Agent 智能体:从“一问一答“到“自主干活“的技术全解析

发布时间:2026/7/9 18:40:23

Agent 智能体:从“一问一答“到“自主干活“的技术全解析
文章目录一、Agent 到底智能在哪1.1 普通对话一问一答任务即终止1.2 Agent持续运转的循环结构二、Agent 工作方式ReAct 三步循环2.1 一个场景走通 ReAct三、Tool UseAgent 的手和脚3.1 常见工具类型3.2 工具数量 能力边界四、MessageAgent 的记忆载体4.1 原生 OpenAI vs LangChain 的返回差异五、AI 工程从零构建编程助手 Agent5.1 工程目录5.2 前置知识async 函数六、完整实现编程助手 Agent6.1 环境与依赖6.2 初始化 LLM6.3 定义工具文件读取6.4 绑定工具到模型6.5 初始化消息6.6 核心循环ReAct 的代码实现6.7 执行流程可视化七、全文总结八、核心知识点复盘九、避坑指南❌ 坑 1ToolMessage 忘了传 tool_call_id❌ 坑 2串行调用多个工具❌ 坑 3LLM 的无状态特性❌ 坑 4无限循环❌ 坑 5工具 description 写得太模糊一、Agent 到底智能在哪字面理解——AI 会自己干活。这么理解没问题但这句大白话遮住了一个更关键的问题Agent 和普通的 AI 对话差别到底在哪里答案是结构不同。1.1 普通对话一问一答任务即终止你: 帮我写一封邮件 AI: (输出邮件内容) ← 任务结束LLM 输出一次对话终止。它是一个问答机器——问什么答什么答完即止没有后续。1.2 Agent持续运转的循环结构你给 Agent 一个任务它会拆解任务决定下一步做什么调用工具去外部世界获取信息观察结果判断是继续还是结束循环往复直到任务完成或触发退出条件超出循环次数、Token 上限、连续相同结果、任务失败这不是一问一答而是一个自主运转的执行循环。二、Agent 工作方式ReAct 三步循环Agent 每一轮循环只有三个核心动作动作英文含义思考Reason分析当前状态决定下一步做什么行动Act调用工具执行具体操作观察Observe接收工具返回的结果判断是否继续一轮结束后观察 → 再回到思考 → 再行动 → 再观察循环往复。这个循环就叫ReActReasoning Act Observe。它不是 LangChain 那种大型开发框架而是Agent 领域通用的循环工作标准是一种思维范式。面试重点ReAct 是 Agent 执行流程的行业共识几乎所有主流 Agent 框架LangChain、AutoGPT、CrewAI底层都遵循这个循环模型。2.1 一个场景走通 ReAct任务“帮我分析三家竞品写一份报告”┌─────────────────────────────────────────────────┐ │ 第一轮 │ │ Reason: 需要搜索竞品信息 │ │ Act: 调用搜索工具查三家竞品最新动态 │ │ Observe: 信息量挺大但缺少财务数据 │ ├─────────────────────────────────────────────────┤ │ 第二轮 │ │ Reason: 需要财务数据可以去官网或股市API │ │ Act: 调用 API 抓取财报数据 │ │ Observe: 财务数据拿到了可以开始写报告 │ ├─────────────────────────────────────────────────┤ │ 第三轮...第 N 轮 │ │ Reason: 信息充足写报告 │ │ Act: 生成完整竞品分析报告 │ │ Observe: 报告完成交给用户 │ └─────────────────────────────────────────────────┘每一轮都在Reason → Act → Observe的循环中推进直到任务完成。三、Tool UseAgent 的手和脚核心认知工具是 Agent 的能力边界。没有工具Agent 只能在脑子里转转完还是只有文字。3.1 常见工具类型工具类型能力代表产品搜索工具上网查实时信息Perplexity代码执行器运行代码、看结果、自验证Claude工程化验收机制最完善文件 I/O读写本地文件Cursor、Copilot浏览器操控打开网页、点击、提交表单ManusAPI 调用连接外部服务各类 SaaS Agent行业观察“文无第一武无第二”——Claude 在代码执行和工程化验收方面建立了事实标准。Anthropic 的 Agent 自测试机制是目前最成熟的 AI 工程质量验证方案。3.2 工具数量 能力边界工具的覆盖范围直接决定 Agent 的能力上限。选型 Agent 产品时先看它集成了多少工具、工具质量如何——这是最核心的评估维度。四、MessageAgent 的记忆载体Agent 的整个对话历史和工具调用结果全部存储在messages 数组中。四种核心消息类型类型角色用途SystemMessage系统设定 AI 身份、能力边界、行为规范HumanMessage用户用户的输入AIMessageAILLM 的回复可能包含工具调用ToolMessage工具工具执行结果的回传必须带tool_call_id⚠️易错点ToolMessage必须携带对应的tool_call_id否则 LLM 无法将工具结果与调用请求关联会产生幻觉或忽略结果。4.1 原生 OpenAI vs LangChain 的返回差异原生 OpenAI 返回工具调用时数据结构在additional_kwargs.tools中。LangChain 在invoke后会原样保留这个结构同时贴心地准备了tool_calls属性——这就是 LangChain 的工程价值提升 LLM 开发的便捷性和可读性。五、AI 工程从零构建编程助手 Agent5.1 工程目录hello-langchain/ ├── package.json ├── node_modules/ ├── .env # API Key 配置 └── src/ └── index.mjs # Agent 主程序5.2 前置知识async 函数// async 函数本身就是 Promise 实例// return 等同于 Promise.resolve()// return 的结果就是 resolve 的参数asyncfunctiongetData(){returnhello;// 等价于 Promise.resolve(hello)}// getData() 返回一个 Promise六、完整实现编程助手 Agent下面是一个可运行的完整 Agent逐段拆解。6.1 环境与依赖importdotenvfromdotenv;import{ChatOpenAI}fromlangchain/openai;import{tool}fromlangchain/core/tools;import{HumanMessage,SystemMessage,ToolMessage,// AIMessage // invoke 返回的 response 本身就是 AIMessage}fromlangchain/core/messages;importfsfromnode:fs/promises;import{z}fromzod;// 加载 .env 中的环境变量dotenv.config();6.2 初始化 LLMconstmodelnewChatOpenAI({modelName:deepseek-v4-flash,// 可替换为任意兼容 OpenAI 协议的模型apiKey:process.env.DEEPSEEK_API_KEY,temperature:0,// Agent 场景建议 0保证输出稳定性configuration:{baseURL:https://api.deepseek.com/v1,// 自定义 API 地址},});经验之谈Agent 场景temperature设 0因为工具调用的参数需要精确创造性在这里是负资产。6.3 定义工具文件读取constreadFileTooltool(async({filePath}){// 功能函数真正干活的代码 constcontentawaitfs.readFile(filePath,utf-8);// 给用户实时反馈Agent 任务可能很耗时用户需要感知进度console.log([工具调用] read_file(${filePath}) 成功读取${content.length}字节);returncontent;},{// 工具元信息LLM 用它来决定何时调用、传什么参数 name:read_file,description:用此工具来读取文件内容。当用户要求读取文件、查看代码、 分析文件内容时调用此工具。输入文件路径可以是相对路径或绝对路径,schema:z.object({filePath:z.string().describe(要读取的文件路径),}),});// 工具注册表consttools[readFileTool];设计要点description是 LLM 决定何时调用的唯一依据写得越精确调用越准确。schema用 Zod 定义参数约束LLM 会严格按 Schema 生成参数。6.4 绑定工具到模型// LangChain 的核心抽象将 LLM 和工具注册到一起constmodelWithToolsmodel.bindTools(tools);bindTools做的事情告诉 LLM你有这些工具可用需要时在回复中带上tool_calls。6.5 初始化消息constmessages[newSystemMessage(你是一个代码助手可以使用工具读取文件并解释代码。 工作流程 1. 用户要求读取文件时立即调用 read_file 工具。 2. 等待工具返回文件内容。 3. 基于文件内容进行分析和解释。 可用工具 - read_file: 读取文件内容使用此工具来获取文件内容),newHumanMessage(请读取 src/tool.mjs 文件内容并解释代码),];6.6 核心循环ReAct 的代码实现前置回顾tool_calls里面有什么llm原生tool_calls:LangChain额外返回的tool_calls:// 第一轮让 LLM 思考letresponseawaitmodelWithTools.invoke(messages);console.log(JSON.stringify(response,null,2));messages.push(response);// 将 AI 回复加入历史// ReAct 循环有工具调用就执行没有就结束 while(response.tool_callsresponse.tool_calls.length0){console.log(\n[检测到${response.tool_calls.length}个工具调用]);// ---- Act并行执行所有工具调用 ----consttoolResultsawaitPromise.all(response.tool_calls.map(async(toolCall){// 查找对应的工具定义constmatchedTooltools.find(tt.nametoolCall.name);if(!matchedTool){return错误找不到工具${toolCall.name};}console.log([执行工具]${toolCall.name}(${JSON.stringify(toolCall.args)}));try{// LangChain 的 tool.invoke() 方法内部调用你写的功能函数constresultawaitmatchedTool.invoke(JSON.parse(toolCall.args));returnresult;}catch(err){return错误工具${toolCall.name}执行失败 ——${err.message};}}));// ---- Observe将工具结果打包为 ToolMessage 加入历史 ----response.tool_calls.forEach((toolCall,index){messages.push(newToolMessage({content:toolResults[index],tool_call_id:toolCall.id,// 必须LLM 靠这个 ID 关联请求和结果}));});// ---- 下一轮 Reason把所有消息喂给 LLM让它继续思考 ----responseawaitmodelWithTools.invoke(messages);messages.push(response);}// 循环结束LLM 不再要求调用工具说明任务完成console.log(\n 最终输出 );console.log(response.content);6.7 执行流程可视化messages [SystemMessage, HumanMessage] │ ▼ ┌──────────────────────────────┐ │ modelWithTools.invoke() │ ← Reason: LLM 思考决定是否调工具 │ 返回 response (AIMessage) │ └──────────┬───────────────────┘ │ 有 tool_calls ──No──▶ 输出 response.content任务完成 │ Yes │ ▼ ┌──────────────────────────────┐ │ Promise.all(tool.invoke()) │ ← Act: 并行执行所有工具 │ 返回 toolResults[] │ └──────────┬───────────────────┘ │ ▼ ┌──────────────────────────────┐ │ messages.push(ToolMessage) │ ← Observe: 结果带 tool_call_id 回传 └──────────┬───────────────────┘ │ ▼ 回到 Reason继续循环七、全文总结Agent 的核心差异在于结构——从一问一答升级为思考→行动→观察的自主循环。理解这个循环就理解了 AgentReAct是 Agent 的通用工作框架不是某个库的专利Tool Use是 Agent 的手和脚工具范围 能力边界Message 数组是 Agent 的记忆四种消息类型承载了整个对话流LangChain的价值在于工程抽象——bindTools、tool()、消息体系让开发者聚焦业务逻辑八、核心知识点复盘知识点一句话总结ReAct 循环Reason → Act → Observe → 循环直到任务完成或触发退出条件Tool UseAgent 操作外部世界的能力工具的覆盖范围决定 Agent 的能力上限SystemMessage定义 Agent 的身份、能力、行为规范ToolMessage工具执行结果必须带tool_call_id才能被 LLM 正确关联model.bindTools()LangChain 的核心抽象将工具注册到 LLMtool()定义工具的元信息name/description/schema 功能函数temperature: 0Agent 场景建议设为 0保证工具调用参数的精确性Promise.all多个工具调用应并行执行而非串行九、避坑指南❌ 坑 1ToolMessage 忘了传 tool_call_id// 错误写法messages.push(newToolMessage({content:result}));// LLM 无法关联可能导致幻觉// 正确写法messages.push(newToolMessage({content:result,tool_call_id:toolCall.id,// 必须}));❌ 坑 2串行调用多个工具当 LLM 返回多个tool_calls时它们通常是互相独立的应该用Promise.all并行执行而不是for循环串行等。❌ 坑 3LLM 的无状态特性LLM本身不记忆任何东西。每一轮调用你必须把完整的 messages 数组传给它。少传一条历史消息Agent 就失忆了。Agent 的记忆全靠你手动维护 messages 数组。❌ 坑 4无限循环Agent 可能陷入调工具→不满意→再调→还不满意的死循环。生产环境必须设置硬限制最大循环次数如 20 轮Token 总量上限连续相同结果检测防重复调用❌ 坑 5工具 description 写得太模糊LLM 靠description判断何时调用工具。写用来处理文件和写当用户要求读取文件内容、查看代码、分析文件时调用此工具效果天差地别。description 是工具调用的说明书越精准越好。

