手把手實戰:用 Mem0 整合 LangGraph 和 Dify,為你的 AI Agent 注入持久記憶 原創 精華
每次跟 ChatGPT 聊天,都得重新自我介紹一遍。明明昨天剛聊過我喜歡看科幻片,今天問它推薦電影,它又問"您喜歡什么類型的?"——這種體驗真讓人抓狂。Mem0 就是來解決這個問題的。
它到底是什么?
簡單說,Mem0 是個記憶層。想象一下,你的 AI 助手終于有了個筆記本,能記住你們之間的對話。更厲害的是,這個筆記本還能跨應用共享——你在 Claude 里說的話,Cursor 編輯器里的 AI 也能記得。
最近他們發了篇論文,數據挺唬人的:比 OpenAI 的記憶方案快 10 倍,準確率還高 26%。不過我更在意的是,它完全開源,數據存在本地。
核心概念
Mem0 支持多級記憶架構,包括:
- 用戶級記憶:跨會話持久化保存用戶偏好和歷史行為
- 會話級記憶:記錄當前交互的上下文信息
- 智能體級記憶:存儲 AI 系統自身的知識和學習成果
理論框架
記憶層架構
記憶層的核心工作流程包括:
- 信息提取:LLM 對對話內容進行深度分析,自動識別并提取出具有長期價值的關鍵信息點。
- 向量化:將提取出的信息通過嵌入模型轉化為向量表示,便于后續的高效檢索。
- 存儲:將向量化后的記憶單元存儲到向量數據庫中,支持大規模、低延遲的語義檢索。
- 檢索:根據當前用戶查詢,系統在向量空間中檢索出最相關的歷史記憶。
- 整合:將檢索到的記憶與當前對話上下文進行整合,輔助智能體生成更具針對性和連貫性的響應。
這種架構設計,使 Mem0 能夠在保證高效率的同時,提供精準且可擴展的記憶檢索服務。
Mem0 如何實現長期記憶
Mem0 的長期記憶系統基于以下核心機制:
- 采用向量嵌入技術,將語義信息高效存儲與檢索,確保記憶內容的可擴展性與相關性。
- 內置高效的檢索機制,能夠快速定位并返回與當前查詢最相關的歷史互動內容。
核心操作接口
Mem0 對外提供了兩大核心 API 接口,便于開發者與記憶層進行交互:
- add:用于提取對話內容并將其存儲為結構化記憶單元。
- search:根據用戶查詢,檢索并返回最相關的歷史記憶內容。
添加記憶流程
添加記憶的操作流程如下圖所示:

- 信息提取:LLM 從對話中自動提取出相關記憶,識別重要實體及其關系。
- 沖突解決:系統會將新提取的信息與現有記憶進行比對,自動識別并解決潛在的矛盾或重復內容,確保記憶的準確性。
- 記憶存儲:最終的記憶內容會被存儲到向量數據庫中,同時相關的實體關系會同步到圖數據庫中。每次用戶與智能體的互動,都會不斷豐富和完善記憶庫。
檢索記憶流程
記憶檢索的操作流程如下圖所示:

- 查詢處理:LLM 首先對用戶的查詢進行理解和優化,系統自動生成針對性的檢索過濾條件。
- 向量搜索:系統在向量數據庫中執行高效的語義搜索,根據與查詢的相關性對結果進行排序,并可按用戶、代理、元數據等多維度進行過濾。
- 結果處理:系統將檢索到的結果進行合并和排序,最終返回帶有相關性分數、元數據和時間戳的記憶內容,供智能體進一步使用。
Mem0 圖記憶
Mem0 現已支持圖形記憶(Graph Memory),通過引入圖數據庫,用戶可以創建和利用信息片段之間的復雜關系,實現更細致入微且具備情境感知的響應。這種集成讓用戶能夠同時發揮基于向量和基于圖結構的優勢,提升信息檢索的準確性和全面性。
示例用法
以下示例展示了如何使用 Mem0 的圖形操作:
- 首先,為名為 Alice 的用戶添加一些記憶。
- 隨著記憶的不斷添加,圖結構會自動演化,實體和關系被自動提取和連接。
- 用戶可以直觀地看到記憶網絡的變化。
添加記憶
(1)添加記憶"我喜歡去遠足"
Python 代碼: ??m.add("I like going to hikes", user_id="alice123")??

