让AI像人一样思考和使用工具,reAct机制详解

news2024/10/12 6:56:10

reAct机制详解

  • reAct是什么
  • reAct的关键要素
  • reAct的思维过程
  • reAct的代码实现
    • 查看效果
    • 引入依赖,定义模型
    • 定义相关工具
    • 集合工具创建代理
    • 启动测试
    • 完整代码
  • 思考

reAct是什么

reAct的核心思想是将**推理(Reasoning)和行动(Acting)**结合起来。具体来说,reAct 赋予了 AI agent 思维链Cot的思考能力和使用工具Action的能力。对于一个复杂问题agent首先利用其强大的推理能力对环境进行分析和理解,识别出需要解决的问题和可用的资源。然后,它根据推理结果制定行动计划,并选择合适的工具或方法来执行计划。最后达到像人一样分析和使用工具最后解决问题的效果。

reAct的关键要素

  • 强大的推理能力
  • 丰富的工具库
  • 灵活的行动策略
  • 持续的反馈机制

reAct的思维过程

举个例子比如问模型一个问题羊村旁边的地方是什么?它的面积加上它的面积是多少?,正常模型肯定回答不了,可是添加上reAct他就被赋予了思考和使用工具获取信息的能力,分析过程大概如下:

分析1:我需要先搜索羊村旁边的地方,然后获取该地方的面积,最后计算面积的总和,首先我得先知道羊村旁边是什么地方

行动1:调用地点搜索工具

分析2:获取到的地点是狼堡,我需要搜索狼堡的面积,然后计算面积的总和

行动2:调用地点面积搜索工具

分析3:获取到面积是500,我已经获取了狼堡的面积,现在需要计算面积的总和。

行动3:调用数字相加计算工具(如果数字比较复杂可能需要专业的数学工具计算)

分析4:计算出结果是1000

行动4:进行最终答复:羊村旁边的地方是狼堡,狼堡的面积是500,加上它的面积是1000。

就这样模型通过reAct完成了一整个复杂问题的拆解和逐步解决。我们可以通过代码来实现并查看一整个过程

reAct的代码实现

我们用langChain搭配deepseek模型去实现reAct的一整个过程,我们先来看看最终结果。

查看效果

在这里插入图片描述
可以看到利用reAct机制LLM确实跟我们预想的一样完成了推理和使用工具。下面我们来看实现。

引入依赖,定义模型

注意key换成deepseek的key

from langchain import hub
from langchain.agents import create_structured_chat_agent, AgentExecutor
from langchain.memory import ConversationBufferMemory
from langchain.tools import BaseTool
from langchain_openai import ChatOpenAI

model = ChatOpenAI(
    model='deepseek-chat', 
    openai_api_key='xxx',
    openai_api_base='https://api.deepseek.com',
    max_tokens=4096
)

定义相关工具

# 定义数字计算工具
class SumNumber_tool(BaseTool):
    name = "数字相加计算工具"
    description = "当你被要求计算数字相加时,使用此工具"

    def _run(self, a, b):
        return a + b  # 直接返回两个数的和
        

# 模拟地点搜索工具(实际使用可以调用内置的google-serper)
class PlaceSearch_tool(BaseTool):
    name= "地点搜索工具"
    description = "当你需要搜索地点时,使用这个工具"

    def _run(self, query):
        return "狼堡"
    
# 创建地点面积搜索工具
class AreaSearch_tool(BaseTool):
    name= "地点面积搜索工具"
    description = "当你需要搜索地点面积时,使用这个工具"

    def _run(self, query):
        return 500

集合工具创建代理

# 工具集合
tools = [SumNumber_tool(), PlaceSearch_tool(), AreaSearch_tool()]
# 提示词,langchain hub内置提示词,之后文章会再做详细分析
prompt = hub.pull("hwchase17/structured-chat-agent")
# 定义AI Agent
agent = create_structured_chat_agent(
    llm=model,
    tools=tools,
    prompt=prompt
)
# 记录上下文
memory = ConversationBufferMemory(
    memory_key='chat_history',
    return_messages=True
)
# 创建一个代理执行器
agent_executor = AgentExecutor.from_agent_and_tools(
    agent=agent, tools=tools, memory=memory, verbose=True, handle_parsing_errors=True
)

启动测试

# 测试场景
agent_executor.invoke({"input": "羊村旁边的地方是什么?它的面积加上它的面积是多少?"}) 

