当前,在各个大厂纷纷卷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

基于ReAct机制的AI Agent的更多相关文章

  1. 基于React Native的移动平台研发实践分享

    转载:http://blog.csdn.net/haozhenming/article/details/72772787 本文目录: 一.React Native 已经成为了移动前端技术的趋势 二.基 ...

  2. React-Native(三):React Native是基于React设计的

    React Native是基于React js设计的. 参考:<React 入门实例教程> React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript ...

  3. 放弃antd table,基于React手写一个虚拟滚动的表格

    缘起 标题有点夸张,并不是完全放弃antd-table,毕竟在react的生态圈里,对国人来说,比较好用的PC端组件库,也就antd了.即便经历了2018年圣诞彩蛋事件,antd的使用者也不仅不减,反 ...

  4. 基于React实现的【绿色版电子书阅读器】,支持离线下载

    代码地址如下:http://www.demodashi.com/demo/12052.html MyReader 绿色版电子书阅读器 在线地址:http://myreader.linxins.com ...

  5. 基于React的PC网站前端架构分析

    代码地址如下:http://www.demodashi.com/demo/12252.html 本文适合对象 有过一定开发经验的初级前端工程师: 有过完整项目的开发经验,不论大小: 对node有所了解 ...

  6. 基于 React.js + Redux + Bootstrap 的 Ruby China 示例 (转)

    一直学 REACT + METEOR 但路由部分有点问题,参考一下:基于 React.js + Redux + Bootstrap 的 Ruby China 示例 http://react-china ...

  7. RSuite 一个基于 React.js 的 Web 组件库

    RSuite http://rsuite.github.io RSuite 是一个基于 React.js 开发的 Web 组件库,参考 Bootstrap 设计,提供其中常用组件,支持响应式布局. 我 ...

  8. 基于React Native的Material Design风格的组件库 MRN

    基于React Native的Material Design风格的组件库.(为了平台统一体验,目前只打算支持安卓) 官方网站 http://mrn.js.org/ Github https://git ...

  9. Android的事件处理机制(一)------基于回调机制的事件处理

    Android平台的事件处理机制有两种,一种是基于回调机制的,一种是基于监听接口的,现介绍第一种:基于回调机制的事件处理.Android平台中,每个View都有自己的处理事件的回调方法,开发人员可以通 ...

  10. 基于react全家桶+antd-design+webpack2+node+express+mongodb开发的前后台博客系统

    很久没更新博客,最近也有点忙,然后业余时间搞了一个比较完整基于react全家桶+antd-design+webpack2+node+express+mongodb开发的前后台博客系统的流程系统,希望对 ...

随机推荐

  1. ip 记录路由选项

    前言 准备整理网络这块,先把概念整理. ip记录路由选项,这个是做什么的呢? 比如说我们发的一条信息,从一端到另外一端经过了那些路由呢?这是一个问题啊. 这个ip记录路由选项就是来看这个问题的,当然这 ...

  2. 实战:如何编写一个 OpenTelemetry Extensions

    前言 前段时间我们从 SkyWalking 切换到了 OpenTelemetry ,与此同时之前使用 SkyWalking 编写的插件也得转移到 OpenTelemetry 体系下. 我也写了相关介绍 ...

  3. 模拟IDC spark读写MaxCompute实践

    简介: 现有湖仓一体架构是以 MaxCompute 为中心读写 Hadoop 集群数据,有些线下 IDC 场景,客户不愿意对公网暴露集群内部信息,需要从 Hadoop 集群发起访问云上的数据.本文以 ...

  4. 使用率激增 250%,这份报告再次将 Serverless 推向幕前

    简介: 本文是对 Datadog 最新的一份 Serverless 报告的解读,欢迎大家留言讨论. 本文是对 Datadog 最新的一份 Serverless 报告的解读,欢迎大家留言讨论.​ 每项新 ...

  5. [FAQ][Hardhat] Error HH501: Couldn't download compiler version 0.8.0. Please check your connection.

    当使用 npx hardhat compile 命令编译智能合约时,会先下载你在 hardhat.config.js 配置中对应版本的 solidity 编译器. 当网络不可达时,就会提示无法下载的错 ...

  6. [FAQ] uni-app 不支持 v-cloak 情况下如何处理 v-if 页面闪烁问题

    在 Vue 中存在使用 v-if 决定元素显示隐藏的时候,会出现页面闪烁,那么当然 uni-app 中也存在了. 如果编译完后,需要满足 js 的某个条件才隐藏,页面元素必然会有闪烁的情况. 所以解决 ...

  7. [FE] Quasar 变通 loading 单纯使用遮罩效果的方法

    Quasar 的 loading 组件是提供加载中的遮罩效果的. 如果你不想要 loading 的效果,只想保留遮罩效果,那么你可以通过 show() 方法的参数进行调整. 把 spinnerSize ...

  8. vue使用vant的van-tabs+tag在选项卡展示该内容有几条的提示

    1.直接写用v-if判断下标展示,会滚动.pass! 2.定位,各种定位,相对各种父元素各种定位,还是会滚,因为tab内容一定滚动,pass 3.手写选项卡+v-if判断,这肯定可行,但本着能用ui组 ...

  9. linux导出安装包

    linux导出安装包 1 背景 部署企业内网环境,主机无法连通外网.不能直接使用yum install安装程序.针对此种情况有如下两个安装办法 源码安装(需要编译环境,安装复杂,容易出错,不推荐) 使 ...

  10. .NET静态代码织入——肉夹馍(Rougamo)发布3.0

    肉夹馍(https://github.com/inversionhourglass/Rougamo)通过静态代码织入方式实现AOP的组件,其主要特点是在编译时完成AOP代码织入,相比动态代理可以减少应 ...