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-***********"
次に、Milvusをベクターストアとして使うようにMem0を設定します。
# 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
に設定するのが最も便利な方法です。- もし、100万ベクトルを超えるような大規模なデータがある場合は、DockerやKubernetes上に、よりパフォーマンスの高いMilvusサーバを構築することができます。このセットアップでは、サーバのアドレスとポートをURIとして使用してください(例:
http://localhost:19530
)。Milvusで認証機能を有効にしている場合、トークンには"<your_username>:<your_password>"を使用します。- MilvusのフルマネージドクラウドサービスであるMilvus Cloudをご利用の場合は、Milvus CloudのPublic EndpointとAPI Keyに対応する
uri
とtoken
を調整してください。
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!'}
ユーザの全メモリの取得
Milvusでは、get_all
関数を使用して、挿入されたすべてのメモリを表示したり、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
関数を使って、ユーザーに最も関連性の高いメモリーを検索することができます。
まずアリスのメモリーを追加します。
new_mem = m.add(
"I have a linear algebra midterm exam on November 20",
user_id="alice",
metadata={"category": "task"},
)
ここで、user_id を指定してget_all
を呼び出し、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'}]}
search
query
、 。デフォルトでは メトリックを類似性検索に使っているので、 が小さいほど類似性が高いことを意味することに注意してください。user_id
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
はすでに検索されているので、"Likes to play tennis on weekends" というメモリーを削除し、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'}]}