藉助AI助手如何高效閱讀原始碼

努力的小雨發表於2024-12-03

以前一直在閱讀Spring的原始碼,深知要獨立閱讀並理解Spring的複雜程式碼是多麼困難。當時,如果沒有藉助網路搜尋的幫助,僅憑自己的時間和精力,根本無法完成對Spring原始碼的深入理解。今天,藉助AI助手可以更加高效地瞭解llamaindex中關於workflow的工作原理。我之前已經編寫過一個簡單的llamaindex示例Demo,對其結構和使用方法有了一定的瞭解,因此示例Demo理解起來並不困難。與Java相比,llamaindex框架的封裝非常精妙,幾乎可以實現一鍵啟動,免去了許多繁瑣的配置和操作。

接下來,我們將快速梳理一下llamaindex中關於workflow的工作流程原理,幫助大家更加清晰地理解這個框架的核心機制。

workflow

今天我們主要的目標是深入瞭解系統的實現原理,詳細探討各個元件的功能和作用,分析它們如何協同工作以實現整體目標。簡單看下引入的依賴。

from llama_index.core.workflow import (
    StartEvent,
    StopEvent,
    Workflow,
    step,
    Event,
)

首先,我們可以從一些簡單的例子入手進行分析。比如 StartEventStopEvent 這兩個類,它們都是直接繼承自 Event 類,並在此基礎上擴充套件了特定的功能。具體來說,這兩個類透過內建一些方法和引數來實現各自的功能,看下原始碼:

image

那我們順著Event開始看下。找一下Event都要做些什麼事情。

Event

這裡上來就有一部分解釋部分,也可以幫你快速瞭解其作用。如圖所示:

image

如果你嫌棄費時間,可以直接向AI助手諮詢,瞭解該關鍵類的具體引數、可用的方法,以及需要執行的相關操作。這樣可以更高效地獲取所需資訊。

image

看完後,總結一句話就是Event實際上可以看作是一個類似於Java中的Map的資料結構,它將該Map作為屬性值對外開放,並提供了多種方法供其他開發者呼叫,從而方便地獲取儲存在Event中的鍵值對(k-v)資料。

step註解

緊接著,我們會看到在方法上標註的step註解。如果你對Python中的註解功能不太瞭解,不妨直接向AI助手提問獲取相關資訊。以下是相關圖示:

image

沒有說的很清楚,我們可以直接根據提示進入到step裝飾類中檢視具體內容,以便AI助手進行準確的回答。我們可以選擇性地將相關的程式碼片段提供給AI助手,以幫助其更好地理解上下文並給出有效的支援。

image

總的來說,他就是將解析出來的配置引數又封裝到了StepConfig類中。我們接著下一步,看下Workflow。

Workflow

同樣的,我們直接進去問下AI助手,快速獲取一下方法、引數資訊等作用。如圖所示:

image

基本可以知道整個工作流的流程了,但是隻說了個大概,例如,在我們的示例演示中,我們直接呼叫了run方法來啟動工作流。在這個過程中,我們不妨讓AI助手提問一下關於run方法的具體資訊,這個資訊很關鍵,我這裡直接拿過來。

  1. 驗證工作流:首先,方法會呼叫 _validate 方法來驗證工作流是否配置正確。如果工作流使用了人工介入(Human-in-the-loop, HITL)並且 stepwise 被設定為 True,則會丟擲一個 WorkflowRuntimeError 異常,因為逐步執行模式不支援人工介入。
  2. 啟動工作流:然後,它會呼叫 _start 方法來設定工作流的執行環境,包括建立佇列和任務,並啟動每個步驟作為非同步任務。
  3. 建立結果處理器:接下來,它會建立一個 WorkflowHandler 例項來處理工作流執行的結果。
  4. 執行工作流:在一個非同步任務中,它會傳送一個起始事件到上下文,並等待所有任務完成。它使用 asyncio.wait 函式來等待任務完成,並設定了超時時間。如果發生異常,它會取消所有未完成的任務,並根據異常型別進行相應的處理。
  5. 處理結果:如果工作流成功完成,它會將結果設定到 WorkflowHandler 中。如果發生異常,它會將異常設定到 WorkflowHandler 中。
  6. 返回結果處理器:最後,它會返回 WorkflowHandler 例項,該例項可以用來獲取工作流的執行結果或異常資訊。

基本上了解後,我們直接看下它是如何啟動工作流的。裡面都做了什麼操作。

image

Context

看到這裡已經開始蒙圈了,東西太多了,不著急,慢慢一個一個去了解,先去看下前提說的上下文。

image

為什麼上下文需要有全域性和私有這個問題 ,按照我以往搭建智慧體工作流時候,可以理解為,工作流巢狀時使用,因為巢狀的工作流內的變數外部工作流是無法直接使用的,只能使用結束節點的輸出引數。

剩下的基本沒有什麼難理解的。基本都是在操作變數k-v值。

佇列和事件

下一步他說的是設定了佇列和事件標識,沒有看懂,我去看了下原始碼,其實就是在遍歷我們當時使用step裝飾的方法並提取出來方法名和方法,不懂就問即可。如圖所示:

image

然後就是初始化到了剛才說的上下文中。

任務

這部分程式碼很多,主要集中在任務處理裡,我們先不看,直接看下其大體流程先,如圖所示:

image

其主體就是先宣告一個帶有入參的非同步任務,至於咋處理一會兒再說,然後根據我們step裝飾器上的引數去同時決定跑幾個非同步任務。最後增加了一個取消工作流任務,之後完全沒有做任何東西,全都是在往上下文中填加所需要的資訊。

接下來,我們再去看看建立的處理任務在做什麼。同樣的直接詢問AI助手。

image

接下來就要結合AI助手給的提示然後結合程式碼看下這個任務具體是如何執行的了,看完之後,可以理解為它相當於每個方法都是有4個執行緒去獲取佇列中的事件,封裝引數後呼叫方法並獲取返回的事件。獲取後再透過send_event方法發出去。

send_event方法有一個引數是指定步驟去解析完成,如果沒有指定,就相當於廣播出去,誰能處理就處理,處理不了就丟棄就行。

image

接著回到主幹道上來。

image

他主要目的就是釋出一個StartEvent事件交給任務處理,等待結果直到超時。

總結

總的來說,深入理解LlamaIndex中關於workflow的工作原理讓我們更清楚地看到了這個框架的高效和靈活性。透過對EventStepWorkflow等核心類的分析,我們可以發現,LlamaIndex的設計思想與傳統框架相比,確實更加簡潔和模組化,尤其是在任務的處理和事件的傳播方面,它將複雜的操作抽象化,使得開發者能夠專注於業務邏輯的實現,而無需過多關注底層細節。

透過結合AI助手的支援,我們能夠更高效地獲取關鍵資訊,快速理解和除錯程式碼,提升了開發效率。希望本次分析能幫助大家更清晰地掌握LlamaIndex的工作原理,為今後的開發實踐打下堅實的基礎。


我是努力的小雨,一名 Java 服務端碼農,潛心研究著 AI 技術的奧秘。我熱愛技術交流與分享,對開源社群充滿熱情。同時也是一位騰訊雲創作之星、阿里雲專家博主、華為云云享專家、掘金優秀作者。

💡 我將不吝分享我在技術道路上的個人探索與經驗,希望能為你的學習與成長帶來一些啟發與幫助。

🌟 歡迎關注努力的小雨!🌟

相關文章