当前位置: 首页 > news >正文

深度讲解智能体:ReACT Agent

目录

一、Agent 工作原理

二、ReACT Agent 工作原理

三、ReACT Agent 与 MCP 的区别

(一)定义与定位

(二)工作方式

(三)功能特性

(四)应用场景


一、Agent 工作原理

人工智能代理(AI Agent)是指能够利用大型语言模型(LM)的推理能力来规划、思考和调用工具执行,从而实现目标的系统。

在由LLM驱动的自主代理系统中,LLM 充当代理的大脑,并由几个关键组件补充:
1、规划(Planning)
1)子目标和分解:代理将大任务分解为更小、更易于管理的子目标,从而能够高效处理复杂任务。
2)反思与改进:代理可以对过去的行为进行自我批评和自我反思,从错误中吸取教训,并为未来的步骤进行改进,从而提高最终结果的质量。
2、记忆(Memory)
1)短期记忆:所有情境学习(参见提示工程)都是利用模型的短期记忆来学习。
2)长期记忆:这为代理提供了在较长时间内保留和回忆(无限)信息的能力,通常是通过利用外部向量存储和快速检索来实现的。
3、工具使用(Tool use)
代理学习调用外部 ARI来获取模型权重中缺少的额外信息(预训练后通常很难改变),包括当前信息、代码执行能力、访问专有信息源等。

二、ReACT Agent 工作原理

ReACT Agent 由普林斯顿大学和谷歌的研究团队于 2022 年提出 ,其核心开发者姚顺雨的研究动机源于两个关键理念。一方面,随着 GPT-3 等大模型的兴起,人工智能呈现出超越常规语言处理的潜力,具备常识推理与动作输出能力,这促使研究者思考如何开发具有通用能力的智能体,以应对更广泛的问题解决需求。另一方面,尽管大模型在某些特定环境(如游戏)中借助奖励机制的强化学习表现优异,但人类具备在无先验经验下解决全新问题的独特能力,这激发了团队探索利用语言模型同时实现推理与行为生成的可能性 。

通过将推理与行动紧密结合,ReACT Agent 让大语言模型能交替生成推理轨迹(Thought)与特定任务行动(Action),开启了两者协同工作的新模式。其首次亮相于 2023 年 ICLR 会议上发表的论文《ReACT: Synergizing Reasoning and Acting in Language Models》 。论文中,研究团队在问答(HotpotQA)、事实验证(Fever)、基于文本的游戏(ALFWorld)和网页导航(WebShop)等多种任务场景下对 ReACT 进行实验评估,结果显示,在少量样本学习设置下,ReACT 相较于现有方法优势显著 。通过一系列消融实验与分析,研究团队深入探讨了推理与行动在不同任务类型中的重要性,证实了 ReACT 在提升模型解决复杂问题能力、增强决策推理过程可解释性等方面的重要价值 。

ReACT Agent 即 “推理与行动(Reasoning and Acting)智能体” ,核心在于将推理(Reasoning)和行动(Action)相结合,让模型以更智能、合理的方式完成复杂任务。其工作机制基于 “思考(Thought)- 行动(Action)- 观察(Observation)” 循环,具体如下:

思考阶段:当接收到用户任务指令,如 “制定一份本季度电子产品销售推广方案”,ReACT Agent 首先利用内部大语言模型(LLM)对任务进行深入分析与推理。它会将复杂任务拆解为一系列更易处理的子任务,思考执行任务所需的信息和步骤。在该例子中,它可能会思考需要了解当前市场上电子产品的热门趋势、竞争对手的推广策略、本季度目标客户群体的偏好等信息。这种思考过程类似人类在解决问题前的思维梳理,通过语言模型生成推理步骤,清晰展示其 “思考” 轨迹,从而引导后续行动。

行动阶段:基于思考得出的结果,Agent 决定采取相应行动,调用外部工具或执行特定操作以获取所需信息或推进任务。这些工具涵盖搜索引擎、数据库、各类 API 接口等。若要获取市场趋势信息,Agent 可能执行 “Action: SearchEngine (‘本季度电子产品市场热门趋势’)”,即调用搜索引擎工具,并将 “本季度电子产品市场热门趋势” 作为输入参数。通过这种方式,Agent 能够突破自身知识局限,从广泛的外部资源中获取最新、最准确的数据。

