在 AI 发展过程中,如何让大模型不仅能理解问题,还能与外部工具交互,甚至像人类一样“思考-行动-反馈-再思考”,一直是核心研究方向。Function Calling 和 ReAct(Reason + Act)正是实现这一目标的关键机制。
本文将深入解析 Function Calling 和 ReAct 的工作原理,并通过一个 查询股票收盘价的实战案例 展示如何改进提示词(Prompt)以提升 AI 交互的智能性。
1. Function Calling & ReAct 让大模型更智能
🔹 Function Calling:让大模型能调用外部工具
Function Calling(函数调用)允许 LLM 通过 API 请求与外部工具交互,比如:
✅ 调用数据库查询实时数据(如股票价格、天气)
✅ 控制硬件设备(如智能家居)
✅ 调用计算 API 进行数学运算
大厂 LLM(如 OpenAI GPT-4-turbo、Claude 3)已经支持 Function Calling,使 AI 具备“工具使用能力”。
示例:GPT-4 Function Calling
{"name": "get_stock_price","description": "查询股票的最新价格","parameters": {"symbol": {"type": "string","description": "股票代码,例如 AAPL"}}
}
🔹 ReAct(Reason + Act):让大模型具备思考 + 反馈 + 行动的能力
ReAct 是 "Reasoning + Acting"(推理 + 行动) 的结合,让 LLM 不仅能生成答案,还能思考、调用工具、分析反馈,像 Agent 一样分步解决问题。
ReAct 通过以下步骤完成任务:
-
Reason(推理):分析问题,规划解决方案
-
Act(行动):调用 API / 数据库 / 计算工具
-
Observe(观察):接收外部工具返回结果
-
Reflect(反思):调整策略,继续调用工具或直接回答
示例:ReAct 交互流程
Question: "今天苹果公司(AAPL)的收盘价是多少?"Reasoning: "需要获取最新的股票数据,调用股票 API 查询 AAPL 价格"Action: 调用 `get_stock_price(symbol="AAPL")`Observation: "返回价格:$180.32"Final Answer: "苹果公司今天的收盘价是 $180.32"
🔹 ReAct 比 Function Calling 更高级
-
Function Calling 只执行外部 API,但不会自主思考如何使用这些 API
-
ReAct 结合 Function Calling + 反思,让 AI 动态调整策略,变成 Agent
2. AI Agent:让大模型主动决策
Agent = LLM + 记忆 + 规划 + 工具调用
AI Agent 具备 主动思考 + 交互能力,能处理复杂任务。
Agent 框架(如 LangChain)基于 ReAct,结合工具增强 AI 能力: ✅ LangChain Agent
✅ OpenAI Function Calling
✅ AutoGPT / BabyAGI
Agent 示例:查询 & 记录用户历史提问
用户提问:「AAPL 的收盘价?」
Agent 思考:「调用 API 查询 AAPL 价格」
Agent 记录:「用户问了 AAPL,可能后续会问 TSLA / GOOG」
Agent 决策:「建议用户查询其他科技股?」
📌 这样,Agent 不仅查询数据,还能预测用户意图,提升交互体验!
3. ReAct Prompt:让 LLM 学会思考 + 行动
ReAct Prompt 设计规定了 AI 的思维方式,指导其拆解问题并调用工具。
ReAct Prompt 模板
Question: {用户输入的问题}Thought: 需要获取相关信息,选择合适的工具
Action: {调用的工具 + 参数}
Observation: {工具返回的结果}
...(可能重复多次)
Final Answer: {最终答案}
案例:查询 AAPL 股票收盘价
Question: "苹果公司的最新收盘价是多少?"Thought: "我需要调用股票查询 API 获取 AAPL 的最新价格"
Action: get_stock_price("AAPL")
Observation: "返回:$180.32"Final Answer: "苹果公司今天的收盘价是 $180.32"
🔹 修改 Prompt 提高 AI 智能性 默认 ReAct Prompt 可能只会调用 API 一次,但我们希望 AI: ✅ 如果数据有误,能 自动重试
✅ 如果股票代码错误,能 建议用户修改
优化后的 Prompt:
Question: {用户输入的问题}Thought: 需要获取最新股票价格,但如果 API 失败,我会重新尝试或请求用户提供更详细信息。
Action: {调用的工具 + 参数}
Observation: {工具返回的结果}
Thought: 结果是否正确?是否需要进一步查询?
...(循环)
Final Answer: {最终答案}
这样,AI 变得更智能,不会因为 API 失败就直接输出错误答案。
4. 实战案例:基于 Function Calling + ReAct 查询股票价格
技术栈:OpenAI GPT-4 + FastAPI + Alpha Vantage API(股票查询)
🔹 实现 Function Calling
import openaifunctions = [{"name": "get_stock_price","description": "获取股票的最新收盘价","parameters": {"type": "object","properties": {"symbol": {"type": "string","description": "股票代码,例如 AAPL"}}}}
]def get_stock_price(symbol):# 调用 Alpha Vantage API 获取股票价格url = f"https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol={symbol}&apikey=YOUR_API_KEY"response = requests.get(url).json()return response["Global Quote"]["05. price"]response = openai.ChatCompletion.create(model="gpt-4-turbo",messages=[{"role": "user", "content": "查询 AAPL 的收盘价"}],functions=functions,function_call="auto"
)
🔹 整合 ReAct 机制
def query_stock_price(symbol):thought = "我需要调用 API 查询股票价格"print(f"Thought: {thought}")action = f"调用 get_stock_price({symbol})"print(f"Action: {action}")try:price = get_stock_price(symbol)observation = f"返回价格:${price}"except Exception as e:observation = "API 查询失败,可能是股票代码错误"print(f"Observation: {observation}")if "API 查询失败" in observation:return "请检查股票代码是否正确"else:return f"Final Answer: {symbol} 的最新收盘价是 ${price}"
5. 总结
Function Calling 和 ReAct 让 LLM 不再是“死记硬背的模型”,而是具备主动思考和交互能力的智能体。
✅ Function Calling 让 LLM 具备调用外部工具的能力(API、数据库等)
✅ ReAct 让 LLM 能 拆解问题、思考、调用工具、调整策略
✅ 结合 Function Calling + ReAct,可以构建智能 AI Agent,适用于搜索、金融、医疗等场景