ReAct范式
ReAct范式基本原理
ReAct范式通过一种特殊的提示工程来引导模型,使其每一步的输出都遵循一个固定的轨迹:
- Thought (思考): 这是智能体的“内心独白”。它会分析当前情况、分解任务、制定下一步计划,或者反思上一步的结果。
- Action (行动): 这是智能体决定采取的具体动作,通常是调用一个外部工具,例如
Search['华为最新款手机']。 - Observation (观察): 这是执行
Action后从外部工具返回的结果,例如搜索结果的摘要或API的返回值。
智能体将不断重复这个 Thought -> Action -> Observation 的循环,将新的观察结果追加到历史记录中,形成一个不断增长的上下文,直到它在Thought中认为已经找到了最终答案,然后输出结果。这个过程形成了一个强大的协同效应:推理使得行动更具目的性,而行动则为推理提供了事实依据。
从实现一个ReAct示例学习该范式
解决用户提出的问题:“苹果最新的手机是哪一款?它的主要卖点是什么?2026年即将推出的手机期待点是什么?”
先实现一个搜索工具
1.选择搜索Api&安装其Python包
为了查询到苹果手机的准确信息,我们需要调用搜索工具。
工具 (Tools) 是其与外部世界交互的“手和脚”。为了让ReAct范式能够真正解决我们设定的问题,智能体需要具备调用外部工具的能力。
这里我们选择Google的搜索Api:SerpApi官网,在官网注册后获取到一个Key

复制后Key放在我们项目根目录下的.env文件中
# https://serpapi.com/manage-api-key
SERPAPI_API_KEY="e04621e40762d24a7a98c52bf7ece4bd16b88739139cc452e34a0a9c7fa0627a"
安装SerpApi:
pip install google-search-results
实现名为search的工具,本质就是一个函数,接收一个字符串参数,返回搜索到的一串字符。
def search(query: str) -> str:
"""
一个基于SerpApi的实战网页搜索引擎工具。
它会智能地解析搜索结果,优先返回直接答案或知识图谱信息。
"""
print(f"🔍 正在执行 [SerpApi] 网页搜索: {query}")
try:
api_key = os.getenv("SERPAPI_API_KEY")
if not api_key:
return "错误:SERPAPI_API_KEY 未在 .env 文件中配置。"
params = {
"engine": "google",
"q": query,
"api_key": api_key,
"gl": "cn", # 国家代码
"hl": "zh-cn", # 语言代码
}
client = SerpApiClient(params)
results = client.get_dict()
# 智能解析:优先寻找最直接的答案
if "answer_box_list" in results:
return "\n".join(results["answer_box_list"])
if "answer_box" in results and "answer" in results["answer_box"]:
return results["answer_box"]["answer"]
if "knowledge_graph" in results and "description" in results["knowledge_graph"]:
return results["knowledge_graph"]["description"]
if "organic_results" in results and results["organic_results"]:
# 如果没有直接答案,则返回前三个有机结果的摘要
snippets = [
f"[{i+1}] {res.get('title', '')}\n{res.get('snippet', '')}"
for i, res in enumerate(results["organic_results"][:3])
]
return "\n\n".join(snippets)
return f"对不起,没有找到关于 '{query}' 的信息。"
except Exception as e:
return f"搜索时发生错误: {e}"
搜索工具主要就是调用接口,并整理返回的结果,SerpApi的返回结果的结构可以在这里看到。
创建工具管理器
当智能体需要使用多种工具时(例如,除了搜索,还可能需要计算、查询数据库等),我们需要一个统一的管理器来注册和调度这些工具。为此,我们创建一个 ToolExecutor 类。主要提供注册工具、获取工具等方法。
from typing import Dict, Any
class ToolExcutor:
"""
一个工具执行器,负责管理和执行工具。
"""
def __init__(self):
self.tools: Dict[str, Dict[str, Any]] = {}
def registerTool(self, name: str, description: str, func: callable):
"""
向工具箱中注册一个新工具。
"""
if name in self.tools:
print(f"警告:工具 '{name}' 已存在,将被覆盖。")
self.tools[name] = {"description": description, "func": func}
print(f"工具 '{name}' 已注册。")
def getTool(self, name: str) -> callable:
"""
根据名称获取一个工具的执行函数。
"""
return self.tools.get(name, {}).get("func")
def getAvailableTools(self) -> str:
"""
获取所有可用工具的格式化描述字符串。
"""
return "\n".join([
f"- {name}: {info['description']}"
for name, info in self.tools.items()
])
测试search工具
from tools.ToolExcutor import ToolExcutor;
from tools.SerTool import search;
from dotenv import load_dotenv
# 加载 .env 文件中的环境变量
load_dotenv()
# --- 工具初始化与使用示例 ---
if __name__ == '__main__':
# 1. 初始化工具执行器
toolExecutor = ToolExcutor()
tool_name = "Search"
# 2. 注册我们的实战搜索工具
search_description = "一个网页搜索引擎。当你需要回答关于时事、事实以及在你的知识库中找不到的信息时,应使用此工具。"
toolExecutor.registerTool(tool_name, search_description, search)
# 3. 打印可用的工具
print("\n--- 可用的工具 ---")
print(toolExecutor.getAvailableTools())
tool_input = "苹果最新的手机是哪一款?它的主要卖点是什么?2026年即将推出的手机期待点是什么?"
# 4. 智能体的Action调用,这次我们问一个实时性的问题
print("\n--- 执行 Action: Search['%s'] ---" % tool_input)
tool_function = toolExecutor.getTool(tool_name)
if tool_function:
observation = tool_function(tool_input)
print("--- 观察 (Observation) ---")
print(observation)
else:
print(f"错误:未找到名为 '{tool_name}' 的工具。")
运行结果:

