create_react_agent 是用于构建基于 ‌ReAct(思考-行动)模式‌ 的智能代理(Agent)的核心函数,其作用是将大语言模型(LLM)与工具调用能力结合,实现动态任务处理。以下是关键要点:

一、核心定义与功能

  1. 定义
    create_react_agent 是一个工厂函数,接收以下参数生成代理:

    • chat 模型实例‌:如 ChatOpenAI 对象,负责理解用户输入并生成自然语言回复‌。
    • tools 列表‌:包含通过 @tool 装饰器封装的函数(如数据查询、API调用等工具),供代理在任务中动态调用‌。
  2. 核心能力

    • 自动决策与工具调用
      代理根据输入内容分析是否需要调用工具。例如,用户输入“记录我的宠物偏好为猫和狗”时,代理自动触发更新工具完成操作‌。
    • 动态迭代流程
      代理遵循 ‌“思考→行动→观察→再思考”‌ 的循环,直至任务完成或达到终止条件‌。

二、设计模式与实现逻辑

  1. ReAct 模式框架

    • 思考(Reason)‌:代理基于当前上下文生成推理步骤(如是否需要调用工具、选择哪个工具)。
    • 行动(Action)‌:执行工具调用或生成自然语言响应。
    • 观察(Observe)‌:获取工具执行结果或用户反馈,更新上下文。
    • 循环上述步骤直至任务完成‌26。
  2. 与其他模块的协作

    • 常与 ‌LangGraph‌ 的 graph_builder.add_conditional_edges 配合使用,后者控制代理执行后的流程分支(如工具调用成功/失败后的处理逻辑)‌。

三、典型使用场景与示例

  1. 场景示例

    • 商品购买系统‌:代理根据用户输入的商品品种、数量等信息,进行订单创建以及下单
    • 商品信息管理‌:代理通过工具实现用户宠物数据的增删改查

四、示例代码

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

 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