相关新闻

Spring Boot 3.x 整合 SSM 实战:5步构建RESTful API并对比传统SSH项目结构

Spring Boot 3.x 整合 SSM 实战:5步构建RESTful API并对比传统SSH项目结构

2026/7/9 18:40:23

Spring Boot 3.x 整合 SSM 实战:从传统架构到现代技术栈的演进之路技术栈演进背景与实战价值十年前走进任何一家Java企业,你大概率会看到Struts2HibernateSpring(SSH)组合占据开发主流。而今天,Spring BootSpring MVCM…

STM32与ADS8665构建高精度数据采集系统

STM32与ADS8665构建高精度数据采集系统

2026/7/9 18:40:23

1. 项目概述:高精度信号转换系统设计 在工业自动化、医疗设备和精密测量领域,16位ADC(模数转换器)搭配高性能MCU的组合已成为高精度信号采集的黄金标准。ADS8665作为TI推出的16位1MSPS SAR型ADC,配合STM32F756ZG这款带…

MCS-51单片机中断编程实战:5个中断源优先级配置与3个寄存器详解

MCS-51单片机中断编程实战:5个中断源优先级配置与3个寄存器详解

2026/7/9 18:40:23

MCS-51单片机中断编程实战:5个中断源优先级配置与3个寄存器详解 1. 中断系统架构与核心寄存器 MCS-51单片机的中断系统是其实时响应能力的核心引擎,包含5个中断源和3个关键控制寄存器。理解这个架构是进行中断编程的基础。 5个中断源及其特性 &#x…

