☰
【Agent】【workflow】17.Self-Discover工作流分析
2026/10/18 4:27:11 网站建设 项目流程

案例目标

本案例展示了如何使用LlamaIndex工作流实现SELF-DISCOVER算法。SELF-DISCOVER是一种自动发现推理结构的方法,它能够根据任务需求自动选择、调整和组合推理模块,形成针对特定任务的推理结构,然后使用该结构解决任务。

SELF-DISCOVER包含两个主要阶段:

  1. 第一阶段:
    • SELECT:从预定义的推理模块中选择相关子集
    • ADAPT:将选定的推理模块调整适应特定任务
    • IMPLEMENT:为任务生成推理结构
  2. 第二阶段:使用生成的推理结构解决任务并生成答案

技术栈与核心依赖

  • llama-index- 核心框架,提供工作流和提示模板功能
  • llama-index-llms-openai- OpenAI语言模型集成
  • OpenAI GPT-4o- 用于推理模块选择、调整和任务解决的LLM
  • PromptTemplate- 用于格式化各种提示模板

环境配置

# 安装LlamaIndex pip install -U llama-index # 设置OpenAI API密钥 import os os.environ["OPENAI_API_KEY"] = ""

案例实现

SELF-DISCOVER工作流程

选择推理模块 → 调整推理模块 → 创建推理结构 → 生成最终答案

1. 定义推理模块和提示模板

首先定义39个推理模块,涵盖问题解决的各个方面:

