開始使用 Mem0 和 Milvus
Mem0是適用於 AI 應用程式的智慧型記憶體層級,可保留使用者偏好並隨時間持續適應,提供個人化且有效率的互動。Mem0 是聊天機器人和 AI 驅動工具的理想選擇,可創造無縫、情境感知的體驗。
在本教程中,我們將介紹 Mem0 記憶體管理的基本操作 - 新增、擷取、更新、搜尋、刪除和追蹤記憶體歷史 - 使用Milvus,這是一個高效能的開放原始碼向量資料庫,提供高效的儲存和擷取功能。這個實作導覽將引導您完成基本的記憶體作業,以協助您使用 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 中的Public Endpoint 和 API key。
使用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
功能,指定我們感興趣的記憶體_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 加入另一個記憶體。
new_mem = m.add(
"I have a linear algebra midterm exam on November 20",
user_id="alice",
metadata={"category": "task"},
)
現在,我們呼叫get_all
,指定 user_id,以驗證我們確實有 2 個使用者 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'},
{'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
記憶體。
我們將刪除記憶體 "Likes to play tennis on weekends",因為它的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'}]}