編按:持續在慢慢研究OpenAI Agents SDK,其中最近 OpenAI 更新了「Session」機制,我覺得讓「管理 AI 記憶」這件事情變得超級方便!不必將繁冗的「{"system": "...", "user": "...", "assistant": "..."}
」 記憶手動匯入,真的很方便。
不過大型部署使用,對不熟資料庫的朋友來說就會相對吃力一點;不過自用的話,很推薦直接引入這個機制!
以下內容是從 OpenAI Agents SDK - Sessions 翻譯並摘錄整理。
什麼是 session?為什麼需要它?
在開發支援對話型 AI、工具代理人(Agent)或聊天機器人平台時,「上下文記憶」是關鍵。假如沒有 session,每一次用戶發問都像第一次,用戶和 Agent 的對話「完全沒有共同記憶」,很難實現多輪對話、任務追蹤、甚至連帶問題處理(像 LINE、Messenger 的客服一樣)。
OpenAI Agents SDK 裡的 session 機制,就是要幫你把「同一串對話」的所有歷史訊息(用戶、Agent、工具等回應)自動串成一條「對話線(session)」管理,讓 agent 可以做到「延續式多輪會話」——比如問一次再追問、以代名詞稱呼上一個階段的討論——應當都沒問題。
之前版本的 Agents SDK ,要自己管理每次對話的 .to_input_list() 或自己組 prompt,但現在 SDK 幫你簡單匯入這些記憶。
原理
每次 Agent 執行前,SDK 會自動把該 session id 的「所有歷史對話」先查出來,全部加在本次交互的 prompt 最前面。因此,你不需自己組 prompt、引入歷史紀錄,只要 session id 一致,之前說過的話、 AI 回答、工具操作都會幫你直接引入。Agent 執行結束後,這一輪新產生的內容(用戶輸入、AI 回覆、工具調用細節等)會自動寫進這個 session 的資料檔或資料庫當中。歷史紀錄會持續疊加。
三個 session 記憶方法
沒記憶
# Default behavior - no session memory
result = await Runner.run(agent, "Hello")
如果要新增記憶的話,只要在 Runner.run 內,新增一個參數「session
」就完成了!!
接著我們來看看加入這個 session 的三種方法搭配:
記憶方法1:OpenAI Conversations API 儲存
使用 OpenAI 官方 Conversations API,讓會話全部自動存在 OpenAI 的雲端(不需自建資料庫)。直接呼叫 OpenAIConversationsSession()
,可選擇指定 conversation_id。
- 優勢:不用架DB、雲端自動記憶、快速部署!適合初學者使用!
- 劣勢:資料不在自己家、進階客製有限
from agents import OpenAIConversationsSession
session = OpenAIConversationsSession()
# Optionally resume a previous conversation by passing a conversation ID
# session = OpenAIConversationsSession(conversation_id="conv_123")
result = await Runner.run(
agent,
"Hello",
session=session,
)
記憶方法2:SQLite memory - 快速單機部署
在 Local 端使用 SQLite(可以是記憶體或檔案型)儲存每個 session 的對話紀錄。
- 優勢:相較於儲存於 OpenAI,使用此方式完全控管資料;適合初學者使用!
- 劣勢:Local 端SQL 管理僅適合單機、測試使用,大用量較不建議。
from agents import SQLiteSession
# In-memory database (lost when process ends)
session = SQLiteSession("user_123")
# Persistent file-based database
session = SQLiteSession("user_123", "conversations.db")
# Use the session
result = await Runner.run(
agent,
"Hello",
session=session
)
此外,也可支援多個 session 存在同個 DB。
記憶方法3:透過 SQLAlchemySession 串接自建資料庫
進階用法,使用 SQLAlchemy 支援的多種資料庫(如 PostgreSQL、MySQL、SQLite 等)作為 session 記憶後端,常用於生產環境、多人系統、或已經有現成資料庫的架構。資源管理更靈活。
- 優勢:完全控管資料、彈性大、支援多人使用、可結合雲/地端 等
- 劣勢:SQLAlchemy需架DB,對初學者有門檻。
1. 快速部署:使用 in-memory SQLite(透過 from_url
參數)
import asyncio
from agents import Agent, Runner
from agents.extensions.memory.sqlalchemy_session import SQLAlchemySession
async def main():
agent = Agent("Assistant")
session = SQLAlchemySession.from_url(
"user-123",
url="sqlite+aiosqlite:///:memory:",
create_tables=True, # Auto-create tables for the demo
)
result = await Runner.run(agent, "Hello", session=session)
if __name__ == "__main__":
asyncio.run(main())
2. 產品化部署:結合既有 SQLAlchemy Engine
import asyncio
from agents import Agent, Runner
from agents.extensions.memory.sqlalchemy_session import SQLAlchemySession
from sqlalchemy.ext.asyncio import create_async_engine
async def main():
# In your application, you would use your existing engine
engine = create_async_engine("sqlite+aiosqlite:///conversations.db")
agent = Agent("Assistant")
session = SQLAlchemySession(
"user-456",
engine=engine,
create_tables=True, # Auto-create tables for the demo
)
result = await Runner.run(agent, "Hello", session=session)
print(result.final_output)
await engine.dispose()
if __name__ == "__main__":
asyncio.run(main())
自訂記憶體管理
除了用內建的 memory(如 Conversations API、SQLite、SQLAlchemy session)之外,也可以自己設計和實作一套 memory 機制。使用 Sessions 參數。
Session 管理
Session ID 命名
- 建議用有意義的命名方式管理不同的對話 session,例如:
- 以用戶為單位:"
user_12345
" - 以討論串為單位:"
thread_abc123
" - 以專案、客服工單等上下文命名:"
support_ticket_456
"
- 以用戶為單位:"
記憶體持久化策略
- 臨時對話可選用記憶體內 SQLite(
SQLiteSession("session_id")
),適合測試和短時應用。 - 長期保存建議用檔案型 SQLite(
SQLiteSession("session_id", "path/to/db.sqlite")
)或 SQLAlchemy(支援外部或雲端資料庫)。 - 也可選 OpenAI 雲端 API 或自訂任何 storage,例如 Redis、Django 等。
Session 操作方式
- 隨時可以呼叫
clear_session()
清除對話(像重設會話)。 - 支援「多 agent 共享一個 session」──只要 session ID 一致,所有 agent 都能讀寫相同歷史。
- 支援「多個 session」──不同 session ID 則各自維護歷史,互不干擾。
編按:覺得後兩項對於對話管理非常重要,尤其是 Agent 化的聊天機器人設計!
進階用法
- 可以自製 session 記憶的實作方式,打造完全客製化的記憶中介層,滿足架構、資安、彈性等各種需求。