观察阶段:执行行动后,Agent 会获取工具返回的结果,即观察(Observation)。假设搜索引擎返回一系列关于电子产品市场趋势的新闻报道、研究报告等信息,这些信息便成为 Agent 的观察内容。Agent 对观察结果进行分析理解,判断是否已获取足够信息解决任务,或是否需要进一步行动。若发现获取的市场趋势信息中提及某类新兴电子产品备受关注,但缺乏竞争对手针对该产品的推广策略信息,Agent 会再次进入思考阶段,规划下一步行动。

循环迭代:Agent 不断重复 “思考 - 行动 - 观察” 循环,直至完成任务得出最终答案。如在制定销售推广方案时,可能需多次搜索不同信息、调用数据分析工具处理数据、参考企业内部销售数据库等,通过多轮循环逐步完善方案内容,最终生成完整且符合要求的本季度电子产品销售推广方案。这种迭代机制使 Agent 能应对复杂多变任务,根据每一步新信息动态调整策略,极大提升任务处理的灵活性与准确性。

三、ReACT Agent 与 MCP 的区别

(一)定义与定位

ReACT Agent:是一种智能体构建框架,旨在增强大语言模型执行复杂任务能力,将模型推理能力与外部工具调用、迭代求解深度融合。通过让模型模拟人类解决问题的思考与行动过程,实现从任务理解到执行的全流程智能化,使模型不再局限于单纯文本生成,而是能在实际场景中完成具体任务,如信息检索、数据分析、方案制定等 。

MCP(Model Context Protocol):即模型上下文协议,是由 Anthropic 牵头提出的开放标准 。其定位类似 AI 领域的 “通用接口”,主要解决大语言模型与外部数据源及工具间的通信标准化问题。通过定义一套统一协议,使不同大模型能以一致方式连接和交互外部资源,降低开发者将多种外部服务集成到模型应用中的成本,增强模型功能拓展性与应用范围 。

(二)工作方式

ReACT Agent:以 “思考 - 行动 - 观察” 循环为核心工作方式。模型先推理任务解决方案,再决定调用合适工具执行行动,依据工具返回结果进一步思考与行动。整个过程中,模型需不断在推理与行动间切换,自行规划任务执行路径,具有较强自主性 。如处理 “分析某公司近五年财务报表,预测下一年营收趋势” 任务时,Agent 可能先思考需调用财务数据分析工具,接着行动调用该工具并输入报表数据,观察工具返回的初步分析结果后,再思考是否需结合市场趋势数据进一步分析等,循环往复直至完成预测 。

MCP:采用客户端 - 服务器架构模式。大模型所在应用程序作为 MCP 主机,其中嵌入负责与 MCP 服务器通信的客户端;MCP 服务器提供具体功能服务,包括暴露资源、提示模板和工具等能力。工作时,主机中的大模型通过客户端向服务器发送请求,服务器依据请求返回相应结果。例如在智能客服场景中,大模型通过 MCP 协议向服务器请求客户历史订单数据,服务器查询数据库后将数据返回给大模型,大模型基于这些数据生成回复客户的内容。大模型只需遵循 MCP 协议发送请求,无需关注底层复杂实现细节 。

(三)功能特性

ReACT Agent

推理与行动结合:突出优势是能将复杂任务逐步拆解,通过推理规划行动步骤,调用外部工具获取信息并执行任务,提升任务解决能力与准确性 。在制定项目计划时,可推理出需了解项目资源、时间节点、人员分工等信息,然后调用资源管理系统、时间规划工具等获取数据并整合生成计划 。

可解释性强:由于在执行任务过程中会输出推理步骤,即 “思考” 过程,开发者与用户能清晰了解模型如何做出决策,便于调试、优化和改进模型行为,增强对模型输出结果的信任 。如模型在推荐产品时,可展示其基于用户历史购买数据、当前市场需求、产品特性等因素的推理过程 。

MCP

