开始使用 Mem0 和 Milvus
Mem0 是为 AI 应用程序设计的智能内存层,旨在通过保留用户偏好并随时间持续适应来提供个性化和高效的交互。对于聊天机器人和 AI 驱动的工具来说,Mem0 创造了无缝的、上下文感知的体验。
在本教程中,我们将使用 Milvus——一个高性能的开源向量数据库,它支持高效存储和检索——介绍基本的 Mem0 内存管理操作:添加、检索、更新、搜索、删除和跟踪内存历史。这个实践介绍将指导您完成基础的内存操作,帮助您使用 Mem0 和 Milvus 构建个性化的 AI 交互。
准备工作
下载所需库
$ pip install mem0ai pymilvus
如果您使用 Google Colab,要启用刚刚安装的依赖项,您可能需要重启运行时(点击屏幕顶部的"Runtime"菜单,从下拉菜单中选择"Restart session")。
使用 Milvus 配置 Mem0
在此示例中,我们将使用 OpenAI 作为 LLM。您应该准备 api key OPENAI_API_KEY
作为环境变量。
import os
os.environ["OPENAI_API_KEY"] = "sk-***********"
现在,我们可以配置 Mem0 使用 Milvus 作为向量存储
# Define Config
from mem0 import Memory
config = {
"vector_store": {
"provider": "milvus",
"config": {
"collection_name": "quickstart_mem0_with_milvus",
"embedding_model_dims": "1536",
"url": "./milvus.db", # Use local vector database for demo purpose
},
},
"version": "v1.1",
}
m = Memory.from_config(config)
- 如果您只需要用于小规模数据或原型设计的本地向量数据库,将 uri 设置为本地文件,例如
./milvus.db
,是最方便的方法,因为它会自动利用 Milvus Lite 将所有数据存储在此文件中。- 如果您有大规模数据,比如超过一百万个向量,您可以在 Docker 或 Kubernetes 上设置性能更高的 Milvus 服务器。在此设置中,请使用服务器地址和端口作为您的 uri,例如
http://localhost:19530
。如果您在 Milvus 上启用了身份验证功能,请使用"<your_username>:<your_password>"作为令牌,否则不要设置令牌。- 如果您使用 Zilliz Cloud,Milvus 的完全托管云服务,请调整
uri
和token
,它们对应于 Zilliz Cloud 中的公共端点和 API 密钥。
使用 Mem0 和 Milvus 管理用户内存
添加内存
add
函数将非结构化文本作为内存存储在 Milvus 中,将其与特定用户和可选元数据关联。
在这里,我们添加 Alice 的内存,"正在努力提高我的网球技能",以及相关的上下文元数据到 Milvus。
# Add a memory to user: Working on improving tennis skills
res = m.add(
messages="I am working on improving my tennis skills.",
user_id="alice",
metadata={"category": "hobbies"},
)
res
{'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
'memory': 'Working on improving tennis skills',
'event': 'ADD'}],
'relations': []}
更新内存
我们可以使用 add
函数的返回值获取内存 ID,允许我们通过 update
用新信息更新此内存。
# Get memory_id
memory_id = res["results"][0]["id"]
# Update this memory with new information: Likes to play tennis on weekends
m.update(memory_id=memory_id, data="Likes to play tennis on weekends")
{'message': 'Memory updated successfully!'}
获取用户的所有内存
我们可以使用 get_all
函数查看 Milvus 中所有插入的内存或按 user_id
过滤。
注意我们可以看到内存现在已从"正在努力提高网球技能"更改为"喜欢在周末打网球"。
# Get all memory for the user Alice
m.get_all(user_id="alice")
`{'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
'memory': 'Likes to play tennis on weekends',
'hash': '4c3bc9f87b78418f19df6407bc86e006',
'metadata': None,
'created_at': '2024-11-01T19:33:44.116920-07:00',
'updated_at': '2024-11-01T19:33:47.619857-07:00',
'user_id': 'alice'}`]}
查看内存更新历史
我们还可以通过 history
函数指定我们感兴趣的 memory_id 来查看内存更新历史。
m.history(memory_id=memory_id)
[`{'id': '71ed3cec-5d9a-4fa6-a009-59802450c0b9',
'memory_id': '77162018-663b-4dfa-88b1-4f029d6136ab',
'old_memory': None,
'new_memory': 'Working on improving tennis skills',
'event': 'ADD',
'created_at': '2024-11-01T19:33:44.116920-07:00',
'updated_at': None}`,
{'id': 'db2b003c-ffb7-42e4-bd8a-b9cf56a02bb9', 'memory_id': '77162018-663b-4dfa-88b1-4f029d6136ab', 'old_memory': 'Working on improving tennis skills', 'new_memory': 'Likes to play tennis on weekends', 'event': 'UPDATE', 'created_at': '2024-11-01T19:33:44.116920-07:00', 'updated_at': '2024-11-01T19:33:47.619857-07:00'}
]
### 搜索内存
我们可以使用 `search` 函数为用户查找最相关的内存。
让我们首先为 Alice 添加另一个内存。
```python
new_mem = m.add(
"I have a linear algebra midterm exam on November 20",
user_id="alice",
metadata={"category": "task"},
)
现在,我们调用 get_all
指定 user_id 来验证我们确实为用户 Alice 有 2 个内存条目。
m.get_all(user_id="alice")
`{'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
'memory': 'Likes to play tennis on weekends',
'hash': '4c3bc9f87b78418f19df6407bc86e006',
'metadata': None,
'created_at': '2024-11-01T19:33:44.116920-07:00',
'updated_at': '2024-11-01T19:33:47.619857-07:00',
'user_id': 'alice'}`,
{'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
'memory': 'Has a linear algebra midterm exam on November 20',
'hash': '575182f46965111ca0a8279c44920ea2',
'metadata': {'category': 'task'},
'created_at': '2024-11-01T19:33:57.271657-07:00',
'updated_at': None,
'user_id': 'alice'}]}
我们现在可以通过提供 query
和 user_id
来执行 search
。注意我们默认使用 L2
度量进行相似性搜索,所以较小的 score
表示更大的相似性。
m.search(query="What are Alice's hobbies", user_id="alice")
`{'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
'memory': 'Likes to play tennis on weekends',
'hash': '4c3bc9f87b78418f19df6407bc86e006',
'metadata': None,
'score': 1.2807445526123047,
'created_at': '2024-11-01T19:33:44.116920-07:00',
'updated_at': '2024-11-01T19:33:47.619857-07:00',
'user_id': 'alice'}`,
{'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
'memory': 'Has a linear algebra midterm exam on November 20',
'hash': '575182f46965111ca0a8279c44920ea2',
'metadata': {'category': 'task'},
'score': 1.728922724723816,
'created_at': '2024-11-01T19:33:57.271657-07:00',
'updated_at': None,
'user_id': 'alice'}]}
删除内存
我们还可以通过提供相应的 memory_id
来 delete
内存。
我们将删除"喜欢在周末打网球"的内存,因为它的 memory_id
已经被检索到,并调用 get_all
来验证删除是否成功。
m.delete(memory_id=memory_id)
m.get_all("alice")
{'results': [{'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
'memory': 'Has a linear algebra midterm exam on November 20',
'hash': '575182f46965111ca0a8279c44920ea2',
'metadata': {'category': 'task'},
'created_at': '2024-11-01T19:33:57.271657-07:00',
'updated_at': None,
'user_id': 'alice'}]}