十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

LangChain实战:从模型调用到Agent工具开发

LangChain实战:从模型调用到Agent工具开发 很多人学 LangChain 都有一种相似的困惑教程看了一堆每个概念都认识什么 Model、Prompt、Chain、Agent、Memory、Tool 都背得出来但真到自己动手写一个能查资料、能调用工具、能自动决策的 Agent 时却不知道从哪一行代码开始。另一个更刺激的问题是2026 年了LangChain 是不是已经过时了网上天天有人说 LLM 应用开发应该直接学 LangGraph、LaMDA 或者原生 SDKLangChain 就是一层没必要存在的封装。我的判断是**LangChain 没有过时过时的是只把 LangChain 当成“搭链子工具”来用的那批学习方式。**它真正的价值沉淀早就不在 Chain 上而在 Model、Tool、Memory、Agent 这一整套大模型应用的工程抽象里。搞懂这套抽象再看 LangGraph 或者任何新框架都是降维打击。这篇文章不是又一个概念百科。我会先用最小示例跑通 Model 调用再带你逐步理解 Agent 的原理最后完整落地一个“能查时间、能查天气、能算数”的资料查询助手。全程有可复制代码、有预期输出、有排错清单建议先收藏再动手。1. 这篇文章真正要解决的问题先泼一盆冷水LangChain 最容易被误解的地方恰好是它最核心的地方。很多人把它理解成“一个把大模型 API 包了一层的工具库”于是学完 Chain、Memory 之后发现自己写业务代码根本用不上或者用了反而更别扭。这不是框架的问题是学习视角的问题。LangChain 真正解决的是三类工程问题第一模型调用的标准化。今天项目里可能同时用到 OpenAI 兼容接口、通义千问、本地 Ollama 模型不同服务商的请求格式不一样。LangChain 用统一的ChatModel接口屏蔽掉这些差异模型可以换来换去业务代码不需要大改。第二AI 应用的结构化。大模型本身只能“输入输出文本”但一个真实应用需要提示词模板、历史记忆、外部工具、权限控制、日志追踪。LangChain 把这些问题抽象成模块让开发者不用每次从零开始搭。第三Agent 决策循环的落地。Agent 不是一个玄学概念而是一套“模型循环调用工具直到完成任务”的机制。LangChain 提供了 ReAct 等范式把“思考—行动—观察”变成了可控代码。这篇文章适合三类读者刚入门 LLM 应用开发想要一条不绕弯的学习路径。在公司里做 AI 应用原型需要用最短时间验证“模型 工具”到底能解决什么业务问题。准备面试的研发同学因为 LangChain 相关的高频面试题基本都集中在 Model 抽象、Agent 原理、LangGraph 关系这三个方向。读完之后你至少能回答三个问题LangChain 的 Model 层到底怎么用Agent 的工作原理是什么怎么从零写一个带工具的完整项目2. LangChain 核心概念先建立五个心智模型在写代码之前先花几分钟把概念地图建立起来。LangChain 的核心抽象可以浓缩成六个词比背 API 重要得多。抽象一句话解释没有它的时候会怎样Model封装大模型调用统一输入输出每个服务商写一套请求代码换模型就重写Prompt消息模板和变量渲染提示词散落在字符串拼接里无法复用Tool让模型能调用外部函数模型只能聊天不能查天气、算数、操作数据库Memory管理多轮对话历史每次对话都要自己拼历史容易超长Agent模型主导的“决策—调用”循环只能走固定流程无法根据问题动态选择工具Chain / 图把上述组件编排成可执行流程所有逻辑堆在业务代码里无法追踪2.1 Model一切从“聊天模型”开始Model 层是整个框架的地基。你要记住的 API 就一个invoke方法。不管是 OpenAI、ChatGLM、DeepSeek 还是 Ollama 本地模型只要实现了BaseChatModel接口调用方式都是一样的。from langchain_openai import ChatOpenAI llm ChatOpenAI(modelgpt-4o-mini, temperature0) answer llm.invoke(什么是 LangChain) print(answer.content)2.2 Prompt提示词工程也需要工程化很多人写提示词就靠一个 f-string 拼变量这在 demo 里没问题进了生产环境就不行了。LangChain 的ChatPromptTemplate把“系统指令”和“用户输入”分离开变量单独声明方便测试和复用。2.3 ToolAgent 的能力来源Tool 是 LangChain 里最容易被低估的组件。模型本身不会做数学运算、不会查资料、不能读数据库但通过tool装饰器注册一个普通函数模型就能在 Agent 循环里“主动”调用它。这是后面实战项目最重要的机制。2.4 Memory多轮对话的隐藏难点模型接口默认是无状态的。每次invoke都是全新对话如果你想做客服机器人就必须把历史消息重新传进去。Memory 的难点不在“记住”而在“控制长度”否则上下文很容易超限。2.5 Agent从“流程执行”到“自主决策”Chain 是写死的固定流程比如“先总结再翻译最后写摘要”。Agent 不同它把决策权交给模型用户问什么模型自己决定先调哪个工具、看到结果后下一步做什么。这是两者最本质的差别。这里需要强调一个观点**理解 Agent不能停留在“它会自己调工具”这个层面要理解它背后的循环机制。**下一章的 ReAct 就是完整解释这个机制的原型。3. 环境准备与前置条件这一章直接给你一套可以完整运行的环境搭建流程。版本号不写死以你安装时的官方最新版本为准但包名和思路是稳定的。3.1 环境清单Python 3.10 及以上推荐 3.11。一个 API Key来自 OpenAI、DeepSeek 或其他兼容服务商或者本地 Ollama。包管理工具推荐pip或uv。3.2 创建虚拟环境无论你用 Windows、macOS 还是 Linux强烈建议先建虚拟环境避免和系统 Python 的依赖冲突。python -m venv .venv source .venv/bin/activate # Windows 上执行 .venv\Scripts\activate pip install --upgrade pip3.3 安装 LangChain 核心包LangChain 现在是按领域拆分的多包结构这也是很多人初学容易乱的原因。安装下面几个包就能覆盖本文章的所有示例pip install langchain langchain-openai langchain-core langchain-communitylangchain: 主体框架包含 Chain、Agent 编排逻辑。langchain-core: 最核心的抽象如 BaseMessage、ChatPromptTemplate、tool 装饰器。langchain-openai: OpenAI 兼容接口的模型适配器。langchain-community: 社区工具集成比如搜索引擎、文档加载器。如果后面要实操本地模型再额外安装pip install langchain-ollama3.4 配置 API Key 和 Base URL本地开发建议把密钥放在.env文件里不要把 Key 写死在代码中。# 文件路径.env LLM_API_KEYsk-xxxxxxxxxxxxx LLM_BASE_URLhttps://api.openai.com/v1 LLM_MODELgpt-4o-mini加载.env文件需要python-dotenvpip install python-dotenv# 文件路径examples/load_env.py import os from dotenv import load_dotenv load_dotenv() api_key os.environ[LLM_API_KEY] base_url os.environ.get(LLM_BASE_URL, https://api.openai.com/v1) model_name os.environ.get(LLM_MODEL, gpt-4o-mini)这里介绍一个非常实用的特性**你的模型服务只需要提供 OpenAI 兼容接口就可以直接使用ChatOpenAI通过base_url接入。**所以不管底层是哪个模型代码都可以保持一致这也是 LangChain Model 层最值得学习的工程思想。4. Model 模型基础调用跑通第一个最小示例现在开始写代码。我用一个“最小可运行”的思路带你过三种常见模型接入方式。4.1 方式一通过 OpenAI 兼容接口调用这是最通用的方式。下面的代码演示了最基础的对话调用# 文件路径examples/01_basic_model.py import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI load_dotenv() api_key os.environ[LLM_API_KEY] base_url os.environ.get(LLM_BASE_URL, https://api.openai.com/v1) model ChatOpenAI( modelgpt-4o-mini, api_keyapi_key, base_urlbase_url, temperature0.3, ) response model.invoke(请用三句话解释 ReAct 是什么) print(response.content)运行方式cd examples python 01_basic_model.py预期输出是模型生成的一段关于 ReAct 的中文解释。只要你能看到print输出的文字就说明模型调用链路已经通了。这段代码里最值得关注的两个参数temperature控制随机性。0 表示输出更确定适合工具调用和数据分析0.7 以上适合创意文本。base_url这是接第三方 API 的入口。很多国内模型的官方 SDK 不统一但只要提供v1/chat/completions格式的接口就能用ChatOpenAI无缝接入。4.2 方式二接入本地 Ollama 模型如果你想完全离线运行或者想验证模型抽象的价值建议用 Ollama。只要本地ollama pull好模型比如qwen2.5:7b代码几乎不用变# 文件路径examples/02_local_model.py from langchain_ollama import ChatOllama model ChatOllama( modelqwen2.5:7b, temperature0, ) response model.invoke(请用一句话介绍你自己) print(response.content)注意这两段代码的共同点调用方式完全一致都是model.invoke(...)。这说明 LangChain 的 Model 抽象真的做到了“模型可替换”。4.3 使用 Prompt 模板和结构化输出实际业务中你不会只传一句用户输入通常还有系统角色、上下文、格式要求。这时要用ChatPromptTemplate# 文件路径examples/03_prompt_template.py from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate load_dotenv() model ChatOpenAI(modelgpt-4o-mini, temperature0.5) prompt ChatPromptTemplate.from_messages( [ (system, 你是一个资深的 {role}回答问题时请使用通俗易懂的语言。), (human, {question}), ] ) chain prompt | model response chain.invoke({role: 后端技术专家, question: 什么是 RAG它解决了什么问题}) print(response.content)这里出现了一个 LangChain 非常有代表性的操作符prompt | model。这条管道符号表示“把 prompt 的结果传给 model”LangChain 里|就是链式组件调用的语法糖简洁又直观。结构化输出也是高频需求。比如你希望模型返回 JSON而不是自由文本# 文件路径examples/04_structured_output.py from pydantic import BaseModel, Field from dotenv import load_dotenv from langchain_openai import ChatOpenAI load_dotenv() class ArticleOutline(BaseModel): title: str Field(description文章标题) sections: list[str] Field(description章节标题列表) model ChatOpenAI(modelgpt-4o-mini, temperature0.5) structured_model model.with_structured_output(ArticleOutline) outline structured_model.invoke(请为《AI Agent 入门》这篇博客列一个大纲) print(outline.title) print(outline.sections)with_structured_output会根据你定义的 Pydantic 模型自动约束模型输出格式这是目前最推荐的“让大模型返回结构化数据”的方式比自己写 JSON 解析可靠得多。到这里你已经掌握了 Model 层最核心的三个能力统一调用、模板渲染、结构化输出。接下来进入本文的高潮部分Agent。5. 从 Chain 到 AgentAgent 的工作原理与范式为什么很多初学者把 Agent 理解成“自动调工具的魔法”之后写出来的代码一跑就出问题因为没搞懂它内部的循环机制。5.1 ReAct 循环一段必须理解的核心机制ReActReason Act是 Agent 最经典的范式。它把模型决策拆成四个阶段循环执行Thought思考模型根据当前问题判断需要什么信息。Action行动模型从已注册工具列表里选择一个工具并生成调用参数。Observation观察代码真正执行工具把结果返回给模型。Final Answer最终回答模型判断已经拿到足够信息停止循环输出回答。没有工具时模型只能“空想”答案。有了 ReAct 循环模型就可以在实践中拿数据修正判断。这就是 Agent 和 Chain 的本质区别Chain 是开发者预先编排的固定流程Agent 是模型主导的动态决策流程。5.2 AgentExecutor 与 LangGraph 的关系很多人在看清“langgraph和langchain的区别”这个问题时被绕晕简单讲AgentExecutor是 LangChain 提供的一个高级封装拿着 agent 对象和 tools 就能运行内部自动处理 ReAct 循环。LangGraph是 LangChain 团队推出的低层编排框架用图结构精准控制每个节点和边适合复杂、可控、需要人类介入的生产级流程。它们不是二选一的对立关系而是“封装程度不同”。快速做原型用AgentExecutor正式生产或需要精细控制时用LangGraph重写。我在实战项目中常用一个判断标准如果循环逻辑简单就别用图AgentExecutor 足够如果涉及条件分支、并行、人工审核、循环回退就用 LangGraph。5.3 什么时候真的需要 Agent不是所有场景都需要 Agent。一个常见的误区是所有需求都上 Agent结果又慢又贵又不稳定。下面是更稳妥的选择参考场景推荐方案原因固定流程的数据清洗Chain流程确定成本低带工具的问答机器人Agent需要动态判断查资料还是查库多步流程且需要人工确认LangGraph可控性强容易插入审核节点单轮 API 转发直接调 Model没必要引入框架6. Agent 完整项目实战构建一个带工具的资料查询助手理论讲完进入完整项目实战。我们的目标是构建一个“智能助手”它具备三个能力能查询当前时间。能计算多位数字加减乘除。能查询指定城市的天气用模拟数据方便本地运行。这个助手会通过 ReAct 循环自动判断用户问时间就调时间工具问算术就调计算工具问天气就调天气工具。整个过程不需要硬编码分支判断。6.1 项目目录结构agent-demo/ ├── .env ├── requirements.txt └── agent_app.py6.2 定义工具每个工具用tool装饰器注册函数名就是模型看到的工具名docstring 就是模型判断“什么时候该用这个工具”的依据。docstring 写得越清楚Agent 选错工具的几率越低。# 文件路径agent_app.py from datetime import datetime from langchain_core.tools import tool tool def get_current_time() - str: 获取当前的日期和时间。当用户询问现在几点、今天日期时使用。 return datetime.now().strftime(%Y-%m-%d %H:%M:%S) tool def calculate(expression: str) - str: 计算数学表达式。当用户需要加减乘除、求幂等数学运算时使用。 参数 expression 是数学表达式字符串例如 3 5 * 2。 try: result eval(expression, {__builtins__: {}}, {}) return str(result) except Exception as e: return f表达式错误: {e} tool def get_weather(city: str) - str: 查询指定城市的天气。当用户询问天气、温度、是否下雨时使用。 参数 city 是城市名称例如 北京。 weather_map { 北京: 晴25℃西南风2级, 上海: 阵雨27℃东南风3级, 广州: 多云转阴30℃南风1级, 深圳: 雷阵雨29℃西南风2级, } return weather_map.get(city, f暂无 {city} 的天气数据)需要特别小心calculate工具里的eval。在这个演示项目里它的输入由大模型生成存在注入风险仅限于本地学习使用。生产环境要换成安全的表达式解析库不能直接eval我会在最佳实践章节再强调。6.3 构建 Agent 并执行# 文件路径agent_app.py续 from dotenv import load_dotenv from langchain.agents import create_react_agent, AgentExecutor from langchain_openai import ChatOpenAI load_dotenv() tools [get_current_time, calculate, get_weather] model ChatOpenAI( modelgpt-4o-mini, temperature0, ) agent create_react_agent(model, tools) executor AgentExecutor( agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue, ) questions [ 现在几点了, 帮我算一下 158 乘以 236 等于多少, 上海今天天气怎么样, ] for q in questions: print(f\n 问题{q} ) result executor.invoke({input: q}) print(f最终回答{result[output]})这里有几个关键点create_react_agent(model, tools)传入模型和工具列表返回一个 ReAct agent。不传 prompt 时使用默认 ReAct 模板模板中会自动包含工具列表和 multi-step 能力。AgentExecutor负责执行 agent 的循环逻辑verboseTrue能打印模型的每一步思考过程这是调试 Agent 最有用的设置。handle_parsing_errorsTrue模型偶尔会输出不合规的格式这个开关能把解析错误返回给模型重试大大提高成功率。6.4 安装依赖并运行pip install langchain langchain-openai langchain-core langchain-community python-dotenv python agent_app.py注意项目里要提前创建.env内容参考第 3 章。7. 运行结果与效果验证当你打开verboseTrue运行后控制台会出现类似下面的内容它揭示了 Agent 的内部决策过程。 问题帮我算一下 158 乘以 236 等于多少 Entering new AgentExecutor chain... Thought: 用户需要计算158乘以236我需要使用calculate工具。 Action: calculate Action Input: 158 * 236 Observation: 37288 Thought: 我已经知道计算结果是37288现在可以回答用户了。 Final Answer: 158 乘以 236 等于 37288。 Finished chain. 最终回答158 乘以 236 等于 37288。这就是 ReAct 循环的可视化过程。通过观察 Thought 和 Action你能立刻判断模型是否选对了工具、工具是否返回了预期结果。验证三个问题是否都能正确回答时间问题应该输出当前日期时间。算术问题应该输出正确计算结果。天气问题应该输出对应城市的模拟天气。如果某个问题没有调工具就直接回答了或者使用完全错误的工具优先按顺序排查检查docstring是否写清楚了工具的用途。检查verboseTrue的打印日志看模型当时是怎么“思考”的。检查temperature是否设成了 0如果不是 0模型可能随机生成工具参数导致结果不稳定。8. 常见问题与排查思路实战中最容易踩的坑集中在这一张表里。建议直接截图保存。问题现象可能原因排查方式解决方案调用模型报 401 / 404API Key 错误、Base URL 不正确检查 .env 是否加载成功单测直接 curl 模型接口修正密钥或 base_url确认模型名是服务商支持的名称报错这个模型名称不被支持模型名填错或服务商未开通该模型查看服务商文档的平台模型列表换成服务商支持的模型名本文示例名称不一定在每家可用上下文长度超限多轮对话历史太长查看报错信息中的 tokens 数量和模型上限使用 Memory 裁剪历史或开启 summarization 压缩Agent 陷入死循环工具返回格式让模型无法确定下一步检查 verbose 日志观察每轮 Action 是否重复给工具 docstring 增补“何时不需要使用”增加 max_iterations 限制工具调用报“参数错误”模型生成参数和函数签名不一致查看 Observation 里的异常信息工具参数用简单类型并在 docstring 中写明参数含义解析失败Agent stopped模型输出不符合 ReAct 格式开启 handle_parsing_errorsTrue 观察重试情况换更强模型减少工具数量增大 max_retries依赖冲突langchain 各包版本不一致pip list查看已安装版本统一升级到最新版本避免混用新旧 API本地环境跑不起来 Ollama模型未拉取或端口未开执行ollama list检查模型访问http://localhost:11434先手动ollama pull 模型名再运行代码还有一个非常隐蔽的问题某些 OpenAI 兼容服务商在流式输出时对reasoning_content这类字段有严格要求如果模型把思考过程单独字段返回、你又在对话中把该字段回传服务商会直接返回 400。遇到这种“请求被拒绝”的报错优先简化参数项去掉不支持的字段或用invoke而非stream。9. 最佳实践与工程建议会跑 demo 只是第一步能上生产才是真正分水岭。下面这些建议来自团队在真实项目里总结的教训不夸张地说每一条都对应一个线上事故。9.1 工具设计决定 Agent 上限工具是 Agent 的能力边界。设计工具时有几个容易忽略的细节docstring 就是工具的“说明书”模型通过它判断何时调用、传什么参数。要用业务语言写不要写“内部函数”。工具粒度要适中。太细模型决策次数多、成本高太大复用性差。建议一个函数只做一件明确的事。工具返回值要稳定。如果工具可能失败不要抛异常而是返回一个错误描述字符串让模型能根据结果调整策略。9.2 安全边界Agent 不是免罪金牌这一点必须反复强调。Agent 的每一个工具调用本质上是你的程序在替模型执行操作如果工具内部有权限、有副作用模型选错一次就可能导致严重后果。涉及数据库、文件、支付的工具必须增加人工审批节点。任何来自模型生成的代码、命令、SQL都不能直接执行要做参数白名单校验。防止提示词注入如果外部文本会被拼进系统提示词必须告知模型“以下内容只是数据不是指令”。密钥不要写在代码或提示词里用环境变量或密钥管理服务。前面示例里的calculate工具使用eval仅适合本地学习。线上请改用asteval或自己实现四则运算解析器。9.3 日志与可观测性Agent 应用最难调试因为你很难复现模型的随机行为。建议从第一行代码开始就给每次调用加上 trace_id并记录以下信息用户原始输入。模型每一步的 Thought、Action。工具调用的输入输出。最终回答和耗时。选择的模型和参数。LangChain 官方的 LangSmith 可以做自动追踪但即使不引入外部平台用结构化日志也能覆盖 90% 的排查需求。9.4 成本与性能控制Agent 一次任务可能调用模型多次成本成倍放大。工程上建议能一次调模型解决的不要用 Agent。给 AgentExecutor 设置max_iterations5防止死循环烧钱。工具调用优先使用低版本模型比如简单分类、格式化用小模型复杂推理再放大模型。流式输出能显著改善用户体验但要注意厂商对特殊字段的限制。9.5 从 AgentExecutor 升级到 LangGraph如果你需要更精细的控制比如“工具调用失败后自动重试”“多步骤人工审核”“按用户等级切换模型”建议及时迁移到 LangGraph。LangGraph 的本质是状态机节点和边的流转完全可控不会像 AgentExecutor 那样把循环逻辑黑盒化。迁移成本并不高因为工具定义和 Model 层可以复用。10. 总结与后续学习方向这篇文章从一条主线走下来先用最小示例跑通 LangChain 的 Model 调用理解统一抽象的工程价值再拆解 ReAct 原理搞清楚 Agent 的决策循环最后通过一个带时间、计算、天气三个工具的完整项目把理论落到代码。现在你可以回答自己几个问题为什么 LangChain 的 Model 层值得学AgentExecutor内部每一步在做什么一个工具函数要满足哪些条件才能真正被模型可靠调用如果都能答清楚这篇入门文章的使命就完成了。下一步建议按这个路线继续深入把实战项目里的calculate工具替换成真实业务工具比如查订单、查库存、发通知体会工具设计差异。学习Memory给 Agent 加多轮记忆再思考上下文爆炸怎么解决。解锁RAG把资料检索加入 Agent 工具链让模型回答有依据。研究LangGraph把同一个 Agent 用例用状态图重写一遍你会在对比中真正理解两者的边界。关注MCPModel Context Protocol它正在把工具接入标准化未来的 Agent 工具很可能不再直接写tool而是通过 MCP 协议复用生态里已经存在的工具。如果这篇文章对你有帮助建议收藏后面对照实操时随时翻出来看。读者里如果有已经在自己业务里跑过 Agent 的欢迎在评论区聊聊你踩过的坑——很多经验只有踩过才知道。
返回列表