标准化接口:最大特性是提供标准化接口,解耦工具调用与具体大模型。不同大模型只要遵循 MCP 协议,均可使用相同外部工具与数据源,实现跨平台、跨模型的资源共享与交互,提高开发效率与系统可扩展性 。例如企业内部不同部门使用不同大模型,但通过 MCP 可统一接入公司数据库、业务系统等资源 。

多数据源集成:方便集成多种外部数据源与工具,无论是本地文件系统、数据库,还是在线 API 服务等,都能整合到同一框架下,为大模型提供丰富数据支持,适用于需要处理大量不同类型数据的复杂应用场景,如企业级数据分析、智能决策系统等 。

(四)应用场景

ReACT Agent

复杂任务执行:适用于需要灵活规划与执行步骤的复杂任务,如办公自动化流程中的多步骤任务处理,包括文档撰写、数据收集与分析、邮件发送等一系列操作,ReACT Agent 可根据任务需求动态调用各类办公软件工具 API 完成任务 。

智能客服深度交互:在智能客服场景中,若客户问题涉及复杂业务流程或需要多轮交互解决,如办理复杂金融业务咨询,ReACT Agent 能通过推理理解客户需求,调用知识库、业务系统等工具获取信息,逐步引导客户完成业务办理,提供个性化、精准服务 。

MCP

企业级 AI 应用开发:在企业级应用开发中,涉及整合企业内部众多异构系统(如 ERP、CRM、OA 等)数据与功能,MCP 可将这些系统封装为大模型可调用的能力模块,实现跨系统数据集成与业务流程自动化,如构建企业智能数据分析平台,使大模型能便捷访问不同业务系统数据进行分析 。

多模型协作场景:当多个不同大模型需要协同工作时,MCP 提供统一通信标准,促进模型间信息共享与交互。例如在智慧城市建设中,交通管理模型、能源管理模型、环境监测模型等不同领域模型可通过 MCP 协议共享数据,协同制定城市综合管理策略 。

代码实战之一:如何通过 MCP 中间件调用高德地图的核心功能?主要逻辑如下:

  1. 封装了与 MCP 服务器的连接管理,包括连接、断开连接等操作

  2. 实现了高德地图常用的三个核心功能:

    • 地理编码:将地址转换为经纬度
    • 逆地理编码:将经纬度转换为具体地址
    • POI 搜索:根据位置搜索周边兴趣点
  3. 采用 JSON 格式进行数据交换,便于解析和扩展

