Mem0 및 Milvus 시작하기
Mem0은 AI 애플리케이션을 위한 지능형 메모리 계층으로, 사용자 선호도를 유지하고 시간이 지나도 지속적으로 적응하여 개인화되고 효율적인 상호작용을 제공하도록 설계되었습니다. 챗봇과 AI 기반 도구에 이상적인 Mem0는 맥락을 인식하는 원활한 경험을 제공합니다.
이 튜토리얼에서는 효율적인 저장 및 검색을 지원하는 고성능 오픈 소스 벡터 데이터베이스인 Milvus를 사용하여 메모리 추가, 검색, 업데이트, 검색, 삭제 및 메모리 이력 추적과 같은 필수 Mem0 메모리 관리 작업에 대해 다룹니다. 이 실습 소개에서는 Mem0 및 Milvus를 사용하여 개인화된 AI 상호 작용을 구축하는 데 도움이 되는 기본적인 메모리 작업을 안내합니다.
준비 사항
필요한 라이브러리 다운로드
$ pip install mem0ai pymilvus
Google Colab을 사용하는 경우 방금 설치한 종속 요소를 사용하려면 런타임을 다시 시작해야 할 수 있습니다(화면 상단의 '런타임' 메뉴를 클릭하고 드롭다운 메뉴에서 '세션 다시 시작'을 선택).
Milvus로 Mem0 구성하기
이 예제에서는 OpenAI를 LLM으로 사용하겠습니다. 환경 변수로 OPENAI_API_KEY
API 키를 준비해야 합니다.
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)
- 소규모 데이터나 프로토타이핑을 위해 로컬 벡터 데이터베이스만 필요한 경우, URL을 로컬 파일(예:
./milvus.db
)로 설정하는 것이 가장 편리한 방법인데, 이 파일에 모든 데이터를 저장하기 위해 Milvus Lite를 자동으로 활용하기 때문입니다.- 백만 개 이상의 벡터와 같이 대규모 데이터가 있는 경우, Docker 또는 Kubernetes에서 더 성능이 뛰어난 Milvus 서버를 설정할 수 있습니다. 이 설정에서는 서버 주소와 포트를 URI로 사용하세요(예:
http://localhost:19530
). Milvus에서 인증 기능을 활성화하는 경우 토큰으로 "<사용자 이름>:<사용자 비밀번호>"를 사용하고, 그렇지 않은 경우 토큰을 설정하지 마세요.- 밀버스의 완전 관리형 클라우드 서비스인 질리즈 클라우드를 사용하는 경우, 질리즈 클라우드의 퍼블릭 엔드포인트와 API 키에 해당하는
uri
및token
을 조정하세요.
Mem0 및 Milvus로 사용자 메모리 관리하기
메모리 추가하기
add
함수는 Milvus에 비정형 텍스트를 메모리로 저장하여 특정 사용자 및 선택적 메타데이터와 연결합니다.
여기서는 "테니스 실력 향상을 위해 노력 중"이라는 앨리스의 메모리를 관련 메타데이터와 함께 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
함수를 사용하여 사용자와 가장 관련성이 높은 메모리를 찾을 수 있습니다.
먼저 앨리스에 대한 메모리를 하나 더 추가해 보겠습니다.
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'}]}
이제 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'}]}