Lab 8 學習導引與技術解析#
本 Lab 解決了大型 LLM 應用在長週期、跨進程、或大 Token 消耗任務中,中途因故障中斷、Token 限制而遺忘上下文記憶的痛點。
💡 核心學習重點#
1. 認知連續性 (Cognitive Continuity) 與斷點續傳#
- 概念:Agent 可以在某個時間點(或進程 A)完成前半段任務並退出;在另一個時間點由一個全新的 Agent 實例(或進程 B)載入狀態,完全繼承之前的想法、思考軌跡與已取得的發現,直接接力完成下半段任務。
- 實作技術:
在
LocalAgentConfig中使用save_dir(持久化快照目錄)與conversation_id(指定的對話 ID)。- 第一階段:不指定 ID,讓系統自動產生全新的對話,將安全掃描發現記錄到 Thoughts 中。結束時,快照檔案自動持久化。
- 第二階段:建立全新的 Agent,帶入第一階段返回的
conversation_id,它會自動從快照目錄載入記憶,並根據之前的掃描漏洞直接生成安全發佈日誌。
2. 狀態持久化儲存引擎底層原理#
- 概念:快照目錄下產生的
[conversation_id].db檔案,其本體是 SQLite 資料庫。 - 底層表結構與職責:
steps:最核心的表。以二進位 Blob 格式儲存了 Agent 經歷的每一個步驟(包含 thoughts 串流與 tool calls 歷史)。gen_metadata:儲存 LLM 每次生成的元數據(如 token 使用量、時間戳)。executor_metadata:儲存執行時的環境與工作區狀態。parent_references:儲存父子對話關聯,供 Subagents 心智轉移使用。
🛠️ 工程踩坑與解決方案 (conversation_id 取得時機)#
- 問題:如果在
async with Agent啟動後立即印出agent.conversation_id,會得到None。 - 解決方案:
根據 SDK 規範,對話 ID 是由雲端 API 或底層 runtime 在對話真正連線且完成至少一次訊息交換 (
agent.chat) 後,才會被賦值給 SDK。因此,請務必在response = await agent.chat(...)執行完畢之後再去獲取對話 ID:response = await agent.chat(prompt) # 消耗 streaming tokens async for token in response: pass # 此時 conversation_id 已被正確初始化 conv_id = agent.conversation_id