Chapter 1: 流程編排 (Flow Orchestration) (value in Traditional chinese)

歡迎來到 PocketFlow-Tutorial-Codebase-Knowledge 教學!在本系列教學中,我們將一步步探索如何自動化地從程式碼庫生成教學文件。想像一下,您拿到一個全新的專案,裡面有成千上萬行程式碼,要從何開始理解呢?如果有一個工具能自動為您整理出核心概念、它們如何協同工作,並生成一份友善的教學文件,那該有多好!這正是我們這個專案要實現的目標。

那麼,這麼複雜的自動化任務,包含許多不同的步驟,例如:抓取程式碼、分析程式碼、產生文字說明、組合文件等等,我們要如何確保這些步驟能按照正確的順序、有條不紊地執行呢?這就是「流程編排」派上用場的地方!

什麼是流程編排?電影導演來執導!

「流程編排」(Flow Orchestration) 就如同整個教學生成專案的總指揮。您可以想像它是一位電影導演,負責安排哪個場景(我們稱之為節點 (Node))先拍,哪個後拍,並確保整個故事(也就是我們的教學文件)能夠流暢地串聯起來。

簡單來說,流程編排定義了從最初的輸入(例如程式碼庫的網址)到最終輸出(一份完整的教學文件)之間的每一個步驟和它們執行的順序。

打個比方:

在我們的專案中,流程編排確保了「抓取程式碼」一定在「分析程式碼」之前完成,「撰寫章節」又一定在「決定章節順序」之後進行。沒有良好的流程編排,整個自動化過程就會像一盤散沙,無法有效地達成目標。

我們的專案如何進行流程編排?

在我們的 PocketFlow-Tutorial-Codebase-Knowledge 專案中,我們將整個「從程式碼生成教學」的任務拆解成一系列定義明確的步驟。每一個步驟都是一個獨立的工作單元,我們稱之為 節點 (Node)

以下是我們專案的主要流程,也就是這些節點 (Node)是如何被編排的:

flowchart TD A[抓取程式碼 FetchRepo] --> B[識別核心概念 IdentifyAbstractions]; B --> C[分析關聯性 AnalyzeRelationships]; C --> D[決定章節順序 OrderChapters]; D --> E[批次撰寫章節 Batch WriteChapters]; E --> F[組合教學文件 CombineTutorial];

這個圖表清楚地展示了我們的「電影劇本」:

  1. 抓取程式碼 (FetchRepo):首先,我們需要取得專案的原始程式碼。
  2. 識別核心概念 (IdentifyAbstractions):接著,分析這些程式碼,找出其中最重要的核心概念。
  3. 分析關聯性 (AnalyzeRelationships):然後,探討這些核心概念之間是如何互動和關聯的。
  4. 決定章節順序 (OrderChapters):根據它們的重要性與關聯性,決定教學章節的呈現順序。
  5. 批次撰寫章節 (Batch WriteChapters):為每一個核心概念撰寫詳細的教學章節。
  6. 組合教學文件 (CombineTutorial):最後,將所有產出的內容(包括摘要、流程圖、各個章節)組合成一份完整的教學文件。

這個順序至關重要。例如,我們不可能在還沒抓取到程式碼之前就去分析它,也不可能在還沒決定章節順序之前就開始撰寫章節。流程編排確保了所有事情都按部就班。

用程式碼定義流程:flow.py 檔案

我們專案中的流程編排主要是透過一個名為 flow.py 的 Python 檔案來定義的。這個檔案告訴我們的系統(使用一個叫做 PocketFlow 的工具)有哪些節點 (Node),以及它們應該如何被串接起來。

讓我們看看 flow.py 的簡化版核心內容:

首先,我們需要匯入 Flow 這個工具以及我們定義好的各個節點 (Node)類別:

# 檔案: flow.py
from pocketflow import Flow
# 從 nodes.py 匯入所有節點類別
from nodes import (
    FetchRepo,
    IdentifyAbstractions,
    AnalyzeRelationships,
    OrderChapters,
    WriteChapters,
    CombineTutorial
)

這段程式碼告訴 Python:「嘿,我們要用到 PocketFlowFlow 功能,還有我們自己定義的 FetchRepoIdentifyAbstractions 等這些不同的工作步驟(節點 (Node))。」

接著,在一個名為 create_tutorial_flow 的函數中,我們為每一個步驟(節點 (Node))建立一個「實例」。可以把它想像成是為電影中的每個場景指派一位演員或一個工作團隊:

