适合对大模型有初步了解希望快速上手大模型应用开发的开发者随着大模型技术的爆发式增长如何高效地将大模型集成到实际应用中成为开发者面临的核心挑战。LangChain 作为当前最流行的 LLM 应用开发框架之一正在快速演进。本文将带你系统了解 LangChain 的发展背景、生态演化并通过实战案例掌握 LangChain 1.x 的核心用法。一、智能体Agent大模型应用的核心什么是智能体智能体Agent是指能够感知环境、做出决策并执行行动的自主系统。在 LLM 领域基于大模型的智能体以大模型为核心控制器整合感知、规划、记忆与工具调用等模块实现复杂任务的自动化处理。智能体的核心架构大模型决策中枢负责任务分解与策略生成如 GPT-4、DeepSeek规划能力分析、拆解复杂任务工具与行动调用外部工具如搜索引擎、API执行操作记忆机制短期记忆对话上下文与长期记忆向量数据库多智能体协同多个专业智能体协作完成复杂任务常用智能体框架框架是否开源特点LangChain/LangGraph开源模块化设计支持任务编排与记忆问答CrewAI开源基于角色分工的多智能体协作AutoGen开源多智能体对话与动态工具调用Dify开源低代码平台支持可视化工作流字节扣子Coze商用拖拽式设计集成 60 插件百度文心智能体商用低代码开发500 预置 API腾讯元器商用对接微信/QQ 生态支持 3D 虚拟形象小结智能体是大模型应用的核心形态掌握智能体的开发是进入大模型应用领域的关键一步。二、LangChain 简介从副业到生态帝国发展历史LangChain 由 Harrison Chase 于 2022 年 10 月发起最初只是一个 800 行代码的个人副业项目。在 Stable Diffusion 发布后、ChatGPT 问世前的窗口期Harrison 通过大量技术交流提炼出开发者构建 LLM 应用的共性需求最终将 LangChain 发展为全球增长最快的开源项目之一。2023 年 4 月LangChain 获得 Benchmark 领投的 1000 万美元种子轮融资一周后又完成红杉领投的 2500 万美元 A 轮融资估值达 2 亿美元。优点高度模块化提供 700 集成覆盖 10 大类组件模型与基础设施中立支持多种 LLM、向量数据库、工具快速开发少量代码即可完成 RAG、智能体等应用双语言支持Python 与 TypeScript缺点控制权不足高层接口易用但定制化困难文档与版本问题破坏性更改、依赖冲突、文档过时学习曲线功能丰富导致概念繁多小结LangChain 是 LLM 应用开发的“胶水”与“粘合剂”极大降低了开发门槛但也带来了控制权与复杂性的挑战。三、LangChain 1.x 的重大改进1. 底层更换为 LangGraph旧版 LangChain 使用有向无环图DAG编排任务无法支持动态流程、分支并行、人工介入等复杂场景。LangGraph 引入图结构Graph支持循环工作流与状态管理成为 LangChain 1.x 的底层引擎。2. 整合 API旧版创建智能体有十几种 API如create_react_agent、create_json_agent新版统一为create_agent大幅降低学习成本。3. 引入 Middleware中间件在大模型自主规划与人工控制之间中间件提供了关键节点的控制与纠偏能力使智能体行为更可控。4. DeepAgent基于 LangGraph 构建的生产级智能体库具备规划工具、文件系统、子代理与详尽系统提示能更可靠地处理复杂任务。四、LangChain 生态演化早期生态LangChain 0.xLangChain-Core内核与表达式语言LangChain-Community第三方集成LangSmith调试、测试、监控平台LangServe部署为 REST APILangGraph 时代1.x底层统一为 LangGraph集成整合为 Integrations新增 LangGraph Platform 部署工具统一 APIcreate_agent高级 APIDeepAgent界面组件AgentChatUI图形化测试LangSmith Studio小结LangChain 1.x 本质上是 LangGraph 的封装在保留品牌价值的同时提供了更强大、更可控的智能体开发体验。五、LangChain 1.x 入门实战环境准备安装依赖pip install langchain langgraph langchain-community本地需要运行 Ollama 并拉取模型如qwen2.5:7b。或者选择线上大模型,烧Token的方式1. 最简代码示例from langchain.agents import create_agent from langchain.chat_models import init_chat_model def get_weather(city: str) - str: 给出指定城市的天气情况 return f{city}的天气一直是万里无云 model init_chat_model( modelqwen2.5:7b, model_providerollama, base_urlhttp://localhost:11434/ ) agent create_agent( modelmodel, tools[get_weather], system_prompt你是一个功能强大的智能助手, ) result agent.invoke( {messages: [{role: user, content: 北京的天气怎么样}]} ) print(result[messages][-1].content)create_agent的核心是一个ReActReasoning Acting推理行动模式的执行循环。它的工作流程是思考 - 行动可选- 观察 - 再思考 - ... - 最终回答。Tool工具只是这个循环中“行动”环节的备选项只有当模型在“思考”后认为需要外部信息时才会调用。下面我们来详细拆解一下它的执行机制。Agent的执行机制一个决策循环当你调用agent.invoke后内部会启动一个循环其工作流如下图所示这个循环的每一步都至关重要调用模型进行推理 (LLM Node)Agent将你提供的system_prompt“你是一个功能强大的智能助手”、历史对话消息“北京的天气怎么样”以及所有工具的描述函数名、参数、文档字符串一并发送给大模型你的qwen2.5:0.5b。模型的任务不是直接回答而是思考下一步该做什么。它会根据用户问题的性质来决定是直接生成答案还是调用某个工具获取更多信息。模型做出决策针对“北京的天气怎么样”这个问题模型通过分析工具的描述get_weather函数的注释给出指定城市的天气情况会“意识”到自己不知道北京的实时天气但有一个工具可以提供这个信息。于是模型不会输出文本答案而是输出一个工具调用指令。这个指令是一个结构化的数据包含了要调用的工具名get_weather和参数city: 北京。执行工具 (Tools Node)Agent的执行器接收到这个工具调用指令后会在本地的Python环境中真正执行你的get_weather(北京)函数。函数执行后返回字符串结果北京的天气一直是万里无云。将观察结果返回给模型 (Observation)这个工具执行的结果会被包装成一条消息再次发送给最初的大模型。模型生成最终答案模型现在拥有了用户的问题和工具返回的“事实”。它会基于这两者进行最后的推理和语言组织。模型意识到“我已经通过工具获得了天气信息用户只是想知道天气不需要再做其他事了。”于是它将这些信息组织成自然、友好的最终答案例如“根据查询北京目前的天气是万里无云。”。循环终止Agent检查模型的最终输出发现没有新的工具调用指令于是判定任务完成将这个最终答案作为invoke的结果返回给你。 用户输入 → 模型思考 → 决策分支 ↓ 需要工具 不需要工具 ↓ ↓ 调用工具 直接回答 ↓ 获得结果 ↓ 再次思考 ↓ 最终回答 运行逻辑智能体判断需要调用get_weather工具参数city北京工具返回“北京的天气一直是万里无云”大模型组织最终回答2. 系统提示词SYSTEM_PROMPT 你是一位专业的天气预报人员。 如果用户查询天气请确认具体地点必要时使用 get_user_location 工具。 agent create_agent( modelmodel, tools[get_weather], system_promptSYSTEM_PROMPT, )3. 创建工具支持运行时上下文from dataclasses import dataclass from langchain.tools import tool, ToolRuntime dataclass class SessionContext: user_id: str session_token: str user_role: str # admin, user, guest request_id: str tool def get_user_permissions(runtime: ToolRuntime[SessionContext]) - list: 根据会话获取用户权限 ctx runtime.context # 可以根据不同角色返回不同权限 if ctx.user_role admin: return [read, write, delete, manage_users] elif ctx.user_role user: return [read, write] else: return [read] # 使用 agent create_agent( modelmodel, tools[get_user_permissions], context_schemaSessionContext ) # 不同用户会话传入不同上下文 admin_session SessionContext( user_idadmin_001, session_tokentoken_abc, user_roleadmin, request_idreq_001 ) result agent.invoke( {messages: [{role: user, content: 我能删除数据吗}]}, contextadmin_session # 管理员上下文 ) # Agent会调用get_user_permissions发现可以删除场景1使用普通工具用户北京的天气怎么样 → Agent调用 get_weather_for_location(city北京) → 结果北京的天气一直是万里无云场景2使用带上下文的工具用户我这里的天气怎么样用户没有说位置 → Agent思考用户没说位置但我有get_user_location工具 → Agent调用 get_user_location() → 工具从 runtime.context.user_id1 得知用户是北京 → 工具返回北京 → Agent再调用 get_weather_for_location(city北京) → 最终回答根据您的定位北京的天气一直是万里无云✅context_schema 声明上下文应该长什么样类型定义✅context实例 提供具体的数据实际对象✅ 工具通过runtime.context访问这些数据这种设计模式的好处类型安全IDE可以自动补全和类型检查解耦工具定义不依赖具体数据来源灵活不同运行场景可以传入不同上下文可测试可以轻松mock上下文进行单元测试4. 配置模型参数from langchain.chat_models import init_chat_model # 方法1直接在初始化时设置 model init_chat_model( modelqwen2.5:0.5b, model_providerollama, base_urlhttp://localhost:11434/, temperature0.8, # 中等创造性 num_predict256 # 限制输出长度 ) # 方法2在调用时动态设置 model init_chat_model( modelqwen2.5:0.5b, model_providerollama ) response model.invoke( 给我讲个笑话, config{ temperature: 0.8, num_predict: 256 } )1.temperature0.8- 控制随机性/创造性作用范围0.0 到 2.0不同模型略有差异Temperature值行为特点适用场景0.0 - 0.3确定性高每次都选概率最高的词代码生成、数据提取、数学计算0.4 - 0.7平衡创造性和准确性一般对话、问答系统0.8 - 1.2创造性高输出多样化创意写作、头脑风暴1.3 - 2.0非常随机可能不连贯实验性应用temperature0.8 的影响✅ 输出会有一定变化不会每次都一样✅ 适合对话场景显得更自然⚠️ 可能会有一些意外的输出⚠️ 不适合需要精确答案的场景2.num_predict256- 限制输出长度作用限制模型生成的最大token数不是字数Token vs 字数英文1 token ≈ 0.75 个单词中文1 token ≈ 0.5-1 个汉字5. 添加记忆多轮对话from langgraph.checkpoint.memory import InMemorySaver checkpointer InMemorySaver() agent_with_memory create_agent( modelmodel, checkpointercheckpointer ) config {configurable: {thread_id: 1}} while True: user_input input(请输入您的问题) response agent_with_memory.invoke( {messages: [{role: user, content: user_input}]}, configconfig ) print(智能助手回答 response[messages][-1].content)6. 完整示例天气助手 记忆from langchain.agents import create_agent from langchain.tools import tool, ToolRuntime from langgraph.checkpoint.memory import InMemorySaver from langchain.chat_models import init_chat_model from pydantic import BaseModel SYSTEM_PROMPT 你是一位专业的天气预报人员。 你可以使用下面两个工具: - get_weather_for_location: 指定一个地点给出该地点的天气情况 - get_user_location: 获取用户的位置信息 如果用户查询天气请确认你知道具体地点如果从用户的问题中能判断出用户要查询他所在地点的天气使用get_user_location工具来定位 class Context(BaseModel): 用户运行时上下文的schema. user_id: str tool def get_weather_for_location(city: str) - str: 给出指定城市的天气情况 return f{city}的天气一直是万里无云 tool def get_user_location(runtime: ToolRuntime[Context]) - str: 根据user_id确定用户所在位置,仅在需要明确知道用户位置时调用 user_id runtime.context.user_id return 北京 if user_id 1 else 上海 # 配置模型 model init_chat_model( modelqwen2.5:0.5b, model_providerollama, base_urlhttp://localhost:11434/, ) # 硅基流动SiliconFlow的 API # model init_chat_model( # modeldeepseek-ai/DeepSeek-V3, # model_provideropenai, # api_keysk-sksksksksksksksksksksksksksksk, # base_urlhttps://api.siliconflow.cn/v1 # ) # deepseek官网 API # model init_chat_model( # modeldeepseek-chat, # model_providerdeepseek, # api_keysksksksksksksksksksksksksksksk, # base_urlhttps://api.deepseek.com # ) # 设置记忆 checkpointer InMemorySaver() # 创建智能体 agent create_agent( modelmodel, system_promptSYSTEM_PROMPT, tools[get_user_location, get_weather_for_location], context_schemaContext, checkpointercheckpointer ) # 如果使用记忆必须带有config # thread_id 对于每次谈话是唯一的. config {configurable: {thread_id: 1}} # 运行agent response agent.invoke( {messages: [{role: user, content: 今天外面天气怎样}]}, configconfig, contextContext(user_id1) ) print(response) print(response[messages][-1].content) # 可以指定thread_id选择相应的对话继续进行对话. response agent.invoke( {messages: [{role: user, content: 谢谢你}]}, configconfig, contextContext(user_id1) ) print(response) print(response[messages][-1].content)流程图:BaseModel细节解析BaseModeldataclass 自动验证 自动序列化 更丰富的功能在 LangChain 中使用BaseModel定义上下文能获得更好的类型安全和错误提示对于简单的场景dataclass也完全够用但BaseModel是更专业的选择整体流程口述:第1步上下文组装Agent将system_prompt ➕ 历史对话信息 ➕ 工具描述(函数名、参数、文档说明)发给大模型,⚠️工具文档说明很重要——它是给大模型看的使用说明书。第2步模型决策大模型思考做出决策是直接返回结果还是去按需使用提供的工具库第3步工具执行如果使用工具库,大模型会将参数和工具调用指令发给Agent,Agent执行完返回给大模型结果第4步再次决策大模型继续思考是直接返回结果还是去按需使用提供的工具库,这里咱们直接返回结果第5步任务完成Agent检查结果,发现没有新的工具调用指令,判定任务完成,返回最终结果7.模型的输入输出def useMsg(): from langchain.messages import HumanMessage,AIMessage,SystemMessage from langchain.chat_models import init_chat_model # 初始化本地 Ollama 模型 model init_chat_model( modelqwen2.5:7b, model_providerollama, base_urlhttp://localhost:11434/ ) systemMsg SystemMessage(你是一位能力很强的个人助手) humanMsg HumanMessage(你好请介绍一下你自己) messages [systemMsg,humanMsg] print(messages) response model.invoke(messages) print([response]) if __name__ __main__: useMsg()8.结构化输出def normalOutPut(): from langchain.chat_models import init_chat_model model init_chat_model( modelqwen2.5:7b, model_providerollama, base_urlhttp://localhost:11434/ ) response model.invoke(输出电影《Inception》的详细信息) print(response.content) def pydanticOutPut(): from pydantic import BaseModel,Field from langchain.chat_models import init_chat_model class Movie(BaseModel): a movie with details title: str Field(...,description电影名称) year: int Field(...,description电影发行年份) director: str Field(...,description电影的导演) rating: float Field(...,description电影的评分满分为10份) model init_chat_model( modelqwen2.5:7b, model_providerollama, base_urlhttp://localhost:11434/ ) modelWithStructuredOutput model.with_structured_output(Movie) response modelWithStructuredOutput.invoke(输出电影《Inception》的详细信息) print(response) if __name__ __main__: normalOutPut() pydanticOutPut()9.流式输出def testStream1(): from langchain.chat_models import init_chat_model # 初始化本地 Ollama 模型 model init_chat_model( modelqwen2.5:7b, model_providerollama, base_urlhttp://localhost:11434/ ) for chunk in model.stream(你好好久不见): print(chunk.text,end|,flushTrue) if __name__ __main__: testStream1()10.批量输出#批量启动推理全部推理完成后统一返回 def returnBatchResult(): from langchain.chat_models import init_chat_model # 初始化本地 Ollama 模型 model init_chat_model( modelqwen2.5:7b, model_providerollama, base_urlhttp://localhost:11434/ ) responses model.batch( [你是谁, 天空为什么是蓝色的, 11等于几] ) for response in responses: print(response) #批量启动推理完成的条目随时返回 def returnItemResult(): from langchain.chat_models import init_chat_model # 初始化本地 Ollama 模型 model init_chat_model( modelqwen2.5:7b, model_providerollama, base_urlhttp://localhost:11434/ ) responses model.batch_as_completed( [你是谁, 天空为什么是蓝色的, 11等于几] ) for response in responses: print(response) #设置最大并发分批启动推理统一返回 def setMaxConcurrency(): from langchain.chat_models import init_chat_model # 初始化本地 Ollama 模型 model init_chat_model( modelqwen2.5:7b, model_providerollama, base_urlhttp://localhost:11434/ ) responses model.batch( [你是谁, 天空为什么是蓝色的, 11等于几], config{ max_concurrency:2, } ) for response in responses: print(response) if __name__ __main__: returnBatchResult() returnItemResult() setMaxConcurrency()六、总结与实操要点问题答案如何调用大模型init_chat_model指定 model、model_provider、base_url如何使用系统提示词create_agent的system_prompt参数如何添加工具使用tool装饰器放入tools列表如何配置模型init_chat_model中传入temperature、num_predict等参数如何添加记忆实例化InMemorySaver作为checkpointer传入并在invoke时提供configLangChain 1.x 通过统一 API、底层 LangGraph 支持和丰富的生态组件大幅提升了智能体开发的效率与可控性。掌握这些基础你就能快速构建属于自己的大模型应用。下一步尝试修改系统提示词、添加更多工具并部署到 LangGraph Platform 上体验生产级能力。