iT邦幫忙

2025 iThome 鐵人賽

DAY 15
0
自我挑戰組

從讀書筆記到可落地 AI:LangChain、LangSmith 與 Agent 工具 30 講系列 第 15

Day 15|Agent Design - Memory - 簡單、方便的Openai Agent SDK(1/5)

  • 分享至 

  • xImage
  •  

目標先講清楚:
Agents SDK 提供 Session Memory(修剪與壓縮),只要反覆呼叫 session.run("..."),就能自動處理上下文長度、歷史與連續性,快速打造可擴充的多輪 Agent。

為什麼 Memory 如此關鍵?

在Agent開發裡,memory 會直接影響:

  • 對話的連貫性(使用者先前的需求/限制條件能否被牢記)
  • 工具協作的正確性(ID、決策、參數是否被穩定傳遞)
  • 成本與延遲的可控性(token 長度、重試與回放的可預測性)

我們將從套件範例出發,快速認識目前主要解法與取捨。


先看 OpenAI SDK:能做什麼、不能做什麼?

OpenAI SDK(Responses) 的特色是直接、靈活,但它不會替你自動管理記憶

What you don’t get is automatic memory management.
需要你自行追加對話歷史、追蹤 response.output 或回應 ID。

這意味著:

  • 你得自己決定保留哪些歷史、何時裁切摘要
  • 你得自己防範token 爆掉成本飆升關鍵脈絡遺失

如果你的應用只需短對話或一次性任務,手動維護尚可;但一旦進入「多輪、長程、工具密集」的場景,就很容易變成泥沼。


Agents SDK 登場:Session = 記憶物件

Agents SDK 在 Responses 之上提供了會話級記憶(Session Memory)

  • Session 就是記憶體:你只要重複呼叫 session.run("...")

  • 自動歷史帶入:SDK 幫你處理上下文長度訊息歷史連續性

  • 內建策略:常見的兩條路線——
    (將memory的管理打包成兩個class, 可以簡單調用)

    • **修剪(Trimming)- TrimmingSession **:只保留最近 N 回合
    • **壓縮(Summarization/Compression)- SummarizingSession **:把更早的歷史寫成摘要,再帶著「摘要 + 最近 N 回合原文」繼續

結論:你不再需要手動拼接訊息或追 ID,大幅降低工程複雜度,讓你把心力放在任務邏輯上。


兩種策略:修剪 vs. 壓縮及調用方式介紹

1) 修剪(Trimming = 只留最近 N 回合)

像聊天視窗只保留最近幾頁。超過就丟最舊的整回合(使用者訊息 + 同回合的助理/工具互動)。

對話(每行是一個使用者或助理訊息;工具結果算在同回合):
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 後,更早但仍重要的脈絡可能被硬切。


2) 壓縮(Summarization = 把較早歷史變成摘要)

當歷史太長時,將「較舊的多輪內容」濃縮成結構化摘要插回對話裡,之後每輪都帶著摘要 + 最近 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的做法.


參考資源

  1. Context Engineering - Short-Term Memory Management with Sessions from OpenAI Agents SDKGoogle-Agentic Design Pattern-CH12

上一篇
Day 14|Agent Design - Tools - Error Handling(3/3)
下一篇
Day 16|Agent Design - Memory - 客製化的LangChain/LangGraph(2/5)
系列文
從讀書筆記到可落地 AI:LangChain、LangSmith 與 Agent 工具 30 講17
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言