AI大模型实战篇:Self Discover框架,万万想不到Agent还能这样推理
Self-Discover的概念
Self-Discover 是Google研究团队提出的一种AI Agent框架,核心亮点在于:让大模型自己去发现并构建推理结构,从而解决各种推理任务。简单来说,这个框架允许模型在没有明确标签指引的情况下,自主地从一组原子推理模块(比如批判性思维、逐步思考)中挑选合适的模块,再组合成一个完整的推理结构。
整个框架分为两大阶段:先自发现特定任务的推理结构,再应用这个结构去解决问题。整个过程如下图所示:

阶段一:自发现特定任务的推理结构
这一阶段包含三个关键动作:选择、适应和实施。
选择
适应
实施
阶段二:应用推理结构
完成阶段一后,模型就拥有了一套专为当前任务定制的推理结构。当面对具体问题实例时,模型只需按这个结构一步步填充JSON中的值,直到得出最终答案。整个过程就像照着菜谱做菜,每一步都清清楚楚。
Self-Discover的实现过程
下面通过实际代码来拆解Self-Discover模式的实现方法。完整的源代码可以在文章末尾获取(本文已删除推广信息,读者可自行搜索相关资源)。
第一步:定义Select、Adapt和Implement
第一步对应阶段一,需要定义好select、adapt和implement这三个函数。
Select
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.
" + "
".join(reasoning_modules)
selected_modules = query_openai(prompt)
return selected_modules
Adapt
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:
{selected_modules}
Our task:
{task_example}"
adapted_modules = query_openai(prompt)
return adapted_modules
Implement
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:
{adapted_modules}
Task Description:
{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}
Solve this task, providing your final answer: {task_instance}"
solution = query_openai(prompt)
return solution
第三步:提出问题,开始推理
最后,把整个过程串联起来推理实现。这段代码非常关键,值得逐条细看:
# Example usage
if __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:
", selected_modules)
adapted_modules = adapt_reasoning_modules(selected_modules, task_example)
print("
Stage 1 ADAPT: Adapted Modules:
", adapted_modules)
reasoning_structure = implement_reasoning_structure(adapted_modules, task_example)
print("
Stage 1 IMPLEMENT: Reasoning Structure:
", reasoning_structure)
result = execute_reasoning_structure(reasoning_structure, task_example)
print("
Stage 2: Final Result:
", 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就能解决更加多样化的问题——因为任何类型的问题,总能有其对应的推理和思考方式。
总结
整个Self-Discover的关键在于:它允许模型在没有人类干预的情况下,自主生成适合特定任务的推理结构。这一机制不仅提升了模型的推理能力,还大大增强了推理过程的可解释性。凭借这种方式,模型能够更高效地处理复杂和多样化的任务。
当然,本文所举的例子虽结构清晰,但不足之处在于没有使用外部工具。对于那些需要搜索工具、数学工具等外部资源的场景,完全可以让大模型在adapt环节也给出适合目标任务的工具信息,然后在后续执行中调用。这一点值得进一步探索和实践。
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名