你有没有想过,为什么有些AI助手不仅能聊天,还能查股票、查天气,甚至帮你自动完成复杂任务?其实,这背后有一套让大模型“会思考、能动手”的套路——ReAct智能体。今天就带你用最通俗的方式,搞懂ReAct的核心原理和实战实现!
一、什么是Agent智能体?ReAct模式又是什么?
- Agent智能体:让大语言模型(LLM)变得更聪明的一种设计模式。它的核心思想是:把LLM和外部工具/数据源结合起来,赋予AI更多能力。
- ReAct模式:Reason(思考)+ Action(行动)。让LLM像人一样,遇到问题先思考,再决定是否调用工具,一步步拆解并解决问题。
二、ReAct智能体的工作流程
我们来一步步拆解ReAct智能体的工作流程:
- 良好的Prompt设计
通过精心设计的提示词(Prompt),告诉LLM如何思考、如何行动。 - 向LLM提问
用户提出问题,比如“青岛啤酒和贵州茅台的收盘价哪个贵?” - LLM思考并决定行动
LLM会分析问题,判断是否需要调用外部工具(如查股票价格)。 - 外部工具调用与轮询反馈
系统根据LLM的“思考结果”,调用对应的工具函数(如get_closing_price),并把结果反馈给LLM,LLM继续思考下一步。 - 输出最终答案
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助手变得更聪明、更实用。