Hippo 記憶:讓本機 AI Agent 真正記住你

📌 本文重點

  • 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. 建一個最小記憶介面

概念流程:

  1. 使用者說話
  2. Agent 回應(用 LLM)
  3. 用 LLM 檢查這輪對話有沒有值得記住的東西
  4. 需要記住的就丟給 Hippo
  5. 下一輪對話前,從 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 擁有長期記憶

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *