基于ReAct机制的AI Agent

news/2025/3/24 22:51:33/文章来源:https://www.cnblogs.com/mangod/p/18230328

当前,在各个大厂纷纷卷LLM的情况下,各自都借助自己的LLM推出了自己的AI Agent,比如字节的Coze,百度的千帆等,还有开源的Dify。

你是否想知道其中的原理?是否想过自己如何实现一套AI Agent?当然,借助LangChain就可以。

1. 简述AI Agent

何为AI Agent呢?如果拿人来对比的话,半支烟认为AI Agent就是一个会思考和行动的人,其中LLM就是这个人的大脑。

说白了,AI Agent就是借助LLM这个大脑,加上一些 能够感知外部环节 和 能够发起行动 的部件,共同组成的一个 机器人。

那怎样能够让 AI Agent这个机器人,充分利用LLM 和 各种部件呢?那ReAct就是这个协作工具。利用ReAct机制,LLM可以很好的结合外部环境和行动组件,形成一个完整的AI Agent。

下面将探讨ReAct框架的概念、原理、优势,并通过代码示例展示如何在LangChain中使用ReAct构建AI Agent。

2. ReAct概念和原理

2.1 为什么需要ReAct

我们知道,LLM在训练完毕后,会具备较强的推理能力,但是他的知识随着时间的推移会过时,但是又不可能经常性的去训练LLM,毕竟每次训练的成本太高了。

那怎么解决这个问题?机器可以像人一样自己主动去学习和搜索新知识呀。

那机器怎么知道什么时候该去搜索知识?什么时候时候该去调用什么样的工具解决当前的问题呢?

ReAct应运而生。ReAct的核心在于,推理和行动。

2.2 ReAct的定义

ReAct(Reasoning and Action)是一个框架,其概念来源于一篇论文,其核心思想,就是通过思维链的方式,引导模型将复杂问题进行拆分,一步一步地进行推理(Reasoning)和行动(Action),同时还引入了观察(Observation)环节,在每次执行(Action)之后,都会先观察(Observation)当前现状,然后再进行下一步的推理(Reason)。

ReAct这个框架,就是要让LLM,进行推理,然后采取行动与外界环境互动。

ReAct这个框架,就是要让开发者一步步引导LLM进行推理,然后根据推理的结果,判断采取哪个行动。

2.3 ReAct的核心组件

ReAct框架的核心组件包括:

  • 思维链(Chain of Thought):将一个大的复杂任务进行拆解,拆解成多个思维步骤。
  • 推理(Reasoning):负责分析和处理输入的数据,生成有效的决策。
  • 行动(Action):执行具体的操作,比如搜索、执行代码,或者其余自定义的行动。
  • 观察(Observation):监控和收集环境反馈的数据,为下一步的推理和行动提供依据。

2.4 工作流程

ReAct框架的工作流程如下:

  1. 输入数据:接收用户输入或环境数据。
  2. 推理阶段:分析输入数据,生成决策和计划。
  3. 行动阶段:根据决策执行具体操作。
  4. 观察阶段:监控操作结果,收集反馈数据。
  5. 循环迭代:根据反馈数据调整推理和行动,持续优化结果。

2.5 举个例子说明ReAct步骤

比如,要知道2024年周杰伦最新的演唱会是时间和地点是什么,通过ReAct机制,会被拆解成以下步骤:

推理1:用户想知道2024年周杰伦最新的演唱会是时间和地点是什么,需要查找最新的信息。
行动1:调用Google的搜索API进行搜索。
观察1:搜索结束,搜索的结果中出现一些关于《2024年周杰伦最新的演唱会》的网页信息。推理2:搜索出来的网页较多,大概浏览前6个网页的具体内容。
行动2:点击第一个网页,开始浏览。
观察2:浏览结束,浏览的网页内容提及到了2024年周杰伦最新的演唱会信息。推理3:针对网页的内容进行,问题的总结。
结果:将最终的答案输出给用户。

3. LangChain的ReAct机制实现AI Agent