MA12070与STM32F723ZE音频系统设计与优化

MA12070与STM32F723ZE音频系统设计与优化

2026/7/9 20:00:32

1. 为什么选择MA12070与STM32F723ZE这对黄金组合 在音频系统设计中,放大器与主控芯片的选型直接决定了系统的音质上限和功能扩展性。MA12070这款D类音频放大器采用专利的多级开关技术,实测THDN(总谐波失真加噪声)低至0.004%&#…

SPSSAU 实战:3类变量组合(分类/连续)的差异性分析全流程与7种方法选择

SPSSAU 实战:3类变量组合(分类/连续)的差异性分析全流程与7种方法选择

2026/7/9 20:00:32

SPSSAU实战:3类变量组合的差异性分析方法选择与操作全流程数据分析师在日常工作中经常面临一个核心挑战:面对不同类型的数据组合,如何快速选择最合适的统计检验方法?本文将以SPSSAU为操作平台,系统梳理分类变量与连续变…

TPA3128D2与PIC32MX664F064L打造高保真音频系统

TPA3128D2与PIC32MX664F064L打造高保真音频系统

2026/7/9 20:00:32

1. 项目概述:TPA3128D2与PIC32MX664F064L的黄金组合在DIY音频设备领域,德州仪器的TPA3128D2 Class-D功放芯片与Microchip的PIC32MX664F064L微控制器堪称一对黄金搭档。这套组合能实现30W2的立体声输出,总谐波失真(THDN)低至0.1%,特…

