AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


AI大模型实战篇:Self Discover框架,万万想不到Agent还能这样推理
发布日期:2024-09-11 20:06:18 浏览次数: 1600




Self Discover的概念

Self-Discover 是由Google的研究人员提出的一种AI Agent框架,可实现自动发现和构建推理结构,以解决各种推理任务。这种方法的核心是一个自发现过程,它允许大型语言模型在没有明确标签的情况下,自主地从多个原子推理模块(如批判性思维和逐步思考)中选择,并将其组合成一个推理结构。

Self-Discover框架包含两个主要阶段,自发现特定任务的推理结构、应用推理结构解决问题。如下图所示:


阶段一:自发现特定任务的推理结构

主要包含三个主要动作:选择(SELECT)、适应(ADAPT)和实施(IMPLEMENT)。

选择:在这个阶段,模型从一组原子推理模块(例如“批判性思维”和“逐步思考”)中选择对于解决特定任务有用的模块。模型通过一个元提示来引导选择过程,这个元提示结合了任务示例和原子模块描述。选择过程的目标是确定哪些推理模块对于解决任务是有助的。

适应: 一旦选定了相关的推理模块,下一步是调整这些模块的描述使其更适合当前任务。这个过程将一般性的推理模块描述,转化为更具体的任务相关描述。例如对于算术问题,“分解问题”的模块可能被调整为“按顺序计算每个算术操作”。同样,这个过程使用元提示和模型来生成适应任务的推理模块描述。

实施: 在适应了推理模块之后,Self-Discover框架将这些适应后的推理模块描述转化为一个结构化的可执行计划。这个计划以键值对的形式呈现,类似于JSON,以便于模型理解和执行。这个过程不仅包括元提示,还包括一个人类编写的推理结构示例,帮助模型更好地将自然语言转化为结构化的推理计划。


阶段二:应用推理结构

完成阶段一之后,模型将拥有一个专门为当前任务定制的推理结构。在解决问题的实例时,模型只需遵循这个结构,逐步填充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.\n\n" + "\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}\n\nOur 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}\n\nTask 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}\n\nSolve this task, providing your final answer: {task_instance}"solution = query_openai(prompt)return solution


第三步 提出问题,开始推理

第三步就是将这个过程进行推理实现,如下面的代码所示,这一步非常关键,大家可以逐条仔细看:

