ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AI Agent复杂推理实战:思维树与后退提示框架实现

AI Agent复杂推理实战:思维树与后退提示框架实现 在实际 AI 应用开发中我们常常遇到一个瓶颈让大语言模型LLM驱动的 Agent 去解决一个需要多步骤、多分支决策的复杂问题时简单的单次提示Prompt或链式思考Chain-of-Thought, CoT往往力不从心。模型可能会卡在某个错误思路上或者生成一个看似合理但无法验证的中间结果导致最终答案错误。这正是“思维树”Tree of Thoughts, ToT框架和“后退提示”Backtracking Prompting技术要解决的核心问题。它们不是简单的提示词技巧而是一套系统性的推理增强框架旨在赋予 Agent 类似人类的规划、探索和修正能力。本文面向已经熟悉基础 Prompt 工程和 Agent 概念希望提升其 AI 应用复杂问题解决能力的开发者。我们将深入探讨 ToT 和后退提示的原理并通过一个完整的实战项目——让 Agent 解决一个需要多步算术和逻辑推理的“24点”游戏问题——来演示如何从零实现这套框架。你将看到如何引导模型生成多种可能的思考路径树的分支评估这些中间状态并在遇到死胡同时智能地回退到上一个决策点后退最终找到正确答案。这不仅是一个算法演示更是一套可复用于规划、代码生成、游戏策略等场景的工程模式。1. 理解思维树与后退提示超越链式思考的推理框架在深入代码之前我们必须厘清几个核心概念以及为什么简单的链式思考CoT在复杂场景下会失效。1.1 从链式思考到思维树推理的维度扩展链式思考要求模型“一步一步地思考”这对于线性问题很有效。例如“小明有5个苹果吃了2个又买了3个现在有几个” CoT 可以很好地引导模型进行5-23的序列计算。然而许多现实问题是非线性的更像一个搜索问题。例如“用数字 3, 3, 8, 8 通过加减乘除得到 24”。解决这个问题需要尝试不同的运算顺序和组合这形成了一个搜索空间。CoT 就像一条单一路径如果第一步(33)(88)22走错了模型可能就会一直错下去或者陷入循环。思维树框架将推理过程建模为一棵树节点代表问题的一个中间思考状态或部分解决方案。边代表从一个状态通过某个“思考”或操作转移到下一个状态。根节点初始问题。叶节点可能的最终答案或死胡同。ToT 的核心思想是在解决问题的每一步都不只生成一个后续步骤而是生成多个k个可能的有希望的后续步骤扩展然后通过一个评估器来筛选哪些步骤更值得深入探索评估必要时可以放弃当前路径回溯到更早的节点尝试其他路径回溯/后退。1.2 后退提示为搜索过程添加“撤销”机制后退提示是 ToT 框架中实现回溯的关键技术。当模型评估发现当前路径的所有后续扩展都不理想评估分数低或直接导致矛盾时我们不能让 Agent 卡死。后退提示就是指导模型执行以下操作的提示识别死胡同明确当前路径无法通向有效解。回退到上一个决策点在思维树中回到父节点。选择替代方案尝试之前未选择的另一个“思考”分支。记录教训避免在未来重复相同的错误尝试。这模拟了人类在解决难题时的行为尝试一种方法发现行不通就退回去换另一种方法。1.3 框架的工作流程与组件一个完整的 ToT 后退提示系统通常包含以下组件它们将通过后续的代码模块实现问题解析器将原始问题转化为初始状态根节点。思维生成器thought_generator给定一个状态生成 k 个可能的下一步“思考”即子节点。这通常是一个提示让 LLM 基于当前局面提出多种后续行动方案。状态评估器state_evaluator评估一个状态的“好坏”或“距离目标还有多远”。它返回一个分数或分类如sure/likely/impossible。这可以是启发式函数也可以是另一个 LLM 调用。搜索算法协调上述组件在树中进行探索。深度优先搜索DFS配合回溯是常见选择广度优先搜索BFS也可行。算法需要决定何时扩展节点、何时评估、何时后退。后退提示模块当搜索算法决定回溯时生成一个特定的提示引导 LLM 理解需要回退并输出回退后的状态和新的尝试方向。终止判断判断当前状态是否已经是可接受的最终答案。2. 环境准备与项目结构我们将使用 Python 和 OpenAI API或兼容 OpenAI 接口的本地模型来实现这个框架。选择 OpenAI 是因为其 API 稳定思维生成和质量评估的效果相对较好。你也可以替换为其他支持 Function Calling 或具有较强推理能力的模型。2.1 环境与依赖首先确保你的 Python 环境在 3.8 以上。然后安装核心依赖pip install openai如果你使用其他兼容 OpenAI 的 SDK 或本地模型请安装相应的包例如litellm。为了清晰地管理项目我们创建以下目录结构tot_backtracking_agent/ ├── main.py # 主程序入口包含搜索算法 ├── prompts.py # 存放所有提示词模板 ├── llm_client.py # 封装 LLM 调用支持切换模型 ├── tree_node.py # 定义思维树节点数据结构 ├── evaluators.py # 状态评估器实现 ├── generators.py # 思维生成器实现 └── utils.py # 工具函数如后退提示构造2.2 核心数据结构思维树节点在tree_node.py中我们定义节点类它是整个搜索过程的基础单元。# tree_node.py class TreeNode: 表示思维树中的一个节点。 def __init__(self, state, parentNone, actionNone): 初始化节点。 Args: state: 当前节点的状态描述字符串或结构化数据。 parent: 父节点对象。 action: 从父节点状态通过什么操作到达此状态。 self.state state self.parent parent self.action action self.children [] # 子节点列表 self.value None # 评估器给出的价值分数 self.visits 0 # 访问次数可用于更复杂的搜索算法 def is_leaf(self): 判断是否为叶节点尚未扩展。 return len(self.children) 0 def add_child(self, child_node): 添加一个子节点。 self.children.append(child_node) def __repr__(self): return fTreeNode(state{self.state[:50]}..., value{self.value})2.3 LLM 客户端封装在llm_client.py中我们封装一个简单的 LLM 调用客户端便于统一管理和切换模型。# llm_client.py import openai from typing import List, Dict, Any class LLMClient: def __init__(self, modelgpt-4, api_keyNone, base_urlNone): 初始化 LLM 客户端。 Args: model: 模型名称如 gpt-4, gpt-3.5-turbo。 api_key: OpenAI API Key。如果为 None会尝试从环境变量读取。 base_url: API 基础 URL用于兼容其他服务。 self.model model self.client openai.OpenAI(api_keyapi_key, base_urlbase_url) def generate(self, messages: List[Dict[str, str]], temperature0.7, max_tokens500) - str: 调用聊天补全 API。 Args: messages: 消息列表格式如 [{role: user, content: ...}] temperature: 温度参数。 max_tokens: 最大生成长度。 Returns: 模型返回的文本内容。 try: response self.client.chat.completions.create( modelself.model, messagesmessages, temperaturetemperature, max_tokensmax_tokens ) return response.choices[0].message.content.strip() except Exception as e: print(fLLM 调用失败: {e}) return 注意在实际生产环境中你需要将 API Key 存储在环境变量或安全的配置管理中不要硬编码在代码里。同时需要增加重试、限流、日志和更完善的错误处理。3. 实现核心组件生成器、评估器与后退提示我们将以“24点游戏”作为贯穿始终的案例。问题定义为给定四个数字例如 3, 3, 8, 8使用加、减、乘、除和括号每个数字用且仅用一次构造一个表达式使其结果等于 24。3.1 思维生成器提出多种可能的下一步思维生成器的任务是给定当前的部分表达式或数字集合提出几种合理的下一步计算。我们在generators.py中实现。# generators.py from llm_client import LLMClient from prompts import THOUGHT_GENERATION_PROMPT class ThoughtGenerator: def __init__(self, llm_client: LLMClient): self.llm llm_client def generate(self, current_state: str, k: int 3) - List[str]: 生成 k 个可能的下一步‘思考’即操作建议。 Args: current_state: 当前状态描述。 k: 生成多少个候选思考。 Returns: 候选思考列表。 prompt THOUGHT_GENERATION_PROMPT.format( current_statecurrent_state, kk ) messages [{role: user, content: prompt}] raw_output self.llm.generate(messages, temperature0.8) # 温度稍高以增加多样性 # 解析输出期望模型返回一个列表如 “1. (38)\n2. 8/3\n3. 3*8” thoughts [] for line in raw_output.split(\n): line line.strip() # 移除编号和项目符号 if line and (line[0].isdigit() or line.startswith(-)): thought line.split(. , 1)[-1] if . in line else line.lstrip(- ) thoughts.append(thought) elif line and len(thoughts) k: # 处理没有编号的行 thoughts.append(line) return thoughts[:k] # 确保不超过 k 个对应的提示词模板定义在prompts.py# prompts.py THOUGHT_GENERATION_PROMPT 你正在玩24点游戏。目标是使用所有给定的数字一次通过加、减、乘、除和括号得到一个结果为24的表达式。 当前状态{current_state} 请列出 {k} 个合理的下一步计算或表达式组合建议。每个建议应该是一个具体的操作例如“将数字A和数字B相加得到C”或者一个部分表达式如“(38)”。 请确保你的建议是基于当前剩余的数字和已形成的中间结果。 直接输出你的建议列表每行一个不要有多余的解释。 3.2 状态评估器判断当前状态的好坏评估器需要判断一个状态部分解是“有希望”、“无希望”还是“已经成功”。我们实现一个基于 LLM 的简单评估器。在生产环境中对于确定性问题如24点可以编写确定性的评估函数如计算表达式值检查数字使用情况。# evaluators.py from llm_client import LLMClient from prompts import STATE_EVALUATION_PROMPT class StateEvaluator: def __init__(self, llm_client: LLMClient): self.llm llm_client def evaluate(self, state: str) - dict: 评估一个状态。 Args: state: 状态描述。 Returns: 一个字典包含 value (分数), confidence (信心), reasoning (理由)。 prompt STATE_EVALUATION_PROMPT.format(current_statestate) messages [{role: user, content: prompt}] evaluation_text self.llm.generate(messages, temperature0.1) # 低温度保证评估稳定 # 解析评估结果。这里我们期望模型返回一个格式化的答案例如 “分数: 7/10, 信心: likely, 理由: ...” # 简化处理我们主要关心一个分类。 evaluation_text_lower evaluation_text.lower() if impossible in evaluation_text_lower or 无希望 in evaluation_text_lower: value 0.0 confidence impossible elif sure in evaluation_text_lower or 确信 in evaluation_text_lower or 24 in state: # 如果表达式直接等于24则成功 value 1.0 confidence sure elif likely in evaluation_text_lower or 可能 in evaluation_text_lower: value 0.6 confidence likely else: # 默认给一个中等分数 value 0.3 confidence unknown return { value: value, confidence: confidence, raw_response: evaluation_text }对应的评估提示词# prompts.py STATE_EVALUATION_PROMPT 评估当前24点游戏状态是否有可能最终得到24。 当前状态{current_state} 请从以下三个类别中选择一个并简要说明理由 1. sure确信: 当前表达式已经等于24或者明显只需一步简单操作就能得到24。 2. likely可能: 当前状态看起来合理有希望继续演算得到24。 3. impossible无希望: 当前状态下的数字或中间结果明显不可能得到24例如所有数字太大或太小或出现了非法运算如除零。 请以“类别: [sure/likely/impossible]”开头然后换行写“理由: ...”。 3.3 后退提示构造器当搜索算法决定回溯时我们需要构造一个特殊的提示让 LLM “意识”到需要后退并给出回退后的状态和新尝试。我们在utils.py中实现这个逻辑。# utils.py from prompts import BACKTRACK_PROMPT_TEMPLATE def construct_backtrack_prompt(current_state: str, previous_state: str, tried_actions: List[str]) - str: 构造后退提示。 Args: current_state: 当前陷入困境的状态。 previous_state: 要回退到的上一个状态。 tried_actions: 从上一个状态已经尝试过的行动列表。 Returns: 构造好的提示词。 prompt BACKTRACK_PROMPT_TEMPLATE.format( previous_stateprevious_state, current_dead_end_statecurrent_state, tried_actions, .join(tried_actions) ) return prompt def parse_backtrack_response(response: str): 解析后退提示的响应期望得到新的行动建议。 响应格式期望为“回退到状态: [状态描述]。新尝试: [行动建议]” lines response.split(\n) new_state None new_action None for line in lines: if line.startswith(回退到状态:): new_state line.split(:, 1)[-1].strip() elif line.startswith(新尝试:): new_action line.split(:, 1)[-1].strip() return new_state, new_action后退提示词模板# prompts.py BACKTRACK_PROMPT_TEMPLATE 你正在解决一个24点问题但当前路径似乎走入了死胡同。 你之前的状态是{previous_state} 从那里你尝试了这些操作{tried_actions} 这导致了当前这个不太可能成功的状态{current_dead_end_state} 现在你需要执行“后退”。请做两件事 1. 明确地回退到上一个状态。 2. 提出一个与之前尝试过的操作不同的、新的合理操作。 请按以下格式回答 回退到状态: [描述上一个状态] 新尝试: [描述一个新的、不同的操作] 4. 整合深度优先搜索与回溯算法现在我们将所有组件整合到主搜索算法中。我们采用深度优先搜索DFS并集成后退提示。算法逻辑如下从根节点初始问题开始。如果当前节点是目标解出24成功返回。如果当前节点被评估为“impossible”则触发后退。否则用思维生成器生成 k 个子节点候选思考。评估这些子节点并按评估价值排序。选择价值最高的子节点递归地进行步骤2。如果递归搜索失败子节点无解且无法后退则回溯到父节点并标记当前子节点为“已尝试”。如果所有子节点都尝试失败则在父节点触发后退提示。我们在main.py中实现这个算法。# main.py import sys from typing import Optional, Tuple from tree_node import TreeNode from llm_client import LLMClient from generators import ThoughtGenerator from evaluators import StateEvaluator from utils import construct_backtrack_prompt, parse_backtrack_response class ToTAgent: def __init__(self, llm_client: LLMClient): self.llm llm_client self.thought_generator ThoughtGenerator(llm_client) self.state_evaluator StateEvaluator(llm_client) self.visited_states set() # 记录访问过的状态防止循环 def solve(self, initial_state: str, max_depth10, max_backtracks5) - Optional[TreeNode]: 使用思维树和后退提示解决问题。 Args: initial_state: 初始问题描述。 max_depth: 最大搜索深度。 max_backtracks: 最大后退次数。 Returns: 包含解的节点如果未找到则返回 None。 root TreeNode(stateinitial_state) self.visited_states.add(self._state_to_key(initial_state)) solution, _ self._dfs( noderoot, depth0, max_depthmax_depth, backtracks_leftmax_backtracks, path_actions[] # 记录从根到当前节点的行动序列 ) return solution def _dfs(self, node: TreeNode, depth: int, max_depth: int, backtracks_left: int, path_actions: list) - Tuple[Optional[TreeNode], bool]: 深度优先搜索递归函数。 Returns: (solution_node, should_backtrack) if depth max_depth: print(f达到最大深度 {depth}在状态: {node.state}) return None, True # 需要回溯 # 检查是否已解决 eval_result self.state_evaluator.evaluate(node.state) node.value eval_result[value] print(f深度 {depth}: 评估状态 {node.state} - 价值 {node.value:.2f}, 信心 {eval_result[confidence]}) if eval_result[confidence] sure: print(f找到解表达式: {node.state}) return node, False # 找到解不需要回溯 if eval_result[confidence] impossible: print(f状态评估为不可能: {node.state}) return None, True # 需要回溯 # 生成子节点候选思考 candidate_thoughts self.thought_generator.generate(node.state, k3) if not candidate_thoughts: print(f无法为状态生成候选思考: {node.state}) return None, True # 为每个候选思考创建子节点并评估 child_nodes [] for thought in candidate_thoughts: # 这里简化处理将“思考”作为行动并更新状态。 # 实际应用中可能需要一个更复杂的“状态转移函数”。 new_state f{node.state} - {thought} # 示例简单拼接 # 更复杂的实现应解析 thought 并实际计算新表达式 child_node TreeNode(statenew_state, parentnode, actionthought) child_eval self.state_evaluator.evaluate(new_state) child_node.value child_eval[value] child_nodes.append(child_node) # 按评估价值降序排序 child_nodes.sort(keylambda x: x.value, reverseTrue) for child in child_nodes: state_key self._state_to_key(child.state) if state_key in self.visited_states: print(f跳过已访问状态: {child.state}) continue self.visited_states.add(state_key) node.add_child(child) path_actions.append(child.action) # 递归搜索 solution, need_backtrack self._dfs( child, depth1, max_depth, backtracks_left, path_actions ) if solution is not None: return solution, False # 找到解向上传递 # 子节点搜索失败 path_actions.pop() # 移除当前行动 if need_backtrack and backtracks_left 0: # 触发后退提示逻辑 backtrack_result self._trigger_backtrack(node, path_actions) if backtrack_result: new_state, new_action backtrack_result if new_action and new_action not in [c.action for c in node.children]: # 创建新的子节点进行尝试 print(f后退后尝试新行动: {new_action}) new_child TreeNode(statenew_state, parentnode, actionnew_action) node.add_child(new_child) path_actions.append(new_action) self.visited_states.add(self._state_to_key(new_state)) # 用新节点重新搜索 solution, _ self._dfs( new_child, depth1, max_depth, backtracks_left-1, path_actions ) if solution is not None: return solution, False path_actions.pop() backtracks_left - 1 # 所有子节点都尝试失败 return None, True def _trigger_backtrack(self, node: TreeNode, tried_actions: list) - Optional[Tuple[str, str]]: 触发后退提示获取新的状态和行动。 if not node.parent: return None # 根节点无法后退 previous_state node.parent.state prompt construct_backtrack_prompt(node.state, previous_state, tried_actions) messages [{role: user, content: prompt}] response self.llm.generate(messages, temperature0.7) print(f后退提示响应:\n{response}) new_state, new_action parse_backtrack_response(response) return new_state, new_action def _state_to_key(self, state: str) - str: 将状态转换为一个可用于去重的键简单实现。 return state.strip().lower() if __name__ __main__: # 初始化 LLM 客户端 # 请将 YOUR_API_KEY 替换为你的实际 API Key或从环境变量读取 client LLMClient(modelgpt-4, api_keyYOUR_API_KEY) # 创建 Agent agent ToTAgent(client) # 定义问题 problem 使用数字 3, 3, 8, 8 通过加、减、乘、除和括号得到 24。 print(f开始解决问题: {problem}) # 运行求解 solution_node agent.solve(problem, max_depth6, max_backtracks3) if solution_node: print(\n 解决方案 ) # 从解节点回溯到根打印路径 path [] current solution_node while current: if current.action: path.append(current.action) current current.parent path.reverse() print( - .join(path)) print(f最终表达式: {solution_node.state}) else: print(\n未能在限制内找到解决方案。)5. 运行验证与结果分析运行上述main.py脚本记得替换YOUR_API_KEY。你会看到控制台输出搜索过程。以下是一个简化的成功输出示例开始解决问题: 使用数字 3, 3, 8, 8 通过加、减、乘、除和括号得到 24。 深度 0: 评估状态 使用数字 3, 3, 8, 8 通过加、减、乘、除和括号得到 24。 - 价值 0.30, 信心 unknown 深度 1: 评估状态 使用数字 3, 3, 8, 8 通过加、减、乘、除和括号得到 24。 - 计算 8 / (3 - 8/3) - 价值 0.60, 信心 likely 深度 2: 评估状态 使用数字 3, 3, 8, 8 通过加、减、乘、除和括号得到 24。 - 计算 8 / (3 - 8/3) - 计算 8 / (1/3) - 价值 0.60, 信心 likely 深度 3: 评估状态 使用数字 3, 3, 8, 8 通过加、减、乘、除和括号得到 24。 - 计算 8 / (3 - 8/3) - 计算 8 / (1/3) - 计算 8 * 3 - 价值 1.00, 信心 sure 找到解表达式: 使用数字 3, 3, 8, 8 通过加、减、乘、除和括号得到 24。 - 计算 8 / (3 - 8/3) - 计算 8 / (1/3) - 计算 8 * 3 解决方案 计算 8 / (3 - 8/3) - 计算 8 / (1/3) - 计算 8 * 3 最终表达式: 使用数字 3, 3, 8, 8 通过加、减、乘、除和括号得到 24。 - 计算 8 / (3 - 8/3) - 计算 8 / (1/3) - 计算 8 * 3结果分析搜索过程可视化Agent 从初始状态开始生成多个候选如8/(3-8/3)评估后选择最有希望的路径深入。状态转移我们的简化实现将“思考”文本直接拼接为状态。更严谨的实现应有一个State类能解析表达式并实际计算中间值这样评估器可以基于数值进行判断。找到解最终路径8 / (3 - 8/3) 8 / (1/3) 24是一个经典解。模型通过多步推理和评估找到了它。后退触发如果第一次生成的候选都不好评估为impossible算法会触发后退提示引导模型回到上一步尝试其他组合。6. 常见问题排查与优化在实际运行中你可能会遇到以下问题。这里提供排查思路和优化建议。6.1 LLM 调用失败或响应格式不符问题现象可能原因检查与解决方式LLM 调用失败API Key 错误、网络问题、额度不足、模型服务不可用。1. 检查api_key和base_url。2. 检查网络连接。3. 在LLMClient.generate方法中添加更详细的错误日志和重试机制。生成器或评估器返回空或无法解析提示词不够清晰模型未按预期格式输出。1. 在提示词中明确指定输出格式如“请以列表形式输出每行一个”。2. 在代码中添加更健壮的解析逻辑处理多种可能的输出格式。3. 使用Function Calling或JSON Mode让模型返回结构化数据如果模型支持。评估结果波动大temperature参数过高导致评估不稳定。将评估器调用的temperature设为较低值如 0.1确保评估一致性。思维生成器可以稍高如 0.7-0.8以保持多样性。6.2 搜索效率低下或陷入循环问题现象可能原因检查与解决方式搜索树爆炸消耗大量 token每步生成的候选k值过大或深度max_depth过深。1. 根据问题复杂度调整k(通常 3-5) 和max_depth。2. 实现更严格的状态去重visited_states。3. 使用价值评估进行剪枝只扩展价值高于阈值的前 N 个节点。在错误路径上花费过多时间评估器不够准确给死胡同路径打了高分。1. 优化评估器提示词加入更具体的判断规则。2. 对于有确定解的问题如24点可以编写基于规则或计算的确定性评估函数替代 LLM 评估更准确且节省成本。3. 引入“访问次数”和“UCT”等启发式平衡探索与利用。后退提示未能产生有效新尝试后退提示词设计不佳或模型未能理解上下文。1. 在后退提示中明确要求“提出一个不同的操作”。2. 在_trigger_backtrack方法中可以记录所有尝试过的行动并在提示中明确列出要求避开它们。3. 如果多次后退无效可以增加回溯到更早祖先节点的逻辑。6.3 工程化与性能优化建议状态表示当前用字符串拼接状态过于简单。对于数学问题应设计一个State类包含剩余数字集合、当前表达式树、计算结果等属性。状态转移函数应能根据“行动”更新这些属性。并行化思维生成和状态评估是独立的 LLM 调用可以并行化以提高速度。但需注意 API 的速率限制。缓存相同的状态评估和思维生成可能会重复出现。可以建立缓存例如使用functools.lru_cache将(state, prompt_template)映射到结果避免重复调用 LLM大幅节省成本和时间。超时与中断为搜索过程设置总时间或总 Token 消耗上限避免无限搜索。日志与可视化记录完整的搜索树便于调试和分析 Agent 的决策过程。可以输出为 JSON 或使用图形库进行可视化。7. 扩展方向与最佳实践ToT 和后退提示是一个强大的模式不限于解数学题。你可以将其应用到更广泛的 Agent 场景中。7.1 扩展应用场景代码生成与调试将“状态”定义为部分代码和错误信息“思考”是代码修改建议“评估”是编译/测试通过率。Agent 可以尝试多种修复方案遇到编译错误时回退。复杂规划如旅行规划、项目排期。状态是当前计划思考是添加/调整任务评估是计划的总成本或时间。游戏策略如棋类游戏。状态是棋盘局面思考是可能的走法评估是局面优劣可由估值函数或另一个 LLM 给出。复杂问答与推理对于需要多文档检索、多步推理的问答可以用 ToT 来规划检索和推理步骤。7.2 生产环境最佳实践清单在将此类 Agent 系统投入生产前请务必检查以下清单[ ]提示词安全与稳定性所有提示词应避免注入攻击并对模型输出进行严格的格式和内容校验。[ ]成本控制设置预算和监控对 LLM 调用进行计费、限流和报警。优先使用缓存和确定性评估来减少不必要的调用。[ ]可观测性记录完整的思维树、每个节点的评估价值、LLM 的输入输出。这对于调试、优化和解释 Agent 行为至关重要。[ ]优雅降级当 LLM 服务不可用或返回异常时系统应有降级策略如返回默认答案、切换备用模型、提示用户稍后重试。[ ]评估与测试建立一套测试集评估 Agent 在不同问题上的成功率和平均推理成本。持续优化提示词和搜索参数。[ ]模块化设计如本文所示将生成器、评估器、搜索算法分离便于单独替换和测试。例如可以轻松将 GPT-4 评估器换成一个本地的规则引擎。7.3 针对不同问题的调整策略问题类型状态表示关键思维生成重点评估器设计搜索策略建议数学/逻辑推理剩余元素集合当前表达式/等式。生成合法的数学操作或逻辑变换。基于规则计算距离目标的数值差距。DFS 强剪枝确定性评估。代码生成现有代码、错误信息、需求描述。生成代码补全、修改建议或 API 调用。运行测试用例、静态分析、或 LLM 评估代码质量。广度优先可能更好以探索多种实现方案。创意写作当前故事线、人物设定、已生成文本。生成后续情节发展、对话或描写。LLM 评估连贯性、趣味性或符合要求的程度。需要更高的temperature和更大的分支数k。数据解析原始数据、已提取的结构、解析规则。尝试不同的解析模式或正则表达式。验证提取结果的格式和部分正确性。可以结合规则模板进行生成减少 LLM 调用。实现一个具备 ToT 和后退提示能力的 Agent核心在于将模糊的“让模型多想几步”转化为一个可编程、可控制、可观测的搜索过程。这要求开发者不仅会写 Prompt更要具备算法设计和系统架构的思维。从本文的最小可行实现出发通过强化状态管理、优化评估函数、引入更高效的搜索算法如 A*你可以构建出能够解决真正复杂现实问题的智能体系统。
返回列表