import com.google.gson.JsonObject;
import java.io.IOException;/*** 通过MCP调用高德地图服务的客户端*/
public class AmapMcpClient {private MCPConnector mcpConnector;private String amapApiKey; // 高德地图API密钥/*** 构造函数* @param mcpHost MCP服务器主机地址* @param mcpPort MCP服务器端口* @param apiKey 高德地图API密钥*/public AmapMcpClient(String mcpHost, int mcpPort, String apiKey) {this.mcpConnector = new MCPConnector(mcpHost, mcpPort);this.amapApiKey = apiKey;}/*** 连接到MCP服务器* @return 连接是否成功*/public boolean connect() {return mcpConnector.connect();}/*** 断开与MCP服务器的连接*/public void disconnect() {mcpConnector.disconnect();}/*** 通过地址获取经纬度(地理编码)* @param address 地址字符串* @param city 城市(可选)* @return 包含经纬度的响应数据* @throws IOException 通信异常*/public MCPResponse geocode(String address, String city) throws IOException {JsonObject params = new JsonObject();params.addProperty("action", "geocode");params.addProperty("address", address);if (city != null && !city.isEmpty()) {params.addProperty("city", city);}params.addProperty("key", amapApiKey);return mcpConnector.sendRequest("amap/service", params);}/*** 通过经纬度获取地址(逆地理编码)* @param longitude 经度* @param latitude 纬度* @return 包含地址信息的响应数据* @throws IOException 通信异常*/public MCPResponse reverseGeocode(double longitude, double latitude) throws IOException {JsonObject params = new JsonObject();params.addProperty("action", "reverse_geocode");params.addProperty("location", longitude + "," + latitude);params.addProperty("key", amapApiKey);return mcpConnector.sendRequest("amap/service", params);}/*** 搜索周边POI* @param longitude 中心点经度* @param latitude 中心点纬度* @param keyword 搜索关键词* @param radius 搜索半径(米)* @return 包含POI信息的响应数据* @throws IOException 通信异常*/public MCPResponse searchPoi(double longitude, double latitude, String keyword, int radius) throws IOException {JsonObject params = new JsonObject();params.addProperty("action", "search_poi");params.addProperty("location", longitude + "," + latitude);params.addProperty("keyword", keyword);params.addProperty("radius", radius);params.addProperty("key", amapApiKey);return mcpConnector.sendRequest("amap/service", params);}// 示例用法public static void main(String[] args) {// 初始化客户端AmapMcpClient client = new AmapMcpClient("mcp-server.example.com", 8080, "your-amap-api-key");try {// 连接到MCP服务器if (!client.connect()) {System.err.println("无法连接到MCP服务器");return;}// 示例1: 地理编码 - 将地址转换为经纬度MCPResponse geocodeResp = client.geocode("北京市朝阳区光华路8号", "北京市");if (geocodeResp.isSuccess()) {System.out.println("地理编码结果: " + geocodeResp.getData());} else {System.err.println("地理编码失败: " + geocodeResp.getErrorMessage());}// 示例2: 逆地理编码 - 将经纬度转换为地址MCPResponse reverseResp = client.reverseGeocode(116.481028, 39.921983);if (reverseResp.isSuccess()) {System.out.println("逆地理编码结果: " + reverseResp.getData());} else {System.err.println("逆地理编码失败: " + reverseResp.getErrorMessage());}// 示例3: 搜索周边POIMCPResponse poiResp = client.searchPoi(116.481028, 39.921983, "餐厅", 1000);if (poiResp.isSuccess()) {System.out.println("周边餐厅搜索结果: " + poiResp.getData());} else {System.err.println("POI搜索失败: " + poiResp.getErrorMessage());}} catch (IOException e) {e.printStackTrace();} finally {// 断开连接client.disconnect();}}
}// MCP连接器类(简化版)
class MCPConnector {private String host;private int port;// 实际实现中会有Socket或其他连接对象public MCPConnector(String host, int port) {this.host = host;this.port = port;}public boolean connect() {// 实际连接实现System.out.println("连接到MCP服务器: " + host + ":" + port);return true; // 简化处理,实际应返回真实连接状态}public void disconnect() {// 实际断开连接实现System.out.println("断开与MCP服务器的连接");}public MCPResponse sendRequest(String service, JsonObject params) throws IOException {// 发送请求到MCP服务器的实现System.out.println("向MCP服务 " + service + " 发送请求: " + params);// 这里只是模拟响应,实际应根据真实返回构建return new MCPResponse(true, "模拟响应数据: " + params, null);}
}// MCP响应类
class MCPResponse {private boolean success;private String data;private String errorMessage;public MCPResponse(boolean success, String data, String errorMessage) {this.success = success;this.data = data;this.errorMessage = errorMessage;}public boolean isSuccess() {return success;}public String getData() {return data;}public String getErrorMessage() {return errorMessage;}
}

代码实战之二:如何使用 React 结合 Agent 模式来调用高德地图 API。这种方式可以更好地管理地图相关的状态和交互逻辑。代码如下:
   