# Example usageif __name__ == "__main__":reasoning_modules = ["1. 我该如何设计一个实验来解决这个问题?","2. 列出解决这个问题的想法,然后逐一应用它们来解决这个问题,看看是否可以取得任何进展。",        "3. 我怎样才能衡量这个问题的进展?","4. 我怎样才能简化这个问题以便于解决?","5. 这个问题背后的关键假设是什么?","6. 每种解决方案的潜在风险和缺点是什么?","7. 对于这个问题,还有哪些其他的观点或看法?","8. 这个问题及其解决方案的长期影响是什么?",        "9. 我怎样才能将这个问题分解成更小、更易于管理的部分?",        "10. 批判性思维:这种思维方式包括从不同角度分析问题、质疑假设以及评估现有证据或信息。它侧重于逻辑推理、基于证据的决策以及识别思维中的潜在偏见或缺陷。","11. 尝试创造性思维,产生创新和突破常规的想法来解决问题。探索非常规解决方案,超越传统界限思考,鼓励想象力和独创性。","12. 寻求他人的意见和合作来解决问题。强调团队合作、开放的沟通,并利用团队的不同观点和专业知识来提出有效的解决方案。","13. 使用系统思维:将问题视为更大系统的一部分,并了解各种元素之间的相互联系。重点是确定影响问题的根本原因、反馈回路和相互依赖关系,并制定解决整个系统的整体解决方案。","14. 使用风险分析:评估与问题的不同解决方案或方法相关的潜在风险、不确定性和权衡。强调评估成功或失败的潜在后果和可能性,并根据风险和收益的平衡分析做出明智的决策。","15. 使用反思性思维:远离问题,花时间进行内省和自我反省。检查可能影响解决问题的个人偏见、假设和思维模式,并乐于从过去的经验中学习,以改进未来的方法。","16. 需要解决的核心问题是什么?”,"17. 导致该问题的根本原因或因素是什么?”,"18. 是否有任何潜在的解决方案或策略曾经被尝试过?如果有,结果和经验教训是什么?“,"19. 解决这个问题可能出现哪些潜在障碍或挑战?”,"20. 是否有相关数据或信息可以洞悉问题?如果有,有哪些数据源可用,如何分析这些数据?","21. 是否有任何利益相关者或个人直接受到该问题的影响?他们的观点和需求是什么?"22. 需要哪些资源(财力、人力、技术等)来有效解决该问题?"23. 如何衡量或评估解决问题的进展或成功?","24. 可以使用什么指标或度量?","25. 这个问题是技术问题还是实践问题,需要特定的专业知识或技能?还是更多的是概念问题或理论问题?“,"26. 该问题是否涉及物理限制,例如资源、基础设施或空间有限?”,"27. 该问题是否与人类行为有关,例如社会、文化或心理问题?”,"28. 问题是否涉及决策或计划,需要在不确定或相互竞争的目标下做出选择?”,"29. 该问题是否是需要数据分析、建模或优化技术的分析问题?”,"30. 这个问题是否是一个需要创造性解决方案和创新的设计挑战?”,"31. 这个问题是否需要解决系统性或结构性问题,而不仅仅是个别问题?“,"32. 该问题是否具有时效性或紧急性,需要立即关注和采取行动?”,"33. 针对这种问题规范通常会产生什么样的解决方案?","34. 给定问题规范和当前最佳解决方案,猜测其他可能的解决方案。”"35. 让我们想象一下当前的最佳解决方案是完全错误的,还有哪些其他方式来思考问题规范?”"36. 鉴于您对此类问题规范的了解,修改当前最佳解决方案的最佳方法是什么?”"37. 忽略当前的最佳解决方案,为问题创建一个全新的解决方案。”"38. 让我一步步思考""39. 让我们制定一个逐步的计划,并用良好的注释和解释来实施它。”]
    task_example = "Lisa有10个苹果,她给了朋友3个苹果,然后从商店买了5个苹果。Lisa现在有多少个苹果?“
selected_modules = select_reasoning_modules(task_example, reasoning_modules)    print("Stage 1 SELECT: Selected Modules:\n", selected_modules)
adapted_modules = adapt_reasoning_modules(selected_modules, task_example)print("\nStage 1 ADAPT: Adapted Modules:\n", adapted_modules)
reasoning_structure = implement_reasoning_structure(adapted_modules, task_example)print("\nStage 1 IMPLEMENT: Reasoning Structure:\n", reasoning_structure)
result = execute_reasoning_structure(reasoning_structure, task_example)print("\nStage 2: Final Result:\n", result)


这段代码非常简单。首先,我们提出了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就能解决更加多样化的问题,因为任何类型的问题,总能有其对应的推理和思考方式。

大家可以关注公众号【风叔云】,回复关键词【SD源码】,获取self discover设计模式的完整源代码,然后自己尝试一些更复杂的提问,看看大模型的回答效果。


总结

整个Self-Discover的关键在于,它允许模型在没有人类干预的情况下,自主地生成适合特定任务的推理结构。这样不仅提高了模型的推理能力,而且提高了推理过程的可解释性。通过这种方式,模型能够更有效地处理复杂和多样化的任务。

本篇文章提到的例子,虽然结构很清晰,但不足之处在于没有使用Tools。对于需要使用搜索工具、数学工具等外部工具的场景,我们也可以让大模型在adapt环节给出适合解决目标任务的外部工具,然后在后续过程中执行。


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询