(2)添加記憶"我喜歡打羽毛球"
Python 代碼: ??m.add("I love to play badminton", user_id="alice123")??

(3)添加記憶"我討厭打羽毛球"
Python 代碼: ??m.add("I hate playing badminton", user_id="alice123")??

(4)添加記憶"我的朋友叫約翰,約翰有一只名叫湯米的狗"
Python 代碼: ??m.add("My friend name is john and john has a dog named tommy", user_id="alice123")??

(5)添加記憶"我的名字是愛麗絲"
Python 代碼: ??m.add("My name is Alice", user_id="alice123")??

(6)添加記憶"約翰喜歡徒步旅行,哈利也喜歡徒步旅行"
Python 代碼: ??m.add("John loves to hike and Harry loves to hike as well", user_id="alice123")??

(7)添加記憶"我的朋友彼得是蜘蛛俠"
Python 代碼: ??m.add("My friend peter is the spiderman", user_id="alice123")??

image.png
搜索記憶
(1)搜索名字
Python 代碼: ??m.search("What is my name?", user_id="alice123")??

(2)搜索:蜘蛛俠
Python 代碼: ??m.search("Who is spiderman?", user_id="alice123")??

備注:圖記憶的實現并非獨立,而是與向量存儲協同工作。每次添加或檢索記憶時,系統會同時操作向量數據庫和圖數據庫,實現信息的多維度管理。
OpenMemory MCP
OpenMemory MCP(模型上下文協議)是 Mem0 的核心協議層,旨在為 AI 交互提供本地化的"記憶背包"。MCP 作為統一的記憶基礎設施,支持多種 AI 應用(如 Claude Desktop、Cursor、Windsurf 等)通過標準化協議連接,實現跨工具的記憶共享。所有數據均在本地存儲,確保用戶對數據的絕對隱私和控制權。
MCP 提供了四個核心 API:
- ?
?add_memories??:存儲新的記憶對象 - ?
?search_memory??:基于相關性和上下文檢索記憶 - ?
?list_memories??:查看所有存儲的記憶 - ?
?delete_all_memories??:清除所有記憶
接口示例:
- ?
?add_memories??:存儲新的記憶對象
POST /add_memories
{
"memories": [
{
"role": "user",
"content": "我喜歡科幻電影,尤其是星際穿越。"
},
{
"role": "assistant",
"content": "星際穿越確實是一部經典的科幻電影!我會記住你喜歡這類電影。"
}
],
"user_id": "alice",
"metadata": {
"category": "movies"
}
}- ?
?search_memory??:基于相關性和上下文檢索記憶
POST /search_memory
{
"query": "我喜歡什么類型的電影?",
"user_id": "alice",
"limit": 5
}- ?
?list_memories??:查看所有存儲的記憶
POST /list_memories
{
"user_id": "alice"
}- ?
?delete_all_memories??:清除所有記憶
POST /delete_all_memories
{
"user_id": "alice"
}OpenMemory MCP 的最大優勢在于其完全本地化運行,既保障了用戶數據的隱私和安全,又通過標準化協議實現了跨應用的記憶共享和無縫集成。
原理描述
記憶提取與存儲
Mem0 利用 LLM 從對話中自動提取關鍵信息。該過程包括:
- 分析對話內容,識別重要信息點
- 將信息結構化為可檢索的記憶單元
- 為記憶分配相關性標簽和類別
- 將記憶存儲在向量數據庫中
以下是一個簡化的記憶提取流程示例:
def extract_and_store_memory(messages, user_id, metadata=None):
# 使用 LLM 提取關鍵信息
extracted_info = llm.extract_key_information(messages)
# 結構化為記憶單元
memory_unit = {
"content": extracted_info,
"source_messages": messages,
"user_id": user_id,
"timestamp": datetime.now(),
"metadata": metadata or {}
}
# 向量化記憶
vector = embedder.embed(extracted_info)
# 存儲在向量數據庫中
vector_store.add(vector, memory_unit)
return memory_unit記憶檢索機制
當需要檢索記憶時,Mem0 會:
- 將用戶查詢轉換為向量表示
- 在向量空間中搜索相似的記憶
- 根據相關性、時效性和重要性對結果排序
- 返回最相關的記憶供 AI 使用
以下是一個簡化的記憶檢索流程示例:
def retrieve_memories(query, user_id, limit=5):
# 向量化查詢
query_vector = embedder.embed(query)
# 在向量空間中搜索相似記憶
similar_memories = vector_store.search(
query_vector,
filter={"user_id": user_id},
limit=limit
)
# 根據相關性、時效性和重要性排序
ranked_memories = rank_memories(similar_memories)
return ranked_memories架構組件分析
Mem0 的架構包含以下關鍵組件:
- LLM 處理器:負責記憶提取和自然語言理解
- 向量存儲:用于高效的語義搜索
- 圖數據庫:用于追蹤記憶間的關系
- MCP 服務器:提供標準化 API 接口
- 客戶端 SDK:便于開發者集成 Mem0 功能
這些組件協同工作,為 AI 智能體提供完整的記憶管理解決方案。
實踐
環境搭建
(1)安裝 Mem0
Mem0 支持托管平臺和自托管開源兩種使用方式。
- 托管平臺:在 Mem0 平臺 注冊賬號,通過 SDK 或 API 密鑰集成記憶層。
- 自托管:適合對數據隱私和本地化有更高要求的開發者。
本文以自托管為例,結合 DeepSeek 和 Ollama,適配 OpenAI 訪問不暢的場景。主要依賴如下:
- LLM 提供商:默認支持 OpenAI gpt-4o-mini,也可選 DeepSeek、Claude 等。
- 向量嵌入模型:如 Ollama 的 mxbai-embed-large。
- 向量存儲:如 Qdrant。
(2) 安裝 mxbai-embed-large
如無法使用 OpenAI 嵌入模型,可用本地模型替代。以 Ollama 的 mxbai-embed-large 為例:
ollama pull mxbai-embed-large
# 驗證
curl http://localhost:11434/api/embeddings -d '{
"model": "mxbai-embed-large",
"prompt": "Represent this sentence for searching relevant passages: The sky is blue because of Rayleigh scattering"
}'如返回 embedding 信息,說明模型可用。
(3)安裝 Qdrant
數據庫安裝:
docker pull qdrant/qdrant
docker run -p 6333:6333 --name qdrant -d qdrant/qdrantUI 界面可用 ??qdrant-web-ui??:
git clone https://github.com/qdrant/qdrant-web-ui.git
cd qdrant-web-ui
npm install
npm start訪問 http://localhost:5173/ 查看向量數據庫狀態。