完整代码

from langchain import hub
from langchain.agents import create_structured_chat_agent, AgentExecutor
from langchain.memory import ConversationBufferMemory
from langchain.tools import BaseTool
from langchain_openai import ChatOpenAI

# 模型
model = ChatOpenAI(
    model='deepseek-chat', 
    openai_api_key='xxx',
    openai_api_base='https://api.deepseek.com',
    max_tokens=4096
)

# 定义数字计算工具
class SumNumber_tool(BaseTool):
    name = "数字相加计算工具"
    description = "当你被要求计算数字相加时,使用此工具"

    def _run(self, a, b):
        return a + b  # 直接返回两个数的和
        

# 模拟地点搜索工具(实际使用可以调用内置的google-serper)
class PlaceSearch_tool(BaseTool):
    name= "地点搜索工具"
    description = "当你需要搜索地点时,使用这个工具"

    def _run(self, query):
        return "狼堡"
    
# 创建地点面积搜索工具
class AreaSearch_tool(BaseTool):
    name= "地点面积搜索工具"
    description = "当你需要搜索地点面积时,使用这个工具"

    def _run(self, query):
        return 500

# 工具集合
tools = [SumNumber_tool(), PlaceSearch_tool(), AreaSearch_tool()]
# 提示词,langchain hub内置提示词,之后文章会再做详细分析
prompt = hub.pull("hwchase17/structured-chat-agent")
# 定义AI Agent
agent = create_structured_chat_agent(
    llm=model,
    tools=tools,
    prompt=prompt
)
# 记录上下文
memory = ConversationBufferMemory(
    memory_key='chat_history',
    return_messages=True
)
# 创建一个代理执行器
agent_executor = AgentExecutor.from_agent_and_tools(
    agent=agent, tools=tools, memory=memory, verbose=True, handle_parsing_errors=True
)


# 测试场景
agent_executor.invoke({"input": "羊村旁边的地方是什么?它的面积加上它的面积是多少?"})

思考

reAct是AI agent很重要的一个概念,它赋予了agent能够逐步推理和执行任务的能力。通过将复杂的任务分解为一系列简单的步骤,并通过使用工具去解决问题,让agent能够更高效地解决问题,最终让agent像人一样能够处理复杂问题。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot3项目中Knife4j的配置与使用

引言 Knife4j 是基于 Swagger 的增强版API文档生成工具,提供美观且功能丰富的API文档界面。 官网:Knife4j 集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j (xiaominfo.com) 配置 基于SpringBoot3进行配置,有以下注意点&#xff1…

Oracle云主机申请和使用教程:从注册到SSH连接的全过程

今天我要和大家分享如何成功申请Oracle云主机,并进行基本的配置和使用。我知道很多同行的朋友在申请Oracle云主机时都遇到了困难(疑惑abc错误),可能试了很多次都没有成功。现总结一下这些年来的一些注册流程经验,或许你们也能成功申请到自己的…

opencv-rust 系列2: camera_calibration

opencv-rust 系列2: camera_calibration 前言: 这里只是opencv-rust自带示例的中文注解. 略微增加了一些代码也是我在调试时用到的. 说明: camera_calibration.rs是opencv-rust自带的示例, 在examples目录中可以找到,我增加了一些中文注释如下.如需运行可以在项目根目录执行命…

Qt第三课 ----------显示类的控件属性

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

从0开始深度学习(8)——softmax回归

