您可以将MongoDB与 Mem0 集成,Mem 是一个面向AI代理和助手的开源内存层,可随时间推移从对话中提取、存储和检索事实。当您将0 Mem0 配置为使用MongoDB作为其向量存储时,Mem 会将代理内存保留在MongoDB集合中。它使用MongoDB Vector Search 进行语义检索,并使用MongoDB Search 进行全文关键字检索。
开始体验
要完成配置 Mem0 以使用MongoDB 的教程,请参阅开始使用MongoDB Mem0 集成。
安装
Mem0 需要Python v3.10 或更高版本以及PyMongo v4.13.2 或更高版本。要安装最新的 Mem0 和PyMongo版本,运行以下命令:
pip install mem0ai pymongo
使用
要将MongoDB用作 Mem0 向量存储,请将配置字典传递给 Memory.from_config(),将 vector_store 字典的 provider 键设置为 mongodb。
选择 Basic initialization标签页以查看基本的MongoDB和 Mem0 配置示例,或选择 Custom configuration标签页以查看如何使用自定义设置来配置集成。
要初始化向量存储,请指定MongoDB连接字符串、数据库名称、集合名称以及嵌入模型生成的维数。以下示例在 vector_store.config 字典中设置这些键:
import os from mem0 import Memory config = { "vector_store": { "provider": "mongodb", "config": { "mongo_uri": os.environ["MONGODB_URI"], "db_name": "mem0_db", "collection_name": "agent_memory", "embedding_model_dims": 1536, }, } } m = Memory.from_config(config)
配置字典还接受 llm 和 embedder 键,您可以使用它们将默认OpenAI 模型替换为 Mem0 支持的任何提供商。以下示例设置了这些可选键:
import os from mem0 import Memory config = { "llm": { "provider": "openai", "config": { "model": "gpt-4o-mini", "temperature": 0.1, "max_tokens": 2000, }, }, "embedder": { "provider": "openai", "config": { "model": "text-embedding-3-small", "embedding_dims": 1536, }, }, "vector_store": { "provider": "mongodb", "config": { "mongo_uri": os.environ["MONGODB_URI"], "db_name": "mem0_db", "collection_name": "agent_memory", "embedding_model_dims": 1536, }, }, "history_db_path": os.path.expanduser("~/.mem0/history.db"), } m = Memory.from_config(config)
vector_store.config 字典中 embedding_model_dims 键的值必须与配置的嵌入器生成的维度数匹配。
首次调用 Memory.from_config() 方法时,Mem0 会创建目标集合(如果目标集合尚不存在),并在该集合上创建MongoDB Vector Search索引和MongoDB Search索引。由于这些索引是异步构建的,因此在索引构建完成之前,搜索可能会返回空结果。
当您将 provider 键设立为 mongodb 时,Mem0 会从嵌套在 vector_store 字典内的 config 字典读取您的MongoDB设置。该字典接受以下键。每个键都是可选的,可以回退到指定的默认值,但必须设立mongo_uri 才能连接到本地部署以外的任何部署。
键 | 必要性 | 说明 |
|---|---|---|
| Optional | MongoDB 部署的连接字符串。默认为 |
| Optional | 保存内存集合的数据库的名称。默认为 |
| Optional | 存储内存文档的集合的名称。默认为 |
| Optional | 嵌入向量的维数。默认为 |
方法
本部分介绍 Memory 类提供的方法。每种方法都对您在 vector_store.config 字典中配置的集合进行操作。
要将方法的范围限定为特定用户、代理或会话运行,请传递至少包含 user_id、agent_id 或 run_id 键之一的 filters 字典。
add()
add() 方法从对话中提取事实,并将其作为内存文档写入集合中。如果实体已存在语义上等效的内存,则 Mem0 会更新该内存,而不是创建重复文档。
以下示例将一个会话传递给 add() 方法,并将生成的内存范围限定为特定用户:
messages = [ {"role": "user", "content": "I'm moving to Berlin next month."}, {"role": "assistant", "content": "I'll remember that you're relocating to Berlin."}, ] result = m.add(messages, user_id="alice") print(result)
{'results': [{'id': '...', 'memory': 'User is moving to Berlin around September 2026.', 'event': 'ADD'}]}
Parameter | 必要性 | 说明 |
|---|---|---|
| 必需 | 对话开始从中提取事实,可以是 |
| 可选的 | 内存所属用户的标识符。您必须至少提供 |
| 可选的 | 内存所属代理的标识符。如果您未提供 |
| 可选的 | 特定对话运行或会话的标识符。如果您未提供 |
| Optional | 要附加到此调用写入的每个内存文档的键值对。您可以使用 |
| Optional | Mem0 从结果中排除内存的日期。 |
| Optional | Mem0 是否使用 LLM 在存储离散事实之前提取它们。默认为 |
| Optional | 要存储的内存类型。 |
| Optional | 自定义提取提示,用于覆盖默认的事实提取模板。 |
get()
get() 方法通过ID值检索单个内存文档,而不运行向量搜索。
以下示例直接通过ID检索内存:
memory = m.get(memory_id="<memory-id>") print(memory)
{'id': '...', 'memory': 'User is moving to Berlin around September 2026.', 'hash': '...', 'metadata': None, 'score': None, 'created_at': '...', 'updated_at': '...', 'user_id': 'alice', 'attributed_to': 'user'}
memory_id 参数为必填项,它接受要检索的内存文档的 id 值。如果不存在具有该ID的内存,则 get() 方法将返回 None。
搜索()
search() 方法针对MongoDB Vector Search索引运行语义搜索,并返回与查询字符串最相关的记忆。
以下示例在特定用户的记忆中搜索五个最相关的结果:
results = m.search( query="Where does Alice live?", filters={"user_id": "alice"}, top_k=5, ) for mem in results["results"]: print(mem["memory"], "- score:", mem["score"])
User is moving to Berlin around September 2026. - score: 0.7043201923370361
Parameter | 必要性 | 说明 |
|---|---|---|
| 必需 | Mem0 用于生成搜索嵌入的自然语言查询。 |
| Optional | 与语义查询一起应用的过滤条件。必须至少包含 |
| Optional | 要返回的最大结果数。默认为 |
| Optional | 内存必须满足才能出现在结果中的最低相关性分数。默认为 |
| Optional | Mem0 在返回结果之前是否对结果进行重新排序。默认为 |
| Optional | 是否包含每个结果的 |
| Optional | Mem0 用于解析查询中的相对时间表达式的日期。 |
| Optional | 是否包含 |
get_all()
get_all() 方法返回为给定实体存储的内存文档,而不运行语义搜索。使用此方法可显示实体的完整内存历史记录。
以下示例返回并打印特定用户的所有记忆:
all_memories = m.get_all(filters={"user_id": "alice"}) for mem in all_memories["results"]: print(mem["id"], mem["memory"])
<id> User is moving to Berlin around September 2026.
update()
update() 方法会替换现有内存文档的文本。 Mem0 根据新文本重新计算嵌入,并就地更新文档。
以下示例将替换现有记忆中的文本:
m.update(memory_id="<memory-id>", text="Alice relocated to Berlin in July 2025.")
Delete()
delete() 方法从集合中删除单个内存文档。
以下示例通过ID删除内存:
m.delete(memory_id="<memory-id>")
memory_id 参数为必填项,接受要删除的内存文档的 id 值。
delete_all()
delete_all() 方法从集合中删除给定实体的所有内存文档。
以下示例将删除特定用户的所有记忆:
m.delete_all(user_id="alice")
History()
history() 方法返回单个内存的编辑历史记录,包括每个版本的文本和事件类型。 Mem0 将此历史记录存储在本地 SQLite数据库中,而不是MongoDB中。要更改 Mem0 写入数据库的位置,请在配置字典中设立history_db_path 键。
以下示例检索并打印内存的编辑历史记录:
history = m.history(memory_id="<memory-id>") for entry in history: print(entry["event"], entry["old_memory"], entry["new_memory"])
ADD None User is moving to Berlin around September 2026. UPDATE User is moving to Berlin around September 2026. Alice relocated to Berlin in July 2025.
memory_id 参数为必填项,它接受要检索其历史记录的内存文档的 id 值。
reset()
reset() 方法执行以下操作:
删除MongoDB集合及其MongoDB Vector Search 和MongoDB Search 索引
重置本地历史数据库
从头开始重新创建集合及其索引
使用此方法清除所有内存,而不是使用 delete_all() 方法一次删除一个实体。
m.reset()
reset() 不接受任何参数,并删除 Mem0 通过此 Memory实例存储的所有内存。
close()
close() 方法释放 Mem0 用于历史数据库的本地 SQLite 连接。此方法不会影响您的MongoDB连接。
m.close()
close() 不接受任何参数。如果您使用 Memory实例作为上下文管理器,则 Mem0 会自动调用它。
搜索索引
Mem0 首次连接时会在您的集合上创建以下索引。您也可以手动创建或检查这些索引。要学习;了解更多信息,请参阅创建MongoDB Vector Search 索引。
MongoDB Vector Search索引名为 <collectionName>_vector_index,其中 <collectionName> 是存储内存文档的集合的名称。该索引使用以下定义:
{ "fields": [ { "type": "vector", "path": "embedding", "numDimensions": 1536, "similarity": "cosine" } ] }
MongoDB Search索引名为 <collection-name>_text_search_index 并使用以下定义:
{ "mappings": { "dynamic": false, "fields": { "payload": { "type": "document", "fields": { "data": { "type": "string" }, "text_lemmatized": { "type": "string" } } } } } }
Mem0 使用MongoDB Search索引来运行关键字搜索,以补充 search() 的语义结果。如果索引不存在,Mem0 会记录警告并仅返回语义结果。
其他资源
要学习;了解有关将 Mem0 与MongoDB结合使用的更多信息,请参阅: