智能体的规划与推理 目录3.1.1 CoT框架分步推理1. CoT的工作原理2. Python实现示例3.1.2 ToT框架多路径探索式推理1. 技术概述与定义2. 基本工作原理3. 技术实现细节4. 实现案例3.1.3 ReAct框架将ReasoningActing结合1. 核心组件2. 工作流程3. Python实现案例《AI Agent智能体开发实践》(邓立国邓淇文)【摘要 书评 试读】- 京东图书《AI Agent智能体开发实践》1~6章试读_《ai agent 智能体开发实践》在线阅读-CSDN博客智能体的规划与推理能力是其实现复杂任务的核心其中Chain-of-ThoughtCoT思维链、Tree-of-ThoughtToT思维树和ReAct框架是三种关键技术。本节详细解析这三种关键技术。3.1.1 CoT框架分步推理CoT是一种让大型语言模型展示其推理过程的技术通过引导模型逐步展示解决问题的中间推理步骤而不是直接给出最终答案。1. CoT的工作原理1基本机制1模型接收包含问题的提示prompt。2不是直接回答而是首先生成一系列中间推理步骤。3基于这些中间步骤得出最终答案。2与传统提示的区别1传统提示问题→直接答案。2CoT提示问题→推理步骤1→推理步骤2→……→最终答案。2. Python实现示例【示例3.1】使用DeepSeek API实现CoT。import requests import os from dotenv import load_dotenv # 可选用于加载环境变量 # 1. 加载API密钥避免硬编码更安全 load_dotenv() # 加载.env文件中的环境变量 API_KEY (DEEPSEEK_API_KEY) # 从.env文件读取API_KEY API_URL https://api.deepseek.com/v1/chat/completions # DeepSeek Chat API端点需确认最新地址 # 2. 定义CoT Prompt模板以数学计算为例 def build_cot_prompt(question): cot_template 你需要解决以下问题并严格按照要求分步推理 问题{question} 要求 1. 先明确问题中的已知信息和需要求的结果 2. 每一步推理都必须说明“为什么这么做”如“第一步计算总消耗因为需要先知道用掉多少” 3. 不允许跳步即使是简单计算也需说明理由 4. 推理结束后用“【最终答案】”开头总结结果。 【推理过程】 return cot_template.format(questionquestion) # 传入具体问题生成完整Prompt # 3. 调用DeepSeek API获取CoT推理结果 def call_deepseek_cot(question): # 构建请求体遵循DeepSeek API格式参考官方文档 prompt build_cot_prompt(question) payload { model: deepseek-chat, # 模型名称如deepseek-chat、deepseek-coder需确认可用模型 messages: [{role: user, content: prompt}], # 用户消息CoT Prompt temperature: 0.2, # 温度越低推理越稳定CoT需低温度避免逻辑混乱 max_tokens: 1000 # 最大输出长度确保能容纳完整推理过程 } # 发送HTTP请求 headers { Authorization: fBearer {API_KEY}, Content-Type: application/json } response requests.post(API_URL, jsonpayload, headersheaders) response.raise_for_status() # 捕获HTTP错误如API密钥无效、额度不足 # 解析模型输出 cot_result response.json()[choices][0][message][content] return cot_result # 4. 示例运行CoT推理解决数学问题 if __name__ __main__: # 待解决的复杂问题 user_question 一个长方形操场长是宽的2倍周长是180米求操场的面积是多少平方米 # 调用API获取推理结果 cot_output call_deepseek_cot(user_question) # 打印结果含推理过程和最终答案 print(DeepSeek CoT推理结果) print(*50) print(cot_output)运行代码输出如下DeepSeek CoT推理结果 【推理过程】 第一步明确已知信息和需要求的结果。 已知信息操场是一个长方形长是宽的2倍周长是180米。 需要求的结果操场的面积单位平方米。 第二步设未知数表示宽。 因为长是宽的2倍所以设宽为 \( w \) 米那么长就是 \( 2w \) 米。这样设未知数可以方便地表示长和宽的关系。 第三步根据周长公式列出方程。 长方形的周长公式是 \( 2 \times (长 宽) \)因为周长是长和宽之和的两倍。已知周长是180米所以 \[ 2 \times (2w w) 180 \] 这里将长 \( 2w \) 和宽 \( w \) 代入公式。 第四步简化方程并求解宽 \( w \)。 先计算括号内的和\( 2w w 3w \)。 所以方程变为 \[ 2 \times 3w 180 \] 即 \[ 6w 180 \] 然后两边同时除以6解出 \( w \) \[ w 180 \div 6 30 \] 因此宽是30米。 第五步求长。 因为长是宽的2倍所以长 \( l 2w 2 \times 30 60 \) 米。 这里直接利用已知关系计算。 第六步计算面积。 长方形的面积公式是 \( 长 \times 宽 \)所以 \[ 面积 60 \times 30 1800 \] 这里将求出的长和宽相乘得到面积。 【最终答案】操场的面积是1800平方米。CoT技术显著提升了大型语言模型解决复杂问题的能力通过展示推理过程增强了模型的可解释性是当前AI解释性和可靠性研究的重要方向之一。3.1.2 ToT框架多路径探索式推理ToT是一种利用大型语言模型解决问题的先进框架由普林斯顿大学和谷歌DeepMind联合提出。该技术通过分解问题、生成思维步骤、评估状态并运用搜索算法探索解决方案模仿人类决策过程具有通用性和模块化特点。1. 技术概述与定义ToT框架将语言模型的推理过程建模为对树状结构的搜索通过逐步将问题拆解为更易处理的子问题每一步都探索并缓存可行的解题路径从而提高语言模型解决问题的能力。它推广了流行的“链式思维Chain of ThoughtCoT”方法通过允许模型探索作为解决问题中间步骤的连贯文本单元思想使模型能够考虑多种不同的推理路径并自我评估选择。2. 基本工作原理1ToT框架的核心在于将问题的解决过程视为一棵思维树其中1每个节点代表一个思维步骤即中间推理过程。2边代表从一个状态到另一个状态的转变。3通过生成和评估这些步骤与搜索算法相结合实现系统性探索。2该框架包含4个关键组成部分1思维分解将问题分解为多个中间推理步骤。2思维生成器生成可能的下一步思维即树的分支。3状态评估器评估当前思维状态的质量和前景。4搜索算法系统性地探索思维树如BFS、DFS等。3. 技术实现细节1问题分解与初始节点生成1将复杂问题分解为多个子问题或步骤形成树状结构的根节点初始状态。2通过模型的生成能力产生多个可能的初步思路作为树的初始分支。2搜索策略选择1广度优先搜索BFS并行扩展所有可能路径避免局部最优但计算成本高。2深度优先搜索DFS深入单一路径直至得出结论适合资源有限的场景。3也可采用蒙特卡洛树搜索等更复杂的算法。3节点评估与路径选择1自我评估模型直接判断当前路径的合理性如概率输出。2外部验证通过规则、工具调用或人工反馈进行验证。3动态剪枝淘汰低概率或无效路径减少计算开销。4回溯与全局优化1当路径陷入死胡同时返回父节点并尝试其他分支。2对模糊节点引入蒙特卡洛采样多次评估以量化不确定性。4. 实现案例【示例3.2】ToT数学问题求解找出所有三个连续正整数其和为36。ToT解决过程初始思维设第一个数为x则三个数为x、x1、x2。分支1建立方程x(x1)(x2)36→3x336。分支2考虑平均数36/312所以三个数为11、12、13。评估两种方法都得到x11验证正确性。class TreeOfThought: def __init__(self): self.solutions [] def generate_thoughts(self, current_state): 生成可能的思考路径 # 在这个问题中我们只有一种数学方法所以返回单一思考 return [algebraic_approach] def evaluate_states(self, states): 评估思考状态 # 在这个简单问题中所有状态都同样好 return [1 for _ in states] def solve_problem(self): 使用ToT框架解决问题 initial_thoughts self.generate_thoughts(None) scores self.evaluate_states(initial_thoughts) # 选择最佳思考路径这里只有一条 best_thought initial_thoughts[scores.index(max(scores))] if best_thought algebraic_approach: # 代数方法解决 # 设三个连续整数为n, n1, n2 # 和为: n (n1) (n2) 3n 3 36 # 3n 33 n 11 n (36 - 3) // 3 if n 0 and (n (n1) (n2)) 36: self.solutions.append((n, n1, n2)) return self.solutions def alternative_brute_force_approach(self): 另一种暴力搜索方法展示ToT的多路径探索 solutions [] # 遍历可能的连续整数序列 for x in range(1, 36): y x 1 z x 2 if x y z 36: solutions.append((x, y, z)) break # 因为是连续正整数只有一个解 return solutions # 使用ToT解决问题 if __name__ __main__: print(使用Tree-of-Thought方法解决问题:) tot TreeOfThought() solutions tot.solve_problem() if solutions: print(f找到的解: {solutions[0]}) print(f验证: {solutions[0][0]} {solutions[0][1]} {solutions[0][2]} {sum(solutions[0])}) else: print(没有找到解) print(\n替代方法验证:) alt_solutions tot.alternative_brute_force_approach() if alt_solutions: print(f暴力搜索找到的解: {alt_solutions[0]}) else: print(暴力搜索没有找到解)代码解释1TreeOfThought类实现了基本的ToT框架。generate_thoughts()生成可能的解决路径这里只有代数方法。evaluate_states()评估各思考路径的质量。solve_problem()执行最佳思考路径来解决问题。2代数方法设三个连续整数为n,n1,n2。建立方程3n336。解得n11。验证解(11,12,13)确实满足和为36。3替代方法实现暴力搜索来验证结果。展示ToT可以包含多种解决路径。运行代码输出如下使用Tree-of-Thought方法解决问题 找到的解: (11, 12, 13) 验证: 11 12 13 36 替代方法验证: 暴力搜索找到的解: (11, 12, 13)ToT框架已在GitHub上开源主要资源包括官方实现https://github.com/princeton-nlp/tree-of-thought-llm。非官方实现https://github.com/kyegomez/tree-of-thoughts。3.1.3 ReAct框架将ReasoningActing结合ReAct框架是一种结合“推理Reasoning”和“行动Acting”的AI智能体开发框架旨在通过动态的思考与执行循环解决复杂任务。其核心运作机制可以概括为“思考Thought→行动Action→观察Observation”的迭代循环。思考模型基于当前任务目标和已有的观察信息进行逻辑推理和规划分析问题并决定下一步需要执行的动作。行动根据“思考”阶段制定的计划模型生成并执行具体的行动指令如调用外部API、查询数据库等。观察模型接收并处理“行动”执行后从外部环境获得的反馈信息这些观察结果将作为下一轮“思考”的输入。1. 核心组件1推理引擎负责分析问题和生成行动计划。2行动执行器负责执行具体动作。3记忆模块存储历史交互和知识。4环境接口与外部环境交互的接口。2. 工作流程1接收输入/观察环境状态。2推理生成可能的行动方案。3选择最优行动并执行。4观察行动结果并更新状态。5重复2~4步直到问题解决。3. Python实现案例【示例3.3】ReAct智能体实现react_framework.py。import json from typing import List, Dict, Any, Optional, Callable class Tool: 表示一个可被智能体调用的工具 def __init__(self, name: str, description: str, func: Callable): self.name name self.description description self.func func def run(self, parameters: Dict) - Any: return self.func(**parameters) class ReActAgent: 实现ReasoningActing循环的智能体 def __init__(self, tools: List[Tool], llm_model: Callable): self.tools {tool.name: tool for tool in tools} self.llm_model llm_model self.max_iterations 10 def _parse_llm_response(self, response: str) - Dict: 解析大语言模型的输出提取思考和行动 try: # 简单解析实际应用中可能需要更复杂的解析逻辑 if Thought: in response and Action: in response: thought response.split(Thought:)[1].split(Action:)[0].strip() action_part response.split(Action:)[1].strip() if Action Input: in action_part: action_name action_part.split(Action Input:)[0].strip() action_input_str action_part.split(Action Input:)[1].strip() try: # 尝试解析为JSON action_input json.loads(action_input_str) except json.JSONDecodeError: # 如果不是有效的JSON作为字符串处理 action_input {input: action_input_str} return { thought: thought, action: { name: action_name, parameters: action_input } } except Exception as e: print(f解析LLM响应时出错: {e}) # 默认回退 return { thought: 无法解析行动直接回答, action: None, answer: response } def run(self, query: str) - str: 运行ReAct循环处理用户查询 history [] history.append(f用户查询: {query}) for i in range(self.max_iterations): # 构建提示 prompt \n.join(history) \n思考: # 获取LLM响应 llm_response self.llm_model(prompt) # 解析响应 parsed self._parse_llm_response(llm_response) # 记录思考 history.append(f思考: {parsed[thought]}) # 处理行动 if parsed.get(action): action parsed[action] tool_name action[name] parameters action[parameters] # 记录行动 history.append(f行动: {tool_name}, 参数: {json.dumps(parameters)}) # 执行工具 if tool_name in self.tools: try: result self.tools[tool_name].run(parameters) history.append(f行动结果: {result}) except Exception as e: history.append(f行动执行错误: {str(e)}) result None else: history.append(f错误: 未知工具 {tool_name}) result None else: # 如果没有行动直接返回答案 return parsed.get(answer, 无法生成答案) return 达到最大迭代次数未找到确定答案 # 示例工具实现 def get_weather(city: str) - str: 获取指定城市的天气信息 # 实际应用中这里会调用天气API weather_data { 北京: 晴朗25°C, 上海: 多云28°C, 广州: 小雨27°C } return weather_data.get(city, 未知天气) def search_wikipedia(query: str) - str: 在维基百科上搜索信息 # 实际应用中这里会调用维基百科API # 简化示例返回一些模拟数据 if Python in query: return Python是一种广泛使用的高级编程语言由Guido van Rossum于1989年圣诞节期间创建。 elif 人工智能 in query: return 人工智能是指计算机系统能够执行通常需要人类智能才能完成的任务的能力如视觉感知、语音识别等。 return f关于{query}的信息未找到 # 示例使用 if __name__ __main__: # 定义工具 tools [ Tool(get_weather, 获取指定城市的当前天气, get_weather), Tool(search_wikipedia, 在维基百科上搜索信息, search_wikipedia) ] # 模拟LLM模型 def mock_llm_model(prompt: str) - str: 模拟大语言模型的输出 if 天气 in prompt: return 思考: 用户想了解北京的天气我可以使用get_weather工具获取信息 行动: get_weather Action Input: {city: 北京} elif Python in prompt or 人工智能 in prompt: return 思考: 用户的问题需要百科知识我可以使用search_wikipedia工具查找信息 行动: search_wikipedia Action Input: {query: Python} return 直接回答: 我不知道这个问题的答案 # 创建智能体 agent ReActAgent(tools, mock_llm_model) # 测试运行 weather_query 北京现在的天气如何 print(f查询: {weather_query}) print(f回答: {agent.run(weather_query)}) python_query Python是什么时候创建的 print(f\n查询: {python_query}) print(f回答: {agent.run(python_query)})运行代码输出如下查询: 北京现在的天气如何 回答: 思考: 用户想了解北京的天气我可以使用get_weather工具获取信息 行动: get_weather Action Input: {city: 北京} 查询: Python是什么时候创建的 回答: 思考: 用户的问题需要百科知识我可以使用search_wikipedia工具查找信息 行动: search_wikipedia Action Input: {query: Python}ReAct框架通过将推理与行动相结合为AI智能体开发提供了强大的范式。其关键优势在于在实际应用中可以根据具体需求调整推理和行动的平衡并不断优化工具集和提示工程以获得最佳性能。