-推荐关注-
推理与行动的协同
通过一个具体的业务场景,使用ReAct的思路来创建一个智能体
1. 业务需求 2. ReAct框架是什么 3. LangChain 中 ReAct Agent 的实现 3.1 大模型(LLM) 3.2 提示词(prompt) 3.3 外部工具(external tools) 3.4 Agent执行器(Agent executor) 4. Agent的完整代码 4.1 运行环境Python 3.10.11, LangChain 0.3 4.2 代码 4.3 运行日志 5. 使用LangSmith跟踪智能体的执行过程 参考
智能体是一种能够感知环境、做出决策并采取行动的系统。这些系统能够执行被动的任务,也能够主动寻找解决问题的方法,适应环境的变化,并在没有人类直接干预的情况下做出决策。
智能体见 : 一文说清楚什么是AI Agent(智能体)
1. 业务需求
现在有一个生意很好的鲜花店
在运营花店的过程中,我们经常遇到天气变化导致鲜花售价变化的情况。那么,每天早上你会如何为当日的鲜花定价呢?
我们创建一个Agent,让Agent可以根据实时的天气和交通状况自动调整产品价格.
人类解决这个问题的一般过程是:
首先看看这个事该怎么办(思考),其次通过搜索引擎查阅网络上今天鲜花的成本价(行动),据此我可预估鲜花的进货价格,然后根据这个价格的高低(观察)来确定要加价多少(思考),最后得出售价(行动)。
人类为鲜花定价的过程如图所示:
这就是我们人类在接到一个新任务时做出决策并完成下一步行动的过程。
在这个简单的例子中,人类首先思考或者观察后再思考,然后采取行动。
这里的观察和思考被统称为“推理”(Reasoning)过程,而“推理”指导人们的“行动”(Acting)。
在Agent开发中,这个动态决策能力可以由 ReAct 来实现
2. ReAct框架是什么
ReAct框架在2022年论文中被引入《ReAct: Synergizing Reasoning and Acting in Language Models》。
它是生成式 AI 应用中广泛使用的提示策略之一。
ReAct 框架的灵感来自“推理”和“行动”之间的协同作用。这种协同作用使得我们能够学习新任务并做出决策。而在大模型应用中,尤其是与 Agent 相关的应用开发中,我们通过提示工程向大模型植入这个思维框架,明确地告诉它们,要循序渐进地、交错地生成推理轨迹和采取行动,将推理和行动融入解决问题的过程中。
ReAct 框架鼓励LLM模型使用提示词的思维过程为:提问、行动、行动输入和观察。(见3.2章:提示词)
详见:从0到1开发AI Agent(智能体)(二)| 智能体推理引擎ReAct框架的快速入门
论文:https://arxiv.org/abs/2210.03629#
3. LangChain 中 ReAct Agent 的实现
在 LangChain 中使用 Agent 时,我们只需要理解下面 4 个元素。
大模型(LLM) :
提供逻辑的引擎,负责生成预测和处理输入。
提示(prompt) :
负责指导模型,形成推理框架。(ReAct风格的提示词)
外部工具(external tools) :
包括数据清洗工具、搜索引擎、应用程序等。
Agent执行器(Agent executor) :
负责调用合适的外部工具,并管理整个流程。(通过create_react_agent生成的Agent)
根据用户的输入(接收任务),Agent会首先决定调用哪些工具,然后通过相应的工具给出答案。Agent不仅可以同时使用多种工具,而且可以将一个工具的输出数据作为另一个工具的输入数据。
3.1 大模型(LLM)
在整个流程中,大模型经常需要自主判断下一步的行动。如果不施加额外的引导,大模型则可能无法自主判断下一步的行动。
例如,任务是查询库存,如果库存不足,就搜索合适的商家并进货。完成这个任务需要考虑一系列的操作。
什么时候开始在本地数据库中进行检索? 如何确定检索本地数据库的步骤已经完成,可以开始进行下一步? 调用哪个外部搜索工具(例如:百度)? 外部搜索工具是否返回想要的内容? 如何确定外部信息的真实性并执行下一步?
通过对 ReAct 框架进行完美封装和实现,LangChain 可以赋予大模型极大的自主性。
应用 ReAct框架后,你的大模型将从一个仅仅可以借助自己内部知识进行对话聊天的机器人飞升为一个能使用工具的智能 Agent。
大模型见 :一文说清楚什么是AI大模型
3.2 提示词(prompt)
提示词可能包含 Agent的性格(也就是给它分配角色,让它以特定方式进行响应)、任务的背景(用于提供更多任务类型的上下文)以及用于激发更好推理能力的提示策略 (如 ReAct 框架)。
尽你所能回答以下问题,你可以访问以下工具:
{tools}
请使用以下格式回答:
问题 : 你必须回答的输入问题
思考 : 你每次都应该思考接下来怎么做
行动 : 要采取的行动,应该是[tool_names}中的一个
行动输人 : 行动的输入
观察 : 行动的结果
......(这个思考 一 行动 一 行动输入 一 观察 过程可以重复N次)
思考 : 我现在知道最终答案了
最终答案 : 原始输入问题的最终答案
开始!
问题 : {input}
思考 : {agent_scratchpad}
在这个提示中,有三个占位符 {tool}、{input} 和 {agent_scratchpad}。这些将在发送到 LLM 之前被适当文本替换。
tool
- 代理可用的工具
input
- 原始问题(通常为用户提出的问题)
agent_scratchpad
- 存储之前的想法/行动/行动输入/观察 的历史记录(思考过程)
参考:https://smith.langchain.com/hub/hwchase17/react?organizationId=099ea035-86e1-4ed7-bc0c-fd43b7039d50
3.3 外部工具(external tools)
ReAct框架会提示大模型为任务生成推理轨迹和行动,这使得Agent能系统地执行动态推理以创建、维护和调整操作计划,同时还支持与外部环境(例如 Google 搜索、维基百科)进行交互,以将额外信息合并到推理中。
这个和外部环境交的过程其实就是我们见过多次的调用并执行工具的行动过程。上面所说的本地知识库或搜索引擎都不是封装在大模型内部的知识,我们把它们称为“外部工具”,见图。
LangChain内置完整工具列表见:https://python.langchain.com/docs/integrations/tools/
3.4 Agent执行器(Agent executor)
如何在我们的人工智能应用中执行需要多个步骤的复杂任务,一个答案是 Agent Executor
LangChain AgentExecutor 构建 Agent,对于入门来说是不错的选择,但当我们需要更多的灵活性和控制,需要创建更高级的 Agent,我们可以使用 LangGraph Agent
Agent Executor负责协调Agent 的执行。它调用Agent ,执行Agent返回的操作,然后再次调用Agent ,将执行操作的结果传递给Agent 。这个过程一直持续到从Agent 那里收到最终答案。
4. Agent的完整代码
4.1 运行环境 Python 3.10.11, LangChain 0.3
4.2 代码
准备环境变量:
import os
# OpenAI 环境变量
os.environ['OpenAI_API_KEY'] = 'hk-iwtb1e427'
# 搜索工具环境变量
os.environ['SERPAPI_API_KEY'] = '66bebeb6a334'
# LangSmith 环境变量 (可选) ,如果需要使用 LangSmith 功能,请在环境变量中设置以下变量
os.environ['LANGCHAIN_TRACING_V2'] = "true"
os.environ['LANGCHAIN_ENDPOINT'] = "https://api.smith.langchain.com"
os.environ['LANGCHAIN_API_KEY'] = "lsv2_pt1c9e"
os.environ['LANGCHAIN_PROJECT'] = "hello-agent"
初始化大模型:
# 初始化大模型
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=1,
base_url="https://api.openai-hk.com/v1"
)
设置工具:
# 设置工具
from langchain_core.tools import tool
# 自定义计算器工具,用于计算鲜花的价格
@tool
def calculator(expression: str) -> str:
"""使用 Python 的 numexpr 库计算数学表达式
表达式应该是一个单行的数学表达式
例如:
"352 * 493" 表示 "352 乘以 493"
"""
import numexpr
import math # 确保导入 math 库
local_dict = {"pi": math.pi, "e": math.e}
result = str(
numexpr.evaluate(
expression.strip(),
global_dict={}, # 限制访问全局变量
local_dict=local_dict, # 添加常用数学函数
)
)
print(f"The result of {expression} is {result}")
return result # 确保返回结果为字符串
from langchain_community.agent_toolkits.load_tools import load_tools
tools = [calculator]
loaded_tools = load_tools(["serpapi"], llm=llm)
tools += loaded_tools
设置提示词模板:
# 设置提示模板
from langchain.prompts import PromptTemplate
template = '''
尽你所能用中文回答以下问题。如果能力不够你可以使用以下工具:
{tools}
Use the following format:
Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question
Begin!
Question: {input}
Thought:{agent_scratchpad}
'''
prompt = PromptTemplate.from_template(template)
# from langsmith import Client
#
# client = Client()
# prompt = client.pull_prompt("hwchase17/react")
print("提示词:")
print(prompt)
使用create_react_agent初始化Agent:
# 初始化Agent
from langchain.agents import create_react_agent
agent = create_react_agent(llm, tools, prompt)
# 构建AgentExecutor
from langchain.agents import AgentExecutor
agent_executor = AgentExecutor(agent=agent, tools=tools, handle_parsing_errors=False, verbose=True)
执行Agent:
# 执行AgentExecutor
agent_executor.invoke({"input":
"""今天市场上玫瑰花的一般进货价格是多少?
如果我在此基础上加价5%,应该如何定价?"""})
4.3 运行日志
5. 使用LangSmith跟踪智能体的执行过程
LangSmith 是一个用于构建生产级LLM应用的平台。
它让您调试、测试、评估和监控基于任何LLM框架构建的链和智能代理,并与 LangChain 无缝集成
非常简单就可以开启 langsmith 日志记录
1.在官网注册,smith.langchain.com
2.新建Tracing projects
3.配置环境变量
os.environ['LANGCHAIN_TRACING_V2'] ="true"
os.environ['LANGCHAIN_ENDPOINT'] ="https://api.smith.langchain.com"
os.environ['LANGCHAIN_API_KEY'] ="你自己的KEY"
os.environ['LANGCHAIN_PROJECT'] ="hello-agent"
完整过程:
在智能体执行完成后,官网控制台就能看到hello-agent这个项目的执行过程:
左边是当前智能体的所有执行环节,右边是对应环节的输入和输出
参考
--END--
点亮“赞”和“在看”,“分享”好友一起看