📌 本文重點
- Hippo 讓 AI Agent 具備結構化長期記憶
- 不只用向量搜索,而是多維度記憶召回
- 可直接接入 LangChain / LangGraph 現有架構
如果你受夠了每次開新對話 AI 就失憶,Hippo 是一個專門幫 AI Agent 建長期記憶結構 的開源工具,讓模型可以跨對話記住你、記住專案、記住世界觀。
專案連結:https://github.com/kitfunso/hippo-memory
核心功能:它跟「塞進向量資料庫」有什麼不一樣?
1. 生物啟發的記憶結構:不是只靠 embedding 搜索
一般「加記憶」做法:
- 把所有對話 / 文件轉成向量,丟進向量資料庫
- 查詢時用 embedding 相似度召回
這樣會遇到:
- 記憶越多越慢
- 容易抓到語意相似但情境不對的內容
- 很難做「時間感」與「重要程度」的區分
Hippo 的做法更像大腦海馬迴:
- 把記憶拆成多種型態(事件、事實、偏好、任務等)
- 每種記憶有自己的欄位:時間戳、重要性、來源、關聯 id
- 召回時不只看相似度,還會考慮:
- 時間距離(最近 / 很久以前但被多次提及)
- 重要性(例如「明天要開會」權重更高)
- 記憶種類(對話中問的是偏好,就優先找偏好類)
💡 關鍵: Hippo 透過「記憶類型 + 時間 + 重要性」多維度過濾與排序,比單靠 embedding 更接近人類大腦的記憶方式。
你可以採取的行動:
- 在設計 Agent 時,把「要記住什麼」先分類(例:使用者設定、長期專案狀態、一次性任務)
- 對應到 Hippo 的不同記憶類型,而不是全部塞進單一向量庫
2. 高效寫入 / 召回:不是每一句話都存
Hippo 會讓 LLM 幫忙「過濾」哪些內容要進長期記憶:
- 每輪對話結束時,呼叫一次 LLM:
- 請它輸出:要存什麼?是什麼類型?重要性幾分?
- 只有被標註為「值得記住」的內容才寫入記憶庫
召回時則是:
- 先根據 當前任務類型 過濾可疑記憶(例如問「專案」時,優先專案類)
- 再用 embedding + 時間 + 重要性加權排序
效果:
- 記憶庫不會無限膨脹
- 查詢時間穩定,對話變長也不會暴漲
💡 關鍵: 透過 LLM 篩選與加權排序,Hippo 在長期對話下仍能維持穩定的查詢速度與記憶品質。
你可以採取的行動:
- 在對話 loop 中加入一個
summarize_and_store_memory()步驟 - 規劃一份提示詞,教 LLM:什麼東西需要記住(例如使用者偏好、長期任務)
3. 可以直接當「記憶模組」接到 LangChain / LangGraph
Hippo 把核心封裝成一個獨立記憶層:
- 暴露簡單的 API:
add_memory(),retrieve_memories(),summarize_dialogue() - 你可以把它包成一個自訂的 LangChain
Memory類或 LangGraph node
這代表你不必改整個 Agent 架構,只要:
- 把原本「向量記憶」的那一層換成 Hippo
- Prompt 裡多餵一段:
{relevant_memories}
你可以採取的行動:
- 先用 Hippo 做一個獨立小腳本,確定記憶寫入 / 召回正常
- 再把它接進現有的 LangChain / LangGraph 專案
適合誰用?三種具體場景
1. 客服 / 助理型 Agent:跨對話記住使用者
問題:
- 今天跟你聊過喜好,明天又得重講一次
用 Hippo 可以:
- 把「使用者個人偏好」「公司規則」「歷史問題」分成不同記憶類型
- 在每次新對話開始前,先用使用者 id 去
retrieve_memories()
具體做法:
- 每個 user 綁一個
user_memory_store - 首輪對話後,寫入:
- 常用產品 / 方案
- 語氣偏好(喜歡簡短回答、或喜歡詳細教學)
- 下次對話開頭,在系統 prompt 裡加:
你已知這個使用者的偏好:...
2. 工具型 Agent:追蹤專案長期狀態
像是:
- 本機程式碼助手
- 專案管理 / 自動化腳本編排 Agent
用 Hippo 可以把:
- 已完成的任務
- 未完成的 TODO
- 決策理由(為什麼選 A 而不是 B)
長期存起來,讓 Agent 未來做決策時可以「回頭想」,而不是只看當前 prompt。
具體做法:
- 每次工具成功執行後,寫入:操作內容、輸入、輸出、錯誤紀錄
- 下次 Agent 在決定要不要呼叫同個工具時,先查過去的失敗 / 成功案例
💡 關鍵: 對工具型 Agent 來說,持續累積「決策與結果」記憶,可以大幅降低重複犯錯與無效操作。
3. 遊戲 / 模擬:角色人格與世界觀持久化
如果你在做:
- 文字冒險遊戲中的 NPC
- 模擬城市 / 社會裡的多 Agent 系統
Hippo 可以:
- 把 NPC 的「人生事件」「人際關係」「信念」拆成不同記憶
- 讓同一個角色在不同局遊戲中保有成長、偏好
具體做法:
- 每次玩家與 NPC 互動後,將關鍵事件寫入該 NPC 的記憶庫
- 下次載入遊戲時,先載入角色記憶,再生成回應
怎麼開始:本機跑一個有長期記憶的 Agent
下面示範:在本機用一個輕量開源 LLM + Hippo 跑出一個最小可用的長期記憶 Agent。
1. 安裝依賴(Python)
假設你有 Python 3.10+,先開一個虛擬環境:
python -m venv venv
source venv/bin/activate # Windows 用 venv\Scripts\activate
pip install hippo-memory
pip install transformers accelerate sentence-transformers
如果你想用 Ollama / 本機模型,也可以只要 HTTP API,把 llm_call() 改成呼叫本地端服務即可。
2. 建一個最小記憶介面
概念流程:
- 使用者說話
- Agent 回應(用 LLM)
- 用 LLM 檢查這輪對話有沒有值得記住的東西
- 需要記住的就丟給 Hippo
- 下一輪對話前,從 Hippo 取出相關記憶加進 prompt
簡化版範例(偽代碼結構):
from hippo_memory import HippoMemory
memory = HippoMemory()
def llm_call(prompt: str) -> str:
# TODO: 換成你實際使用的本機 LLM(Ollama / vLLM / transformers)
...
def summarize_for_memory(dialogue: str) -> list[dict]:
"""讓 LLM 決定要存哪些記憶,回傳 list[{"type":..., "content":..., "importance":...}]"""
prompt = f"""
你是記憶管理員。以下是剛剛的一段對話:
{dialogue}
請列出值得長期記住的事情(使用者偏好、長期目標、重要事件)。
用 JSON 陣列輸出,每個元素包含 type, content, importance(1-5)。
如果沒有,回傳 []。
"""
import json
res = llm_call(prompt)
return json.loads(res)
def add_dialogue_to_memory(history: list[tuple[str, str]]):
# history = [(user_msg, assistant_msg), ...]
text = "\n".join([f"User: {u}\nAssistant: {a}" for u, a in history[-3:]])
items = summarize_for_memory(text)
for item in items:
memory.add_memory(
mem_type=item["type"],
content=item["content"],
importance=item.get("importance", 3),
)
def chat_loop():
history = []
while True:
user = input("你:")
if user.strip().lower() in {"exit", "quit"}:
break
# 1) 先查記憶
relevant = memory.retrieve_memories(query=user, top_k=5)
memory_text = "\n".join([f"- {m.content}" for m in relevant])
# 2) 組 prompt
prompt = f"""你是一個會記住使用者的助理。
以下是你對這位使用者的已知記憶:
{memory_text or '(目前沒有特別記憶)'}
現在的對話:
使用者:{user}
請根據記憶與對話回應。
"""
assistant = llm_call(prompt)
print("Agent:", assistant)
history.append((user, assistant))
add_dialogue_to_memory(history)
if __name__ == "__main__":
chat_loop()
你可以採取的行動:
- 把上面程式框架複製到自己的專案
- 將
llm_call()替換成你現用的 LLM(如 Ollama 的/api/chat) - 用幾輪「自我介紹 → 問之前說過什麼」來測試記憶效果
3. 接到 LangChain / LangGraph 的 memory 模組
如果你已經在用這些框架,可以這樣思考:
- LangChain:
- 寫一個
HippoMemoryWrapper,實作load_memory_variables+save_context - 內部直接呼叫
HippoMemory.add_memory()/retrieve_memories() - LangGraph:
- 把 Hippo 抽成一個 node:「更新記憶」與「擷取記憶」
- 在主對話 graph 中,讓每輪都經過這兩個 node
這樣你不用推翻原有設計,只是把記憶 backend 換成更聰明的 Hippo。
小結:什麼時候值得上 Hippo?
你可以用一個簡單判斷:
- 只做「單次任務、一次對話就結束」的 Agent → 一般向量資料庫就夠
- 需要「跨天、跨專案、角色長期成長」的 Agent → 值得導入 Hippo 記憶
先從一個很小的場景開始:例如讓你的本機助理 記住你的個人偏好。當你發現它真的記得你說過的事,再把同樣的記憶結構,複製到客服、專案管理或遊戲 NPC 上。
專案原始碼與設計細節: https://github.com/kitfunso/hippo-memory
🚀 你現在可以做的事
- 打開專案頁面,閱讀 Hippo 的 README 與範例程式碼:https://github.com/kitfunso/hippo-memory
- 在本機建立一個小腳本,實作文中
llm_call()並跑起示範的記憶型 Agent- 將 Hippo 接入你現有的 LangChain / LangGraph 專案,先讓一個特定 user 或 NPC 擁有長期記憶

發佈留言