从“固定流程”到“自主决策”让 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 加上记忆以及如何用中间件优化长对话和增加人工审核。敬请关注下篇
企业数字化 ERP 产品动态
相关推荐
openeuler/lzu-icc-nsg中的情感识别技术:facial_emotion数据集应用与分析指南 openeuler/lzu-icc-nsg中的情感识别技术:facial_emotion数据集应用与分析指南 【免费下载链接】lzu-icc-nsg Lanzhou University Intelligent Computing Research Center - Network Security Group 项目地址: https://gitcode.com/openeuler/lzu-icc-nsg
前往… · 2026/11/14 12:20:33
Android 工程师的 AI Agent 副驾驶:KMP + 端侧推理构建隐私优先智能功能 本文基于 2026 年 Android 与 KMP 生产实践,结合 Gemini Nano AICore 与 Kotlin Multiplatform 逻辑复用,拆解隐私优先 AI Agent 的架构落地、代码实战与工程避坑,定义 Android 工程师的下一波技术护城河。一、为何是“端侧 KMP”组合护城河… · 2026/10/26 3:16:16
AI 会议记录工具怎么选:Fireflies、Otter 与飞书妙记的真正差异 本文更新于 2026 年 7 月 18 日。功能、价格、条款和政策都可能变化,涉及采购或上线决策时,请以文末官方页面为准。 会议刚结束,十分钟内收到一份摘要,确实很爽。问题是:人名写错了、责任人漏了、截止时间猜了一个&… · 2026/11/1 18:24:26
潍坊市高压电工证好考吗保姆级教程来了,怕考不过白交培训费的看过来 潍坊市高压电工证好考吗保姆级教程来了,怕考不过白交培训费的看过来 怕考不过白交培训费?潍坊市高压电工证好考吗?这些问题是不是你正在纠结的?别急,这篇保姆级教程从报名到考试、从政策变化到备考技巧,统统给你讲明白,让你轻松拿证,不踩坑、不浪费。… · 2026/11/14 12:20:20
中职电工证是怎么考的,上岗必备实操技巧全解析 中职电工证是怎么考的,上岗必备实操技巧全解析 实操考试心里没底怕挂科?你不是一个人。很多初次报考中职电工证的朋友都在担心实操部分,怕动手能力跟不上,影响最终通过。别慌,这篇文章就是为你量身打造,带你从报名到考试全流程走一遍,尤其是实操部分,… · 2026/11/14 12:20:20
石碣电工证换证年审多少钱 电工证年审怕报不上名?手把手教你解决 石碣电工证换证年审多少钱 电工证年审怕报不上名?手把手教你解决 你是不是也这样,学历不高,担心报名石碣电工证换证年审的时候会被拒绝?别急,今天我就把整个流程讲清楚,教你从零开始搞定换证年审, 多少钱 都别怕,关键是你得知道怎么操作。… · 2026/11/14 12:20:20
特种工证书怎么报名,全国通用怎么操作?洛阳施工企业负责人必看 特种工证书怎么报名,全国通用怎么操作?洛阳施工企业负责人必看 证书过期了不知道怎么复审延期,这是很多施工企业和一线作业人员的共同焦虑。特种作业操作证一旦过期,不仅影响项目进展,还可能面临罚款、停工甚至安全事故责任。特别是对于洛阳这类中小型施… · 2026/11/14 12:20:20
洪湖到哪可拿电工证 在哪考外省证能转过来吗 洪湖到哪可拿电工证 在哪考外省证能转过来吗 之前考的证在外省能不能转过来?这个问题几乎是每个准备在洪湖地区考电工证的人都会问的。尤其是像你这样已经在外地工作了一段时间,手里握着一张外地颁发的电工证,担心在洪湖这边能不能正常使用,或者能不能顺… · 2026/11/14 12:20:20
电工证丢失还能补吗?千万别踩坑,丢了证等于失业 电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/13 22:30:50
电力电缆作业证直播报名入口与办理流程良心建议 电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/13 5:40:45
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/12 23:27:43
有初级电工证怎么工作 2026河南最新政策怎么应对 有初级电工证怎么工作 2026河南最新政策怎么应对 之前考的证在外省能不能转过来?这个问题我每天被问上百次。2026年河南最新政策对证书跨省转移有了明确说明,特别是南阳市的从业者,需要特别关注。… · 2026/11/14 0:00:31
电工证过期了不知道怎么复审?考电工证自学书+官方报名入口全攻略 电工证过期了不知道怎么复审?考电工证自学书+官方报名入口全攻略 证书过期了不知道怎么复审延期?很多人遇到这种情况,要么是工作太忙没时间处理,要么是不知道具体流程,导致证书失效,影响工作和项目进展。其实复审并不难,关键是要找准官方报名入口,掌… · 2026/11/14 0:00:31
为什么要低压电工证实操考试考什么 为什么低压电工证值不值得考?别再被中介骗了 你是不是也经常看到网上有人在问“低压电工证到底值不值得考”?或者在找报名点时,担心被中间人骗钱?这些问题,我懂,我也经历过。作为一名在应急管理行业摸爬滚打多年的从业者,我深知低压电工证不仅是一个从… · 2026/11/14 0:00:31
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 6:12:21
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 6:11:51
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 22:31:30