上篇:LangChain Agent 智能体从入门到实战(一)—— 概念、工具定义与 MCP 协议

发布时间:2026/7/18 16:40:39
上篇:LangChain Agent 智能体从入门到实战(一)—— 概念、工具定义与 MCP 协议 从“固定流程”到“自主决策”让 LLM 自己决定下一步做什么。在前面的课程中我们学会了用 Chain链来编排固定的 LLM 调用流程。但现实世界的问题往往是开放的、动态的——你无法预先知道用户会问什么也无法提前写好所有分支逻辑。Agent智能代理应运而生。它把 LLM 当作“大脑”让模型自己决定调用哪些工具、按什么顺序执行直到完成任务。本文将带你理解 Agent 的核心思想学会用tool定义工具并通过 MCP 协议接入外部服务最终构建出第一个可用的 Agent。一、Agent 是什么为什么需要它1.1 从 Chain 到 AgentChain 的工作方式是预先定义好一条固定的处理流程输入数据按顺序流经每一步最终得到输出。这适合翻译、摘要等确定性任务。但有些任务无法预知路径。比如“帮我查查北京明天会不会下雨如果下雨帮我取消明天的户外预约。”要完成这个任务程序需要先查天气 API根据结果下雨/不下雨判断如果下雨再调用日程 API 取消预约如果不下雨直接回复。步骤 2 和 3 在编写代码时无法确定。你不能硬编码成一条 Chain因为每次用户输入不同路径也不同。Agent 的核心思想把 LLM 当作大脑让它自己决定下一步做什么。Chain开发者编排流程LLM 负责执行 → “你告诉它怎么做”AgentLLM 自主编排流程工具负责执行 → “你告诉它要做什么它自己想怎么做”1.2 核心组件与工作机制Agent 有四大核心组件但并非每个都必须具备。最简单的 Agent 只需要LLM Tools即可工作。组件角色说明① LLM大脑理解意图做出每一步决策中枢驱动② Tools工具执行 LLM 的决策与外部世界交互LLM“想”工具“做”③ Memory记忆存储上下文让 Agent“记住”对话历史为决策提供历史信息④ Planning规划分解复杂任务为可执行步骤隐含在推理过程和提示词中工作机制Agent 通过“感知 → 推理 → 行动”的循环来逐步完成任务。每轮循环LLM 都会判断“任务完成了吗”如果没完成就继续调用工具、观察结果、再推理直到给出最终答案。以“查天气并取消预约”为例第 1 轮LLM 推理 → 需要查天气 → 调用get_weather→ 返回“小雨”第 2 轮LLM 推理 → 明天下雨需要取消预约 → 调用cancel_appointment→ 返回“已取消”第 3 轮LLM 推理 → 任务完成 → 直接回复用户整个过程中没有任何代码预先规定“先查天气再取消预约”。执行路径是 LLM 动态决定的。1.3 什么时候用 Agent对比维度ChainAgent谁决定流程开发者在代码中预定义LLM 在运行时自主决定执行路径线性的、固定的循环的、动态的工具调用在固定位置调用固定工具LLM 按需选择调用次数不定适合任务结构明确、步骤固定开放式、需要判断和决策开发复杂度低较高实际建议任务流程固定用 Chain简单可靠任务需要动态判断和多步决策时用 Agent。二、工具定义让 Agent 拥有“手脚”Agent 的工具是它唯一能与外部世界交互的通道。LLM 负责“想”工具负责“做”。工具的描述写得好不好直接决定了 LLM 能不能正确地选择和调用它。2.1 工具调用的本质Function Calling当我们给 Agent 配置工具时实际发生的事情是你定义工具函数名 参数说明 功能描述LangChain 将工具信息转换成 JSON Schema随提示词发给 LLMLLM 阅读工具描述决定“要调用哪个工具、传什么参数”LLM 返回“工具调用指令”不是执行而是指令LangChain 框架接收指令在本地执行对应的函数执行结果返回给 LLMLLM 继续推理。关键理解LLM 自身不能执行任何工具它只是“调度员”。真正执行的是你的代码。2.2 LangChain 的 tool 装饰器LangChain 提供tool装饰器只需写一个普通 Python 函数加类型注解和 docstringLangChain 会自动生成 JSON Schema。pythonfrom langchain.tools import tool tool def get_weather(city: str, date: str) - str: 获取指定城市在指定日期的天气。 Args: city: 城市名称如“北京”、“上海” date: 日期格式为 YYYY-MM-DD # 实际调用天气 API这里用模拟数据 return f{city} 在 {date} 天气多云有下雨的可能性。三个影响 LLM 调用准确性的关键点要素作用写法建议函数名LLM 初步判断工具用途用清晰的动词名词如get_weatherdocstringLLM 理解工具具体功能写清楚“做什么”越具体越好参数类型注解LLM 决定传什么值每个参数都要有类型注解和说明当参数复杂时可以用 Pydantic 模型定义参数结构pythonfrom pydantic import BaseModel, Field class GetWeatherArgs(BaseModel): city: str Field(description城市名称如北京) date: str Field(description日期格式 YYYY-MM-DD) tool(args_schemaGetWeatherArgs) def get_weather(city: str, date: str) - str: 获取天气预报 return f{city} {date} 天气多云2.3 构建并调用 Agent使用create_agent函数将 LLM 和工具组装起来pythonfrom langchain.agents import create_agent from langchain.chat_models import init_chat_model from langchain_tavily import TavilySearch llm init_chat_model(modelgpt-4o-mini, model_provideropenai) search TavilySearch(max_results5) tools [get_weather, search] # 自定义 第三方工具 agent create_agent( modelllm, toolstools, system_prompt你是一个智能助手请根据用户需求调用合适的工具。 ) # 一次性调用 result agent.invoke({messages: [{role: user, content: 今天北京天气怎么样}]}) print(result[messages][-1].content) # 流式调用观察每一步 for step in agent.stream({messages: [{role: user, content: 今天北京天气怎么样}]}): print(step, end\n\n)流式调用会依次展示LLM 推理 → 工具调用 → 工具返回 → 最终回复非常适合调试。2.4 LangSmith 调试设置环境变量即可启用 LangSmith 追踪可视化每一步的执行细节pythonimport os os.environ[LANGSMITH_TRACING] true os.environ[LANGSMITH_API_KEY] 你的 API Key os.environ[LANGSMITH_PROJECT] my-agent-project三、MCP 协议标准化工具接入3.1 为什么需要 MCP本地工具虽然灵活但当你需要使用别人封装好的服务如查火车票、操作数据库时每个服务的接入方式都不同REST、WebSocket、gRPC...如果每接入一个都要写适配代码太繁琐。MCP模型上下文协议是 AI 领域的“USB-C 标准”它统一了 LLM 与外部工具之间的通信方式。3.2 MCP 架构与工作流程MCP 采用客户端-服务器架构三个角色MCP Host你的 LangChain Agent 程序MCP ClientLangChain 的 MCP 适配器MCP Server提供工具能力的远程服务工作流程握手Agent 启动时连接 Server获取工具列表注入工具描述和用户问题一起发给 LLMLLM 不关心工具是本地的还是远程的决策LLM 决定调用哪个工具、传什么参数路由执行Host 通过 MCP 协议将调用请求发给 ServerServer 执行并返回继续推理Host 将结果返回给 LLM。对 LLM 来说MCP 工具和本地工具没有区别——它看到的都是“工具名 描述 参数”。MCP 只改变了接入方式对 LLM 完全透明。3.3 编写 MCP ServerStdio 方式本地开发调试最常用 Stdio 传输通过标准输入输出通信。python# mcp_server_stdio.py from mcp.server.fastmcp import FastMCP mcp FastMCP(MyTools) mcp.tool() def add(a: int, b: int) - int: 计算两个整数的和 return a b mcp.tool() def multiply(a: int, b: int) - int: 计算两个整数的乘积 return a * b if __name__ __main__: mcp.run(transportstdio)除了mcp.tool()MCP 还支持mcp.resource提供可读取的静态数据如系统日志、配置文件类似只读 API。mcp.prompt提供预定义的提示词模板让 Server 自带“使用说明书”。3.4 编写 MCP ServerHTTP 方式当 Server 需要部署在远程供多个 Client 调用时使用 Streamable HTTPpython# mcp_server_http.py from mcp.server.fastmcp import FastMCP mcp FastMCP(MyTools) mcp.tool() def add(a: int, b: int) - int: return a b if __name__ __main__: mcp.run(transportstreamable-http) # 默认 127.0.0.1:8000对应的 Client 连接方式不同但调用工具的 API 完全一致。3.5 LangChain 接入 MCP使用langchain-mcp-adapters库可将 MCP Server 的工具直接转换成 Agent 可用的工具pythonfrom langchain_mcp_adapters.client import MultiServerMCPClient from langchain.agents import create_agent from langchain_openai import ChatOpenAI client MultiServerMCPClient({ my-local-tools: { transport: stdio, command: python, args: [mcp_server_stdio.py], } }) async def main(): tools await client.get_tools() # 自动获取所有工具 llm ChatOpenAI(modelgpt-4o-mini) agent create_agent(llm, tools) result await agent.ainvoke({messages: [(user, 10加20等于多少)]}) print(result[messages][-1].content)核心价值通过MultiServerMCPClient可同时接入任意数量 MCP Server对 Agent 来说MCP 工具和本地tool工具用起来没有任何区别。3.6 本地工具 vs MCP 工具对比维度本地工具toolMCP 工具定义位置写在项目代码中运行在独立的 Server 上适合场景业务逻辑简单、不需要复用通用能力、跨项目/跨团队复用维护方式和主项目一起维护独立部署、独立维护生态复用无只有自己能用强任何支持 MCP 的应用都能接入实际建议项目早期或工具逻辑简单时直接用tool最快当工具需要被多个项目复用或想接入社区已有的服务时用 MCP。两者可以混合使用。小结上篇Agent 是什么LLM 自主决策 工具调用通过“感知→推理→行动”循环完成动态任务。工具定义用tool装饰器将普通函数转为 Agent 工具写好 docstring 和类型注解是关键。MCP 协议统一了 LLM 与外部工具的通信方式让 Agent 能像“插 USB”一样接入各种服务。有了工具和 MCPAgent 已经能调用外部能力了。但它还有一个明显的不足——每次调用都是“失忆”的不记得之前说过什么。下一章我们将学习如何给 Agent 加上记忆以及如何用中间件优化长对话和增加人工审核。敬请关注下篇