-推荐关注-
1. ReAct是什么
2. 代码实现
2.1 导入基于ReAct的提示词
2.2 创建大模型实例
2.3 定义搜索工具
2.4 创建ReAct智能体
2.5 执行ReAct智能体
3. 完整代码
3.1 执行结果(可以看到整个思考过程)
参考
智能体有3个核心组件:规划、记忆、工具。其中规划(同时也包含决策)能力,以有效地执行更复杂的任务,这涉及到子目标的分解、连续的思考、自我反思和批评,以及对表征行动的反思。
1. ReAct是什么
ReAct框架正是这个自我反思环节使用到的一个框架,用于指导大模型完成复杂任务的结构化思考和决策过程。ReAct框架包括一系列的步骤,使得大模型能够以更系统和高效的方式处理和回应查询,确保它能够全面和准确地回应用户的需求。
通过 ReAct 框架,Agent获得了动态决策能力。当遇到自己内部知识无法解决的问题时,Agent先搜索或调用工具,拓展自己的知识面。Agent还利用工具的灵活性,协调使用各种工具,在多个数据点之间进行切换,以获得最终的决策数据。Agent在执行每一步后会观察结果,并将新信息用于接下来的决策过程,这体现了Agent出色的学习能力与适应性。
ReAct框架的设计哲学是:在动态和不确定的环境中,有效的决策需要持续的学习和适应,以及快速将推理转化为行动的能力,即形成有效的观察 一 思考 一 行动 一 再观察的循环(见图)
图1
该循环过程主要涉及如下3个步骤
思考(Thought): 涉及对下一个行动进行推理。在这一步骤中需要评估当前情况并考虑可能的行动方案。
行动(Action): 基于思考的结果,决定采取什么行动。这一步骤是行动计划的选择过程。
观察(Observation): 执行行动后,需要观察并收集反馈。这一步将对行动结果进行评估。它可能影响或改变下一轮次思考的方向。
在LangChain中ReAct框架的实现流程:Agent首先接到任务,然后自动进行推理,最后自主调用工具来完成任务。
整个 ReAct 框架的实现流程强调自主 Agent 在完成任务时如何利用大模型的推理能力和使用外部工具,以及如何与环境互动以产生结果。这个框架凸显了大模型在推理和决策中的中心作用,并说明了工具如何为大模型扩展能力,以及 Agent如何通过与环境的动态交互来驱动任务的完成。
2. 代码实现
整个代码分为几个部分:
导入基于ReAct的提示词
创建大模型实例
定义搜索工具
创建ReAct智能体
执行ReAct智能体
代码基于LangChain v0.3
2.1 导入基于ReAct的提示词
从LangChain的Hub(可以理解成一个社区)中直接将hwchase17 这个用户设计好的 ReAct 提示词“拉”进来。
from langsmith import Client
client = Client()
# 从Hub中获取ReAct的提示词模板
prompt = client.pull_prompt("hwchase17/react")
print(prompt)
提示词:
input_variables=['agent_scratchpad', 'input', 'tool_names', 'tools']
input_types={} partial_variables={} metadata={'lc_hub_owner': 'hwchase17', 'lc_hub_repo': 'react', 'lc_hub_commit_hash': 'd15fe3c426f1c4b3f37c9198853e4a86e20c425ca7f4752ec0c9b0e97ca7ea4d'}
template='Answer the following questions as best you can. You have access to the following tools:\n\n{tools}\n\n
Use the following format:\n\n
Question: the input question you must answer\n
Thought: you should always think about what to do\n
Action: the action to take, should be one of [{tool_names}]\n
Action Input: the input to the action\n
Observation: the result of the action\n...
(this Thought/Action/Action Input/Observation can repeat N times)\n
Thought: I now know the final answer\n
Final Answer: the final answer to the original input question\n\n
Begin!\n\n
Question: {input}\n
Thought:{agent_scratchpad}'
把上边提示词翻译成如下伪代码,可以更方便理解这个 ReAct 框架。
尽你所能回答以下问题,你可以访问以下工具:
{tools}
请使用以下格式回答
问题:你必须回答的输入问题
思考:你每次都应该思考接下来怎么做
行动:要采取的行动,应该是[tool_names}中的一个
行动输人:行动的输入
观察:行动的结果
......(这个思考 一 行动 一 行动输入 一 观察 过程可以重复N次)
思考:我现在知道最终答案了
最终答案:原始输入问题的最终答案
开始!
问题:{input}
思考:{agent_scratchpad}
而有了这个提示,大模型就会按照图1中的思路走,经过思考,它明白该搜索时就调用搜索工具,而不会轻易“胡言乱语”
这个决策过程或工作流程包含了开始提到的3个步骤:行动、观察、思考和最终答案
2.2 创建大模型实例
若要构建 Agent,首先应创建大模型的实例。因为大模型是 Agent 的推理引擎。
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="gpt-3.5-turbo",
base_url="https://api.openai-hk.com/v1"
)
LangChain 支持许多不同的语言模型,可以使用它们进行互换
langchain_openai是其中之一,langchain集成的openai的功能包
其他比如还有集成google的模型:pip install -qU langchain-google-vertexai
其他语言模型、ChatOpenAI的使用见:
https://python.langchain.com/docs/tutorials/llm_chain/#using-language-models
https://python.langchain.com/api_reference/openai/chat_models/langchain_openai.chat_models.base.ChatOpenAI.html#langchain_openai.chat_models.base.ChatOpenAI
这个地方"https://api.openai-hk.com/v1"用的是openai的一个代理服务,解决国内因为网络不能访问openai api的问题,
如果网络可以访问openai,请使用openai的地址:https://api.openai.com/v1
2.3 定义搜索工具
我们已经设置了大模型实例,接下来配置工具--此处只有一个搜索工具。
# 导入SerpAPIWrapper即工具包
from langchain_community.utilities import SerpAPIWrapper
from langchain.agents import Tool
# 实例化SerpAPIWrapper
search = SerpAPIWrapper()
# 准备工具列表
tools = [
Tool(
name="Search",
func=search.run,
description="当大模型没有相关知识时,用于搜索知识"
),
]
SerpAPIWrapper是一个包装器,其中封装了与SerpApi的交互以便通过编程方式访问 SerpApi提供的搜索服务。SerpApi是一个服务,它提供了对多个搜索引擎(如 Google、Bing 等)的查询接口。
Tool类则是LangChain Agent 可以使用的工具的基础类。一个 Tool实例代表Agent 可以访问的一个外部功能或服务。列表 tools 中包含 Tool 类的实例。列表中的每个元素都代表一个工具,Agent可以利用这些工具来执行任务。
2.4 创建ReAct智能体
有了大模型、工具,以及 ReAct框架提示,接下来就可以开始构建 ReAct Agent的实例。
# 导入create_react_agent功能
from langchain.agents import create_react_agent
# 构建ReAct代理
agent = create_react_agent(llm, tools, prompt)
llm是之前实例化的大模型,tools是之前定义的SerpApi搜索工具,而 prompt 则是包含 ReAct 框架的提示,用来定义 Agent 的行为和任务。
2.5 执行ReAct智能体
最后,创建专门负责运行Agent的AgentExecutor,并通过 AgentExecutor的invoke 方法来执行 ReAct Agent 的实例,以便观察结果。
# 导入AgentExecutor
from langchain.agents import AgentExecutor
# 创建代理执行器并传入代理和工具
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 调用代理执行器,传入输入数据
agent_executor.invoke({"input": "请用中文回答:2024年底,AI Agent最新研究进展是什么?"})
3. 完整代码
环境:Python 3.10.11
依赖版本:
langchain 0.3.9
langchain-community 0.3.9
langchain-core 0.3.21
langchain-openai 0.2.11
langchain-text-splitters 0.3.2
langchainhub 0.1.21
langsmith 0.1.147
import os
os.environ['OpenAI_API_KEY'] = 'hk-iwtbie10000491e427'
os.environ['SERPAPI_API_KEY'] = '66bebeb62a4d8462a334'
from langsmith import Client
client = Client()
prompt = client.pull_prompt("hwchase17/react")
print(prompt)
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="gpt-3.5-turbo",
base_url="https://api.openai-hk.com/v1"
)
# 导入SerpAPIWrapper即工具包
from langchain_community.utilities import SerpAPIWrapper
from langchain.agents import Tool
# 实例化SerpAPIWrapper
search = SerpAPIWrapper()
# 准备工具列表
tools = [
Tool(
name="Search",
func=search.run,
description="当大模型没有相关知识时,用于搜索知识"
),
]
# 导入create_react_agent功能
from langchain.agents import create_react_agent
# 构建ReAct代理
agent = create_react_agent(llm, tools, prompt)
# 导入AgentExecutor
from langchain.agents import AgentExecutor
# 创建代理执行器并传入代理和工具
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 调用代理执行器,传入输入数据
agent_executor.invoke({"input": "请用中文回答:2024年底,AI Agent最新研究进展是什么?"})
3.1 执行结果(可以看到整个思考过程)
参考:
2. 从0到1开发AI Agent(智能体)(一)| 基于大模型的AI Agent技术框架
3.《大模型应用开发 动手做AI Agent》
--END--