LangChain 能跑 Demo,但为什么你做完简历上写不出“可观测“?
聊《别急着上LangChain先把成本、边界和失败兜底算清楚》之前先说一句实在的别急着背概念先看它在真实项目里到底解决什么问题。摘要做 AI 应用项目最近我发现一个挺反直觉的现象Demo 跑通的人越来越多但真正能写进简历、让面试官觉得这人干过正经项目的反而变少了。LangChain 确实降低了很多门槛Model、PromptTemplate、Chain几个组件搭起来一个能回答问题的 Agent 半天就能跑通。但问题也出在这里——Demo 能跑不代表你知道它什么时候会翻车。我最近带几个朋友做项目复盘发现真正卡住他们的不是代码而是三件事权限怎么配、日志怎么记、失败怎么兜底。这三件事LangChain 的官方文档里几乎不写面试也不会问但上线第一天就会暴露。所以这篇文章我想从一个能写进简历的实战项目角度把 LangChain 的核心组件讲清楚但更重要的是把 Demo 到上线之间那道门槛拆给你看。---目录LangChain 能解决什么问题核心组件Prompt 与 Chain 的实战工具调用这才是 Agent 的核心真实案例一个被中间件污染的 Agent排查过程从报错到定位代码解释关键配置的含义失败原因三类错误的区分适用边界什么时候不该用 LangChain总结Demo 和上线之间差的是这三件事LangChain 能解决什么问题先说结论LangChain 解决的是把多个 AI 能力串起来的问题不是让 AI 变得更聪明的问题。很多初学者有一个误区觉得用了 LangChain 模型就能自动变强。其实 LangChain 只是一个编排框架它帮你管理的是Prompt 的组装和版本多个 LLM 调用之间的状态传递工具调用和函数参数映射一些常用的 Chain 模式RAG、Agent、Multi-step如果你的项目只是发一条消息拿一个回复根本不需要 LangChain。但如果你要做根据用户输入查文档、调用工具、再结合上下文生成回答这种多步骤流程LangChain 的抽象就值钱了。---核心组件LangChain 的核心组件其实不多但每个组件都有自己的坑。Model 层ChatOpenAI、ChatAnthropic、ChatOllama这些类表面看只是换了一个提供商但不同模型的 token 限制、function calling 支持、temperature 行为都不一样。我在实际项目里踩过最坑的一次是用了某个国产模型function calling 的参数格式和 OpenAI 不一致导致 Agent 一直调不对工具。Prompt 层PromptTemplate和ChatPromptTemplate的区别在于后者直接操作消息列表更适合多轮对话场景。这里有一个经常被忽略的细节system message 和 user message 的顺序不同模型的要求不一样。有些模型要求 system 必须在最前面有些则不识别 system role。Chain 层LCELLangChain Expression Language是现在推荐的方式用|运算符把各个组件串起来比传统的Chain类更灵活。但 LCEL 的调试体验比较差报错信息经常指向一个很抽象的位置。Tool 层tool装饰器是写工具最简单的方式但要注意工具的描述description会被模型用来决定是否调用这个工具描述写得不好模型要么不调用要么乱调用。---Prompt 与 Chain 的实战先贴一段代码然后逐段解释。from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_openai import ChatOpenAI # 输入用户消息 prompt ChatPromptTemplate.from_messages([ (system, 你是一个技术支持助手。请用简洁的语言回答问题。如果不知道答案直接说我不知道不要编造。), (user, {question}) ]) # 模型使用 OpenAI gpt-4o-mini model ChatOpenAI(modelgpt-4o-mini, temperature0.3) # 输出解析 parser StrOutputParser() # 用 LCEL 串联 chain prompt | model | parser # 执行 result chain.invoke({question: LangChain 的 ChatPromptTemplate 和 PromptTemplate 有什么区别}) print(result)---工具调用这才是 Agent 的核心光有 Chain 还不够Agent 的价值在于能调用工具。下面是一个完整的最小可用案例。from langchain_core.tools import tool from langchain_openai import ChatOpenAI from langchain.agents import create_tool_calling_agent, AgentExecutor from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder # 定义工具查询天气 tool def get_weather(city: str) - str: 查询指定城市的当前天气。输入应该是城市名比如北京或上海。 # 实际项目中这里应该调用真实的天气 API weather_data { 北京: 晴25°C, 上海: 多云22°C, 广州: 雨28°C, } return weather_data.get(city, f未找到 {city} 的天气数据) # 定义工具查询股票 tool def get_stock(symbol: str) - str: 查询指定股票代码的最新价格。 stock_data { AAPL: 189.50 USD, GOOGL: 141.20 USD, TSLA: 248.90 USD, } return stock_data.get(symbol.upper(), f未找到 {symbol} 的股票数据) tools [get_weather, get_stock] # Prompt注意 MessagesPlaceholder 的位置 prompt ChatPromptTemplate.from_messages([ (system, 你是一个全能助手可以查询天气和股票信息。调用工具时请只传必要的参数。如果工具返回错误请告诉用户具体原因。), (user, {input}), MessagesPlaceholder(agent_scratchpad), ]) # 模型必须支持 function calling model ChatOpenAI(modelgpt-4o-mini, temperature0) # 创建 Agent agent create_tool_calling_agent(model, tools, prompt) # 创建 Executor agent_executor AgentExecutor( agentagent, toolstools, verboseTrue, # 生产环境改成 False handle_parsing_errorsTrue, # 关键工具解析失败时的兜底 max_iterations5, # 防止 Agent 无限循环 return_intermediate_stepsTrue, # 方便日志记录 ) # 执行 result agent_executor.invoke({input: 北京今天天气怎么样苹果股票多少钱}) print(result[output])---真实案例一个被中间件污染的 Agent去年我帮一个朋友看他做的 LangChain 项目Agent 在本地跑得好好的换到测试环境就频繁报错。输入用户提问北京今天天气怎么样现象Agent 偶尔会抛出OutputParserException提示工具返回的 JSON 格式不对。但在本地用同样的输入不会复现。步骤1. 对比两个环境的模型版本确认都是 gpt-4o-mini排除模型差异。2. 打开verboseTrue看完整的 tool call 和 tool response。发现测试环境的工具返回里多了一段模型的思考文字不是纯 JSON。3. 检查工具的tool装饰器发现测试环境的同学加了一个retriever中间件这个中间件会往返回值里追加一些调试信息。可观察结果问题出在工具返回格式被中间件污染了。解决方案是重写中间件让它只修改输入不修改输出或者用response_format参数强制模型输出纯 JSON。这个案例说明一个问题Demo 环境和生产环境的差异往往不在模型而在工具链的每一个中间件。你在本地写的工具到了团队环境里可能被加了日志、限流、缓存这些都会影响工具的输入输出。简历上如果能写排查过工具返回格式被中间件污染的问题比写用了 LangChain 的 Agent值钱得多。---排查过程从报错到定位上面的案例可以拆解成一套通用的排查流程以后遇到类似问题可以直接套用。第一步确认报错类型OutputParserException说明是解析环节出了问题不是模型本身的问题。如果报错是This model does not support function calling那就是配置问题。如果报错是超时或连接失败那就是环境问题。第二步对比环境差异本地能跑、测试环境报错99% 是环境差异导致的。对比清单模型版本是否一致环境变量API key、base_url是否一致是否有额外的中间件或装饰器网络环境是否不同代理、防火墙第三步打开 verbose 看完整链路verboseTrue会打印每一轮的 tool call 和 tool response。把输出和预期对比差异点就是问题所在。第四步隔离变量如果问题复杂把工具单独拿出来测试确认是工具本身的问题还是 Agent 编排的问题。---代码解释关键配置的含义回到上面的 Agent 代码有几个配置值得单独解释。handle_parsing_errorsTrue这个参数让 Agent 在工具返回格式不对的时候不会直接 crash而是把错误信息反馈给模型让模型自己决定下一步怎么做。没有这个配置一个格式错误的工具返回就能让整个 Agent 挂掉。max_iterations5防止 Agent 陷入调用工具→调用工具→调用工具的死循环。有些模型在工具返回不符合预期时会反复尝试调用同一个工具直到达到最大迭代次数。这个值设太小会导致 Agent 过早放弃设太大会浪费 token。5 是一个比较合理的默认值。return_intermediate_stepsTrue这个配置让 AgentExecutor 返回每一轮的 tool call 和 tool result。有了这个你可以把每一轮的交互记录到日志里上线之后排查问题全靠这个。没有这个配置你只能看到最终输出不知道中间发生了什么。MessagesPlaceholder(agent_scratchpad)这是 Agent 模式里最关键的一行。它告诉 LangChain 在每轮对话中把模型的中间思考过程工具调用、工具结果插入到这个位置。如果没有这一行Agent 就看不到自己之前调过什么工具相当于每轮都是新的。---失败原因三类错误的区分做 AI 项目报错是常态。但报错了你不知道怎么区分就会浪费时间。业务错误模型返回了答案但答案不对。比如工具调对了但天气数据本身是错的。这种错误的排查方向是检查数据源不是改代码。配置错误模型选错了、temperature 设太高、function calling 不支持的模型被用了。这种错误通常有明确的报错信息比如This model does not support function calling。排查方向是对照模型文档确认能力边界。环境错误网络超时、API key 失效、并发限流。这种错误最烦人因为随机性很强。排查方向是加重试、加超时、加日志。我在实际项目里最常见的错误类型是第二种——选了不支持 function calling 的模型或者用了太老的模型版本。LangChain 不会在 import 的时候报错要等到真正调用的时候才暴露所以一定要在写代码之前先确认模型能力。---适用边界什么时候不该用 LangChainLangChain 不是万能的。以下场景建议慎重考虑简单问答如果只是用户问模型答一个ChatOpenAI加一个 prompt 就够了不需要 Chain更不需要 Agent。加 LangChain 只会增加复杂度。高并发低延迟LangChain 的抽象层会带来一定的性能开销每次调用都要经过 prompt 组装、消息格式化、输出解析等多个步骤。如果你的场景要求毫秒级响应建议直接用 OpenAI 的 SDK绕过 LangChain。需要精细控制每一步LangChain 的 LCEL 已经很灵活了但如果你需要根据上一轮的输出动态决定下一步调哪个模型这种细粒度控制建议自己写编排逻辑而不是硬套 LangChain 的抽象。团队没有 AI 工程经验LangChain 的学习曲线不低组件之间的耦合关系需要时间理解。如果团队里没人懂 prompt engineering 和 function calling 的原理直接用 LangChain 很容易写出能跑但不知道为什么能跑的代码上线后维护成本极高。---总结Demo 和上线之间差的是这三件事回到文章开头的问题为什么 Demo 能跑的人越来越多但能写进简历的反而少了因为 Demo 只展示了 LangChain 的甜蜜点——简单场景下它确实能帮你快速搭出一个能用的东西。但真正的项目要面对的是工具调用失败、模型输出不稳定、并发限流、日志缺失这些问题。如果你在简历上写 LangChain 项目建议按这个结构来组织1. 项目背景解决了什么实际问题为什么需要 Agent 而不是简单问答。2. 技术选型为什么选 gpt-4o-mini 而不是 gpt-4o为什么用 LCEL 而不是 Chain 类。3. 关键实现工具的定义和 description 怎么写prompt 里加了什么约束防止幻觉。4. 兜底策略handle_parsing_errors、max_iterations、重试机制是怎么配的。5. 可观测性日志怎么记、中间步骤怎么存、出问题怎么排查。最后一条是最重要的。LangChain 的代码本身不难难的是你知不知道它什么时候会翻车以及翻车了怎么救。这个能力才是 Demo 和上线之间真正的护城河。资料展示下面是我整理的AI大模型学习资料和工具包预览适合收藏后按主题逐步学习。需要这份AI大模型资料清单的话在评论区回复「清单」即可我会根据大家的问题继续补充对应的实战内容。