ReAct智能体实战:让大模型会思考、能动手的秘密武器!

386 阅读4分钟

你有没有想过,为什么有些AI助手不仅能聊天,还能查股票、查天气,甚至帮你自动完成复杂任务?其实,这背后有一套让大模型“会思考、能动手”的套路——ReAct智能体。今天就带你用最通俗的方式,搞懂ReAct的核心原理和实战实现!


一、什么是Agent智能体?ReAct模式又是什么?

  • Agent智能体:让大语言模型(LLM)变得更聪明的一种设计模式。它的核心思想是:把LLM和外部工具/数据源结合起来,赋予AI更多能力。
  • ReAct模式:Reason(思考)+ Action(行动)。让LLM像人一样,遇到问题先思考,再决定是否调用工具,一步步拆解并解决问题。

二、ReAct智能体的工作流程

我们来一步步拆解ReAct智能体的工作流程:

  1. 良好的Prompt设计
    通过精心设计的提示词(Prompt),告诉LLM如何思考、如何行动。
  2. 向LLM提问
    用户提出问题,比如“青岛啤酒和贵州茅台的收盘价哪个贵?”
  3. LLM思考并决定行动
    LLM会分析问题,判断是否需要调用外部工具(如查股票价格)。
  4. 外部工具调用与轮询反馈
    系统根据LLM的“思考结果”,调用对应的工具函数(如get_closing_price),并把结果反馈给LLM,LLM继续思考下一步。
  5. 输出最终答案
    LLM得到所有需要的信息后,给出最终答案,反馈给用户。

三、核心代码结构与实现详解

1. 工具函数与工具列表(tools.py)

项目中通过tools列表定义了可用的外部工具,并用get_closing_price函数实现了股票收盘价查询:

tools = [
  {
    "name": "get_closing_price",
    "description": "使用该工具获取指定股票的收盘价格",
    "parameters": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "股票名称,例如:贵州茅台、青岛啤酒等"
        }
      },
      "required": ["name"]
    }
  }
]

def get_closing_price(name):
  if name == "贵州茅台":
    return '1488.21'
  elif name == "青岛啤酒":
    return '67.92'
  else:
    return '未搜索到该股票'

2. Prompt模板设计(prompt.py)

Prompt模板规定了LLM与工具交互的格式,确保每一步都“思考-行动-观察-总结”:

REACT_PROMPT = """
{instructions}

TOOLS:
------

您可以使用以下工具:

{tools}

使用工具时,请使用以下格式:

思考: 我需要使用工具吗? 是 行动: 要采取的行动,必须是[{tool_names}]其中之一 行动输入: 该行动的输入内容


然后等待用户使用 Observation 回复您操作的结果。
... (这个思考/行动/行动输入/观察可以重复 N 次)
当您有回应要对用户说,或者不需要使用工具时,您必须使用以下格式:

思考: 我需要使用工具吗? 否 最终答案: [在此输入您的回应]

开始!

新输入: {input}

3. LLM客户端配置(llm.py)

通过OpenAI接口连接大模型,支持API Key和自定义base_url:

from openai import OpenAI
import os
from dotenv import load_dotenv
load_dotenv('.env.local')

client = OpenAI(
  api_key=os.getenv('DEEPSEEK_API_KEY'),
  base_url='https://api.deepseek.com/v1'
)

4. 智能体主流程(agent.py)

主流程负责与LLM对话、解析LLM的思考和行动、调用工具并反馈结果,直到获得最终答案:

# 省略部分导入...

def send_messages(messages):
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=messages,
    )
    return response

if __name__ == "__main__":
    instructions = "你是一个股票助手,可以回答股票相关的问题"
    query = "青岛啤酒和贵州茅台的收盘价哪个贵?"
    prompt = REACT_PROMPT.format(
        instructions=instructions,
        tools=tools,
        tool_names="get_closing_price",
        input=query
    )
    messages = [{"role": "user", "content": prompt}]

    while True:
        response = send_messages(messages)
        response_text = response.choices[0].message.content
        print("大模型的回复:")
        print(response_text)

        # 检查是否有最终答案
        final_answer_match = re.search(r'最终答案:\s*(.*)', response_text)
        if final_answer_match:
            final_answer = final_answer_match.group(1)
            print("最终答案:", final_answer)
            break

        messages.append(response.choices[0].message)

        # 解析模型回复中的动作和参数
        action_match = re.search(r'Action:\s*(\w+)', response_text)
        action_input_match = re.search(r'Action Input:\s*({.*?}|".*?")', response_text, re.DOTALL)

        if action_match and action_input_match:
            tool_name = action_match.group(1)
            params = json.loads(action_input_match.group(1))
            if tool_name == "get_closing_price":
                observation = get_closing_price(params["name"])
                messages.append({'role':'user', 'content':f"observation:{observation}"})

四、实用案例:查股票收盘价

假如你问:“青岛啤酒和贵州茅台的收盘价哪个贵?”

  • LLM会先思考:需要分别查两个股票的收盘价。
  • 依次调用get_closing_price工具,获取价格。
  • 最后综合分析,给出最终答案。

五、常见问题解答

  • Q:为什么要用ReAct模式?
    A:让AI既能分步思考,又能灵活调用工具,解决复杂问题更高效、可控。

  • Q:Prompt设计有什么技巧?
    A:要明确告诉LLM每一步该怎么做,格式要规范,便于解析和轮询。

  • Q:如何扩展更多工具?
    A:只需在tools.py中添加新工具,并在主流程中增加对应的调用逻辑即可。


六、总结

本文用通俗语言梳理了ReAct智能体的核心原理、代码结构和实战流程。掌握这种模式,你就能让AI助手变得更聪明、更实用。