# 檔案: flow.py (續)
def create_tutorial_flow():
    """建立並回傳程式碼庫教學生成流程。"""

    # 實例化節點 (為每個步驟做好準備)
    fetch_repo = FetchRepo()
    identify_abstractions = IdentifyAbstractions()
    analyze_relationships = AnalyzeRelationships()
    order_chapters = OrderChapters()
    write_chapters = WriteChapters() # 這是一個批次處理節點
    combine_tutorial = CombineTutorial()
    # ... (準備工作完成)

每一行如 fetch_repo = FetchRepo() 就是在說:「好,我們有一個『抓取程式碼』的任務準備就緒了。」

然後,最關鍵的一步來了:我們定義這些節點 (Node)的執行順序,使用 >> 符號,它代表「然後執行」:

# 檔案: flow.py (續)
    # ... (節點實例化)

    # 根據設計順序連接節點 (安排電影拍攝順序)
    fetch_repo >> identify_abstractions
    identify_abstractions >> analyze_relationships
    analyze_relationships >> order_chapters
    order_chapters >> write_chapters
    write_chapters >> combine_tutorial
    # ... (順序安排完成)

這就像導演在排程:「先拍 fetch_repo 這個場景,拍完之後,接著拍 identify_abstractions 這個場景,以此類推。」

最後,我們將所有這些安排打包成一個完整的「流程」(Flow),並告訴 PocketFlow 我們的整個故事從哪個節點 (Node)開始:

# 檔案: flow.py (續)
    # ... (節點連接)

    # 建立以 FetchRepo 為起始的流程 (宣告電影開拍!)
    tutorial_flow = Flow(start=fetch_repo)

    return tutorial_flow

Flow(start=fetch_repo) 這行程式碼就明確指示了整個自動化教學生成任務的起點是 fetch_repo(抓取程式碼)。

流程如何運作:幕後一瞥

當我們啟動這個教學生成專案時,PocketFlow 框架就像一位勤奮的副導演,拿著 flow.py 這份「劇本」開始工作:

  1. 開拍!:副導演看到劇本說從 fetch_repo 開始,於是它就去執行 FetchRepo 這個節點 (Node) 的任務。
  2. 任務執行與交接FetchRepo 節點完成它的工作(例如,把程式碼下載下來)。它可能會將結果(下載好的程式碼)放到一個大家都能存取的地方(我們將在 共享狀態 (Shared State) 章節詳細介紹這個機制)。
  3. 下一場戲!:副導演接著看劇本,發現 fetch_repo 完成後應該輪到 identify_abstractions。於是,它通知 IdentifyAbstractions 節點 (Node) 開始工作,這個節點可能會用到上一步驟產生的程式碼。
  4. 依序推進:這個過程會一直持續下去,一個節點 (Node) 完成後,流程編排會指示下一個節點 (Node) 接手,直到最後的 combine_tutorial 節點 (Node) 完成任務,產出完整的教學文件。

讓我們用一個簡單的時序圖來想像這個過程:

sequenceDiagram participant 使用者 participant PocketFlow框架 as PocketFlow 框架 participant 流程編排 as Flow Orchestration (flow.py) participant 節點A as FetchRepo 節點 participant 節點B as IdentifyAbstractions 節點 使用者->>PocketFlow框架: 請開始生成教學文件! PocketFlow框架->>流程編排: 好的,請告訴我流程如何定義。 流程編排-->>PocketFlow框架: 我們的起始節點是 FetchRepo。 PocketFlow框架->>節點A: FetchRepo 節點,輪到你了,請執行! 節點A-->>PocketFlow框架: 任務完成!這是結果。 PocketFlow框架->>流程編排: FetchRepo 已完成。接下來是哪個節點? 流程編排-->>PocketFlow框架: 下一個是 IdentifyAbstractions。 PocketFlow框架->>節點B: IdentifyAbstractions 節點,請開始執行 (你可能需要用到 FetchRepo 的結果)。 節點B-->>PocketFlow框架: 任務完成! Note right of PocketFlow框架: ...流程依照編排繼續執行其餘節點...

這個流程編排的設計,參考了我們在專案設計文件 (docs/design.md) 中規劃的「Flow Design」。該文件裡的「Flow high-level Design」部分,就列出了這些主要步驟,而 flow.py 則是這個設計藍圖的具體程式碼實現。

總結

在本章中,我們認識了「流程編排 (Flow Orchestration)」這個核心概念。它就像是我們自動化教學生成專案的總指揮或電影導演,負責:

理解了流程編排,就等於掌握了整個專案運作的骨架。它為我們後續深入了解每個具體工作步驟打下了堅實的基礎。

接下來,我們將更仔細地研究構成這個流程的基石——也就是那些獨立的「工作單元」。準備好了嗎?讓我們一起探索 第 2 章:節點 (Node)