创建ReAct主体
1.设计系统提示词
# ReAct 提示词模板
REACT_PROMPT_TEMPLATE = """
请注意,你是一个有能力调用外部工具的智能助手。
当前日期:{now}
可用工具如下:
{tools}
请严格按照以下格式进行回应:
Thought: 你的思考过程,用于分析问题、拆解任务和规划下一步行动。
Action: 你决定采取的行动,必须是以下格式之一:
- `{{tool_name}}[{{tool_input}}]`:调用一个可用工具。
- `Finish[最终答案]`:当你认为已经获得最终答案时。
- 当你收集到足够的信息,能够回答用户的最终问题时,你必须在Action:字段后使用 Finish[最终答案] 来输出最终答案。
现在,请开始解决以下问题:
Question: {question}
History: {history}
"""
系统提示词的设计很重要,对Action的解析等需要很好的规范,不然会导致智能体无法推进工作。
2.ReAct主体的实现
核心就是一个循环,它不断地“格式化提示词 -> 调用LLM -> 执行动作 -> 整合结果”,直到任务完成或达到最大步数限制。
HelloAgents的实现参考:
class HelloAgentsLLM:
"""
为本书 "Hello Agents" 定制的LLM客户端。
它用于调用任何兼容OpenAI接口的服务,并默认使用流式响应。
"""
def __init__(self, model: str = None, apiKey: str = None, baseUrl: str = None, timeout: int = None):
"""
初始化客户端。优先使用传入参数,如果未提供,则从环境变量加载。
"""
self.model = model or os.getenv("LLM_MODEL_ID")
apiKey = apiKey or os.getenv("LLM_API_KEY")
baseUrl = baseUrl or os.getenv("LLM_BASE_URL")
timeout = timeout or int(os.getenv("LLM_TIMEOUT", 60))
if not all([self.model, apiKey, baseUrl]):
raise ValueError("模型ID、API密钥和服务地址必须被提供或在.env文件中定义。")
self.client = OpenAI(api_key=apiKey, base_url=baseUrl, timeout=timeout)
def think(self, messages: List[Dict[str, str]], temperature: float = 0) -> str:
"""
调用大语言模型进行思考,并返回其响应。
"""
print(f"🧠 正在调用 {self.model} 模型...")
try:
response = self.client.chat.completions.create(
model=self.model,
messages=messages,
temperature=temperature,
stream=True,
)
# 处理流式响应
print("✅ 大语言模型响应成功:")
collected_content = []
for chunk in response:
if not chunk.choices:
continue
content = chunk.choices[0].delta.content or ""
print(content, end="", flush=True)
collected_content.append(content)
print() # 在流式输出结束后换行
return "".join(collected_content)
except Exception as e:
print(f"❌ 调用LLM API时发生错误: {e}")
return None
class ReActAgent:
def __init__(self, llm_client: HelloAgentsLLM, tool_executor: ToolExcutor, max_steps: int = 5):
self.llm_client = llm_client
self.tool_executor = tool_executor
self.max_steps = max_steps
self.history = []
def _parse_output(self, text: str):
"""解析LLM的输出,提取Thought和Action。
"""
# Thought: 匹配到 Action: 或文本末尾
thought_match = re.search(r"Thought:\s*(.*?)(?=\nAction:|$)", text, re.DOTALL)
# Action: 匹配到文本末尾
action_match = re.search(r"Action:\s*(.*?)$", text, re.DOTALL)
thought = thought_match.group(1).strip() if thought_match else None
action = action_match.group(1).strip() if action_match else None
return thought, action
def _parse_action(self, action_text: str):
"""解析Action字符串,提取工具名称和输入。
"""
match = re.match(r"(\w+)\[(.*)\]", action_text, re.DOTALL)
if match:
return match.group(1), match.group(2)
return None, None
def run(self, question: str):
"""
运行ReAct智能体来回答一个问题。
"""
self.history = [] # 每次运行时重置历史记录
current_step = 0
while current_step < self.max_steps:
current_step += 1
print(f"--- 第 {current_step} 步 ---")
# 1. 格式化提示词
tools_desc = self.tool_executor.getAvailableTools()
history_str = "\n".join(self.history)
prompt = REACT_PROMPT_TEMPLATE.format(
now=datetime.now(),
tools=tools_desc,
question=question,
history=history_str
)
# 2. 调用LLM进行思考
messages = [{"role": "user", "content": prompt}]
response_text = self.llm_client.think(messages=messages)
if not response_text:
print("错误:LLM未能返回有效响应。")
break
# 3. 解析LLM的输出
thought, action = self._parse_output(response_text)
if thought:
print(f"思考: {thought}")
if not action:
print("警告:未能解析出有效的Action,流程终止。")
break
# 4. 执行Action
if action.startswith("Finish"):
# 如果是Finish指令,提取最终答案并结束
final_answer = re.match(r"Finish\[(.*)\]", action).group(1)
print(f"🎉 最终答案: {final_answer}")
return final_answer
tool_name, tool_input = self._parse_action(action)
if not tool_name or not tool_input:
# ... 处理无效Action格式 ...
continue
print(f"🎬 行动: {tool_name}[{tool_input}]")
tool_function = self.tool_executor.getTool(tool_name)
if not tool_function:
observation = f"错误:未找到名为 '{tool_name}' 的工具。"
else:
observation = tool_function(tool_input) # 调用真实工具
print(f"👀 观察: {observation}")
# 将本轮的Action和Observation添加到历史记录中
self.history.append(f"Action: {action}")
self.history.append(f"Observation: {observation}")
# 循环结束
print("已达到最大步数,流程终止。")
return None
使用ReAct智能体运行示例,回答用户问题:
if __name__ == '__main__':
llmClient = HelloAgentsLLM();
toolExcutor = ToolExcutor();
tool_name = "Search";
search_description = "一个网页搜索引擎。当你需要回答关于时事、事实以及在你的知识库中找不到的信息时,应使用此工具。"
toolExcutor.registerTool(tool_name, search_description, search);
myAgent = ReActAgent(llm_client=llmClient, tool_executor=toolExcutor);
question = "苹果最新的手机是哪一款?它的主要卖点是什么?2026年即将推出的手机期待点是什么?"
myAgent.run(question=question);
分析运行结果:
工具 'Search' 已注册。
--- 第 1 步 ---
🧠 正在调用 coding-glm-4.7-free 模型...
✅ 大语言模型响应成功:
Thought: 我需要查找苹果最新的手机型号以及它的卖点。由于硬件产品更新频繁,且我的知识库可能无法包含最新的发布信息,我需要使用搜索工具来获取最准确的信息。首先搜索"苹果最新手机型号"。
Action: Search[苹果最新手机型号]
思考: 我需要查找苹果最新的手机型号以及它的卖点。由于硬件产品更新频繁,且我的知识库可能无法包含最新的发布信息,我需要使用搜索工具来获取最准确的信息。首先搜索"苹果最新手机型号"。
🎬 行动: Search[苹果最新手机型号]
🔍 正在执行 [SerpApi] 网页搜索: 苹果最新手机型号
👀 观察: [1] iPhone - 机型比较
比较各款iPhone 机型的功能和技术规格,包括iPhone 17 Pro、iPhone 17 Pro Max、iPhone Air、iPhone 17、iPhone 17e 以及更多机型。
[2] iPhone
iPhone 17 Pro · iPhone Air · iPhone 17 · iPhone 17e · iPhone 16 · 机型比较 · 配件 · 选购iPhone.
[3] 识别你的iPhone 机型
细节:iPhone 14 Pro 配备支持灵动岛的6.1 英寸1全面屏超视网膜XDR 显示屏。采用优质亚光质感玻璃背板设计,机身环绕直边不锈钢边框。侧边按钮位于设备的右 ...
--- 第 2 步 ---
🧠 正在调用 coding-glm-4.7-free 模型...
✅ 大语言模型响应成功:
Thought: 用户询问苹果最新手机型号、卖点以及2026年的期待点。之前的搜索结果有些混乱,既显示了iPhone 17 Pro(这听起来像是未来的型号),又显示了iPhone 14 Pro(旧的型号)。为了获得准确的信息,我需要更精确地搜索“最新发布的iPhone”或具体的最新一代产品(可能是iPhone 15或16系列,视当前时间而定),以确定现实中现在最新的一款。然后再搜索其卖点和关于2026年的传闻。
Action: Search[最新发布的 iPhone 是哪一款]
思考: 用户询问苹果最新手机型号、卖点以及2026年的期待点。之前的搜索结果有些混乱,既显示了iPhone 17 Pro(这听起来像是未来的型号),又显示了iPhone 14 Pro(旧的型号)。为了获得准确的信息,我需要更精确地搜索“最新发布的iPhone”或具体的最新一代产品(可能是iPhone 15或16系列,视当前时间而定),以确定现实中现在最新的一款。然后再搜索其卖点和关于2026年的传闻。
🎬 行动: Search[最新发布的 iPhone 是哪一款]
🔍 正在执行 [SerpApi] 网页搜索: 最新发布的 iPhone 是哪一款
👀 观察: [1] iPhone
我们最新款的iPhone 机型正面配备了超瓷晶面板2,抗刮划能力提升至3 倍 4。iPhone 17 Pro 和iPhone Air 的背面同样配备了超瓷晶面板,耐用性大大增强。水花飞溅?也是小事一桩 ...
[2] iPhone(苹果公司发布的电子产品系列)
2025年10月25日消息,据多方供应链消息和分析师预测,iPhone 18系列新机可能会带来苹果近年来最大规模的升级,涵盖芯片、设计、摄像头乃至产品形态等多个维度,有望重新定义 ...
[3] 识别你的iPhone 机型
细节:iPhone 14 Pro 配备支持灵动岛的6.1 英寸1全面屏超视网膜XDR 显示屏。采用优质亚光质感玻璃背板设计,机身环绕直边不锈钢边框。侧边按钮位于设备的右 ...
--- 第 3 步 ---
🧠 正在调用 coding-glm-4.7-free 模型...
✅ 大语言模型响应成功:
Thought: 根据之前的搜索结果,在当前语境下(似乎是模拟的2025年或之后的时间点),最新的iPhone机型似乎是iPhone 17系列(包含iPhone 17 Pro和iPhone Air)。为了准确回答用户关于主要卖点的问题,我需要搜索更详细的iPhone 17系列的规格和功能介绍。随后,我需要搜索关于2026年即将推出的iPhone(根据命名规律应该是iPhone 18系列)的期待点或传闻。
Action: Search[iPhone 17 系列主要卖点 规格 功能]
思考: 根据之前的搜索结果,在当前语境下(似乎是模拟的2025年或之后的时间点),最新的iPhone机型似乎是iPhone 17系列(包含iPhone 17 Pro和iPhone Air)。为了准确回答用户关于主要卖点的问题,我需要搜索更详细的iPhone 17系列的规格和功能介绍。随后,我需要搜索关于2026年即将推出的iPhone(根据命名规律应该是iPhone 18系列)的期待点或传闻。
🎬 行动: Search[iPhone 17 系列主要卖点 规格 功能]
🔍 正在执行 [SerpApi] 网页搜索: iPhone 17 系列主要卖点 规格 功能
👀 观察: [1] Apple 发布iPhone 17 Pro 和iPhone 17 Pro Max
三颗4800 万像素融合式摄像头,分别是主摄、超广角摄像头和全新的长焦摄像头,功能相当于8 个镜头,包括支持8 倍变焦,创下iPhone 历来最高光学级品质变焦纪录 ...
[2] iPhone 17懶人包:顏色、規格、相機等6大升級成為亮點!
整體而言,A19/A19 Pro 的登場不僅象徵性能再次躍進,也讓iPhone 17 系列成為首批能完整支援Apple Intelligence 功能的機種。對一般使用者而言,體驗 ...
[3] iPhone 17 哪支好?!今年到底該買哪一支iPhone,一次搞懂四 ...
蘋果四款iPhone 17 新機一次齊發,Air、標準版、Pro、Pro Max,各有各的賣點,也各有妥協。問題來了,你的錢又該花在哪一支身上??如果你還在眼花撩亂, ...
--- 第 4 步 ---
🧠 正在调用 coding-glm-4.7-free 模型...
✅ 大语言模型响应成功:
Thought: 从之前的搜索结果来看,我已经了解到苹果最新手机是iPhone 17系列,包括iPhone 17 Pro、iPhone 17 Pro Max、iPhone Air、iPhone 17等。主要卖点包括:4800万像素三摄系统(支持8倍变焦)、A19/A19 Pro芯片、支持Apple Intelligence功能等。但是关于2026年即将推出的手机(应该是iPhone 18系列)的期待点,我需要进一步搜索更详细的信息。
Action: Search[2026年 iPhone 18 期待 升级 特点]
思考: 从之前的搜索结果来看,我已经了解到苹果最新手机是iPhone 17系列,包括iPhone 17 Pro、iPhone 17 Pro Max、iPhone Air、iPhone 17等。主要卖点包括:4800万像素三摄系统(支持8倍变焦)、A19/A19 Pro芯片、支持Apple Intelligence功能等。但是关于2026年即将推出的手机(应该是iPhone 18系列)的期待点,我需要进一步搜索更详细的信息。
🎬 行动: Search[2026年 iPhone 18 期待 升级 特点]
🔍 正在执行 [SerpApi] 网页搜索: 2026年 iPhone 18 期待 升级 特点
👀 观察: [1] 【iPhone 18 上市時間、規格、價格、外觀】傳聞懶人包
iPhone 18 規格升級重點在於2 奈米製程的A20 晶片以及iPhone 18 Pro 的可變光圈相機,而iPhone 摺疊機則帶來的7.8 吋大螢幕與全新無摺痕螢幕體驗。iPhone ...
[2] iPhone 18 價格預測|2026 上市空機價、四款機型售價
iPhone 18 技術再突破?特點一次整理 ; AI 功能反應可能更快; 照片、影片與文字處理效率可能提升; 螢幕與晶片更省電,續航表現更穩 ; 可能搭載A20 Pro 晶片, ...
[3] iPhone 18 is gone! Big reveal from Apple's 2026 event.
下載《Raid》iOS/安卓/PC版➡️ 點擊https://t2m.io/Appledad_Dec25 ,即可解鎖一款源自經典IP的免費神秘傳說英雄,並額外獲得2個史詩英雄 僅限通過此鏈接 ...
--- 第 5 步 ---
🧠 正在调用 coding-glm-4.7-free 模型...
✅ 大语言模型响应成功:
Thought: 根据搜索结果,我已经获得了关于苹果最新手机、其卖点以及2026年预期机型的相关信息。最新发布的是iPhone 17系列,主要卖点集中在影像系统(4800万像素三摄、8倍变焦)、A19芯片以及Apple Intelligence支持。关于2026年的iPhone 18系列,主要期待点包括2纳米工艺的A20芯片、可变光圈相机以及可能推出的折叠屏机型。现在我可以整理这些信息,给出最终答案。
Action: Finish[基于最新的搜索结果,以下是您问题的答案:
**1. 苹果最新的手机是哪一款?**
目前苹果最新发布的手机是 **iPhone 17 系列**。该系列包含四款机型:iPhone 17、iPhone 17 Air、iPhone 17 Pro 和 iPhone 17 Pro Max。
**2. 它的主要卖点是什么?**
iPhone 17 系列的主要卖点如下:
* **突破性的影像系统:** iPhone 17 Pro 和 Pro Max 配备了三颗 4800 万像素融合式摄像头(主摄、超广角和长焦),功能相当于 8 个镜头。其光学品质变焦能力达到了 8 倍,创下了 iPhone 历史上的最高纪录。
* **性能与 AI 体验:** 搭载全新的 A19 / A19 Pro 芯片,性能实现大幅跃进。该系列也是首批能完整支持 **Apple Intelligence** 功能的机型,提升了用户在智能处理方面的体验。
* **屏幕与耐用性:** 正面和背面均配备了超瓷晶面板,抗刮划能力显著提升(最高提升至 3 倍),大大增强了设备的耐用性。
**3. 2026 年即将推出的手机(iPhone 18 系列)期待点是什么?**
针对 2026 年预计推出的 iPhone 18 系列,目前的传闻和期待点包括:
* **芯片制程升级:** 预计将搭载基于 **2 纳米制程** 的 A20(或 A20 Pro)芯片,这将带来更高的能效、更稳定的续航表现以及更快的 AI 功能反应速度。
* **影像技术革新:** iPhone 18 Pro 可能会配备 **可变光圈相机**,进一步提升摄影灵活性。
* **全新产品形态:** 市场高度期待苹果可能会推出 **折叠屏 iPhone**,传闻将带来 7.8 英寸的大屏幕以及全新的无折痕屏幕体验。]
思考: 根据搜索结果,我已经获得了关于苹果最新手机、其卖点以及2026年预期机型的相关信息。最新发布的是iPhone 17系列,主要卖点集中在影像系统(4800万像素三摄、8倍变焦)、A19芯片以及Apple Intelligence支持。关于2026年的iPhone 18系列,主要期待点包括2纳米工艺的A20芯片、可变光圈相机以及可能推出的折叠屏机型。现在我可以整理这些信息,给出最终答案。
:::::::finishGroup:::::: Finish[基于最新的搜索结果,以下是您问题的答案:
**1. 苹果最新的手机是哪一款?**
目前苹果最新发布的手机是 **iPhone 17 系列**。该系列包含四款机型:iPhone 17、iPhone 17 Air、iPhone 17 Pro 和 iPhone 17 Pro Max。
**2. 它的主要卖点是什么?**
iPhone 17 系列的主要卖点如下:
* **突破性的影像系统:** iPhone 17 Pro 和 Pro Max 配备了三颗 4800 万像素融合式摄像头(主摄、超广角和长焦),功能相当于 8 个镜头。其光学品质变焦能力达到了 8 倍,创下了 iPhone 历史上的最高纪录。
* **性能与 AI 体验:** 搭载全新的 A19 / A19 Pro 芯片,性能实现大幅跃进。该系列也是首批能完整支持 **Apple Intelligence** 功能的机型,提升了用户在智能处理方面的体验。
* **屏幕与耐用性:** 正面和背面均配备了超瓷晶面板,抗刮划能力显著提升(最高提升至 3 倍),大大增强了设备的耐用性。
**3. 2026 年即将推出的手机(iPhone 18 系列)期待点是什么?**
针对 2026 年预计推出的 iPhone 18 系列,目前的传闻和期待点包括:
* **芯片制程升级:** 预计将搭载基于 **2 纳米制程** 的 A20(或 A20 Pro)芯片,这将带来更高的能效、更稳定的续航表现以及更快的 AI 功能反应速度。
* **影像技术革新:** iPhone 18 Pro 可能会配备 **可变光圈相机**,进一步提升摄影灵活性。
* **全新产品形态:** 市场高度期待苹果可能会推出 **折叠屏 iPhone**,传闻将带来 7.8 英寸的大屏幕以及全新的无折痕屏幕体验。] None
Traceback (most recent call last):
File "/Users/shane/dev/agents/article/demo/chapter4/ReActTest.py", line 163, in <module>
myAgent.run(question=question);
~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
File "/Users/shane/dev/agents/article/demo/chapter4/ReActTest.py", line 128, in run
final_answer = finishGroup.group(1);
^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'group'
这里发现有一段报错,排查后是因为final_answer = re.match(r"Finish\[(.*)\]", action).group(1)正则匹配时没有匹配换行符,所以要将这一行代码改成:
final_answer = re.match(r"Finish\[(.*)\]", action, re.S).group(1)
还发现一些问题,再次运行有概率输出这样的思考:
Thought: 用户想知道苹果最新的手机型号、它的卖点以及今年即将推出的新机期待点。首先,我需要确认目前市面上的最新iPhone型号(通常是iPhone 15系列,特别是Pro/Max版本)以及它的主要卖点。其次,我需要搜索关于今年(2024年)即将发布的iPhone 16系列的最新爆料和期待点。
llm误认为今年是2024年,但现在已经是2026年,所以需在prompt上加一下: 当前日期:{now},并在format时将datetime.now()传进去(已在代码里标红)。
这样再运行发现llm已经可以确认当前日期为:
Thought: 用户询问苹果最新的手机型号、主要卖点,以及今年即将推出的手机的期待点。当前日期是2026年7月18日。通常苹果会在每年的9月发布新机。因此,目前市面上的最新手机应该是2025年9月发布的iPhone 17系列,而今年即将推出的应该是iPhone 18系列。我需要搜索相关信息来确认具体的型号、卖点以及下一代机型的传闻和期待点。
至此我们得到用户输入问题的答案为:
