
案例目標(biāo)本案例展示了如何使用LlamaIndex工作流實(shí)現(xiàn)SELF-DISCOVER算法。SELF-DISCOVER是一種自動(dòng)發(fā)現(xiàn)推理結(jié)構(gòu)的方法它能夠根據(jù)任務(wù)需求自動(dòng)選擇、調(diào)整和組合推理模塊形成針對(duì)特定任務(wù)的推理結(jié)構(gòu)然后使用該結(jié)構(gòu)解決任務(wù)。SELF-DISCOVER包含兩個(gè)主要階段第一階段SELECT從預(yù)定義的推理模塊中選擇相關(guān)子集ADAPT將選定的推理模塊調(diào)整適應(yīng)特定任務(wù)IMPLEMENT為任務(wù)生成推理結(jié)構(gòu)第二階段使用生成的推理結(jié)構(gòu)解決任務(wù)并生成答案技術(shù)棧與核心依賴llama-index- 核心框架提供工作流和提示模板功能llama-index-llms-openai- OpenAI語(yǔ)言模型集成OpenAI GPT-4o- 用于推理模塊選擇、調(diào)整和任務(wù)解決的LLMPromptTemplate- 用于格式化各種提示模板環(huán)境配置# 安裝LlamaIndex pip install -U llama-index # 設(shè)置OpenAI API密鑰 import os os.environ[OPENAI_API_KEY] 案例實(shí)現(xiàn)SELF-DISCOVER工作流程選擇推理模塊 → 調(diào)整推理模塊 → 創(chuàng)建推理結(jié)構(gòu) → 生成最終答案1. 定義推理模塊和提示模板首先定義39個(gè)推理模塊涵蓋問(wèn)題解決的各個(gè)方面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. Lets make a step by step plan and implement it with good notation and explanation., ] _REASONING_MODULES \n.join(_REASONING_MODULES) # 定義四個(gè)關(guān)鍵提示模板 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. 定義工作流事件定義三個(gè)事件類用于在工作流的不同步驟之間傳遞數(shù)據(jù)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): 創(chuàng)建推理結(jié)構(gòu)事件 task: str reasoning_structure: str3. 實(shí)現(xiàn)SelfDiscoverWorkflow創(chuàng)建SelfDiscoverWorkflow類包含四個(gè)主要步驟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: 獲取模塊步驟 # 獲取輸入數(shù)據(jù)將llm存儲(chǔ)到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獲取結(jié)果 prompt SELECT_PRMOPT_TEMPLATE.format( tasktask, reasoning_modules_REASONING_MODULES ) result llm.complete(prompt) return GetModulesEvent(tasktask, modulesstr(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) # 格式化提示并獲取結(jié)果 prompt ADAPT_PROMPT_TEMPLATE.format( tasktask, selected_modulesmodules ) result llm.complete(prompt) return RefineModulesEvent(tasktask, refined_modulesstr(result)) step async def create_reasoning_structure(self, ctx: Context, ev: RefineModulesEvent) - ReasoningStructureEvent: 創(chuàng)建推理結(jié)構(gòu)步驟 task ev.task refined_modules ev.refined_modules llm: LLM await ctx.store.get(llm) # 格式化提示獲取結(jié)果 prompt IMPLEMENT_PROMPT_TEMPLATE.format( tasktask, adapted_modulesrefined_modules ) result llm.complete(prompt) return ReasoningStructureEvent( tasktask, reasoning_structurestr(result) ) step async def get_final_result(self, ctx: Context, ev: ReasoningStructureEvent) - StopEvent: 從推理結(jié)構(gòu)事件獲取最終結(jié)果 task ev.task reasoning_structure ev.reasoning_structure llm: LLM await ctx.store.get(llm) # 格式化提示獲取結(jié)果 prompt REASONING_PROMPT_TEMPLATE.format( tasktask, reasoning_structurereasoning_structure ) result llm.complete(prompt) return StopEvent(resultresult)4. 運(yùn)行工作流創(chuàng)建工作流實(shí)例并運(yùn)行任務(wù)from llama_index.llms.openai import OpenAI from IPython.display import display, Markdown # 創(chuàng)建工作流和LLM實(shí)例 workflow SelfDiscoverWorkflow() llm OpenAI(gpt-4o) # 定義任務(wù) 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? # 運(yùn)行工作流并顯示結(jié)果 result await workflow.run(tasktask, llmllm) display(Markdown(str(result)))案例效果本案例實(shí)現(xiàn)的SELF-DISCOVER工作流能夠自動(dòng)為復(fù)雜問(wèn)題生成結(jié)構(gòu)化的推理過(guò)程并得出準(zhǔn)確答案。對(duì)于給定的數(shù)學(xué)問(wèn)題關(guān)于橙子和蘋(píng)果的數(shù)量計(jì)算系統(tǒng)執(zhí)行了以下步驟選擇相關(guān)推理模塊從39個(gè)預(yù)定義模塊中選擇了與問(wèn)題解決相關(guān)的模塊如如何將問(wèn)題分解為更小的部分和讓我們一步步思考等。調(diào)整推理模塊將選定的通用模塊調(diào)整為適合當(dāng)前具體任務(wù)的形式。創(chuàng)建推理結(jié)構(gòu)基于調(diào)整后的模塊創(chuàng)建了一個(gè)結(jié)構(gòu)化的推理框架指導(dǎo)如何解決這個(gè)數(shù)學(xué)問(wèn)題。生成最終答案使用推理結(jié)構(gòu)逐步解決問(wèn)題計(jì)算出Michael現(xiàn)在有18個(gè)橙子和9個(gè)蘋(píng)果。最終結(jié)果不僅給出了正確答案還展示了詳細(xì)的推理過(guò)程包括每一步的計(jì)算和解釋使整個(gè)解決方案透明且易于理解。這種結(jié)構(gòu)化的方法特別適合解決需要多步驟推理的復(fù)雜問(wèn)題。案例實(shí)現(xiàn)思路模塊化推理設(shè)計(jì)將問(wèn)題解決過(guò)程分解為可重用的推理模塊每個(gè)模塊專注于特定的推理方法或策略。自適應(yīng)選擇機(jī)制利用LLM的語(yǔ)義理解能力根據(jù)任務(wù)描述自動(dòng)選擇最相關(guān)的推理模塊。動(dòng)態(tài)調(diào)整與組合將選定的通用推理模塊調(diào)整適應(yīng)特定任務(wù)并組合成針對(duì)該任務(wù)的推理結(jié)構(gòu)。結(jié)構(gòu)化推理流程通過(guò)生成的推理結(jié)構(gòu)指導(dǎo)問(wèn)題解決過(guò)程確保推理的邏輯性和完整性。事件驅(qū)動(dòng)架構(gòu)使用LlamaIndex工作流的事件驅(qū)動(dòng)模型通過(guò)定義GetModulesEvent、RefineModulesEvent和ReasoningStructureEvent等事件實(shí)現(xiàn)步驟間的數(shù)據(jù)傳遞。擴(kuò)展建議領(lǐng)域特定推理模塊為特定領(lǐng)域如數(shù)學(xué)、科學(xué)、法律等創(chuàng)建專門的推理模塊提高在專業(yè)領(lǐng)域的表現(xiàn)。動(dòng)態(tài)模塊學(xué)習(xí)實(shí)現(xiàn)從成功案例中學(xué)習(xí)新推理模塊的能力不斷擴(kuò)展推理模塊庫(kù)。多模態(tài)推理支持?jǐn)U展支持圖像、表格等多模態(tài)輸入為每種模態(tài)設(shè)計(jì)專門的推理模塊。推理結(jié)構(gòu)評(píng)估添加推理結(jié)構(gòu)質(zhì)量評(píng)估機(jī)制根據(jù)歷史表現(xiàn)選擇更有效的推理結(jié)構(gòu)。交互式推理優(yōu)化允許用戶參與推理過(guò)程提供反饋或指導(dǎo)優(yōu)化推理結(jié)構(gòu)。推理路徑可視化實(shí)現(xiàn)推理過(guò)程的可視化展示幫助用戶理解問(wèn)題解決路徑。并行推理探索對(duì)于復(fù)雜問(wèn)題同時(shí)探索多個(gè)不同的推理路徑并選擇最佳結(jié)果??偨Y(jié)SELF-DISCOVER工作流是一種創(chuàng)新的自動(dòng)推理方法它通過(guò)模擬人類問(wèn)題解決過(guò)程中的模塊化思維實(shí)現(xiàn)了針對(duì)不同任務(wù)的自動(dòng)推理結(jié)構(gòu)發(fā)現(xiàn)。本案例展示了如何使用LlamaIndex工作流框架實(shí)現(xiàn)這一算法包括推理模塊定義、事件設(shè)計(jì)、工作流步驟實(shí)現(xiàn)和任務(wù)執(zhí)行等關(guān)鍵環(huán)節(jié)。與傳統(tǒng)的固定推理方法相比SELF-DISCOVER具有更強(qiáng)的適應(yīng)性和靈活性能夠根據(jù)任務(wù)特點(diǎn)自動(dòng)調(diào)整推理策略。這種設(shè)計(jì)特別適合處理需要多步驟推理的復(fù)雜問(wèn)題如數(shù)學(xué)問(wèn)題解決、邏輯推理和決策分析等。該實(shí)現(xiàn)的核心價(jià)值在于其模塊化和自適應(yīng)特性開(kāi)發(fā)者可以通過(guò)擴(kuò)展推理模塊庫(kù)和優(yōu)化選擇策略進(jìn)一步提高系統(tǒng)在特定領(lǐng)域的表現(xiàn)。此外工作流的事件驅(qū)動(dòng)架構(gòu)使得整個(gè)過(guò)程清晰可控便于調(diào)試和優(yōu)化。SELF-DISCOVER代表了AI推理系統(tǒng)的一個(gè)重要發(fā)展方向即從固定規(guī)則向自適應(yīng)、模塊化推理的轉(zhuǎn)變有望在復(fù)雜問(wèn)題解決、教育輔導(dǎo)和決策支持等領(lǐng)域發(fā)揮重要作用。