1 分类问题 深度学习从大方向上来说,就是回归预测和分类问题。 假设输入一个 2 ∗ 2 2*2 2∗2的灰度图像,可能属于“鸡、猫、狗”三个类别中的一个,那如何在计算机中表示标签呢?最常见的想法是 y { 1 , 2 , 3 } y \{1,2,3\} y{…

现金1.8kw, 年入150w, 财务不自由...

他的生活状态无疑是许多人梦寐以求的。拥有两套无贷款的房产,家庭和睦,两台车价值约50万元。现金资产高达1800万元,家庭年收入约150万元,职业稳定,属于中层管理阶层。 重要的是,孩子们的成绩优异&#xff0…

ListView的Items绑定和comboBox和CheckBox组合使用实现复选框的功能

为 ListView 控件的内容指定视图模式的方法,参考官方文档。 ComboBox 样式和模板 案例说明:通过checkBox和ComboBox的组合方式实现下拉窗口的多选方式,同时说明了ListView中Items项目的两种绑定方式. 示例: 设计样式 Xaml代码…

机器学习 | 特征选择如何减少过拟合?

在快速发展的机器学习领域,精确模型的开发对于预测性能至关重要。过度拟合的可能性,即模型除了数据中的潜在模式外,还拾取训练集特有的噪声和振荡,这是一个固有的问题。特征选择作为一种有效的抗过拟合武器,为提高模型…

好用,易用,高效,稳定 基于opencv 的 图像模板匹配 - python 实现

在定位、搜索固定界面图块时,经常用到模板匹配,opencv自带的图像模板匹配好用,易用,高效,稳定,且有多种匹配计算方式。 具体示例如下: 模板图: 待搜索图: 具体实现代码…

苹果正式宣布:iPhone全面开放近场通信(Near Field Communication,简称NFC)【使用安全元件提供app内NFC数据交换功能】

文章目录 引言I iPhone的NFC功能开发者用户数据交换的体验革新安全与隐私II 知识扩展:近场通信(NFC)技术钱包NFC开关打开读取NFC标签(NFC tags )权限demo引言 2014年iPhone 6开始,苹果首次引入了NFC功能,但最初只允许自家的Apple Pay进行移动支付。慢慢地适配了交通卡,增…

基于go开发的终端版即时通信系统(c-s架构)

项目架构图 类似一个聊天室一样 整体是一个客户端和服务端之间的并发多线程网络通信,效果可以翻到最后面看。 为了巩固基础的项目练手所以分为9个阶段进行迭代开发 版本⼀:构建基础Server 新建一个文件夹就叫golang-IM_system 第一阶段先将server的大…

沈阳化工大学第十一届程序设计沈阳区竞赛:凿冰 Action(博弈论,思维)

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 北极探险队有新收获了!!! 北极探险队发现了NNN条长度不一的冰柱,由于冰柱里封存有价值的生物,现在需要两名生物学家小A和小…

TON生态小游戏开发:推广、经济模型与UI设计的建设指南

随着区块链技术的快速发展,基于区块链的Web3游戏正引领行业变革。而TON生态小游戏,借助Telegram庞大的用户基础和TON(The Open Network)链上技术,已成为这一领域的明星之一。国内外开发者正迅速涌入,开发和…

如何在算家云搭建Kolors(图像生成)

一、模型介绍 Kolors 是快手 Kolors 团队基于潜在扩散的大规模文本转图片生成模型。经过数十亿个文本-图片对的训练,Kolors 在视觉质量、复杂语义准确性和中英文文本渲染方面均比开源和闭源模型具有显著优势。此外,Kolors 支持中英文输入,在…

C语言基础语法——类型转换

数据有不同的类型,不同类型数据之间进行混合运算时涉及到类型的转换问题。 转换的方法有两种: 自动类型转换(隐式转换):遵循一定的规则,由编译系统自动完成强制类型转换(显示转换)…

http协议概述与状态码

目录 1.HTTP概述 1.1请求报文起始行与开头 ​1.2响应报文起始行 ​ 1.3响应报文开头 ​ 2.http状态协议码 1.HTTP概述 默认端口 80 HTTP超文本传输与协议: 数据请求和响应 传输:将网站的数据传递给用户 超文本:图片 视频等 请求request:打开网站 访问网站 响应r…

Python数据分析-垃圾邮件分类

一、研究背景 随着电子通信技术的飞速发展,电子邮件已经成为人们日常工作和生活中不可或缺的一部分。然而,伴随着这一趋势,垃圾邮件(Spam)的数量也在急剧增加。垃圾邮件不仅会占用用户的邮箱空间,还可能含…

设置dl服务解决github pushTimed out问题

提交代码到GitHub,一直提示提交失败 我们一般是fq挂的dl服务器进行的,而git需要配置下dl,此时我们要将dl服务器对应的IP地址和端口为我们所调用。 查找dl服务器(windows直接搜索dl服务器设置,mac参考官网&#xff09…

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第二十二章 安装VMware Tool 工具

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐…

学习python自动化——pytest单元测试框架

一、什么是pytest 单元测试框架,unittest(python自带的),pytest(第三方库)。 用于编写测试用例、收集用例、执行用例、生成测试结果文件(html、xml) 1.1、安装pytest pip instal…