前面我们分享了 Basic Reflection 这种偏重反思的 AI Agent 设计模式,在面对复杂的问题时,就需要更强大的 Self-discover 设计模式来进行。这篇文章,作者的分享一定不能错过。
AI大模型实战篇:Self Discover框架,万万想不到Agent还能这样推理
在上篇文章《AI 大模型实战篇:Basic Reflection,AI Agent 的左右互搏之术》中,风叔结合原理和具体源代码,详细介绍了第一种偏重反思的 AI Agent 设计模式,即 Basic Reflection。
Basic Reflection 的思路非常朴素,使用成本较低,但是在实际应用中,Basic Reflection 面对一些比较复杂的问题时,需要 Generator 具备更强大的推理能力。
在这篇文章中,沿着“更强大的推理能力”这条优化路线,风叔将介绍 Self-discover 设计模式。这个设计模式非常有意思,相信看到最后,大家会发现令人惊奇的结果。
AI大模型实战篇:Self Discover框架,万万想不到Agent还能这样推理
一、Self Discover 的概念
Self-Discover 是由 Google 的研究人员提出的一种 AI Agent 框架,可实现自动发现和构建推理结构,以解决各种推理任务。这种方法的核心是一个自发现过程,它允许大型语言模型在没有明确标签的情况下,自主地从多个原子推理模块(如批判性思维和逐步思考)中选择,并将其组合成一个推理结构。
Self-Discover 框架包含两个主要阶段,自发现特定任务的推理结构、应用推理结构解决问题。如下图所示:
AI大模型实战篇:Self Discover框架,万万想不到Agent还能这样推理
阶段一:自发现特定任务的推理结构
主要包含三个主要动作:选择(SELECT)、适应(ADAPT)和实施(IMPLEMENT)。
选择:在这个阶段,模型从一组原子推理模块(例如“批判性思维”和“逐步思考”)中选择对于解决特定任务有用的模块。模型通过一个元提示来引导选择过程,这个元提示结合了任务示例和原子模块描述。选择过程的目标是确定哪些推理模块对于解决任务是有助的。
适应:一旦选定了相关的推理模块,下一步是调整这些模块的描述使其更适合当前任务。这个过程将一般性的推理模块描述,转化为更具体的任务相关描述。例如对于算术问题,“分解问题”的模块可能被调整为“按顺序计算每个算术操作”。同样,这个过程使用元提示和模型来生成适应任务的推理模块描述。
实施:在适应了推理模块之后,Self-Discover 框架将这些适应后的推理模块描述转化为一个结构化的可执行计划。这个计划以键值对的形式呈现,类似于 JSON,以便于模型理解和执行。这个过程不仅包括元提示,还包括一个人类编写的推理结构示例,帮助模型更好地将自然语言转化为结构化的推理计划。
AI大模型实战篇:Self Discover框架,万万想不到Agent还能这样推理
阶段二:应用推理结构
完成阶段一之后,模型将拥有一个专门为当前任务定制的推理结构。在解决问题的实例时,模型只需遵循这个结构,逐步填充 JSON 中的值,直到得出最终答案。
二、Self Discover 的实现过程
下面,风叔通过实际的源码,详细介绍 Self Discover 模式的实现方法,具体的源代码地址可以在文章结尾处获取。
第一步 定义 Select、Adapt 和 Implement
第一步要做的事情,是前面所讲的阶段一,定义好 select、adapt 和 implement 这三个过程。
首先,定义 select。给 Select 的 prompt 是,“对于给定的任务,找出最相关的 reasoning module,即确定通过什么方法来解决任务”
def select_reasoning_modules ( task_description, reasoning_modules ) : """ 第 1 步,为任务选择相关的推理方法 .""" prompt = f"Given the task: {task_description}, which of the following reasoning modules are relevant? Do not elaborate on why.nn" + "n".join ( reasoning_modules ) selected_modules = query_openai ( prompt ) return selected_modules
然后,定义 adapt。给 Adapt 的 prompt 是,“在不需要给出完整解决方案的情况下,让大模型调整上一步得到的 reasoning module,以更好地适应任务。”
def adapt_reasoning_modules ( selected_modules, task_example ) : """ 第 2 步:调整所选的推理模块,使其更适合任务 .""" prompt = f"Without working out the full solution, adapt the following reasoning modules to be specific to our task:n{selected_modules}nnOur task:n{task_example}" adapted_modules = query_openai ( prompt ) return adapted_modules
接下来,定义 implement。给 Implement 的 prompt 是,“在不需要给出完整解决方案的情况下,利用上一步得到的优化后的 reasoning module,创建一个可执行的推理结构。”
def implement_reasoning_structure ( adapted_modules, task_description ) : """ 第 3 步:将调整后的推理模块实施为可操作的推理结构。""" prompt = f"Without working out the full solution, create an actionable reasoning structure for the task using these adapted reasoning modules:n{adapted_modules}nnTask Description:n{task_description}" reasoning_structure = query_openai ( prompt ) return reasoning_structure
第二步 执行推理结构
第二步要做的事情,就是前面所讲的阶段二,应用这个推理结构获得最终答案
def execute_reasoning_structure ( reasoning_structure,task_instance ) : """ 执行推理结构来解决特定的任务实例。 """ prompt = f"Using the following reasoning structure: {reasoning_structure}nnSolve this task, providing your final answer: {task_instance}" solution = query_openai ( prompt ) return solution
第三步 提出问题,开始推理
第三步就是将这个过程进行推理实现,如下面的代码所示,这一步非常关键,大家可以逐条仔细看:
这段代码非常简单。首先,我们提出了 39 种 reasoning modules,即推理的具体方法,大家也可以自己提炼出一些推理方法,通过 prompt 告知给 Agent。
然后,我们提出一个具体的推理任务:
“ Lisa 有 10 个苹果。她给了朋友 3 个苹果,然后从商店买了 5 个苹果。Lisa 现在有多少个苹果?“
然后大模型会自动选出最合适的推理方法。实践中发现,大模型选择了方法 9 和 10。
第 1 阶段选择:选定模块: 9. 我如何将这个问题分解成更小、更易于管理的部分?这个问题可以分解成两个部分:首先,计算 Lisa 在送出一些苹果后有多少个苹果,其次,计算她购买更多苹果后有多少个苹果。这种方法简化了问题并使其更容易解决。 此外,10. 批判性思维:这种风格涉及从不同角度分析问题、质疑假设以及评估可用的证据或信息。它侧重于逻辑推理、基于证据的决策以及识别思维中的潜在偏见或缺陷。批判性思维在解决问题中始终很重要,因为它有助于确保解决方案基于合理的推理和证据。在这种情况下,它可以帮助确认问题被正确解释并且解决方案合乎逻辑且准确。 因此,9 和 10 都是此问题的相关推理模块。
接下来,针对目标任务,大模型自动优化推理方法的描述。
第 1 阶段 适应:改编模块: 1. 分解问题:问题可以分解为两个较小的任务: a ) 计算 Lisa 送给朋友 3 个苹果后还有多少个苹果。 b ) 计算 Lisa 从商店购买 5 个苹果后还有多少个苹果。 通过将问题分解为这些较小的任务,解决问题会变得更容易。 2. 批判性思维:运用批判性思维确保问题得到正确解释,解决方案合乎逻辑且准确。这包括: a ) 确认问题得到正确理解(Lisa 从 10 个苹果开始,赠送 3 个,然后购买 5 个)。 b ) 确保正确遵循操作顺序(在添加购买的苹果之前减去赠送的苹果)。 c ) 仔细检查计算以确保准确性。 通过运用批判性思维,您可以确信解决方案基于合理的推理和证据。
然后,大模型自动给出了具体的推理结构。
第 1 阶段实施:推理结构: 1. 分解问题: a ) 计算 Lisa 送给朋友 3 个苹果后还剩下多少个苹果: - Lisa 一开始有 10 个苹果 - 她送出了 3 个苹果 - 从最初的苹果数量中减去送出的苹果数量 b ) 计算 Lisa 从商店购买 5 个苹果后还剩下多少个苹果: - 送出 3 个苹果后,Lisa 还剩下一定数量的苹果(来自任务 a) - 然后她又买了 5 个苹果 - 将购买的苹果数量加到剩余的苹果数量中 2. 批判性思维: a ) 确认问题理解正确: - Lisa 一开始有 10 个苹果 - 她送出了 3 个苹果 - 她又买了 5 个苹果 b ) 确保操作顺序正确: - 首先,减去送出的苹果 - 然后,加上苹果购买 c ) 仔细检查计算结果: - 确认减去的苹果数量正确 - 确认添加了的苹果数量正确 通过遵循此推理结构,您可以通过将问题分解为较小的任务、运用批判性思维和仔细检查计算结果来解决问题。最终答案应准确且基于合理的推理。 最后,执行推理结构,得出最终结果 最终答案:Lisa 现在有 12 个苹果。
至此,Self Discover 的原理和流程就介绍完了。
风叔在尝试这个 case 之前,完全没想到大模型还能在给定的推理方法中,自主选择最合适特定的问题的推理方法,并完成推理结构和推理语言的输出,这项能力确实是让风叔眼前一亮。通过这种推理方式,未来 Agent 就能解决更加多样化的问题,因为任何类型的问题,总能有其对应的推理和思考方式。
总结
整个 Self-Discover 的关键在于,它允许模型在没有人类干预的情况下,自主地生成适合特定任务的推理结构。这样不仅提高了模型的推理能力,而且提高了推理过程的可解释性。通过这种方式,模型能够更有效地处理复杂和多样化的任务。
本篇文章提到的例子,虽然结构很清晰,但不足之处在于没有使用 Tools。对于需要使用搜索工具、数学工具等外部工具的场景,我们也可以让大模型在 adapt 环节给出适合解决目标任务的外部工具,然后在后续过程中执行。