// AmapAgent.js
import { loadScript } from './utils';class AmapAgent {constructor(apiKey) {this.apiKey = apiKey;this.map = null;this.markers = [];this.loaded = false;this.loadPromise = null;}// 加载高德地图SDKload() {if (this.loadPromise) {return this.loadPromise;}this.loadPromise = new Promise((resolve, reject) => {if (window.AMap) {this.loaded = true;resolve(window.AMap);return;}// 加载高德地图脚本loadScript(`https://webapi.amap.com/maps?v=2.0&key=${this.apiKey}`).then(() => {this.loaded = true;resolve(window.AMap);}).catch(reject);});return this.loadPromise;}// 初始化地图initMap(containerId, options = {}) {return this.load().then(AMap => {this.map = new AMap.Map(containerId, {zoom: options.zoom || 13,center: options.center || [116.397428, 39.90923], // 默认北京...options});return this.map;});}// 添加标记点addMarker(position, options = {}) {if (!this.map) {return Promise.reject(new Error('地图未初始化'));}return this.load().then(AMap => {const marker = new AMap.Marker({position: position,...options});marker.addTo(this.map);this.markers.push(marker);return marker;});}// 地理编码 - 地址转经纬度geocode(address, city = '') {return this.load().then(AMap => {return new Promise((resolve, reject) => {const geocoder = new AMap.Geocoder({city: city // 城市,默认全国});geocoder.getLocation(address, (status, result) => {if (status === 'complete' && result.geocodes.length) {resolve(result);} else {reject(new Error(`地理编码失败: ${status}`));}});});});}// 逆地理编码 - 经纬度转地址reverseGeocode(lnglat) {return this.load().then(AMap => {return new Promise((resolve, reject) => {const geocoder = new AMap.Geocoder();geocoder.getAddress(lnglat, (status, result) => {if (status === 'complete' && result.regeocode) {resolve(result);} else {reject(new Error(`逆地理编码失败: ${status}`));}});});});}// 清除所有标记clearMarkers() {this.markers.forEach(marker => {this.map.remove(marker);});this.markers = [];}// 销毁地图destroy() {if (this.map) {this.map.destroy();this.map = null;}this.markers = [];this.loaded = false;this.loadPromise = null;}
}export default AmapAgent;

两种调用高德地图的实现方式核心区别可简单总结为:

  1. 调用路径

    • React Agent:前端直接调用高德 API(客户端→高德服务器)
    • MCP 方式:通过中间件中转(客户端→MCP 服务器→高德服务器)
  2. 交互方式

    • React Agent:带 UI 界面,支持地图可视化和用户交互
    • MCP 方式:多为后端服务交互,无直接界面展示
  3. 数据处理

    • React Agent:客户端直接处理原始地图数据,可操作 DOM
    • MCP 方式:只能处理 MCP 返回的二次加工数据
  4. 适用场景

    • React Agent:前端可视化应用,需低延迟交互
    • MCP 方式:多端统一接入,需集中管控的场景
  5. 复杂度

    • React Agent:链路短,逻辑直接
    • MCP 方式:链路长,增加中间层管理成本但更易统一控制
http://www.xdnf.cn/news/1376083.html

相关文章:

  • Python包发布与分发策略:从开发到生产的最佳实践(续)
  • 基于 Ultralytics YOLO11与 TrackZone 的驱动的高效区域目标跟踪方案实践
  • Effective c++ 35条款详解
  • 【测试】pytest测试环境搭建
  • 日志的实现
  • Java全栈开发工程师的面试实战:从基础到微服务
  • 小程子找Bug之for循环的初始化表达类型
  • Hadoop(五)
  • 2025年9月计算机二级C++语言程序设计——选择题打卡Day8
  • 设备电机状态监测:通往预测性维护与效能飞升之路
  • 深入理解C++ std::forward:完美转发的原理与应用
  • GitLab 导入/导出仓库
  • 财务报表怎么做?财务常用的报表软件都有哪些
  • 为什么 “int ” 会变成 “int”?C++ 引用折叠的原理与本质详解
  • 20.19 LoRA微调Whisper终极指南:3步实现中文语音识别错误率直降37.8%
  • 信任,AI+或人机环境系统智能的纽带
  • (一)光头整洁架构(Mediator Pattern/Result Patttern/UnitOfWork/Rich Domain)
  • k8s部署pgsql集群
  • 【PostgreSQL内核学习:通过 ExprState 提升哈希聚合与子计划执行效率】
  • Kafka 4.0 兼容性矩阵解读、升级顺序与降级边界
  • React Hooks 完全指南:从基础到高级的实战技巧
  • 路由基础(一):IP地址规划
  • 种草商城全链路技术实现指南
  • 【网络编程】NtyCo协程服务器的框架(轻量级的协程方案,人称 “小线程”)
  • 零后端、零配置:用 AI 编程工具「Cursor」15 分钟上线「Vue3 留言墙」
  • 【双指针- LeetCode】15.三数之和
  • python自学笔记14 NumPy 线性代数
  • anaconda本身有一个python环境(base),想用别的环境就是用anaconda命令行往anaconda里创建虚拟环境
  • 前端架构知识体系:css架构模式和代码规范
  • vscode 如何调试 python 2.7