为了使智能体不再仅仅是简单地遵从指令,而是能进行更复杂的解题,我们必须为其配备有效的推断方法。尽管大型语言模型 (LLM) 本身具备出色的文本生成和理解能力,但要指导它们执行有条理的推理,尤其是在多步骤任务中,则需要特定的策略。这里详细介绍了几种提升单个 LLM 智能体推理能力的主要方法,为后续讨论的更复杂的协作行为奠定了基础。思维链提示改进 LLM 推理能力最直接的方式之一就是通过思维链 (CoT) 提示。其核心思想是鼓励 LLM 在得出最终答案之前生成一系列中间推理步骤,这很像人类解决问题的方式。这种思维过程的明确表述通常会带来更准确、更可靠的结果,尤其适用于涉及算术、常识推理或逻辑推断的任务。工作原理并非直接要求 LLM 给出答案,而是提示它“一步一步地思考”,或者提供展示这种逐步推理的例子(少样本提示)。零样本 CoT: 这是最简单的形式,你只需在查询后面加上一句“我们一步一步地思考吧”之类的短语。无 CoT 示例:提示: “一家杂货店有200个苹果。他们周一卖出了15%,周二卖出了剩余苹果的25%。还剩下多少苹果?”可能的 LLM 输出: “120个苹果。”(如果 LLM 误解了“剩余”,这可能是错误的)带零样本 CoT 示例:提示: “一家杂货店有200个苹果。他们周一卖出了15%,周二卖出了剩余苹果的25%。还剩下多少苹果?我们一步一步地思考吧。”LLM 输出:初始苹果数量 = 200。周一售出苹果 = 200的15% = 0.15 * 200 = 30个苹果。周一后剩余苹果 = 200 - 30 = 170个苹果。周二售出苹果 = 剩余170个苹果的25% = 0.25 * 170 = 42.5个苹果。由于我们不能卖半个苹果,我们假设这意味着42个或43个,或者问题暗示了一个分数可以接受的上下文。假设在最终实际解释之前,42.5是允许计算的:周二后剩余苹果 = 170 - 42.5 = 127.5个苹果。 如果我们必须处理整数苹果,“售出”意味着整数苹果,那么170的25%是42.5。如果商店只能卖整数苹果,他们可能卖了42个。 我们重新评估一下: 步骤1:从200个苹果开始。 步骤2:周一销售量:200的15% = 0.15 * 200 = 30个苹果。 步骤3:周一后剩余:200 - 30 = 170个苹果。 步骤4:周二销售量:170的25% = 0.25 * 170 = 42.5。 步骤5:周二后剩余苹果:170 - 42.5 = 127.5个苹果。 最终答案是 127.5。少样本 CoT: 在这里,你在提示中提供一个或多个示例,展示所需的问题、逐步推理和答案格式。示例:提示: Q: 娜塔莉亚卖夹子给她的25个朋友。她卖给每个朋友8个夹子。她总共卖了多少个夹子? A: 娜塔莉亚卖夹子给25个朋友。她卖给每个朋友8个夹子。所以,总共卖出的夹子数量是 25 * 8 = 200。最终答案是 200。Q: 一名慢跑者周一跑了3英里,周二跑了4英里,周三跑了2英里。如果他们本周(周一至周五)的目标是15英里,那么他们周四和周五总共还需要跑多少英里? A: 这名慢跑者周一跑了3英里。这名慢跑者周二跑了4英里。这名慢跑者周三跑了2英里。目前为止跑的总英里数 = 3 + 4 + 2 = 9英里。本周的目标是15英里。还需要跑的英里数 = 15 - 9 = 6英里。最终答案是 6。Q: 一家面包店制作了500块饼干。他们早上卖出了60%。下午,他们卖出了剩余饼干的25%。到一天结束时,还有多少块饼干未售出?我们一步一步地思考吧。LLM 输出: A: 这家面包店制作了500块饼干。 早上售出的饼干数量 = 500的60% = 0.60 * 500 = 300块饼干。 早上后剩余的饼干数量 = 500 - 300 = 200块饼干。 下午售出的饼干数量 = 剩余200块饼干的25% = 0.25 * 200 = 50块饼干。 总共售出的饼干数量 = 300(早上) + 50(下午) = 350块饼干。 未售出的饼干数量 = 初始饼干数量 - 总共售出的饼干数量 = 500 - 350 = 150块饼干。 最终答案是 150。CoT 的考量:Token 使用: 生成中间步骤会增加处理的 token 数量,这会影响延迟和成本。提示敏感性: CoT 的效果可能对提示的措辞和少样本示例的质量很敏感。错误传播: 如果在生成的思维链的早期步骤中出现错误,可能导致最终答案不正确,尽管有时模型可以自我纠正。CoT 是一种有效且相对简单的实现方法,可大幅提升 LLM 处理需要顺序推理问题的能力。ReAct:推理与行动尽管 CoT 增强了 LLM 的内部思维过程,但许多智能体任务需要与外部工具或信息源交互。ReAct 框架,即“推理与行动”的缩写,使 LLM 能够将推理与行动结合起来。它允许智能体生成口头推理轨迹(思考)来规划,然后采取行动(例如,查询数据库、调用 API、使用搜索引擎)。这些行动产生的结果会反馈回模型,以指导后续的思考和行动。ReAct 循环: 该过程是迭代的,通常遵循“思考-行动-观察”循环:思考: LLM 分析当前状态和整体目标,然后制定推理步骤或计划。这可能涉及分解问题、识别缺失信息或决定下一步做什么。行动: 基于思考,LLM 生成要执行的行动。此行动通常涉及调用外部工具,例如 search[query] 或 calculate[expression]。观察: 执行行动的结果(例如,搜索结果、API 响应、计算输出)作为观察结果返回给 LLM。这些新信息为 LLM 后续的推理提供了依据。此循环会重复,直到智能体完成任务或确定无法完成。digraph ReAct_Cycle { rankdir=TB; node [shape=box, style="rounded,filled", fontname="Arial", fillcolor="#dee2e6", color="#495057"]; edge [fontname="Arial", color="#495057"]; Goal [label="总体目标", shape=ellipse, fillcolor="#e9ecef"]; Thought [label="思考 (T_i)\nLLM 生成推理、\n计划或下一步", fillcolor="#a5d8ff"]; Action [label="行动 (A_i)\nLLM 选择工具/API\n或制定查询", fillcolor="#96f2d7"]; Tool [label="外部工具/\n环境", shape=cylinder, fillcolor="#b2f2bb"]; Observation [label="观察 (O_i)\n来自工具/API 的结果\n或环境反馈", fillcolor="#ffec99"]; Goal -> Thought [style=dashed]; Thought -> Action [label="决定"]; Action -> Tool [label="调用"]; Tool -> Observation [label="返回"]; Observation -> Thought [label="指导下一步", constraint=true]; }ReAct 框架将 LLM 生成的思考与通过外部工具执行的行动结合起来,并利用观察结果来改进后续的推理步骤。ReAct 实际应用示例: 考虑以下任务:“埃菲尔铁塔所在城市的当前天气是什么,以及该国家的人口是多少?”目标: 查找巴黎当前天气和法国人口。思考 1: 我需要找到埃菲尔铁塔所在的城市。行动 1: search[埃菲尔铁塔所在城市]观察 1: “埃菲尔铁塔位于法国巴黎。”思考 2: 好的,城市是巴黎,国家是法国。现在我需要查找巴黎的当前天气。行动 2: weather[巴黎, 法国] (假设有一个 weather 工具)观察 2: “法国巴黎当前天气为 18°C,局部多云。”思考 3: 我已经得到了巴黎的天气。现在我需要法国的人口。行动 3: search[法国人口]观察 3: “法国人口约为6700万。”思考 4: 我已获得所需的所有信息。巴黎(埃菲尔铁塔所在地)的天气是18°C,局部多云,法国人口约为6700万。最终答案: 巴黎当前天气为 18°C,局部多云,法国人口约为6700万。ReAct 的优势:有依据的推理: 通过与外部工具交互,ReAct 使 LLM 的推理基于事实和最新的信息,减少幻觉和知识截止问题。工具使用: 明确允许智能体使用专业工具,处理 LLM 不擅长的任务(例如,复杂计算、实时数据检索)。可解释性: 明确的思考-行动-观察轨迹使智能体的决策过程更透明,更容易调试。ReAct 的实现考量:工具定义: 清晰定义可用工具、它们的输入和输出很重要。提示工程: 基本提示必须指导 LLM 遵循 ReAct 格式,详细说明如何表达思考、行动以及如何使用观察结果。少样本示例在此处通常非常有效。行动解析: 你的系统需要一个可靠的机制来解析 LLM 生成的 Action 字符串,以识别工具及其参数。观察结果格式: 来自工具的观察结果必须清晰简洁地格式化,以便 LLM 理解。错误处理: 工具可能失败。系统必须妥善处理错误,并向 LLM 提供有用的观察结果(例如,“工具‘weather’返回错误:未找到城市”)。停止条件: 定义智能体何时应停止(例如,任务完成、最大迭代次数、特定的停止行动)。ReAct 代表着构建更强大、更具交互性的智能体的重要一步,它通过让 LLM 不仅能够“思考”,还能“行动”。其他高级推断模式尽管 CoT 和 ReAct 是基础性的,但该领域正在迅速发展。对于更复杂的问题,你可以考虑使用以下方法:自我反思/批评: 这包括让 LLM 生成初步解决方案或计划,然后提示它(或另一个 LLM 实例)来批评该输出。根据批评,原始 LLM 改进其解决方案。这种迭代改进过程可以大幅提升生成结果的质量和稳定性。例如,一个智能体可能会起草一封电子邮件,然后一个“批评者”角色会审查其语气和清晰度,从而生成一份修订草稿。思维树 (ToT): ToT 扩展了 CoT,允许 LLM 同时评估多个推理路径。它不生成单一链条,而是生成一个树状结构,其中每个节点都是部分解决方案或思考。LLM 随后可以评估这些不同路径(自我批评),并决定继续哪些或从哪些回溯,从而有效地在可能的思维序列空间中进行搜索。这需要更多计算资源,但对于搜索空间较大或存在多个可行解决方案的问题可能有所助益。思维图 (GoT): 通过允许思考形成任意图结构而不仅仅是树,GoT 进一步泛化了 ToT。这使得更复杂的推理模式成为可能,例如合并不同的思路,或在需要迭代改进单个想法时创建循环依赖。这在组织推理过程方面提供了最大的灵活性,但也增加了实现难度。选择合适的推断方法推断方法的选择在很大程度上取决于智能体任务的具体要求和期望的权衡:对于主要涉及内部推理和推断而无需外部数据的任务,思维链通常是一个不错的起点,因为它简单有效。当智能体必须与其环境交互、查询外部知识库或使用专业工具时,ReAct 是一个更适合且强大的框架。对于需要考察许多替代方案或深刻、多方面推理的高度复杂问题,可能需要更高级的模式,如自我反思、思维树或思维图,尽管它们带来更高的实现开销和计算成本。权衡:性能与复杂性: 像 CoT 这样简单的技术更容易实现,但在复杂、交互式任务上可能不如 ReAct 或 ToT 表现好。延迟: 生成中间思考或进行多次工具调用会增加延迟。成本: 更详尽的推理(更多 token)和更多工具调用(如果 API 是付费的)会增加运营成本。控制与自主性: 高度结构化的推理框架提供更多控制,但可能限制 LLM 的创意解题能力。智能体设计的实际影响将这些推断方法融入你的智能体具有几个实际影响:复杂的提示工程: 指导智能体整体行为的主提示,包括其推理过程(CoT、ReAct 格式),成为工程中的重要一环。结构化输出解析: 对于像 ReAct 这样的技术,你需要机制来解析 LLM 的输出,以提取独立的思考、行动和行动参数。工具管理: 如果使用 ReAct 或类似方法,一套定义明确的工具,以及向 LLM 清晰说明何时以及如何使用它们,这一点至关重要。状态管理: 智能体需要在思考、行动和观察的多个回合中保持状态。迭代改进: 构建具有高级推理能力的智能体很少是一次性过程。要根据观察到的表现,对提示、工具集成和推理结构进行迭代。掌握这些个体智能体推断方法,可以为每个智能体提供更深刻的理解能力和更有效的行动能力。这是构建多智能体系统的一项基本要求,在这些系统中,单独智能的智能体可以进行协作,正如我们将在后续章节中讨论集体推理和协调时所看到的那样。