langchain系列之基于create_react_agent 创建一个Agent
create_react_agent 是用于构建基于 ReAct(思考-行动)模式 的智能代理(Agent)的核心函数,其作用是将大语言模型(LLM)与工具调用能力结合,实现动态任务处理
create_react_agent
是用于构建基于 ReAct(思考-行动)模式 的智能代理(Agent)的核心函数,其作用是将大语言模型(LLM)与工具调用能力结合,实现动态任务处理。以下是关键要点:
一、核心定义与功能
-
定义
create_react_agent
是一个工厂函数,接收以下参数生成代理:-
chat
模型实例:如ChatOpenAI
对象,负责理解用户输入并生成自然语言回复。 -
tools
列表:包含通过@tool
装饰器封装的函数(如数据查询、API调用等工具),供代理在任务中动态调用。
-
-
核心能力
- 自动决策与工具调用
代理根据输入内容分析是否需要调用工具。例如,用户输入“记录我的宠物偏好为猫和狗”时,代理自动触发更新工具完成操作。 - 动态迭代流程
代理遵循 “思考→行动→观察→再思考” 的循环,直至任务完成或达到终止条件。
- 自动决策与工具调用
二、设计模式与实现逻辑
-
ReAct 模式框架
- 思考(Reason):代理基于当前上下文生成推理步骤(如是否需要调用工具、选择哪个工具)。
- 行动(Action):执行工具调用或生成自然语言响应。
- 观察(Observe):获取工具执行结果或用户反馈,更新上下文。
- 循环上述步骤直至任务完成26。
-
与其他模块的协作
- 常与 LangGraph 的
graph_builder.add_conditional_edges
配合使用,后者控制代理执行后的流程分支(如工具调用成功/失败后的处理逻辑)。
- 常与 LangGraph 的
三、典型使用场景与示例
-
场景示例
- 商品购买系统:代理根据用户输入的商品品种、数量等信息,进行订单创建以及下单
- 商品信息管理:代理通过工具实现用户宠物数据的增删改查
四、示例代码
1、导入需要的库
import json
import time
import os
from dotenv import load_dotenv
from langchain_core.tools import tool
from langchain.chat_models import init_chat_model
from langchain_core.prompts import ChatPromptTemplate
from langchain.agents import AgentExecutor, create_react_agent
load_dotenv(override=True)
2、定义商品获取工具
# 1、商品工具
@tool
def query_goods(good_detail:str,goods_type: str=None, price_range: str = None) -> str:
"""根据商品名称以及价格范围商品数据库查找匹配的商品。
Args:
good_detail: 商品信息总参数,用来接受传参,真实的参数是后面的字段
goods_type: 商品类别,如"水果"、"手机"、"洗衣机"等
price_range: 可选,价格范围,如"1000-2000"
return:
查询到的商品列表
"""
goodss = [
{"goods_name": "苹果","goods_type": "水果","price": 1.00,"description": "苹果","id":"11111111"},
{"goods_name": "香蕉","goods_type": "水果","price": 0.50,"description": "香蕉","id":"22222222"},
{"goods_name": "小米15", "goods_type": "手机","price": 1500,"description": "小米手机","id":"33333333"},
{"goods_name": "iPhone 13","goods_type": "手机","price": 4099,"description": "苹果手机","id":"44444444"},
{"goods_name": "华为mate 70","goods_type": "手机","price": 7800,"description": "华为手机","id":"55555555"}
]
goodsDic = json.loads(good_detail)
goods_type = goodsDic["goods_type"]
new_goods = [goods for goods in goodss if goods["goods_type"] == goods_type]
if len(new_goods) == 0:
return f"抱歉,未找到相关的产品:{goods_type}"
if "price_range" in goodsDic:
try:
min_price, max_price = map(int, price_range.split("-"))
new_goods = [p for p in new_goods if min_price <= p["price"] <= max_price]
except:
pass
formatted_results = "\n".join([
f"{p['goods_name']} - ¥{p['price']}" for p in new_goods
])
return f"获取到一下的{goods_type}:\n{formatted_results}"
3、 定义商品下单工具
# 2、进行下单操作
@tool
def create_order(good_detail:str, goods_name: str = None, price: int= None, quantity:int=None) -> str:
"""创建订单,并返回订单编号。
Args:
good_detail:商品信息,用来接受传参,正真参数是后面的字段
goods_name:商品名称
price:商品价格
quantity:购买数量
return:
订单编号
"""
goodsDetail = json.loads(good_detail)
goods_name = goodsDetail["goods_name"]
price = goodsDetail["price"]
if "quantity" not in goodsDetail:
quantity = 1
else:
quantity = goodsDetail["quantity"]
# 当前时间的毫秒数 作为订单编号
order_num = int(time.time() * 1000)
# 模拟下单操作,返回订单编号
return f"订单创建成功,商品{goods_name}订单编号:{order_num},购买数量为:{quantity},单价:{price},订单总价:{price*quantity}"
4、定义商品支付工具
# 3、进行支付
@tool
def order_pay(order_detail:str, order_num: int=None,order_price: int=None, payment_method: str = None) -> str:
"""进行支付,并返回支付结果。
Args:
order_detail:订单信息,用来接受传参,正真参数是后面的字段
order_num: 订单编号
order_price: 订单价格
payment_method: 支付方式,如"支付宝"、"信微"、"银行卡"
return:
支付结果
"""
payDetail = json.loads(order_detail)
order_num = payDetail["order_num"]
order_price = payDetail["order_price"]
payment_method = payDetail["payment_method"]
# 模拟支付操作,返回支付结果
return f"订单{order_num}支付成功,支付金额为{order_price},支付方式:{payment_method}"
5、Agent 创建
# 工具列表
tools = [
query_goods,
create_order,
order_pay
]
react_prompt = ChatPromptTemplate.from_template("""
Answer the following questions as best you can. You have access to the following tools:
{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}
"""
)
llm_ds = init_chat_model(
"deepseek-chat",
api_key = os.getenv("DEEPSEEK_API_KEY"),
base_url = os.getenv("DEEPSEEK_URL"),
model_provider = "deepseek"
)
# 创建ReAct代理
agent = create_react_agent(
llm=llm_ds,
tools=tools,
prompt=react_prompt
)
# 创建代理执行器
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True, # 显示详细执行过程
max_iterations=5, # 最大工具调用次数
# early_stopping_method="generate", # 提前停止策略
handle_parsing_errors=True # 处理解析错误
)
这里面需要注意的一下几点:
1)、react_prompt这个提示词的创建可以直接用
react_prompt = hub.pull("hwchase17/react")
这个是有langchain自带的莫模板库,上面代码中的提示词模板也是从模板里面拿出来的。
2、这里用的是英文提示词,需要注意的一点是,如果用中文提示词的话(将上面的英文翻译成中文),由于create_react_agent进行推理反思的智能体,会不定时的出现去正确答案都已经获取到了,但是智能体还是在反复的推理中,以至于到达推理次数上限,还没得到正确答案。
6、结果运行测试
query = "我要买一个手机"
query1 = "我要买一个手机,我的预算是5000元,帮我推荐一款"
query2 = "我现在要购买一个苹果,单价是1元,我需要购买5个,帮我创建一个订单"
query3 = "我要支付订单,订单编号是123456789,支付方式是支付宝,订单价格是5000元"
query4 = "我要买一个手机,我的预算是2000元,帮我推荐一款,并进行下单支付"
query5 = "我要买三个苹果,并进行下单支付, 支付方式为微信"
result = agent_executor.invoke({"input": query5})
print(result)
五、写在最后
以上就是一个用langchain的create_react_agent创建的一个智能体,需要注意的一点是,create_react_agent里面的工具,限制只能传一个参数的,所以上面的三个工具的参数,只有第一个是起作用的,后面的参数多设置了默认值为None,不然是会报错的,或者可以直接传一个参数进去,其他的参数可以在注释里面写清楚就可以了。
所以提示词(注释)很重要,要是没有写清楚的话,会造成参数混乱,以至于获取不到对应的参数信息。
官网地址:create_react_agent — 🦜🔗 LangChain documentation
更多推荐
所有评论(0)