以上我们已经了解的原理和步骤,接下来我们使用LangChain定义一个ReAct机制的AI Agent。

3.1 示例

比如,在不使用ReAct机制借助外部工具的情况下,让LLM帮我们计算两个小数相加,则直接出错。

然后,借助ReAct机制,会让LLM自动使用自定义工具,最终计算正确。

然后,继续测试,问别的问题,借助ReAct机制,则不会使用到工具,直接给出答案。

3.2 代码

具体代码如下:

from langchain import hub
from langchain.agents import create_structured_chat_agent, AgentExecutor
from langchain.memory import ConversationBufferMemory
from langchain.schema import HumanMessage
from langchain.tools import BaseTool
from langchain_openai import ChatOpenAI# 模型
model = ChatOpenAI(model="gpt-3.5-turbo",openai_api_key="sk-XXXXXXXXXX",openai_api_base="https://api.aigc369.com/v1")
# 直接让模型计算数字,模型会算错
model.invoke([HumanMessage(content="你帮我算下,3.941592623412424+4.3434532535353的结果")])# 下面开始使用ReAct机制,定义工具,让LLM使用工具做专业的事情。# 定义工具,要继承自LangChain的BaseTool
class SumNumberTool(BaseTool):name = "数字相加计算工具"description = "当你被要求计算2个数字相加时,使用此工具"def _run(self, a, b):return a.value + b.value# 工具合集
tools = [SumNumberTool()]
# 提示词,直接从langchain hub上下载,因为写这个ReAct机制的prompt比较复杂,直接用现成的。
prompt = hub.pull("hwchase17/structured-chat-agent")
# 定义AI Agent
agent = create_structured_chat_agent(llm=model,tools=tools,prompt=prompt
)
# 使用Memory记录上下文
memory = ConversationBufferMemory(memory_key='chat_history',return_messages=True
)
# 定义AgentExecutor,必须使用AgentExecutor,才能执行代理定义的工具
agent_executor = AgentExecutor.from_agent_and_tools(agent=agent, tools=tools, memory=memory, verbose=True, handle_parsing_errors=True
)
# 测试使用到工具的场景
agent_executor.invoke({"input": "你帮我算下3.941592623412424+4.3434532535353的结果"})# 测试不使用工具的场景
agent_executor.invoke({"input": "请你充当稿件审核师,帮我看看'''号里的内容有没有错别字,如果有的话帮我纠正下。'''今天班级里的学生和老实要去哪里玩'''"})        

4. 总结

本文主要介绍了AI Agent的概念,探讨了ReAct框架的概念、原理、优势,并通过代码示例展示如何在LangChain中使用ReAct构建AI Agent。希望对你有帮助!

======>>>>>> 关于我 <<<<<<======

本篇完结!欢迎点赞 关注 收藏!!!

原文链接:https://mp.weixin.qq.com/s/OAQ3nPeRaC7mSNFNFDqF_A

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/719745.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正也科技之芒哥合规管理系统解决方案

正也科技的芒哥合规管理系统是一个针对医药企业的合规性解决方案,旨在帮助企业建立并维护一个符合法律法规要求的合规管理体系。该系统结合医药行业的特点,为企业提供了一系列合规管理工具和功能,以应对复杂的合规挑战。以下是芒哥合规管理系统的主要优势: 全面的合规性支持…

《计算机网络微课堂》实验23 VLAN间通信的实现方法:使用三层交换机

本仿真实验的目的在于验证 VLAN 间的通信可以使用三层交换机来实现。本仿真实验的目的在于验证 VLAN 间的通信可以使用三层交换机来实现。我已经在仿真软件中构建好了我们理论课中所使用的网络拓扑,并在各主机的旁边都标注好了所需配置的 IP 地址和地址掩码。 ​​ ‍博主注:…

《计算机网络微课堂》实验25 动态主机配置协议DHCP的作用

