2026/8/6 22:15:57

LangChain 实战指南:把关键能力落到项目里

LangChain 实战指南:把关键能力落到项目里 聊《LangChain怎么学先做一个会暴露问题的真实项目》之前先说一句实在的别急着背概念先看它在真实项目里到底解决什么问题。摘要LangChain生态很火但很多开发者学完后发现自己的Agent项目只能跑个Demo真正上线就各种问题。本文结合真实项目经验从核心组件到工具调用再到生产环境的关键考量分享LangChain实战中的坑和解决方案。目录LangChain能解决什么问题核心组件Prompt与Chain工具调用项目实战总结---LangChain能解决什么问题先说个真实场景。去年有个做运维的同学找我说想做个Agent自动处理告警。Demo跑得很顺模型能读监控数据、能查历史日志、还能生成修复建议。但真正要接入公司系统时问题全来了——API调用没权限、日志没记录、模型响应时间不可控。LangChain解决的问题本质上是把散乱的AI能力串成可复用的工程。它不是让你学会用大模型而是帮你解决1. Prompt管理不同场景的提示词怎么版本化、怎么测试2. Chain编排多个模型调用之间的数据怎么流转3. 工具集成怎么让模型调用外部API、数据库、文件系统4. 记忆管理多轮对话的状态怎么保存和恢复很多人学LangChain第一步就错了——先学怎么调API再学怎么拼Chain。其实应该反过来先想清楚你的Agent要做什么再决定用什么组件。核心组件LangChain的组件很多但真正常用的就这几类模型层from langchain_openai import ChatOpenAI llm ChatOpenAI( modelgpt-4o, temperature0.1, max_tokens2048, timeout30, max_retries2 )temperature别设太高生产环境要的是稳定输出不是创意。提示词层from langchain_core.prompts import ChatPromptTemplate prompt ChatPromptTemplate.from_messages([ (system, 你是一个运维助手负责处理告警和生成修复方案。), (user, 当前告警信息{alert}\n历史日志{logs}\n请给出处理建议。) ])提示词要模块化别把所有逻辑塞进一个字符串。链式调用from langchain_core.output_parsers import JsonOutputParser parser JsonOutputParser() chain prompt | llm | parser这里用了管道语法比LLMChain更清晰。记忆管理from langchain_core.chat_history import BaseChatMessageHistory from langchain_core.messages import HumanMessage, AIMessage class SimpleMemory: def __init__(self, max_turns10): self.history [] self.max_turns max_turns def add(self, role, content): self.history.append({role: role, content: content}) if len(self.history) self.max_turns * 2: self.history self.history[-self.max_turns * 2:] def get_messages(self): return [ HumanMessage(contentm[content]) if m[role] user else AIMessage(contentm[content]) for m in self.history ]别迷信LangChain内置的记忆组件简单场景自己写更可控。Prompt与ChainPrompt工程是LangChain的核心但也是最容易踩坑的地方。常见错误提示词太长模型注意力分散没有明确输出格式解析失败忘记考虑token限制实际调用时截断我的做法from langchain_core.prompts import PromptTemplate # 分离系统提示和用户提示 SYSTEM_PROMPT 你是一个智能客服助手。你的职责 1. 理解用户问题 2. 从知识库中查找相关信息 3. 给出准确、简洁的回答 约束 - 如果不知道答案直接说我不知道 - 回答控制在200字以内 - 不要编造信息 USER_TEMPLATE PromptTemplate( input_variables[question, context], template 知识库内容 {context} 用户问题{question} 请根据知识库内容回答问题。 )Chain的调试技巧from langchain_core.runnables import RunnablePassthrough debug_chain { question: RunnablePassthrough(), context: lambda x: search_knowledge(x[question]) } | USER_TEMPLATE | llm # 调试时打印中间结果 result debug_chain.invoke({question: 如何重置密码}) print(result)用RunnablePassthrough和字典语法可以方便地调试每个环节的输出。工具调用工具调用是Agent的手脚也是生产环境最容易出问题的地方。定义工具from langchain_core.tools import tool import requests tool def get_system_status(service_name: str) - dict: 查询指定服务的系统状态 response requests.get( fhttps://monitor.example.com/api/status/{service_name}, headers{Authorization: Bearer YOUR_TOKEN}, timeout10 ) return response.json() tool def execute_command(command: str, target_host: str) - str: 在指定主机上执行命令需要审批 # 这里应该加权限校验 if not check_permission(target_host): return 权限不足 result run_remote_command(target_host, command) return result工具调用的坑1. 权限问题别把敏感操作直接暴露给模型要有审批机制2. 超时处理网络请求可能卡住要设timeout3. 错误恢复工具调用失败时模型可能陷入循环要加最大重试次数调用工具的正确姿势from langchain.agents import create_openai_functions_agent, AgentExecutor tools [get_system_status, execute_command] agent create_openai_functions_agent(llm, tools, prompt) executor AgentExecutor( agentagent, toolstools, max_iterations5, # 防止无限循环 handle_parsing_errorsTrue, verboseTrue ) result executor.invoke({input: 检查nginx状态并重启})项目实战去年我做了一个运维Agent项目从Demo到生产踩了不少坑。第一阶段Demo跑通from langchain.agents import initialize_agent, AgentType from langchain.tools import Tool def check_disk_usage(host: str) - str: # 模拟API调用 return f{host} 磁盘使用率: 75% tools [ Tool( namecheck_disk, funccheck_disk_usage, description查询主机磁盘使用情况 ) ] agent initialize_agent( tools, llm, agentAgentType.OPENAI_FUNCTIONS, verboseTrue ) agent.run(检查web01的磁盘使用情况)Demo阶段所有东西都是硬编码跑通了就以为结束了。第二阶段接入真实系统问题开始暴露API调用超时Agent卡死模型输出格式不固定解析失败没有日志记录出问题无法排查解决方案import logging from datetime import datetime logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s ) logger logging.getLogger(agent) class TracedAgent: def __init__(self, executor): self.executor executor def invoke(self, input_text: str) - dict: trace { timestamp: datetime.now().isoformat(), input: input_text, steps: [] } try: result self.executor.invoke({input: input_text}) trace[output] result trace[status] success except Exception as e: trace[error] str(e) trace[status] failed logger.error(fAgent execution failed: {e}) trace[steps] self.executor.history logger.info(fAgent trace: {trace}) return trace加上日志和trace后问题排查效率提升了至少50%。第三阶段生产环境最后的问题是关于权限和可观测性敏感操作需要人工审批调用量监控和成本核算模型响应时间的SLA保障import time from functools import wraps def track_performance(func): wraps(func) def wrapper(*args, **kwargs): start time.time() try: result func(*args, **kwargs) duration time.time() - start logger.info(f{func.__name__} took {duration:.2f}s) return result except Exception as e: duration time.time() - start logger.error(f{func.__name__} failed after {duration:.2f}s: {e}) raise return wrapper这些看似简单的改进才是Demo和生产环境的真正差距。总结LangChain的学习路径我建议这样走1. 先理解关键概念Prompt、Chain、Agent是什么别急着写代码2. 从简单场景入手先做个问答机器人再逐步增加工具3. 重视调试能力学会看trace学会加日志4. 提前考虑生产问题权限、日志、监控别等上线再补Demo能跑通只是开始生产环境才是真正的考验。权限管理、日志记录、性能监控这些看似不相关的工作往往决定了一个Agent项目能不能真正上线。如果你的Agent项目还停留在Demo阶段建议先问自己几个问题调用失败时模型会怎么反应敏感操作有没有权限控制出问题能不能快速定位想清楚这些再往上加功能会稳很多。资料展示下面是我整理的AI大模型学习资料和工具包预览适合收藏后按主题逐步学习。如果你想看完整资料目录可以在评论区留言「资料」也欢迎告诉我你更关注AI大模型里的哪类内容。