我們之前搭建了許多不同型別的智慧體,其中最受歡迎的就是在智慧體中搭建各種工作流——這也是我最喜歡探索和玩的領域。那麼,究竟什麼是工作流?如何在後端實現一個工作流呢?今天我們就先簡單瞭解下。
什麼是工作流?
工作流是一種事件驅動、基於步驟的方法,用於控制和管理應用程式的執行流程。在這種方法中,應用程式被拆分為多個互相獨立但又相互關聯的部分,每個部分都被稱為“步驟”。這些步驟通常由特定的事件觸發,而每個步驟在執行時也可能會觸發其他事件,從而啟用更多後續的步驟。
透過精心設計和組合這些步驟與事件,你可以建立出複雜的流程,進而封裝業務邏輯。
簡單入門
首先,在開始之前,你需要確保你的電腦上已經安裝了Python環境。我這裡使用的是Python 3.10版本,但你可以根據自己的需要選擇任何其他版本,前提是它符合專案的需求。接下來,我們將從建立一個新的Python專案開始,帶你一步步入門。為了確保專案的依賴不與你電腦中其他Python專案的環境衝突,我們將使用虛擬環境。
今天的教程將聚焦於Python專案的基礎入門部分,我們會一步步進行講解。在後續的章節中,我們會深入探討更復雜的技術和方法,話不多說,我們正式開始吧!
專案建立
虛擬環境搭建
- 在你的專案目錄中開啟終端(命令提示符),然後使用以下命令建立虛擬環境: python -m venv venv
- 在 Windows 上,使用以下命令啟用虛擬環境: .\venv\Scripts\activate
- 儲存依賴庫列表: pip freeze > requirements.txt
- 退出虛擬環境: deactivate
VSCode配置
我使用的IDE是VSCode,當然你也可以根據個人喜好選擇其他開發工具。雖然我們已經啟動了Python虛擬環境,但需要注意的是,預設情況下,當你點選執行時,程式碼依舊是透過原始的Python路徑來執行,而非虛擬環境中的Python直譯器。因此,我們需要進行一些簡單的配置來確保程式碼在正確的環境下執行。
- 按下
Ctrl + Shift + P
(Windows/Linux) 或Cmd + Shift + P
(Mac) 開啟命令皮膚。 - 輸入並選擇
Python: Select Interpreter
。 - 在彈出的列表中,選擇你虛擬環境中的 Python 直譯器。
在彈出的視窗中,選擇我們的專案路徑中的venv目錄即可。然後每次再點選執行就OK了。
Hello World
首先,為了確保後續操作順利進行,需要提前安裝以下兩個依賴包。請使用以下命令進行安裝:
pip install llama-index-core
pip install llama-index-utils-workflow
然後,直接貼上以下程式碼,我們就可以順利執行這個簡單的程式。這個工作流的主要功能是列印“Hello, World!”訊息,是一個非常基礎的工作流示例:
from llama_index.core.workflow import (
StartEvent,
StopEvent,
Workflow,
step,
)
class MyWorkflow(Workflow):
@step
async def my_step(self, ev: StartEvent) -> StopEvent:
# do something here
return StopEvent(result="Hello, world!")
async def main():
w = MyWorkflow(timeout=10, verbose=False)
result = await w.run()
print(result)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
在這段程式碼中,整體邏輯其實相當簡單易懂。主要透過定義帶有 step
註解的方法,並透過執行這些方法來實現工作流的流程控制。不過,程式碼中有兩個關鍵的節點事件需要特別注意,它們分別是 StartEvent
和 StopEvent
。工作流的執行通常從 StartEvent
開始,並且必須以 StopEvent
結束,確保工作流的完整性和正確性。
需要特別注意的是,如果工作流在執行過程中存在其他事件或步驟沒有被正確觸發或執行,系統會丟擲錯誤。下面看下。
多個事件
我們依然可以進行簡單的測試,畢竟這是流資料處理的基本操作。在此,我們定義了兩個自定義事件,如下所示:
from llama_index.core.workflow import (
StartEvent,
StopEvent,
Workflow,
step,
Event,
)
class FirstEvent(Event):
first_output: str
class SecondEvent(Event):
second_output: str
然後我們在工作流中引用下:
class MyWorkflow(Workflow):
@step
async def step_one(self, ev: StartEvent) -> FirstEvent:
print(ev.first_input)
return FirstEvent(first_output="First step complete.")
@step
async def step_two(self, ev: FirstEvent) -> SecondEvent:
print(ev.first_output)
return SecondEvent(second_output="Second step complete.")
@step
async def step_three(self, ev: SecondEvent) -> StopEvent:
print(ev.second_output)
return StopEvent(result="Workflow complete.")
async def main():
w = MyWorkflow(timeout=10, verbose=False)
result = await w.run(first_input="Start the workflow.")
print(result)
這樣,我們就可以逐步執行各個事件。如果在執行過程中某一個步驟未能順利完成,例如我們直接修改了第二個事件並且導致返回結束,那麼第三個步驟將無法執行,這樣就會引發錯誤。
@step
async def step_two(self, ev: FirstEvent) -> StopEvent:
print(ev.first_output)
return StopEvent(result="Second step complete.")
@step
async def step_three(self, ev: SecondEvent) -> StopEvent:
print(ev.second_output)
return StopEvent(result="Workflow complete.")
在構建智慧體工作流的過程中,如果沒有進行連線操作,系統通常會自動檢測並提示錯誤。這種情況下,錯誤提示會提醒使用者必須完成連線,以確保工作流的正常執行和功能的完整性。報錯資訊如下:
視覺化分析
工作流視覺化功能在這裡顯得相對簡單,它主要用於檢視整個呼叫鏈路的結構和流程,而不像其他平臺那樣具備強大的互動操作性。我們一起看下:
from llama_index.utils.workflow import draw_all_possible_flows
#省略重複程式碼
if __name__ == "__main__":
import asyncio
asyncio.run(main())
draw_all_possible_flows(MyWorkflow, filename="multi_step_workflow.html")
執行完成後,將會生成一個可正常開啟的HTML檔案。下面請看下圖所示的內容:
整個工作流程非常清晰明瞭。在每一次執行當前事件時,首先會列印出所呼叫的方法名稱,接著會顯示正在處理的事件名稱,最後以“done”字樣結束該過程。
總結
透過今天的簡單介紹,我們初步瞭解了工作流的基本概念及實現方法。工作流作為一種事件驅動的執行機制,為我們提供了更靈活的方式來管理和控制應用程式的流程。我們透過建立和配置虛擬環境,逐步實現了基礎的工作流示例,體驗瞭如何使用Python構建多步驟的業務邏輯。
在後續的學習中,我們還將探索更復雜的工作流構建方法。希望透過這一系列的實踐,能夠激發大家在智慧體領域的創新思維,共同探討更高效的解決方案。
我是努力的小雨,一名 Java 服務端碼農,潛心研究著 AI 技術的奧秘。我熱愛技術交流與分享,對開源社群充滿熱情。同時也是一位騰訊雲創作之星、阿里雲專家博主、華為云云享專家、掘金優秀作者。
💡 我將不吝分享我在技術道路上的個人探索與經驗,希望能為你的學習與成長帶來一些啟發與幫助。
🌟 歡迎關注努力的小雨!🌟