本仿真实验的目的在于验证动态主机配置协议 DHCP 的作用。下面我们来进行一个仿真实验,本仿真实验的目的在于验证动态主机配置协议 DHCP 的作用。 我已经在软件中构建好了我们理论课中所使用的那个例子,并在各设备旁边标注出了所需的配置信息,我们的应用需求是不给局域网中的…

《计算机网络微课堂》实验21 VLAN间通信的实现方法:多臂路由

本仿真实验的目的在于验证微软件的通信可以使用多臂路由来实现。‍‍本仿真实验的目的在于验证微软件的通信可以使用多臂路由来实现。‍‍ ‍ 我已经在仿真软件中构建好了我们理论课中所使用的网络拓扑,‍‍并且在各主机和路由器的各接口旁边都标注好了所需配置的 IP 地址和地…

《计算机网络微课堂》实验20 运输层端口

本仿真实验的目的在于验证 TCP/IP 运输层端口号的作用。下面我们来进行一个仿真实验,本仿真实验的目的在于验证 TCP/IP 运输层端口号的作用。 我已经在仿真软件中构建好了这样一个网络拓扑,两台服务器和一台主机通过一台以太网交换机进行互联,属于同一个以太网,右边这台服务…

.NET mvc cshtml 如何调试

原文链接:https://blog.51cto.com/u_16213388/7243295 .NET MVC cshtml 如何调试 在使用 .NET MVC 开发网页应用程序时,cshtml 文件是视图文件,用于定义页面的外观和布局。调试 cshtml 文件是非常重要的,因为它可以帮助我们定位和解决页面显示或逻辑问题。本文将介绍如何在…

Carmack的快速开平方根倒数算法

基本原理 需求\(y =\frac{1} {\sqrt{x} }\) \(log(a^ba^c)=bloga+cloga=(b+c)loga\) 32位浮点表示法:二进制的科学计数法 符号位1+阶码8(有符号的反码表示幂指数)+小数位23(二进制小数首位必为1,默认,只需表示小数位即可) -20240511163945890.webp) 字符串形式:\(S_0​…

Carmack的快速开平方根倒数算法(Fast inverse square root)

基本原理 需求\(y =\frac{1} {\sqrt{x} }\) \(log(a^ba^c)=bloga+cloga=(b+c)loga\) 32位浮点表示法:二进制的科学计数法 符号位1+阶码8(有符号的反码表示幂指数)+小数位23(二进制小数首位必为1,默认,只需表示小数位即可) -20240511163945890.webp) 字符串形式:\(S_0​…

URP案例(较重要)

简约水面场景准备: 水底和水面的示例物体 天空球 和天空球一样的Cubemap 组成部分 深度颜色 水下扭曲 泡沫 高光 反射 焦散 代码部分 git hub地址: 有注释,就不写了详细过程了C#using System.Collections; using System.Collections.Generic; using UnityEngine;namespace U…

如何解决跨国传输大文件的难题,助力数据价值的挖掘?

在当前全球化时代,跨国合作已成为许多行业和领域的常态。经常需要与海外合作伙伴或客户分享大型视频、音频、图片等文件。这些高质量、高分辨率的文件占用大量存储空间和网络带宽,因此跨国传输大文件成为一个普遍而重要的需求。跨国传输大文件面临着以下一些挑战: 带宽限制:…

用fiddler调试本地接口线上项目

1.打开fiddler编辑脚本,找到OnBeforeRequest处添加代码,点击保存代码按钮使其生效,开启fiddler监控//外网转内网 https 转 http if (oSession.HostnameIs(www.demo.cn)){if(oSession.isHTTPS){oSession.fullUrl = oSession.fullUrl.Replace("https://","http…

企业如何利用智能防止截屏保护商业机密

在数字化时代,企业商业机密的保护变得尤为重要。智能防止截屏技术作为一种先进的数据安全手段,能够帮助企业有效防止商业机密的泄露。本文将探讨企业如何利用这一技术保护其宝贵的商业信息。 一、商业机密面临的威胁 商业机密包括但不限于产品设计方案、客户列表、市场策略、…