32-Skills高级特性

32-Skills高级特性

2026/7/9 20:00:32

32 Skills高级特性 概述 前面的文章介绍了Skills的基础概念和创建方法,但Skills的真正威力在于其高级特性。条件触发、多步骤任务编排、参数化配置、优先级管理、技能协同——这些特性让Skills从一个简单的指令模板升级为一个强大的工作流引擎。 本文将深入探讨这些高级特性…

游戏暴击率计算模型构建:从基础原理到Python工程实践

游戏暴击率计算模型构建:从基础原理到Python工程实践

2026/7/9 20:00:32

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 在实际游戏开发或数值模拟项目中,我们经常需要处理复杂的属性计算和战斗模拟。一个典型的场景是分析角色在特定装备、技能…

穿越机锂电池安全使用全指南:从充电到存储的完整闭环管理

穿越机锂电池安全使用全指南:从充电到存储的完整闭环管理

2026/7/9 19:50:32

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 1. 这篇文章真正要解决的问题 如果你刚组装好第一架穿越机,看着手里这块鼓鼓囊囊、接口复杂的锂电池,心里是不…

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

2026/7/9 19:40:56

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…

6个月转型AI工程师:实战路径与核心技能

6个月转型AI工程师:实战路径与核心技能

2026/7/9 18:28:30

1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公…

YOLOv5模型剪枝与量化实战:边缘设备部署优化

YOLOv5模型剪枝与量化实战:边缘设备部署优化

2026/7/8 14:04:34

1. 项目背景与核心价值在计算机视觉领域,YOLOv5因其出色的实时检测性能成为工业界宠儿。但当我们尝试将其部署到边缘设备(如树莓派、Jetson Nano或手机终端)时,立刻会遇到两个致命问题:模型体积庞大(原始YO…

平价正宗重庆火锅实测|理性避坑选型指南

平价正宗重庆火锅实测|理性避坑选型指南

2026/7/9 0:09:12

一、引言:重庆火锅消费现存痛点当下大众平价川渝火锅赛道竞争白热化,普通消费者就餐普遍面临三大选型难题:一是口味同质化严重,大量门店采用预制锅底、半成品食材,打着重庆老火锅旗号弱化牛油本味,麻辣口感…

AcFunDown:打破A站视频离线观看壁垒的终极解决方案

AcFunDown:打破A站视频离线观看壁垒的终极解决方案

2026/7/9 0:09:12

AcFunDown:打破A站视频离线观看壁垒的终极解决方案 【免费下载链接】AcFunDown 包含PC端UI界面的A站 视频下载器。支持收藏夹、UP主视频批量下载 😳仅供交流学习使用喔 项目地址: https://gitcode.com/gh_mirrors/ac/AcFunDown 想象一下这样的场景…

【复现】面向新能源消纳能力评估的年负荷序列建模及场景生成方法(Matlab代码实现)

【复现】面向新能源消纳能力评估的年负荷序列建模及场景生成方法(Matlab代码实现)

2026/7/9 0:09:12

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 &#x1f381…