from llama_index.core.prompts import PromptTemplate _REASONING_MODULES = [ "1. How could I devise an experiment to help solve that problem?", "2. Make a list of ideas for solving this problem, and apply them one by one to the problem to see if any progress can be made.", # ... 更多推理模块 "39. Let's make a step by step plan and implement it with good notation and explanation.", ] _REASONING_MODULES = "\n".join(_REASONING_MODULES) # 定义四个关键提示模板 SELECT_PRMOPT_TEMPLATE = PromptTemplate( "Given the task: {task}, which of the following reasoning modules are relevant? Do not elaborate on why.\n\n {reasoning_modules}" ) ADAPT_PROMPT_TEMPLATE = PromptTemplate( "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}" ) IMPLEMENT_PROMPT_TEMPLATE = PromptTemplate( "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}" ) REASONING_PROMPT_TEMPLATE = PromptTemplate( "Using the following reasoning structure: {reasoning_structure}\n\nSolve this task, providing your final answer: {task}" )

2. 定义工作流事件

定义三个事件类,用于在工作流的不同步骤之间传递数据:

from llama_index.core.workflow import Event class GetModulesEvent(Event): """获取模块事件""" task: str modules: str class RefineModulesEvent(Event): """精炼模块事件""" task: str refined_modules: str class ReasoningStructureEvent(Event): """创建推理结构事件""" task: str reasoning_structure: str

3. 实现SelfDiscoverWorkflow

创建SelfDiscoverWorkflow类,包含四个主要步骤:

from llama_index.core.workflow import ( Workflow, Context, StartEvent, StopEvent, step, ) from llama_index.core.llms import LLM class SelfDiscoverWorkflow(Workflow): """Self discover workflow.""" @step async def get_modules(self, ctx: Context, ev: StartEvent) -> GetModulesEvent: """获取模块步骤""" # 获取输入数据,将llm存储到ctx task = ev.get("task") llm: LLM = ev.get("llm") if task is None or llm is None: raise ValueError("'task' and 'llm' arguments are required.") await ctx.store.set("llm", llm) # 格式化提示并从LLM获取结果 prompt = SELECT_PRMOPT_TEMPLATE.format( task=task, reasoning_modules=_REASONING_MODULES ) result = llm.complete(prompt) return GetModulesEvent(task=task, modules=str(result)) @step async def refine_modules(self, ctx: Context, ev: GetModulesEvent) -> RefineModulesEvent: """精炼模块步骤""" task = ev.task modules = ev.modules llm: LLM = await ctx.store.get("llm") # 格式化提示并获取结果 prompt = ADAPT_PROMPT_TEMPLATE.format( task=task, selected_modules=modules ) result = llm.complete(prompt) return RefineModulesEvent(task=task, refined_modules=str(result)) @step async def create_reasoning_structure(self, ctx: Context, ev: RefineModulesEvent) -> ReasoningStructureEvent: """创建推理结构步骤""" task = ev.task refined_modules = ev.refined_modules llm: LLM = await ctx.store.get("llm") # 格式化提示,获取结果 prompt = IMPLEMENT_PROMPT_TEMPLATE.format( task=task, adapted_modules=refined_modules ) result = llm.complete(prompt) return ReasoningStructureEvent( task=task, reasoning_structure=str(result) ) @step async def get_final_result(self, ctx: Context, ev: ReasoningStructureEvent) -> StopEvent: """从推理结构事件获取最终结果""" task = ev.task reasoning_structure = ev.reasoning_structure llm: LLM = await ctx.store.get("llm") # 格式化提示,获取结果 prompt = REASONING_PROMPT_TEMPLATE.format( task=task, reasoning_structure=reasoning_structure ) result = llm.complete(prompt) return StopEvent(result=result)

4. 运行工作流

创建工作流实例并运行任务:

from llama_index.llms.openai import OpenAI from IPython.display import display, Markdown # 创建工作流和LLM实例 workflow = SelfDiscoverWorkflow() llm = OpenAI("gpt-4o") # 定义任务 task = "Michael has 15 oranges. He gives 4 oranges to his brother and trades 3 oranges for 6 apples with his neighbor. Later in the day, he realizes some of his oranges are spoiled, so he discards 2 of them. Then, Michael goes to the market and buys 12 more oranges and 5 more apples. If Michael decides to give 2 apples to his friend, how many oranges and apples does Michael have now?" # 运行工作流并显示结果 result = await workflow.run(task=task, llm=llm) display(Markdown(str(result)))

案例效果

本案例实现的SELF-DISCOVER工作流能够自动为复杂问题生成结构化的推理过程,并得出准确答案。对于给定的数学问题(关于橙子和苹果的数量计算),系统执行了以下步骤:

  1. 选择相关推理模块:从39个预定义模块中选择了与问题解决相关的模块,如"如何将问题分解为更小的部分"和"让我们一步步思考"等。
  2. 调整推理模块:将选定的通用模块调整为适合当前具体任务的形式。
  3. 创建推理结构:基于调整后的模块,创建了一个结构化的推理框架,指导如何解决这个数学问题。
  4. 生成最终答案:使用推理结构逐步解决问题,计算出Michael现在有18个橙子和9个苹果。

最终结果不仅给出了正确答案,还展示了详细的推理过程,包括每一步的计算和解释,使整个解决方案透明且易于理解。这种结构化的方法特别适合解决需要多步骤推理的复杂问题。

案例实现思路

  1. 模块化推理设计:将问题解决过程分解为可重用的推理模块,每个模块专注于特定的推理方法或策略。
  2. 自适应选择机制:利用LLM的语义理解能力,根据任务描述自动选择最相关的推理模块。
  3. 动态调整与组合:将选定的通用推理模块调整适应特定任务,并组合成针对该任务的推理结构。
  4. 结构化推理流程:通过生成的推理结构指导问题解决过程,确保推理的逻辑性和完整性。
  5. 事件驱动架构:使用LlamaIndex工作流的事件驱动模型,通过定义GetModulesEvent、RefineModulesEvent和ReasoningStructureEvent等事件,实现步骤间的数据传递。

扩展建议

  • 领域特定推理模块:为特定领域(如数学、科学、法律等)创建专门的推理模块,提高在专业领域的表现。
  • 动态模块学习:实现从成功案例中学习新推理模块的能力,不断扩展推理模块库。
  • 多模态推理支持:扩展支持图像、表格等多模态输入,为每种模态设计专门的推理模块。
  • 推理结构评估:添加推理结构质量评估机制,根据历史表现选择更有效的推理结构。
  • 交互式推理优化:允许用户参与推理过程,提供反馈或指导,优化推理结构。
  • 推理路径可视化:实现推理过程的可视化展示,帮助用户理解问题解决路径。
  • 并行推理探索:对于复杂问题,同时探索多个不同的推理路径,并选择最佳结果。

总结

SELF-DISCOVER工作流是一种创新的自动推理方法,它通过模拟人类问题解决过程中的模块化思维,实现了针对不同任务的自动推理结构发现。本案例展示了如何使用LlamaIndex工作流框架实现这一算法,包括推理模块定义、事件设计、工作流步骤实现和任务执行等关键环节。

与传统的固定推理方法相比,SELF-DISCOVER具有更强的适应性和灵活性,能够根据任务特点自动调整推理策略。这种设计特别适合处理需要多步骤推理的复杂问题,如数学问题解决、逻辑推理和决策分析等。

该实现的核心价值在于其模块化和自适应特性,开发者可以通过扩展推理模块库和优化选择策略,进一步提高系统在特定领域的表现。此外,工作流的事件驱动架构使得整个过程清晰可控,便于调试和优化。

SELF-DISCOVER代表了AI推理系统的一个重要发展方向,即从固定规则向自适应、模块化推理的转变,有望在复杂问题解决、教育辅导和决策支持等领域发挥重要作用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询