尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

从awesome-llm-apps看LLM应用:RAG、Agent与工程落地

从awesome-llm-apps看LLM应用:RAG、Agent与工程落地 大概从 2023 年开始GitHub 上冒出过一个很有意思的现象满屏都是“awesome-xxx”的仓库。这种清单型项目说穿了就是一个领域里的老玩家把散落在全网的高质量工具、开源项目、论文、教程手动整理成一份精挑细选的目录。而在所有 awesome 系列里我最常翻、也最推荐团队新人去翻的就是这份“awesome-llm-apps”。它表面上是一份链接列表实际上是过去两年大语言模型LLM应用生态的一份“活地图”。对话助手、RAG 知识库、自主 Agent、多模态工具、端侧推理方案全都按场景和技术栈分好了类。这篇文章我不打算只是给你报一遍仓库里有什么而是借它把整个 LLM 应用的技术栈、设计思路、实操流程和踩坑记录从头到尾给你捋一遍。无论你是刚入门想找方向还是已经在写业务代码想补全视野这篇都值得收藏。1. 从 awesome-llm-apps 看 LLM 应用生态全景1.1 awesome 清单是什么为什么值得看先说说 awesome 系列本身。它们遵循一套约定一个 README 文件一堆分类目录三五百个精选链接每个链接配一句“人话”介绍。维护者通常不是在写文档而是在记录自己试用过、验证过、真正有价值的东西。所以这类仓库的筛选标准往往比搜索引擎的结果靠谱得多因为背后是真人踩过坑后的选择。“awesome-llm-apps”这类仓库的价值不是给你一个可以立刻跑起来的代码而是帮你建立坐标系。LLM 领域的信息密度极高今天一个框架明天一个工具今天一个 Agent 范式明天一个推理加速方案。如果没有一份经过整理的清单你很容易被信息洪流冲走要么一头扎进某个热门项目里出不来要么每天刷资讯但什么也没沉淀下来。有清单在手你至少能回答三个问题现在这个领域有哪些主赛道、每条赛道上有哪些代表性项目、它们之间是什么关系。1.2 清单里的应用分类逻辑打开一份典型的 awesome-llm-apps 仓库你会发现分类逻辑基本上遵循了 LLM 应用的几条主流路线第一类是聊天与助手类。从早期的 ChatGPT 网页壳子到后来各种带系统提示词、带插件生态的桌面客户端。它们的共同点是解决“怎么和模型对话”这件事包括更好的聊天体验、上下文管理、提示词模板、多人共享对话等。第二类是检索增强生成RAG类。这类应用解决的是“怎么让模型知道它不知道的东西”把企业文档、私有知识库、网页内容先向量化再在用户提问时检索相关内容喂给模型做回答。典型代表是各种知识库问答工具、论文阅读助手、企业内网 Copilot。第三类是自主 Agent 类。这是过去一年多最火的方向也是我个人最看好的方向。这类应用不再满足于“问答”而是让模型自主规划任务、调用工具、观察结果、迭代执行。从 AutoGPT 到各种集成型的智能体框架都属于这个范畴。关于 Agent 的细节后面章节详细讲。第四类是开发框架与编排工具。LangChain、LlamaIndex、Semantic Kernel 这类东西严格来说不算“应用”但它们是应用的地基。awesome 清单里通常会单独开一个目录把这类基础设施和上层应用分开避免混在一起误导新手。第五类是微调与数据工程工具。包括数据集制作、指令微调、RLHF 流程里的训练框架和评估工具。这类项目技术门槛最高但也是垂直领域落地绕不开的一环。第六类是推理与部署工具。如果你不想把所有流量都打到 OpenAI 的 API 上就要考虑 vLLM、Ollama、llama.cpp 这些方案。它们解决的是“模型训练出来之后怎么高效跑起来”的问题。除了这些还有多模态应用、垂直行业方案、本地优先与隐私应用等分类。你会发现这份清单的排列顺序本身就是一条完整的技术演进路径从最简单的人机对话到信息增强再到自主决策最后落到工程化部署。1.3 为什么现在更需要这样一张地图2023 年到 2025 年LLM 应用层的工具数量增长是指数级的。但工具越多选择就越困难。很多团队刚开始做技术选型时喜欢直接去 GitHub 搜索关键词”LLM“然后被十几个 star 数相近的项目困住拿不准哪个更适合自己的场景。我自己的习惯是先看 awesome 清单再看每个候选项目的 issues、更新频率、维护者背景最后才是实际试跑。因为 awesome 清单能给你的是第一层过滤哪些项目在真实场景里被验证过哪些只是昙花一现的 demo。比如有些仓库 star 数很高但作者半年不更新、issues 堆了几百个不处理这种项目即便进了 awesome 清单也只能当学习资料不能当生产依赖。一句话总结awesome-llm-apps 不是终点而是起点。它提供给你的不是答案是一张可以持续迭代的地图。2. LLM 应用的核心技术栈拆解2.1 三种主流应用形态对话、RAG、Agent把所有 LLM 应用抽象一下你会发现它们本质上只有三种形态。第一种是最直接的对话形态。输入一段文本模型输出一段文本中间不做额外处理。看似简单但要做到好用仍然需要处理系统提示词、上下文压缩、多轮记忆、输出结构化等一堆问题。很多人的第一个 LLM 应用就是这个形态比如把公司客服知识库写进系统提示词做一个简单的问答机器人。第二种是 RAG 形态。它的出现是为了解决大模型的两个先天问题知识截止时间和幻觉。模型训练完之后它的知识就冻结了你不可能让它知道今天刚发布的政策文件。RAG 的思路很朴素不修改模型而是在回答之前先从外部知识库里检索相关内容把检索结果作为上下文的一部分喂给模型。相当于考试时允许你翻书而不是要求你把整本书背下来。这个形态目前是落地最多的因为企业对“答案要有依据”这件事极其看重。第三种是 Agent 形态。如果说对话形态是“你说我听”RAG 是“边查边答”那 Agent 就是“自己动手”。模型不再是简单地生成文本而是生成一个行动序列调用哪个工具、传什么参数、看什么结果、下一步做什么。整个过程形成一个循环。这个方向的想象力最大但坑也最多。三种形态之间不是替代关系。我看到很多成熟的系统其实是三种形态的混合体用户提问后先判断意图如果是事实性问题就走 RAG如果是操作类任务就走 Agent如果只是闲聊就直接对话。用 awesome-llm-apps 的清单去对照你会发现最成功的开源项目往往也是这种混合架构。2.2 Agent 是怎么工作的规划、记忆、工具调用Agent 这个概念最近两年被炒得很热但真正理解它内部机制的人并不多。我在这里拆开讲一下。一个标准的自主 Agent 通常会包含四个核心模块规划、记忆、工具调用、反射。规划模块解决“先做什么后做什么”。大模型本身不具备多步骤执行能力它只是生成下一个 token。但你可以通过提示词让模型先输出一份计划再把计划拆成多个步骤逐一执行。常见的做法是 ReAct 模式Thought我该做什么→ Action调用哪个工具→ Observation看到了什么结果循环往复。记忆模块分短期和长期。短期记忆是模型的上下文窗口用来承载当前任务的信息。长期记忆则是外部存储比如向量数据库里保存的历史对话、用户偏好、任务结果。有长期记忆的 Agent 才能在多次会话中保持一致的行为。工具调用模块是 Agent 连接真实世界的通道。模型本身不能查天气、不能下单、不能操作数据库但你可以通过函数调用Function Calling机制把工具描述成 JSON Schema 暴露给模型。模型在需要时会生成一条调用指令系统执行后把结果回传给模型。这一步是整个 Agent 能“动手”的关键。反射模块则是让 Agent 从错误中学习。每执行完一个任务模型会对自己的表现做一次自我评估把失败原因和修正策略记录下来用于下一轮任务。这个机制能显著提高复杂任务的完成率。理解了这四个模块你就知道选型时该看什么了框架是否支持函数调用、记忆如何持久化、规划循环是否可控制、有没有反射机制。而不是只看某个项目宣称自己是“下一代 Agent 平台”。2.3 框架选型LangChain、LlamaIndex、AutoGen很多人一上来就问“该学 LangChain 还是 LlamaIndex”其实这个问题本身就有点问题。它们解决的并不完全是同一件事。LangChain 是更通用的 LLM 应用编排框架。它提供了模型调用、提示词管理、链式组合、Agent 循环、记忆、工具接入等全套能力。适合快速搭建原型也适合做功能复杂的业务系统。缺点是抽象层级多底层机制藏得深出了问题排查成本高。我在生产环境里更倾向于只用它的一部分能力比如只用它的模型封装和工具调用RAG 部分自己写。LlamaIndex 则更聚焦于“数据连接”这个场景。它把文档加载、切分、向量化、索引、检索这一整套流程做得极其精细。如果你做的是知识库问答这类 RAG 密集型应用LlamaIndex 的体验比 LangChain 好很多。现在最新版本也加入了 Agent 和 Workflow 能力但它的优势依然在数据侧。微软的 AutoGen 则主打多 Agent 协作。它允许你定义多个角色不同的 Agent比如一个写代码、一个审查代码、一个执行测试让它们互相配合完成任务。这个思路在复杂工作流里很有价值但学习曲线比较陡且需要你对自己要解决的任务有清晰的拆分能力。我做框架选型时有一个简单判断标准如果应用里 80% 的逻辑是数据的加载、切分、检索选 LlamaIndex如果 80% 的逻辑是工具调用、任务规划、多步流程选 LangChain 或直接手写如果要做多角色协同的复杂任务考虑 AutoGen 或类似的群聊式框架。2.4 模型选择与推理部署应用层做得再好模型不行一切都白搭。好在现在模型选择的余地比前两年大得多。如果你做的是对效果要求极高、对成本不敏感的业务比如面向客户的智能客服闭源 API 依然是首选。它们的推理性能、指令跟随能力、多语言效果都处于第一梯队而且你不用关心底层部署。如果你想省钱或者对数据隐私有硬性要求那就得考虑开源模型加本地部署。目前开源社区已经追得很近了尤其是 7B 到 14B 这个区间配合量化技术一张消费级显卡就能跑起来。我实测过几个主流开源模型在中文场景下的效果虽然和顶级闭源 API 还有差距但配合 RAG 和良好的提示词工程足够应付大部分企业内部场景。部署这块首选方案是 vLLM 这类高性能推理引擎吞吐量比原生 Transformers 库高好几倍。如果只是本地调试Ollama 是最省事的选择一条命令搞定环境、模型和 API 服务。再往下追求极致性能就是 llama.cpp 系配合 GGUF 量化格式CPU 也能跑。3. 从零搭建一个 LLM 应用的真实操3.1 场景选择与环境准备理论讲再多不如动手做一个。我这边选一个最适合练手的场景基于企业内部文档的智能问答系统。为什么选这个因为它需求明确、技术链路完整、且不需要训练模型最适合体验 LLM 应用开发的全流程。环境准备阶段建议用 Python 3.10 以上版本。先建一个虚拟环境然后装核心依赖openai或对应的模型 SDK、langchain 或 llama-index、faiss-cpu 或 chromadb向量存储、pandas 和 tiktoken文本处理。如果你是本地模型再加一个 ollama 包。装依赖时最容易踩的坑是版本冲突。LangChain 和 LlamaIndex 的更新频率非常高两个框架互相依赖的第三方库经常打架。我的建议是不要追求最新版锁定几个相互兼容的版本实测能用就别动了。很多人一开始把环境搞得乱七八糟最后不得不全删了从零开始。3.2 最小可用的私有知识库问答第一步是文档加载和切分。把 PDF、Word、Markdown 等格式的文档加载进来按固定长度切分成小块。chunk_size 建议从 500 到 1000 个 token 之间试起切太短会丢失上下文切太长检索精度会下降。这个参数是后面影响效果的关键没有绝对最优只能针对你自己的文档反复调。第二步是向量化。把每个文本块用 Embedding 模型转成向量。这一步决定了语义搜索的上限。中文场景下国产的 Embedding 模型效果通常比国外的通用模型好。我自己常用的是带中文优化的一些开源模型比如 BAAI/bge 系列。第三步是建立索引。把向量写进向量数据库。如果是小规模测试用 FAISS 或 Chroma 就够了如果文档量到了几十万级别再考虑 Qdrant、Milvus 或者云上的向量数据库。第四步是检索和生成。用户提问时把问题也转成向量在库里做相似度搜索取 top-k 个最相关的文本块拼接到系统提示词里然后让模型基于这些文本生成答案。代码如下from llama_index.core import VectorStoreIndex, SimpleDirectoryReader # 加载文档 documents SimpleDirectoryReader(./docs).load_data() # 构建索引 index VectorStoreIndex.from_documents(documents) # 查询 query_engine index.as_query_engine(similarity_top_k4) response query_engine.query(我们公司的年假规则是什么) print(response)这段代码大概是整个 RAG 流程里最短的写法。但你一定要理解背后发生了什么否则调优时就会抓瞎。3.3 给应用加上工具调用升级成能动手的 Agent做完知识库问答下一步值得做的是把静态问答升级成带工具的 Agent。我给这个项目加的第二个能力是“自动执行统计报表查询”。具体做法是用函数调用机制把数据库查询暴露成工具。模型的职责是理解用户的模糊意图然后把意图翻译成结构化查询参数。举个例子用户说“上个月华东区的销售额是多少”模型需要做的不是直接回答而是调用一个查询工具入参是 region“华东区”、date_range“2025-01-01 至 2025-01-31”然后把查询结果转成自然语言回答。from openai import OpenAI client OpenAI() tools [ { type: function, function: { name: query_sales, description: 查询指定区域和日期的销售额, parameters: { type: object, properties: { region: {type: string, description: 区域名称}, start_date: {type: string, description: 开始日期}, end_date: {type: string, description: 结束日期} }, required: [region] } } } ] response client.chat.completions.create( modelgpt-4o-mini, messages[{role: user, content: 上个月华东区的销售额是多少}], toolstools, tool_choiceauto )注意一点工具描述写得越好模型调用工具的准确率就越高。描述里要写清楚“这个工具能干什么”“参数的含义和格式”甚至要给出参数示例。很多人在这一步偷懒结果模型要么传错参数要么根本不调用工具。3.4 垂域应用的数据准备要点顺着“垂直领域 LLM”这个热搜词多说几句。很多团队做垂域应用时第一个想法就是微调模型。但我强烈建议先做 RAG再考虑微调。原因很简单RAG 不需要训练成本低、迭代快、可解释性强。微调则是动一发而全身数据准备、算力投入、评估回归每一步都耗时耗力。只有当 RAG 把检索到的知识喂给模型模型依然无法完成任务时才说明模型本身的能力边界有问题这时候才需要考虑微调。如果你真的要做垂域微调数据准备是成败关键。几条实操经验第一样本质量远比数量重要一万条高质量指令好过十万条从网上批量爬来的垃圾数据。第二指令要多样化同一类问题要写不同说法、不同难度、不同边界条件。第三一定要留出一部分评估集微调前后用同一批题目做对比用自动化和人工结合的方式回归。第四注意数据去重和隐私清洗我在实际项目里见过不少团队兴冲冲微调完才发现训练数据里混着大量重复样本模型能力反而退化。4. 常见问题与排查技巧实录4.1 上下文窗口溢出这是所有 LLM 应用都会碰到的第一道坎。你的文档有几十页但模型的上下文窗口只有几万 token。解决方案很多文本切分、滑动窗口、摘要压缩、只取检索后的 top-k。但你一定要想清楚自己的场景是长文档理解还是知识库检索。前者需要“能读完全文”后者需要“找对片段”。两者的技术路线完全不同不要混着做。我见过最离谱的一次是有人把一本五百页的 PDF 直接塞进提示词然后抱怨“模型怎么答不对”。这不是模型的问题是应用设计的问题。4.2 向量检索召回质量差很多 RAG 应用做出来效果不如预期问题通常出在检索环节而不是生成环节。文档切分不合理、Embedding 模型选得不合适、top-k 设得太小都会导致召回不准确。我的排查习惯是三步走第一步单独看检索结果不看生成结果确认召回的文本块是否真的与问题相关第二步检查文本切分方式必要时按章、节、标题来做结构化切分而不是纯按字符长度切第三步调整 top-k 和相似度阈值实测不同取值对最终答案的影响。另外提一句很多团队忽略查询改写。用户的问题是碎片化的口语直接拿去向量检索效果有限。可以先让模型把问题重写成一个更完整、更正式的查询语句再去做检索召回质量会有明显提升。4.3 Agent 陷入死循环Agent 应用最让人头疼的问题就是执行到一半卡住反反复复调用同一个工具就是不往前推进。根本原因是模型在规划时缺乏有效的停止条件。解决思路有几个一是在系统提示词里明确写出“当任务已经完成或者无法取得进展时必须停止并给出总结”二是给每个工具设置超时上限某个工具调用超过 N 次就强制终止三是在代码层面加入循环次数限制Agent 的执行轮数超过预设值就降级为直接问答模式四是引入反射机制每轮结束让模型评估一下“当前是否取得了新进展”如果连续几轮没有进展就主动终止。4.4 幻觉问题模型一本正经地胡说八道是 RAG 系统最致命的缺陷。根本原因是模型会基于训练时的先验知识补全答案即使检索结果里根本没有相关内容。我在项目里用了三招来压制幻觉第一系统提示词里明确要求“只能基于提供的资料回答资料中没有的内容要明确说不知道”第二降低生成温度把 temperature 调到 0 或 0.1减少模型的自由发挥空间第三做答案溯源让回答中每个关键结论都在参考资料中找得到对应段落找不到就标红提醒人工复核。这套组合实践下来能把幻觉率压到可接受的范围。4.5 本地推理性能瓶颈本地模型部署后体验最直接影响的是推理速度。12B 左右的模型在消费级显卡上如果不做优化生成一个 token 可能要几百毫秒用户体验很差。常规优化手段有三种模型量化从 FP16 量化到 INT8 或 INT4速度能提升数倍KV Cache 优化减少重复计算批处理多个请求合并推理。如果这些做完还不够就只能考虑换更强的显卡或者部分流量走 API。下面这个表是我做性能排查时的速查清单上下文溢出现象是报错或回答中断优先做文本切分、压缩、只保留关键片段。检索质量差现象是答非所问检查切分方式、Embedding 模型、查询改写。Agent 死循环现象是卡住或反复调用工具限制轮数、加停止条件、加反射。幻觉严重现象是内容虚假但语气确定降低温度、要求引用来源、人工复核。推理慢现象是生成一个字要等半天量化、KV Cache、用推理引擎。5. LLM 学习路线与下一步方向5.1 给新手的 LLM 学习路线很多刚入行的人被 LLM 的名词绕晕Transformer、微调、RLHF、Agent、RAG、向量数据库……其实学习路径可以很清晰。第一步理解底层原理。不需要自己从零训练模型但要知道 Transformer 的基本结构、token 是什么、预训练和指令微调的区别、为什么大模型会产生涌现能力。这决定了你后面能不能理解模型的边界。第二步把 API 用熟。不管用哪家的模型先把对话补全、流式输出、函数调用这些基本接口用一遍。做几个小项目翻译助手、总结工具、客服机器人。这一阶段的目标是建立对模型能力的直觉。第三步掌握检索增强。学习向量化、向量数据库、RAG 架构。给自己做一个私有知识库问答系统把切分、召回、重排、生成这几个环节拆开调优。第四步深入 Agent 与工具调用。从单个工具调用开始逐步做成多工具协作、带记忆、带反思的完整 Agent。这个阶段可以多看 awesome-llm-apps 里 Agent 分类下的开源项目源码。第五步研究工程化和数据。学习如何评估模型效果、如何做数据清洗和微调、如何做推理部署优化。到这个阶段你已经具备在企业里落地 LLM 项目的能力了。5.2 从 awesome-llm-apps 看趋势Agent、AIoT 与垂域翻看 awesome-llm-apps 的更新记录你能明显感受到几条趋势线。第一条是 Agent 从概念走向实用早期项目大多停留在“会写诗”“会讲段子”的玩具阶段现在的 Agent 项目已经在做自动写代码、自动跑测试、自动操作浏览器等真实工作。第二条是 AIoT 智能家居与 LLM 的结合。热词里那个 “AIoT smart home via autonomous LLM agents” 非常典型。过去智能家居的控制逻辑靠的是开发者预先写好的规则基本没有智能可言。现在通过 LLM Agent你可以让系统自主理解用户的模糊指令比如“我出门了”Agent 能根据用户的历史习惯自动关灯、关空调、开启安防模式。这种应用形态把 LLM 从“聊天窗口”带到了真实的物理世界。第三条是垂域应用的数据重要性越来越被认可。大家慢慢意识到模型能力是一方面数据准备才是真正拉开差距的地方。同一套开源模型有人用在法律文书审查上效果惊艳有人在医疗问答上一塌糊涂差别不在模型而在数据工程。这也是我为什么在前面反复强调数据准备。如果你有精力建议每隔一两个月就去翻一遍 awesome-llm-apps看看列表里新增了什么、删掉了什么。一个项目被移除往往说明它在激烈的竞争中掉队了而一个项目快速上榜则是行业风向转变的信号。我个人在实际使用中最大的一个体会是做 LLM 应用最重要的能力不是调参不是背框架而是判断力。判断当前这个需求到底应该用对话、RAG、还是 Agent判断这个问题是应该等模型升级还是应该靠工程手段解决判断这个数据值不值得花时间去清理和标注。awesome-llm-apps 这类清单项目恰好是训练这种判断力最好的素材库。多读、多拆解、多试跑你很快就能从“看热闹”变成“看门道”。最后再分享一个小技巧逛 awesome 仓库时别只看 README多点点链接进去看看每个项目最后更新时间。如果一个去年还很火的项目已经一年多没动静那不管 star 数多高选型时都要慎重。这个细节能帮你避开很多死胡同。
返回列表