目標先講清楚:
Agents SDK 提供 Session Memory(修剪與壓縮),只要反覆呼叫 session.run("..."),就能自動處理上下文長度、歷史與連續性,快速打造可擴充的多輪 Agent。
在Agent開發裡,memory 會直接影響:
我們將從套件範例出發,快速認識目前主要解法與取捨。
OpenAI SDK(Responses) 的特色是直接、靈活,但它不會替你自動管理記憶。
What you don’t get is automatic memory management.
需要你自行追加對話歷史、追蹤response.output
或回應 ID。
這意味著:
如果你的應用只需短對話或一次性任務,手動維護尚可;但一旦進入「多輪、長程、工具密集」的場景,就很容易變成泥沼。
Agents SDK 在 Responses 之上提供了會話級記憶(Session Memory):
Session 就是記憶體:你只要重複呼叫 session.run("...")
。
自動歷史帶入:SDK 幫你處理上下文長度、訊息歷史與連續性。
內建策略:常見的兩條路線——
(將memory的管理打包成兩個class, 可以簡單調用)
結論:你不再需要手動拼接訊息或追 ID,大幅降低工程複雜度,讓你把心力放在任務邏輯上。
像聊天視窗只保留最近幾頁。超過就丟最舊的整回合(使用者訊息 + 同回合的助理/工具互動)。
對話(每行是一個使用者或助理訊息;工具結果算在同回合):
U: 我是 A 公司,要幫 40 人去東京。
A: 收到。
U: 想 11/20 出發,3 天 2 夜。
A: OK。
U: 請先給大概行程草案。
A: 好的,這是草案…
若 max_turns = 2,那接下來第 7 回合時,留下的「上下文」只會是回合 5–6(最近一回合)和 7 之前的那一回合(3–4)。最早的 1–2 被丟掉,助理可能忘了「40 人」與「A 公司」這些更早資訊。
session = TrimmingSession(session_id="corp-trip", max_turns=3)
await session.run("我們 A 公司,40 人要去東京")
await session.run("11/20 出發,3 天 2 夜")
await session.run("請先給草案")
# 第 4 回合起,最早那回合會被丟掉
await session.run("幫我粗估機酒")
TrimmingSession的缺點是:超過 N 後,更早但仍重要的脈絡可能被硬切。
當歷史太長時,將「較舊的多輪內容」濃縮成結構化摘要插回對話裡,之後每輪都帶著摘要 + 最近 N 回合原文繼續。
其實SummarizingSession本身就包含「保留最近 N 回合 + 將更早內容摘要」的流程。
(對話範例同修剪)
對話到了第 7 回合前,你啟動「摘要刷新」:
(系統內部)把回合 1–4 壓成摘要:
摘要:使用者是 A 公司,團體 40 人;目的地東京;出發日 11/20;天數 3 天 2 夜;已請求行程草案。
接下來模型看到的上下文就會是:
這份摘要(濃縮早期事實),以及
最近的原文回合(例如 5–6)。
如此,即使把 1–4 原文砍掉,助理仍能正確記住「40 人、11/20、3 天 2 夜」。
session = SummarizingSession(session_id="corp-trip", max_turns=3,
summarizer=LLMSummarizer(model="gpt-4o"))
await session.run("我們 A 公司,40 人要去東京")
await session.run("11/20 出發,3 天 2 夜")
await session.run("請先給草案")
# 觸發壓縮:把更早歷史壓成摘要插回去
await session.run("幫我粗估機酒")
SummarizingSession的缺點是:要多一次模型呼叫來寫摘要,有成本/延遲;若摘要寫錯,可能把錯誤帶到後面。
Agent SDK提供簡潔的方式協助開發者進行memory管理;但如果是複雜的使用情境,比較推薦LangChain/LangGraph的做法.