現在的 Agent 系統有個很明顯的問題 —— 會話一結束,什麼都忘了。
這不是個技術缺陷,但是卻限制了整個系統的能力邊界。Agent 可以做推理、規劃、執行復雜任務,但就是記不住之前發生過什麼。每次對話都像是第一次見面,這種狀態下很難説它真正"理解"了什麼。
記憶能力是把 LLM 從簡單的問答工具變成真正協作夥伴的關鍵。一個只能"回答當前問題",另一個能"基於歷史經驗做決策",這就是增加了記憶能力後的改進。
這篇文章會講怎麼給 Agent 加上記憶、反思和目標跟蹤能力。技術棧很簡單:
- SQLite 做結構化存儲
- 向量數據庫(Pinecone、FAISS、Chroma 都行)處理語義檢索
- LLM 層負責反思和總結
這套架構可以直接集成到現有框架裏,不管你用 LangChain、CrewAI 還是自己寫的框架。
記憶為什麼這麼重要
Agent 的自主性需要記憶支撐,先説跨會話連續性,一個數據質量監控 Agent 如果能記住哪些數據集經常出問題,就能提前預警而不是每次都從頭排查。
而且通過記憶還可以增加反思的能力,Agent 可以自己評估"這次任務完成得怎麼樣"、"推理過程有沒有問題",這種自我評估不需要複雜的獎勵函數,用自然語言就能實現強化學習的效果。
長期目標跟蹤也是一個很大的需求,數據整理、研究輔助這類工作往往跨越多次交互,需要 Agent 記住目標、追蹤進度、理解任務之間的依賴關係。
沒有記憶的 Agent 永遠困在當下,無法積累經驗也無法改進。
系統架構
整體設計分兩個記憶層面:情景記憶記錄發生的事情,語義記憶提煉學到的經驗。
這個架構的核心是讓 Agent 既能查詢"我之前做過什麼",也能理解"類似的情況該怎麼處理"。
數據庫設計
為了演示,我們使用SQLite ,因為它輕量、本地化、跨平台支持好。對於大多數場景夠用了,除非你的 Agent 需要處理海量併發。
數據庫如下:
CREATE TABLE IF NOT EXISTS memory_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
agent_name TEXT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
input TEXT,
output TEXT,
summary TEXT,
embedding BLOB
);
CREATE TABLE IF NOT EXISTS goals (
id INTEGER PRIMARY KEY AUTOINCREMENT,
agent_name TEXT,
goal TEXT,
status TEXT DEFAULT 'in_progress',
last_updated DATETIME DEFAULT CURRENT_TIMESTAMP
);
memory_events 表存交互歷史和摘要,goals 表追蹤目標狀態。每個任務執行完就自動記錄,這些數據後面會用來做反思分析。
記錄情景記憶
每次任務執行完,把關鍵信息存下來:
def log_memory_event(agent_name, input_text, output_text, summary, embedding):
conn = sqlite3.connect("memory.db")
cur = conn.cursor()
cur.execute("""
INSERT INTO memory_events (agent_name, input, output, summary, embedding)
VALUES (?, ?, ?, ?, ?)
""", (agent_name, input_text, output_text, summary, embedding))
conn.commit()
conn.close()
summary 可以讓 LLM 生成:
summary_prompt = f"Summarize this agent interaction:\n\nInput: {input_text}\nOutput: {output_text}\n"
summary = llm.complete(summary_prompt)
然後把摘要轉成向量存起來:
embedding = embedding_model.embed(summary)
這樣做的好處是,檢索時不依賴關鍵詞匹配,而是基於語義相似度。Agent 記住的不是原始文本,是事情的"意思"。
語義檢索實現
新查詢來的時候,先找出相關的歷史記憶:
def recall_related_memories(query, top_k=3):
query_embedding = embedding_model.embed(query)
results = pinecone_index.query(vector=query_embedding, top_k=top_k)
return [r['metadata']['summary'] for r in results]
檢索出來的摘要直接注入到 prompt 裏:
"以下是一些相關的歷史經驗,處理當前問題時可以參考……"
這個過程模擬了人類決策前回憶類似經歷的思維方式。向量檢索能找到語義上相關但表述完全不同的內容,比傳統的全文搜索要智能得多。
反思機制
有了記憶以後,還可以讓 Agent 學會從記憶中學習。反思循環把被動的存儲變成主動的能力提升。每隔幾次交互觸發一次:
reflection_prompt = f"""
You are reviewing your recent actions. Based on the following summaries, what patterns,
mistakes, or improvements do you notice?
{recent_summaries}
Provide 3 takeaways and 1 improvement plan for your future tasks.
"""
reflection = llm.complete(reflection_prompt)
可以把這個反思結果作為元記憶存起來,也可以生成 embedding 用於後續檢索。
更進一步還可以加自我批評機制。每個主要任務完成後,Agent 評估是否達成目標。沒達成就寫個修正筆記,下次遇到類似情況知道該怎麼改進。
這種方式實現了推理層面的強化學習,不需要梯度更新,純靠自然語言就能調整行為模式。
目標管理
Agent 需要目標感。可以動態定義、更新、評估目標:
def update_goal(agent_name, goal, status):
conn = sqlite3.connect("memory.db")
cur = conn.cursor()
cur.execute("""
UPDATE goals SET status = ?, last_updated = CURRENT_TIMESTAMP
WHERE agent_name = ? AND goal = ?
""", (status, agent_name, goal))
conn.commit()
conn.close()
可以專門跑一個目標跟蹤 Agent,定期檢查未完成的目標然後提醒相關 Agent:
"目標:提升數據時效性當前進度:70%建議行動:檢查上週的數據延遲情況"
這樣整個系統就有了持續性。Agent 不再是處理單次請求的工具,而是在追求長期目標的過程中持續運作。
完整流程
把這些組件串起來流程就是這樣的:
1、用户請求進來,Agent 執行任務,同時把交互記錄寫入 SQLite 和向量庫。
2、處理新請求之前,先做語義檢索調出相關記憶,把這些信息加到上下文裏。
3、每隔 N 次交互,Agent 總結最近的行為表現,寫反思筆記存檔。
4、目標獨立於單次會話存在,可以跨越多天甚至多周追蹤進度。
5、這樣構建出來的 Agent 更接近一個能學習、能記憶、能進化的系統。
一些實踐經驗
存摘要比存完整對話有效得多,既節省空間又便於檢索。
定期清理數據很重要。比如説設置個定時任務,合併相似的記憶或者刪掉不再有用的舊記錄。
語義壓縮是個好技巧 —— 把多個相關事件總結成一條元記憶,減少信息冗餘的同時保留關鍵模式。
提示詞設計也要引導元認知。給 Agent 一個明確角色比如"反思分析師",會讓自我評估的質量明顯提升。
如果想直觀看到效果,可以搭個 Streamlit 或 React 界面,實時展示記憶聚類、目標進度、反思內容這些信息。可視化對調試和優化很有幫助。
最後
加上記憶、反思、目標追蹤,Agent 就從一次性的工具變成了學習型夥伴。他們的區別在於一個只會執行任務,另一個能理解意圖的演變並主動適應。
Agent AI 這個方向發展下去,記憶系統會成為基礎設施。數字助手需要記住昨天發生的事,反思今天的表現,規劃明天的行動。
最簡單的記憶功能實現起來並不複雜,SQLite 加個向量庫,寫幾個精心設計的 prompt,就能讓 Agent 開始進化了。
https://avoid.overfit.cn/post/44c8d547475340d59aa4480f634ea67f
作者:Kyle knudson