基本使用示例
以下為 Mem0 的完整使用流程,涵蓋初始化、添加記憶、檢索記憶等操作:
uv add dotenv langchain langgraph mem0ai ollama代碼示例:
import os
import json
from mem0 import Memory
from mem0.configs.base import MemoryConfig, LlmConfig, EmbedderConfig
# 設置 API 密鑰
os.environ["DEEPSEEK_API_KEY"] = "sk-……"# 替換為你的 DeepSeek API 密鑰
# 創建配置
config = {
"llm": {
"provider": "deepseek",
"model": "deepseek-chat",
"temperature": 0.2,
"max_tokens": 2000,
"top_p": 1.0
},
"embedder": {
"provider": "ollama",
"model": "mxbai-embed-large"
},
"vector_store": {
"provider": "qdrant",
"config": {
"collection_name": "mem0_new",
"embedding_model_dims": 768,
"host": "localhost",
"port": 6333,
}
},
"reset_vector_store": True
}
# 創建 Memory 實例
m = Memory.from_config(config)
# 添加對話記憶
messages = [
{"role": "user", "content": "我喜歡科幻電影,尤其是星際穿越。"},
{"role": "assistant", "content": "星際穿越確實是一部經典的科幻電影!我會記住你喜歡這類電影。"},
{"role": "user", "content": "我也喜歡克里斯托弗·諾蘭的其他電影。"},
{"role": "assistant", "content": "諾蘭的作品確實很出色!除了《星際穿越》,他還導演了《盜夢空間》、《信條》、《記憶碎片》等經典作品。您對這些電影有什么特別的看法嗎?"}
]
# 添加記憶,并附加元數據
m.add(messages, user_id="alice", metadata={"category": "movies"})
# 檢索記憶
memories = m.search(query="我喜歡什么類型的電影?", user_id="alice")
print(json.dumps(memories, indent=2, ensure_ascii=False))
# 獲取所有記憶
all_memories = m.get_all(user_id="alice")
print(json.dumps(all_memories, indent=2, ensure_ascii=False))運行 ??uv run main.py??,可見檢索結果如下:
{
"results": [
{
"id": "b052c579-23dd-4d89-933e-4c6ceb4e8958",
"memory": "喜歡克里斯托弗·諾蘭的其他電影",
"hash": "a46f8ee3dcfded0fd39d1b5006810adc",
"metadata": {
"category": "movies"
},
"score": 0.6853715,
"created_at": "2025-06-24T07:36:23.381311-07:00",
"updated_at": null,
"user_id": "alice"
},
{
"id": "2fae3fa7-0fa7-4164-b521-5c0d821d1c7a",
"memory": "喜歡科幻電影,尤其是星際穿越",
"hash": "55309121dad25e817ea0b3f132db1e6c",
"metadata": {
"category": "movies"
},
"score": 0.6162164,
"created_at": "2025-06-24T07:36:23.367111-07:00",
"updated_at": null,
"user_id": "alice"
}
]
}Mem0 與 LangGraph 集成
Mem0 可與 LangGraph 無縫集成,為智能體賦予持久記憶能力。集成步驟如下:
1.安裝依賴:
uv add dotenv langchain langgraph mem0ai ollama langchain-deepseek2.配置 LLM、嵌入器和向量存儲,與前述一致。
3.在 LangGraph 流程中,調用 Mem0 的 add/search 方法,實現記憶的自動存取。
代碼示例略(詳見原文)。
import os
from typing import TypedDict, Annotated
from langgraph.graph import StateGraph, START, END
from langgraph.prebuilt import ToolNode
from mem0 import Memory
from langchain_core.messages import HumanMessage, AIMessage
from langchain.chat_models import init_chat_model
# 設置 API 密鑰
api_key = os.getenv("DEEPSEEK_API_KEY", "sk-……") # 請替換為你的 DeepSeek API 密鑰
os.environ["DEEPSEEK_API_KEY"] = api_key
# 創建配置
config = {
"llm": {
"provider": "deepseek",
"model": "deepseek-chat",
"temperature": 0.2,
"max_tokens": 2000,
"top_p": 1.0
},
"embedder": {
"provider": "ollama",
"model": "mxbai-embed-large"
},
"vector_store": {
"provider": "qdrant",
"config": {
"collection_name": "mem0_new",
"embedding_model_dims": 768,
"host": "localhost",
"port": 6333,
}
},
"reset_vector_store": True
}
# 初始化 Mem0
m = Memory.from_config(config)
llm = init_chat_model(
"deepseek-chat", # 使用DeepSeek模型
api_key=api_key
)
# 定義狀態類型
class State(TypedDict):
messages: list
user_id: str
memories: list
# 定義記憶檢索函數
def retrieve_memories(state: State):
query = state["messages"][-1]["content"]
user_id = state.get("user_id", "alice")
memories = m.search(query=query, user_id=user_id)
return {"memories": memories["results"]}
# 定義 LLM 節點
def llm_node(state: State):
# 構建系統提示,包含記憶
memories_str = "\n".join(f"- {m['memory']}"for m in state["memories"])
system_prompt = f"你是一個有記憶能力的助手。以下是用戶的相關記憶:\n{memories_str}\n請基于這些記憶回答問題。"
# 準備消息
messages = [{"role": "system", "content": system_prompt}]
messages.extend(state["messages"])
# 調用 LLM
response = llm.invoke(messages)
# 更新消息列表,轉換為 dict
new_message = {"role": "assistant", "content": response.content}
return {"messages": state["messages"] + [new_message]}
# 定義記憶存儲函數
def store_memories(state: State):
user_id = state.get("user_id", "alice")
# 現在 state["messages"] 已全為 dict
m.add(state["messages"], user_id=user_id)
return {}
# 構建圖
graph_builder = StateGraph(State)
graph_builder.add_node("retrieve_memories", retrieve_memories)
graph_builder.add_node("llm", llm_node)
graph_builder.add_node("store_memories", store_memories)
# 添加邊
graph_builder.add_edge(START, "retrieve_memories")
graph_builder.add_edge("retrieve_memories", "llm")
graph_builder.add_edge("llm", "store_memories")
graph_builder.add_edge("store_memories", END)
# 編譯圖
graph = graph_builder.compile()
# 使用圖處理查詢
result = graph.invoke({
"messages": [{"role": "user", "content": "我最喜歡什么電影?"}],
"user_id": "alice",
"memories": []
})
print(result)運行代碼 ??uv run main.py?? 得到如下結果,可以看到 LLM 已經成功使用記憶層。
{
'messages': [{
'role': 'user',
'content': '我最喜歡什么電影?'
}, {
'role': 'assistant',
'content': '根據我們的記憶,您最喜歡的電影是《星際穿越》!這部由克里斯托弗·諾蘭執導的科幻杰作確實令人難忘,特別是其中關于時間、空間和人類情感的深刻探討。您還喜歡諾蘭的其他作品,比如《盜夢空間》和《黑暗騎士》三部曲等。需要聊聊最近重溫《星際穿越》的新發現嗎?'
}],
'user_id': 'alice',
'memories': [{
'id': '2fae3fa7-0fa7-4164-b521-5c0d821d1c7a',
'memory': '喜歡科幻電影,尤其是星際穿越',
'hash': '55309121dad25e817ea0b3f132db1e6c',
'metadata': {
'category': 'movies'
},
'score': 0.62142074,
'created_at': '2025-06-24T07:36:23.367111-07:00',
'updated_at': None,
'user_id': 'alice'
}, {
'id': 'b052c579-23dd-4d89-933e-4c6ceb4e8958',
'memory': '喜歡克里斯托弗·諾蘭的其他電影',
'hash': 'a46f8ee3dcfded0fd39d1b5006810adc',
'metadata': {
'category': 'movies'
},
'score': 0.61610943,
'created_at': '2025-06-24T07:36:23.381311-07:00',
'updated_at': None,
'user_id': 'alice'
}]
}使用 Mem0 與 Dify 集成
Mem0 為 Dify AI 提供了強大的記憶層,通過持續的對話存儲和檢索功能增強 AI 代理能力:
- 在 Dify 市場中尋找并安裝 Mem0 插件
- 配置 Mem0 API 密鑰
- 將 Mem0 插件集成到項目工作流中
- 在提示模板中添加記憶檢索指令
你是一個有記憶能力的助手。以下是用戶的相關記憶:
{{memories}}
請基于這些記憶回答問題。在 Dify 中調整 LLM 記憶配置,添加以下提示詞模板:
你是我的得力助手。
請將以下內容作為你的知識儲備,放在 <context></context> 標簽內。
<context>
{{#context#}}
</context>
根據用戶的問題,檢索已有記憶的結果是:
<memory>
{{#1747805606313.text#}}
</memory>
當回答用戶問題時:
若不知道答案,就直接說不知道。
若不確定,就向用戶澄清問題。
避免提及信息來源于上下文。
根據用戶提問的語言進行回答。配置 Dify 工作流集成 mem0 插件

image.png
注意:目前 Dify 的 mem0 插件僅支持托管平臺版本,不支持本地版本。
高級探索
高級功能
記憶分類與標簽
Mem0 支持對記憶進行多維度分類和標簽管理,提升檢索的精度和靈活性。例如:
# 添加帶標簽的記憶
m.add(messages, user_id="alice", metadata={
"category": "movies",
"tags": ["sci-fi", "preferences"],
"importance": "high"
})
# 按類別檢索
memories = m.search(
query="科幻電影",
user_id="alice",
filter={"category": "movies"}
)
# 按標簽檢索
memories = m.search(
query="科幻電影",
user_id="alice",
filter={"tags": "sci-fi"}
)
# 按重要性檢索
memories = m.search(
query="科幻電影",
user_id="alice",
filter={"importance": "high"}
)記憶導出與遷移
Mem0 支持記憶導出,采用 Pydantic schemas 格式,便于記憶的備份和遷移:
# 導出所有記憶
all_memories = m.get_all(user_id="alice")
import json
with open("alice_memories.json", "w") as f:
json.dump(all_memories, f, ensure_ascii=False, indent=2)高級 API 使用與最佳實踐
復雜檢索與標簽/分類操作
Mem0 支持基于多條件(標簽、類別、重要性等)的復雜記憶檢索,并可實現批量操作。
# 按標簽和類別檢索
memories = m.search(
query="深度學習",
user_id="alice",
filter={
"category": "ml",
"tags": ["neural-network", "research"]
},
limit=10
)
# 按重要性檢索
memories = m.search(
query="緊急事項",
user_id="alice",
filter={"importance": "high"}
)
# 批量導出所有記憶(適合備份/遷移)
all_memories = m.get_all(user_id="alice")
with open("alice_memories.json", "w") as f:
import json
json.dump(all_memories, f, ensure_ascii=False, indent=2)
# 批量導入記憶
with open("alice_memories.json", "r") as f:
memories_data = json.load(f)
for memory in memories_data:
m.add([memory["source_messages"]], user_id="alice", metadata=memory.get("metadata"))權限控制相關 API
Mem0 支持多租戶和權限控制,可為不同用戶、組織配置隔離的數據空間。
# 創建組織并分配用戶
org_id = m.create_organization(name="Acme Corp")
m.add_user_to_organization(user_id="alice", org_id=org_id, role="admin")
# 以組織維度設置隔離
memories = m.search(query="合規", user_id="alice", org_id=org_id)高級 API 示例(RESTful)
通過 OpenMemory MCP,所有操作均可通過 HTTP RESTful API 實現。
POST /search_memory
{
"query": "項目進度",
"user_id": "alice",
"org_id": "acme",
"filter": {"category": "project", "tags": "progress"},
"limit": 5
}插件機制與二次開發
插件開發
Mem0 支持在 MCP Server 層開發自定義插件。插件可用于前置/后置處理、自定義嵌入器和存儲適配器。
from mem0.plugins import register_preprocessor
def custom_preprocessor(memory_item):
# 增加自定義元數據
memory_item["metadata"]["custom_flag"] = True
return memory_item
register_preprocessor(custom_preprocessor)插件生命周期與隔離
插件應支持生命周期管理(初始化、熱更新、卸載),并建議按功能進行隔離開發,提升健壯性和可維護性。
一些坑和建議
用了一段時間,踩過幾個坑:
- 選對嵌入模型:如果不能用 OpenAI,推薦 Ollama 的 mxbai-embed-large,效果不錯,本地跑也快。
- 記憶要分類:別什么都往里塞,加好標簽和元數據,不然后面檢索會很亂。
- 定期清理:時間長了會積累很多過時信息,需要定期清理或設置過期機制。
- 隱私問題:雖然支持本地部署,但如果用云端 LLM,對話內容還是會發出去。敏感信息要謹慎。
總結
當然,它不是銀彈。記憶管理本身就很復雜——什么該記、記多久、怎么更新、如何遺忘,這些都是難題。但至少,Mem0 讓我們朝著"真正智能"的 AI 邁進了一步。
如果你也受夠了"健忘"的 AI,不妨試試 Mem0。開源免費,本地能跑,至少比每次都重新自我介紹要好太多了。
本文轉載自?????AI 博物院????? 作者:longyunfeigu

















