第22天:Prompt Engineering 中的 Agentic Workflow (代理工作流)與 Function Calling (函數調用)
之前已經學過 LLM 作為代理人(as an Agent)的概念,今天就要來進一步理解,當 LLM as an Agent 時的細部流程,也就是,在 LLM 內,這會是怎麼樣的進行的。意即:代理工作流程 (Agentic Workflow)。而在整個流程中,還有一個重要的概念需要引進,就是函數調用 (Function Calling)。這之所以重要是因為,函數調用是完成整個流程不可或缺的一塊拼圖。
而代理工作流與函數調用之所以得以運作,仍需要仰賴 Prompt Engineering。以下也將說明 Prompt Engineering 在其中所發揮的功用。
1. 關於代理工作流 (Agentic Workflow)
當 LLM 作為一個代理人時,便具備自主執行多步驟任務的能力,成為一個協調者 (Orchestrator) 或決策者 (Decision-maker)。意即,LLM 不再只是「生成內容」,而是能夠依序地感知、思考、規劃、行動,從而完成用戶指令。
依此而形成的代理工作流便是:
A.理解用戶指令→
B.規劃步驟、完成指令→
C.選定完成指令之工具(調用外部工具或函數/if needed)→
D.執行操作並獲取結果→
E.整合資訊(根據返回結果,或重新思考、生成新的 Prompt,或向用戶提供最終答案)
從A到E的流程,LLM 會先在B與C環節上做出處置,而來到C與D的實現,函數調用則佔了重要作用。這些將在接下來一一說明。
2. 函數調用 (Function Calling) 的重要性
如上所述,函數調用對於協助完成指令相當關鍵。函數調用是一種讓 LLM 能夠安全地調用外部函數或 API 的能力。透過函數調用,LLM 得以應用外部函數或 API 實現指令所需的內容。有了這些內容,才可能進一步完成整個生成內容,達成任務。所以函數調用很重要。
*如何實現函數調用:
(1) 所有可調用的函數與 API 的工具清單
有了這個清單,LLM 才能知道有什麼選項可協助完成指令。
(2) LLM 正確地執行以下動作:
a. 分析拆解指令:將指令拆解成細項的子任務
b. 媒合指派任務:確認每個子任務如何完成、辨認出哪些子任務需應用外部函數&API,進行指派
c. 驅動執行任務:將用戶指令中的自然語言轉為可驅動函數執行任務的參數數據**
(**註:執行任務的參數數據,將以JSON格式交付外部函數,以驅動函數執行任務。這整個就是一個JSON 物件,包含了要調用的函數名稱和所需的參數。)
d. 生成內容回傳:當執行外部函數結束,執行結果傳回給 LLM,至此便完成函數調用的動作**
(**註:這是假設 LLM 檢視內容後判斷已足夠回覆用戶的理想狀況下;若 LLM 判斷內容仍需調整或不足,則再次返回函數調用過程。)
3. Prompt Engineering 所扮演的角色
當 LLM 作為一個代理人,所具備的能力更加多元,包含思考/推論/規劃/執行,而 Prompt Engineering 的功用,也將從「幫助給出最佳回答」更進一步深入為「協助 LLM 進行思考/推論/規劃/執行,然後給出最佳回答」。
具體而言,Prompt Engineering 要做到的包含:
(1)定義代理人(Agent):
透過最主要的 Prompt (大傘)清晰定義代理人的角色扮演、能力、達成目標。
(2)定義可用的工具清單:
以明確精準的自然語言描述所有可調用的函數,包含:工具名(tool_name)、功能描述(description)、 必要變數(parameters)。**
(**註:是的,函數調用的工具清單是由 Prompt Engineering 定義並提供。這個工作清單的制定極為重要,唯有描述越清晰,LLM 才越能準確地判斷何時用,以及,用哪一個函數 。 )
(3)引導決策與邏輯:
每一次收到指令,Prompt 需要引導 LLM 做出正確決策:
→應該直接回答?
→還是需要調用工具?
→抑或應該告知用戶無法執行操作?
→如果工具調用失敗,應該如何應對?
(4)提醒輸出格式:
由於函數調用時,LLM須將指令轉為 JSON 物件,所以需要提醒 LLM在獲得所有生成內容後,須將最終答案以用戶所指定的輸出格式、或自然語言提供給用戶。
-
最後,附上一張實際運行流程簡圖供參考

整體工作流程 (簡圖)
























