AI Hunter
Member
Anh em có thấy ức chế không khi con Jarvis của mình rất thông minh, hỏi gì biết nấy, nhưng cứ tắt Terminal đi bật lại là nó lại hỏi: "Chào bạn, tôi có thể giúp gì?" như chưa hề quen biết?
Đó là vấn đề muôn thuở của LLM: **Stateless** (Không lưu trạng thái).
Hôm nay, chúng ta sẽ phẫu thuật não cho Jarvis, cấy vào đó một module **Long-term Memory** (Bộ nhớ dài hạn). Mục tiêu là để lần sau bạn quay lại, nó sẽ chào:
"Chào sếp! Dự án Python hôm qua fix xong lỗi chưa? Sếp có muốn uống cafe không đường như mọi khi không?"
Nghe "sướng" hơn hẳn đúng không? Bắt tay vào làm thôi!
Nhiều anh em hay nhầm lẫn 2 cái này.
Để làm Memory, chúng ta không lưu nguyên văn đoạn chat (vừa tốn token vừa loãng), mà chúng ta sẽ dùng kỹ thuật Fact Extraction (Trích xuất sự kiện) để lưu lại những ý chính.
Thay vì tự code vector database lằng nhằng, chúng ta sẽ dùng thư viện Mem0 (trước đây là EmbedChain). Đây là thư viện Python chuyên dụng để quản lý bộ nhớ cho AI, nó tự động hóa việc lưu, xóa, và tìm kiếm ký ức.
Cài đặt:
[CODE lang="python"]
import os
from mem0 import Memory
os.environ["OPENAI_API_KEY"] = "sk-proj-xxxx"
# Cấu hình bộ nhớ (Mặc định dùng Qdrant + OpenAI Embedding)
config = {
"vector_store": {
"provider": "qdrant",
"config": {
"host": "localhost",
"port": 6333
}
}
}
m = Memory.from_config(config)
[/CODE]
Giả sử trong lúc chat, User nói: "Tôi đang làm việc tại Hà Nội và thích ăn Phở không hành."
Chúng ta sẽ ném câu này vào Mem0.
[CODE lang="python"]
# user_id là định danh duy nhất của người dùng
user_id = "user_123"
m.add("Tôi đang làm việc tại Hà Nội và thích ăn Phở không hành.", user_id=user_id)
print("Đã ghi nhớ vào não bộ!
")
[/CODE]
Điều kỳ diệu xảy ra ở đây: Mem0 sẽ không lưu nguyên văn. Nó sẽ tự động trích xuất thành các facts:
1. User làm việc tại Hà Nội.
2. User thích ăn Phở (preference: không hành).
Lần sau, khi User hỏi: "Gợi ý chỗ ăn trưa đi."
Hệ thống sẽ quét bộ nhớ xem ông này có sở thích gì không.
[CODE lang="python"]
query = "Gợi ý chỗ ăn trưa đi."
# Tìm kiếm ký ức liên quan đến câu hỏi
memories = m.search(query, user_id=user_id)
print("Ký ức tìm thấy:")
for mem in memories:
print(f"- {mem['text']}")
[/CODE]
Kết quả trả về:
Bây giờ chúng ta sẽ ghép mảnh ký ức này vào System Prompt để LLM trả lời "chuẩn bài".
[CODE lang="python"]
context_memories = "\n".join([mem['text'] for mem in memories])
system_prompt = f"""
Bạn là trợ lý AI hữu ích.
Dưới đây là những gì bạn biết về người dùng này:
{context_memories}
Hãy trả lời câu hỏi của người dùng dựa trên thông tin cá nhân hóa đó.
"""
# Gọi OpenAI như bình thường với system_prompt mới này
# ...
[/CODE]
Kết quả AI trả lời:
"Ở Hà Nội thì bác ra Phở Thìn Lò Đúc làm bát tái lăn đi, nhớ dặn chủ quán là không cho hành như ý bác nhé!" -> Quá đỉnh! 10 điểm tinh tế.
Mem0 có một tính năng cực hay là tự động update.
Nếu hôm sau User bảo: "Thôi dạo này béo quá, tôi chuyển sang ăn salad rồi."
Khi bạn gọi hàm
với câu mới này, Mem0 sẽ tự động phát hiện mâu thuẫn với ký ức cũ (thích ăn Phở) và cập nhật lại trạng thái mới nhất. Jarvis sẽ không bị "tẩu hỏa nhập ma" giữa sở thích cũ và mới.
Vậy là Jarvis của chúng ta đã có đủ:
1. **Trí tuệ:** LLM & Structured Outputs.
2. **Kiến thức:** GraphRAG.
3. **Kỷ luật:** Ragas Evaluation.
4. **Tâm hồn:** Long-term Memory.
Giờ đây, nó là một người trợ lý thực thụ, biết lắng nghe, thấu hiểu và ghi nhớ.
Đó là vấn đề muôn thuở của LLM: **Stateless** (Không lưu trạng thái).
Hôm nay, chúng ta sẽ phẫu thuật não cho Jarvis, cấy vào đó một module **Long-term Memory** (Bộ nhớ dài hạn). Mục tiêu là để lần sau bạn quay lại, nó sẽ chào:
"Chào sếp! Dự án Python hôm qua fix xong lỗi chưa? Sếp có muốn uống cafe không đường như mọi khi không?"
Nghe "sướng" hơn hẳn đúng không? Bắt tay vào làm thôi!
1. Tư duy: RAG vs. Memory
Nhiều anh em hay nhầm lẫn 2 cái này.
- RAG (Retrieval Augmented Generation): Dùng để tra cứu kiến thức chung hoặc tài liệu công ty. (Ví dụ: Luật lao động, Code base dự án).
- Memory (Bộ nhớ): Dùng để lưu thông tin CÁ NHÂN HÓA của User. (Ví dụ: User tên Hùng, là Dev, thích code ngắn gọn, ghét Java).
Để làm Memory, chúng ta không lưu nguyên văn đoạn chat (vừa tốn token vừa loãng), mà chúng ta sẽ dùng kỹ thuật Fact Extraction (Trích xuất sự kiện) để lưu lại những ý chính.
2. Vũ khí: Mem0 (Mem-Zero)
Thay vì tự code vector database lằng nhằng, chúng ta sẽ dùng thư viện Mem0 (trước đây là EmbedChain). Đây là thư viện Python chuyên dụng để quản lý bộ nhớ cho AI, nó tự động hóa việc lưu, xóa, và tìm kiếm ký ức.
Cài đặt:
Mã:
pip install mem0ai openai
3. Triển khai thực chiến
Bước 1: Khởi tạo bộ nhớ
[CODE lang="python"]
import os
from mem0 import Memory
os.environ["OPENAI_API_KEY"] = "sk-proj-xxxx"
# Cấu hình bộ nhớ (Mặc định dùng Qdrant + OpenAI Embedding)
config = {
"vector_store": {
"provider": "qdrant",
"config": {
"host": "localhost",
"port": 6333
}
}
}
m = Memory.from_config(config)
[/CODE]
Bước 2: Dạy Jarvis ghi nhớ (Add Memory)
Giả sử trong lúc chat, User nói: "Tôi đang làm việc tại Hà Nội và thích ăn Phở không hành."
Chúng ta sẽ ném câu này vào Mem0.
[CODE lang="python"]
# user_id là định danh duy nhất của người dùng
user_id = "user_123"
m.add("Tôi đang làm việc tại Hà Nội và thích ăn Phở không hành.", user_id=user_id)
print("Đã ghi nhớ vào não bộ!
[/CODE]
Điều kỳ diệu xảy ra ở đây: Mem0 sẽ không lưu nguyên văn. Nó sẽ tự động trích xuất thành các facts:
1. User làm việc tại Hà Nội.
2. User thích ăn Phở (preference: không hành).
Bước 3: Hồi tưởng ký ức (Search Memory)
Lần sau, khi User hỏi: "Gợi ý chỗ ăn trưa đi."
Hệ thống sẽ quét bộ nhớ xem ông này có sở thích gì không.
[CODE lang="python"]
query = "Gợi ý chỗ ăn trưa đi."
# Tìm kiếm ký ức liên quan đến câu hỏi
memories = m.search(query, user_id=user_id)
print("Ký ức tìm thấy:")
for mem in memories:
print(f"- {mem['text']}")
[/CODE]
Kết quả trả về:
Mã:
- User thích ăn Phở không hành.
Bước 4: Ghép vào Prompt (The Final Flow)
Bây giờ chúng ta sẽ ghép mảnh ký ức này vào System Prompt để LLM trả lời "chuẩn bài".
[CODE lang="python"]
context_memories = "\n".join([mem['text'] for mem in memories])
system_prompt = f"""
Bạn là trợ lý AI hữu ích.
Dưới đây là những gì bạn biết về người dùng này:
{context_memories}
Hãy trả lời câu hỏi của người dùng dựa trên thông tin cá nhân hóa đó.
"""
# Gọi OpenAI như bình thường với system_prompt mới này
# ...
[/CODE]
Kết quả AI trả lời:
"Ở Hà Nội thì bác ra Phở Thìn Lò Đúc làm bát tái lăn đi, nhớ dặn chủ quán là không cho hành như ý bác nhé!" -> Quá đỉnh! 10 điểm tinh tế.
4. Cơ chế tự động cập nhật (Self-Correction)
Mem0 có một tính năng cực hay là tự động update.
Nếu hôm sau User bảo: "Thôi dạo này béo quá, tôi chuyển sang ăn salad rồi."
Khi bạn gọi hàm
Mã:
m.add()
Tổng kết
Vậy là Jarvis của chúng ta đã có đủ:
1. **Trí tuệ:** LLM & Structured Outputs.
2. **Kiến thức:** GraphRAG.
3. **Kỷ luật:** Ragas Evaluation.
4. **Tâm hồn:** Long-term Memory.
Giờ đây, nó là một người trợ lý thực thụ, biết lắng nghe, thấu hiểu và ghi nhớ.
Bài viết liên quan