多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

大模型RAG与Agent实战:从提示词到知识库智能体落地全解析

大模型RAG与Agent实战:从提示词到知识库智能体落地全解析 “大模型项目到底怎么落地”——这是我在后台收到最多的私信问题之一。很多人花了几千块买课、囤了一堆资料结果还是卡在同一个地方看了一堆概念OpenAI API 也调通了但要做一个像样的知识库问答、一个能自动处理任务的智能体就完全不知道从哪下手。最近黑马程序员这套《大模型RAG与Agent智能体项目实战教程》在圈子里讨论度很高我把它完整跟完了一遍又顺着代码把 LangChain 的源码和文档过了一遍。这篇就把我的学习笔记和实操经验整理出来从提示词工程讲到 RAG 知识库落地最后带你把 Agent 智能体的整个链路跑通全程都会标注我踩过的坑和调参心得。考虑到大模型应用开发现在的热度很多人都想找一条“从理论到实战”的稳妥路线。RAG 和 Agent 这两个方向刚好代表了两种典型的落地范式RAG 把外部知识注入大模型解决幻觉和私有知识的问题Agent 让大模型具备调用工具、分解任务的能力解决“只会聊天、不会干活”的问题。而 LangChain 是串联这两者最主流的工程底座。本文不会只堆理论我会把可运行的代码、参数配置和问题排查都放进来尽量让你看完就能跟着动手。1. 学习路线先理顺提示词、RAG、Agent 分别解决什么问题1.1 大模型应用开发的三个层次我先用一句话概括这三者的关系提示词是基本功RAG 是知识补全Agent 是能力外延。它们是递进关系但不是替代关系。你完全可以只用提示词解决简单任务也可以在 RAG 的基础上叠加 Agent 的逻辑让系统自主决定“什么时候该查资料、什么时候该调工具”。提示词工程是整个大模型应用开发里门槛最低、天花板却很高的一环。它的核心并不是“怎么把话说得漂亮”而是怎么通过输入设计约束模型的输出空间。比如用系统提示词设定角色和输出格式用 few-shot 示例给模型提供参照用思维链引导模型分步推理。很多初学者觉得提示词不重要反正模型都能理解自然语言。这个想法在实际项目中会吃大亏。我在做结构化抽取任务时同样的基础模型提示词写得好不好输出 JSON 的合法率能从 60% 拉到 98% 以上这个差距在批量任务里会被无限放大。RAGRetrieval-Augmented Generation检索增强生成解决的是模型“不知道”的问题。大模型的训练数据有截止时间也没有你的私有文档、最新政策、企业内部资料。RAG 的套路是先把外部文档向量化存到数据库用户提问时先检索出相关片段再把片段和问题一起塞给大模型生成答案。这样既不用微调模型又能让模型“看过”你的资料再回答是目前企业落地最多的一种方案。Agent 智能体则更进一步。它不只是“读资料再回答”而是可以调用外部工具、分步执行任务、根据中间结果调整下一步计划。比如让它查天气、订机票、整理行程它需要自己拆解成子任务先查天气再查航班再规划行程每一步都可能调用不同工具。这种“感知-决策-行动”的循环就是 Agent 的基本形态。1.2 LangChain 在整套体系中的位置LangChain 是当前大模型应用开发里最主流的编排框架它做的核心事情可以用两个字总结编排。它把所有组件——模型、提示词、向量数据库、工具、记忆——统一成标准接口然后用 Chain链或 Agent智能体的方式把它们串起来。你可以把 LangChain 看作乐高积木Prompt 是一块、LLM 是一块、Retriever 是一块、Tool 是一块你要做的就是设计好这些积木的拼接逻辑而不是从零开始手写模型调用的胶水代码。我用 LangChain 做过的几个项目里最大的感受是它的抽象设计一开始会让人觉得“多此一举”等你需要切换模型、切换向量库、增加工具的时候才会意识到这层封装的价值。比如项目前期用的 OpenAI后来因为成本原因换成了国内的开源模型如果代码直接调用 OpenAI SDK改起来要动几十处换成 LangChain 之后只需要换一下ChatOpenAI(base_url...)或者直接换一个ChatModel类其余业务代码基本不用动。但这并不是说 LangChain 是什么银弹。它的版本迭代非常快网上很多教程的代码在新的版本里已经跑不通了。我自己就遇到过langchain.document_loaders目录结构调整、agent初始化接口弃用这类问题。所以学习的时候一定要看官方最新文档不要照抄老博客的代码。这套实战教程的好处是跟着 LangChain 的中期版本更新过相对坑会少一些。2. RAG 知识库系统拆解从文档加载到检索问答全流程2.1 一个完整的 RAG 管线由哪些环节组成标准 RAG 的处理链路可以切成五个阶段缺一环效果都会打折。名称上常见的是“加载-切分-向量化-检索-生成”我拆成下面这张表来看会更加清楚。阶段核心操作常见工具选型产出物文档加载读取 PDF / Word / HTML / Markdown 等不同格式PyPDFLoader、Unstructured、Docx2txt原始文本块文本切分把长文档切成小块控制 token 数和语义完整性RecursiveCharacterTextSplitter带元数据的 chunk向量化把文本块转成高维向量OpenAI Embeddings、BGE、m3e向量集合向量存储存入向量数据库并建立索引Chroma、FAISS、Milvus、pgvector可检索的向量库检索生成语义相似度检索 组装 Prompt 调用 LLMLangChain RetrievalQA、LCEL最终答案这里我想特别强调切分这一步。很多人把 RAG 做砸了80% 的原因都在切分和检索的匹配上。切分的核心矛盾是块越大语义越完整但检索的精度越差还容易超过上下文窗口块越小检索越精准但可能把一个完整的事实割裂开导致模型看不到上下文。我实践下来的经验是通用文档先用RecursiveCharacterTextSplitter把chunk_size设为 500 到 800 个字符左右chunk_overlap设为 100 到 150 个字符。这个参数的设置还要看你实际问答的粒度如果你做的是整本章节总结那切分可以大一点如果是抽取条款、查字段那切分小一点反而效果更好。向量化的选择同样关键。OpenAI 的text-embedding-ada-002效果稳定但国内访问和费用是问题。开源方案里智源的 BGE 系列、M3E 都是不错的选择它们的中文检索能力已经可以跟闭源模型打得有来有回。这里补充一句向量模型的关键指标是 MTEB / C-MTEB 榜单上的检索分数不要只看模型参数量。同一个知识库换一个更强的向量模型检索 top5 的命中率可能从 60% 涨到 90%这是性价比最高的一个优化点。2.2 基于 LangChain 实现一个最小可用的知识库问答我直接给出一份能跑通的最小实现环境是 Python 3.10 LangChain 0.1.x Chroma。你可以先复制过去把 API Key 换成自己的再把文档路径改一下基本就能跑起来。我会在代码后面说明每个关键点。from langchain.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.chat_models import ChatOpenAI from langchain.chains import RetrievalQA # 1. 加载文档 loader PyPDFLoader(企业规章制度.pdf) documents loader.load() # 2. 切分文本 text_splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap100, separators[\n\n, \n, 。, , , , , , ] ) chunks text_splitter.split_documents(documents) print(f切分后片段数量: {len(chunks)}) # 3. 向量化并存储到 Chroma embeddings OpenAIEmbeddings(modeltext-embedding-ada-002) vectorstore Chroma.from_documents( documentschunks, embeddingembeddings, persist_directory./chroma_db ) # 4. 构建检索问答链 retriever vectorstore.as_retriever(search_typesimilarity, search_kwargs{k: 4}) llm ChatOpenAI(modelgpt-4o-mini, temperature0) qa_chain RetrievalQA.from_chain_type( llmllm, retrieverretriever, chain_typestuff ) # 5. 提问 query 员工请病假需要提供哪些材料 answer qa_chain.run(query) print(answer)代码逻辑并不复杂。我先解释几个关键接口。RecursiveCharacterTextSplitter的separators参数非常实用它是递归切分的优先级列表先按双换行切、再按单换行切、再按句号切这样能最大程度保证切出来的块不会从句子中间断开。中文场景里建议把。也加入分隔符列表否则默认的英文分隔符对中文的支持并不理想。search_typesimilarity表示直接用向量余弦相似度取 top k。还有一种是mmr最大边际相关性它在相似度基础上增加了多样性惩罚避免检索出的片段内容过于重复。如果你们的知识库里有多段内容都在讲同一件事、但侧重点不同用mmr效果会好很多不过它的相关度会稍微损失一点。我一般先跑similarity如果答案内容单一化再切到mmr试。chain_typestuff是最简单也最容易理解的模式把检索到的所有内容一次性“塞”进 Prompt再交给模型。它适合检索片段少、总 token 不超限的场景。如果你的知识库单个片段很多8 个片段以上可能就会把上下文窗口打满这时就要考虑map_reduce或refine模式它们会先对每个片段分别处理再把结果合并或者迭代修正。这两者的优点是能支持超长文本缺点是速度慢、token 消耗大。真实项目中我建议按需选择不要盲目追求复杂链路。2.3 检索效果调优的核心指标与经验参数搭建完 RAG 只是第一步真正费时间的是调优。我习惯把 RAG 的效果问题分为“检不出”和“答不对”两类排查路径完全不同。“检不出”指的是模型回答里出现了“根据提供的资料无法回答”这类话或者答案跟资料内容明显对不上。这种情况问题出在召回环节优先排查三件事第一个是切分粒度如果一条完整规定被切到了不同 chunk 里检索只能召回一半自然答不全第二个是向量模型换成更强或者专门针对中文优化的模型召回提升最明显第三个是 top k 的取值k 太小容易漏k 太大噪声会干扰模型经验值是在 3 到 8 之间调整。“答不对”指的是资料里明明有正确答案但模型还是胡编。这种情况问题出在生成环节优先检查 Prompt 和温度参数。如果temperature设得太高比如 0.7 以上模型生成时想象力太丰富容易脱离材料发挥。知识库问答场景建议把temperature压到 0 到 0.3 之间让模型更忠实于上下文。另外 Prompt 里要明确写一句“请仅根据给定上下文回答不要使用内部知识编造”这虽然不是绝对可靠但实测非常管用。我也强烈建议给检索到的片段加上来源元数据比如{source: 企业规章制度.pdf, page: 3}然后在 Prompt 中要求模型在回答时标注依据来源。这不仅方便定位错误成熟产品上线时也必须有溯源能力否则用户无法核对答案信任度会大打折扣。3. Agent 智能体项目实战让大模型自己动起来3.1 Agent 的核心机制大模型如何决定调用哪个工具Agent 跟普通 Chain 的区别一句话总结是Chain 的流程是写死的Agent 的流程是模型自己决定的。我们写 Chain 解决“用户问知识库我们检索完给模型回答”这种固定流程没问题但遇到“帮我规划一个北京三天的行程顺便订好景点门票和天气提醒”这样的复合任务流程根本无法穷举。Agent 的思路是给模型一个工具箱让它根据用户问题自己拆解步骤。LangChain 里的 Agent 底层核心是 ReAct 模式——Reasoning Acting 的组合。它把模型的每次推理循环拆成 Thought思考、Action行动、Observation观察三个阶段。模型先分析用户意图决定要调用什么工具工具返回结果后模型再观察结果决定下一步是继续调用工具还是给出最终答案。这种循环结构很像人在解决问题时的思考方式。LangChain Agent 的祖传结构包括三个部分工具列表Tools、提示词模板Prompt、执行器AgentExecutor。工具就是你给模型注册的函数比如搜索、计算器、查数据库、调 API。模型并不会真的执行代码它只是在输出的内容里按照约定格式写出“我要调用 xx 工具参数是 xxx”由执行器解析后调用对应函数再把结果返回给模型。这里有一个新手很容易绕晕的点模型不直接执行工具工具的执行者是代码框架。3.2 一个可运行的 LangChain Agent 示例下面是一个简单的 Agent 示例我给模型注册了两个工具一个是计算器一个是获取当前时间的函数。这样一个不能精确运算、也不知道当前时间的模型就具备了这两种能力。from langchain.agents import initialize_agent, Tool, AgentType from langchain.chat_models import ChatOpenAI import datetime # 1. 定义工具函数 def multiply(a: float, b: float) - float: 返回两个数字的乘积 return a * b def current_time() - str: 返回当前时间格式为 YYYY-MM-DD HH:MM:SS return datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S) # 2. 包装成 LangChain Tool tools [ Tool( name乘法计算器, funcmultiply, description当需要计算两个数字的乘法时非常有用输入格式为两个数字 ), Tool( name当前时间查询, funccurrent_time, description当用户询问当前时间或日期时使用无需输入参数 ) ] # 3. 初始化大模型 llm ChatOpenAI(modelgpt-4o-mini, temperature0) # 4. 初始化 Agent agent initialize_agent( toolstools, llmllm, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION, verboseTrue ) # 5. 提问 response agent.run(12345乘以6789等于多少另外能告诉我现在是几点吗) print(response)ZERO_SHOT_REACT_DESCRIPTION是最常用的 Agent 类型意思是模型不需要额外训练或 few-shot 示例它通过工具的描述来决定何时调用工具。这背后的关键在于每个 Tool 的description写得是否清晰。模型无法像人一样试试验证每个函数它只能通过描述来判断“这个工具适不适合当前任务”。所以描述里要写清楚触发条件、输入格式和适用范围。如果你的描述太模糊比如只写“用于计算”模型可能完全不知道怎么填参数或者干脆跳过这个工具。verboseTrue在调试时非常重要。打开后你会看到模型每一步的思考过程比如它先说“我需要调用乘法计算器”然后执行器打印Observation: 83947005再继续推理。如果 Agent 行为不符合预期这是最直接的定位手段。线上环境再关掉 verbose避免刷屏。实际部署时我一般不会直接用initialize_agent而是用 LangChain 的 LangGraph 来构建更可控的 Agent 图。LangGraph 是 LangChain 团队后来主推的新框架专门用来构建有状态、可精细控制循环的 Agent。如果你只是做 demo用现成的initialize_agent就够了但做复杂生产系统建议尽早切到 LangGraph。差别的核心在于老版 Agent 的循环逻辑是黑盒LangGraph 把每个节点、每次条件跳转都变成显式定义出了问题一眼就能看懂。3.3 Agent 的失效模式与生产化改造Agent 看着很炫但生产环境里坑非常多。最常见的失效模式有三种。第一是“幻觉式的工具调用”模型明明不知道工具是否合适却编造了一个不存在的参数或者工具名。这通常是因为模型能力太弱或者工具描述有歧义。第二是“死循环”模型一次次地调用同一个工具观察结果然后继续调用永远停不下来。解决方法是给 Agent 设置max_iterations比如 5 次超过就强制结束。第三是“串联误差”前一个工具输出的错误结果会影响后续所有步骤越跑越偏。这个问题的本质是模型缺少验证环节可以引入一个人工反馈节点或者对工具输出做格式校验。生产级 Agent 改造方向我觉得有三个关键词受控、可观测、可回退。受控是指不要把所有工具一下子全给模型按需分配比如先给它 3 个核心工具跑通再加。可观测是指把每次思考、每次工具调用、每次输出都记日志否则出了错连复现都无从谈起。可回退是指关键工具调用前要有人工审核环节特别是在处理转账、删除数据、发送消息这类不可逆操作时绝不能把执行权完全交给模型。这一点在自动化和 agent 项目里再强调都不为过。还有一点提醒Agent 的 token 消耗比普通问答高得多。一次 5 步的工具调用循环每步都会把历史对话和中间结果拼进 Prompttoken 成倍上涨。做产品的时候一定要设预算上限、用量告警并且在 Prompt 里引导模型“能一次回答就别多次调用工具”。我在一个项目里就是没注意这个问题一天跑了十几万 token账单出来人都傻了。4. 提高 RAG 与 Agent 协作效果的实战技巧4.1 Agentic RAG把检索从“固定流程”变成“按需行动”刚才说的 RAG 和 Agent 其实是两条独立的技术线但真正复杂的业务场景里两者往往要配合使用。RAG 负责给模型找资料Agent 负责决定“找什么、什么时候找、找到之后干什么”。把 Agent 的决策能力跟 RAG 的检索能力结合起来业界流行叫法就是 Agentic RAG智能体驱动的 RAG。传统 RAG 是“检索-生成”一条直线不管什么问题都先去向量库捞一遍再交给模型。这在很多场景下是浪费的比如用户问“你好你是谁”压根不需要检索知识库直接让模型回答更自然。而且遇到需要多轮追问、比较多个文档的综合问题传统 RAG 的一次检索根本不够。Agentic RAG 的做法是用 Agent 来决定流程先判断用户问题是否需要检索如果需要再决定去哪几个数据源检索、要不要做二次检索、要不要跨文档对比。在我的实践里Agentic RAG 最朴素、也最有效的实现方式是“Router 条件判断”。大模型先做一次意图分类输出一个 JSON里面包含“是否需要检索”和“检索方向”两个字段。框架根据这个 JSON 路由到不同的处理链上。说它是 Agent 也好说它是带条件分支的 Chain 也好关键是让“检索”成为模型可选择的行动项而不是固定的前置步骤。这样做之后普通闲聊的响应速度变快了复杂问答的准确率也提升了。4.2 工具选型LangChain 之外你必须知道的组件库做 RAG 和 Agent 项目LangChain 负责编排但具体的存储、检索、部署还要依赖其他组件。我列一下自己常用的选型。向量数据库方面项目早期用 Chroma 做原型最方便它是嵌入式数据库一行代码就能跑起来。数据量超过百万条、需要高并发查询时我会切到 Milvus 或者 Qdrant。如果团队已经有 PostgreSQL直接用pgvector扩展也不失为一种务实选择运维成本最低还不用额外引入一套新数据库。生产环境我不建议用 FAISS 做服务端存储它的定位更像本地方案分布式、持久化、权限控制都需要自己搞代价不低。Embedding 模型方面OpenAI 的 ada-002 和 text-embedding-3-small 都是稳定选项中文场景推荐 BGE-large-zh-v1.5 或 bge-m3。BGE 模型最大的好处是开箱即用、免费部署还可以根据自己领域的数据做微调。答主这边踩过一个坑一开始用sentence-transformers/all-MiniLM-L6-v2这个英文小模型来处理中文知识库检索结果离谱得没法看。后来换成 BGE 之后效果直接断崖式提升。所以向量模型的选型一定要先在自己数据上做效果评测不要盲目相信榜单。大模型 API 方面国内可以直接调 GPT 系列也可以选择国产的 GLM、通义千问、DeepSeek、Kimi。LangChain 对大部分主流模型都做了封装切换成本不高。在实际项目中我还比较看重模型的如下三点中文理解能力、函数调用Function Calling能力、价格和响应速度。Agent 项目里模型的 function calling 尤其关键你给模型注册了工具但模型本身不会正确输出结构化参数后续的工作根本转不动。好的模型在参数抽取上就是更规范这也是很多时候即便某个模型很便宜Agent 项目里我还是会换贵一点但更稳的模型的原因。4.3 对话记忆与多轮上下文管理做知识库问答和 Agent 应用还有一个非常影响体验的地方就是多轮对话记忆管理。LangChain 里的ConversationBufferMemory可以自动保存历史消息但如果不加限制历史消息会无限膨胀直到把上下文窗口挤爆。我在项目里用的是剪裁策略只保留最近 5 轮对话摘要再配合一个滑动窗口把更早的消息丢弃。这样既能保障多轮语境连贯又能控制 token 开销。一种更进阶的做法是“记忆分层”把长期记忆用户偏好、身份信息存成向量库短期记忆最近几轮上下文放窗口每次回答前从长期记忆里检索相关内容、再从短期窗口里拿最近的对话。这种结构做私人助理类产品非常合适。比如用户一周前跟你说过“我在准备雅思考试”这周问“帮我推荐几本学习资料”模型如果能检索到那条长期记忆回答会贴心很多。LangChain 里可以用VectorStoreRetrieverMemory来做配合一个大模型自动从对话中抽取值得长期保存的信息基本能实现。但我要泼一盆冷水记忆做得越重系统复杂度越高、越容易出错。很多产品根本不需要长期记忆强行上只会自找麻烦。先想清楚你的用户是不是真的会长期使用、是不是真的需要跨会话的个性化服务再决定要不要做记忆系统。这个决策本身比技术实现更重要。5. 常见问题与排查技巧实录5.1 实测中最容易踩的 8 个坑我把这段时间跑项目过程中遇到的高频问题整理成一张速查表每个问题后面附上我验证过的解决思路。你可以直接把它当排查手册用。常见问题典型表现排查方向与解决方案切分不当导致检索遗漏答案信息不完整只覆盖了文档的一小段调小chunk_size增大chunk_overlap观察召回内容覆盖度向量化模型选错检索结果与问题语义明显无关换成 BGE / bge-m3 / text-embedding-3-small并在自建评测集上对比top k 取值不合适答案噪音太多或信息缺失从 k4 开始看结果质量增减调整多片段场景用 MMR温度太高导致编造内容答案是模型自己脑补的资料里没有把temperature降到 0~0.3并加“仅根据上下文回答”的约束上下文超过窗口限制报 token 超限错误或回答截断减少检索片段数、用 map_reduce 模式的 chain、升级更长上下文的模型Agent 反复调用同一工具日志里出现循环动作迟迟不返回结果设置max_iterations5检查工具描述是否清晰必要时限制工具数量工具参数解析失败模型输出的 action input 是非法 JSON换支持 function calling 的模型或在工具描述中强化参数格式说明熟人切换模型后效果暴跌从 GPT 换到国产模型准确率明显下降国产模型选更强版本如 GLM-4、DeepSeek-V3同时重写 Prompt 适配模型风格这里每个坑我都实际踩过。尤其是“工具参数解析失败”那个在 Agent 早期版本几乎天天遇到。LangChain 老版 Agent 要求模型按特定文本格式输出 action 和 action input欧美的模型对这种格式理解得还不错但中文模型经常格式对齐不上。后来 LangChain 全面转向 JSON 输出和 function calling 模式之后这个问题才大幅缓解。也侧面说明做 Agent 应用模型的能力是被工具调用格式的严格度放大的。5.2 排查方法论把“玄学”变成可复现的问题RAG 和 Agent 项目最让人头疼的就是问题不好定位经常是“结果不对但不知道是检索错了还是模型答错了”。我逐渐养成一套自己的排查顺序基本能高效缩小问题范围。第一步绕开检索直接测试生成。把检索出来的片段手动粘贴给模型看它能不能给出正确答案。如果手动粘贴也不行问题在生成环节调 Prompt 或换模型如果能行问题在检索环节。这个步骤可以把 RAG 的两大环节快速隔离开。第二步单独检查检索召回。不经过模型直接把用户问题拿去跑向量检索打印出 top 5 片段人工看这些片段跟问题是否相关。如果不相关问题在文档切分、向量模型或者检索方式上。第三步看 Agent 的完整思考轨迹。把verbose打开或者用 LangSmith 这类工具记录每次调用链重点看模型在“决策”环节选了哪个工具、传入什么参数、观察结果后改了什么思路。绝大多数 Agent 问题在思考轨迹里一眼就能看出来。这样做的好处非常明显排查问题时每一环都有明确证据而不是靠猜。我见过很多同事排错时喜欢反复调 Prompt、调温度调了半天还是不对因为问题压根不在那个环节。先定位环节再微调参数成功率会高很多。5.3 成本优化与上线监控最后说一下上线后的两个重点关注项成本和监控。成本控制的核心是算清每次请求的 token 账单。RAG 场景比较好计算每次提问的 token 消耗大概等于“Prompt 模板 检索片段 历史记忆 用户问题”。这意味着检索片段数量 k 和 chunk_size 直接决定了你的成本。如果你的收益要求没那么高把 k 从 4 降到 3每个片段从 800 字缩到 500 字单次成本能降低近三成而体验下降并不明显。Agent 场景成本波动更大因为中间的思考轮数是动态的。我习惯在代码里统计每次会话的 token 消耗并设置单日用量上限防止线上被刷爆。监控方面除了常规的请求量、延迟、错误率大模型应用一定要额外关注答案质量类指标。当检索结果为空、模型输出被截断、工具调用失败这类异常发生时要主动记录。比如在 RAG 里如果检索出来的最高相似度分数连 0.4 都不到基本可以判定知识库没有覆盖用户问题这种情况应该触发“无法回答”的兜底逻辑而不是让模型硬答。再比如 Agent 里每次工具调用失败都可以记录失败次数和失败原因持续观察这个指标如果太高就该考虑换工具或改 Prompt 了。这些监控项看起来琐碎但它们就是大模型应用从 demo 走到生产系统的关键台阶。很多人做的 demo 能跑通一上线就崩本质原因是缺少对每一环的观测能力。做完整套实战项目还有一个额外的心得想分享不要被框架牵着走。LangChain 的确很好用但它的抽象也在一定程度上离底层越来越远。遇到框架解决不了的业务需求时不要硬跟框架死磕完全可以退回自己写几十行代码调用模型 API效果反而更可控。框架是辅助不是信仰。理解了模型 API 和检索的基础原理之后你就能判断什么时候该用 LangChain什么时候该手写而不是被框架的 API 绑架。这套课程里最值得学习的反而不是 API 的用法而是它拆解问题和设计方案的思路——知道为什么这么搭、什么场景适合什么方案比记住某个函数参数值要重要得多。
返回列表