🎯 Mục tiêu bài học
Không có memory, agent xử lý mỗi request như lần đầu. Memory cho phép agent nhớ conversation history, user preferences, và learned knowledge.
Sau bài này, bạn sẽ:
✅ Short-term memory (conversation history) ✅ Long-term memory (persistent knowledge) ✅ Semantic memory với vector store ✅ Memory management patterns
🔍 Types of Agent Memory
| Memory Type | Nội dung |
|---|---|
| Short-term (Working) | Current conversation, Recent tool results, Current task context |
| Long-term (Persistent) | User preferences, Past interactions, Learned knowledge |
| Semantic (Knowledge) | Facts and relationships, Domain knowledge, Searchable by meaning |
Checkpoint
Bạn đã hiểu 3 loại memory chính (Short-term, Long-term, Semantic) chưa?
📐 Short-term Memory
Conversation Buffer
1from langchain_core.chat_history import InMemoryChatMessageHistory2from langchain_core.messages import HumanMessage, AIMessage34# Simple buffer - keeps ALL messages5history = InMemoryChatMessageHistory()67history.add_user_message("Tên tôi là Minh")8history.add_ai_message("Xin chào Minh! Tôi có thể giúp gì?")9history.add_user_message("Tôi muốn tìm laptop")10history.add_ai_message("Bạn cần laptop cho công việc gì, Minh?")1112print(history.messages)13# 4 messages storedWindow Buffer (Last N Messages)
1class WindowMemory:2 """Keep only the last N messages."""3 4 def __init__(self, window_size=10):5 self.window_size = window_size6 self.messages = []7 8 def add_message(self, role, content):9 self.messages.append({"role": role, "content": content})10 # Trim to window size11 if len(self.messages) > self.window_size:12 self.messages = self.messages[-self.window_size:]13 14 def get_messages(self):15 return self.messages16 17 def clear(self):18 self.messages = []1920memory = WindowMemory(window_size=10)21memory.add_message("user", "Hello")22memory.add_message("assistant", "Hi there!")Summary Memory
1from langchain_openai import ChatOpenAI2from langchain_core.prompts import ChatPromptTemplate34class SummaryMemory:5 """Summarize old messages to save tokens."""6 7 def __init__(self, llm, max_messages=6):8 self.llm = llm9 self.max_messages = max_messages10 self.summary = ""11 self.recent_messages = []12 13 def add_message(self, role, content):14 self.recent_messages.append({"role": role, "content": content})15 16 # When too many messages, summarize old ones17 if len(self.recent_messages) > self.max_messages:18 self._summarize()19 20 def _summarize(self):21 """Summarize older messages."""22 old_messages = self.recent_messages[:-4] # Keep last 423 24 prompt = ChatPromptTemplate.from_template(25 "Summarize this conversation concisely:\n"26 "Previous summary: {summary}\n"27 "New messages: {messages}\n"28 "Summary:"29 )30 31 chain = prompt | self.llm32 messages_text = "\n".join(33 f"{m['role']}: {m['content']}" for m in old_messages34 )35 36 result = chain.invoke({37 "summary": self.summary or "None",38 "messages": messages_text39 })40 41 self.summary = result.content42 self.recent_messages = self.recent_messages[-4:]43 44 def get_context(self):45 """Get summary + recent messages for prompt."""46 context = ""47 if self.summary:48 context += f"Conversation summary: {self.summary}\n\n"49 50 context += "Recent messages:\n"51 for m in self.recent_messages:52 context += f"{m['role']}: {m['content']}\n"53 54 return contextCheckpoint
Bạn đã hiểu 3 loại short-term memory (Buffer, Window, Summary) chưa?
📐 Long-term Memory
Vector Store Memory
1from langchain_openai import OpenAIEmbeddings2from langchain_community.vectorstores import Chroma3from langchain_core.documents import Document4import json5from datetime import datetime67class LongTermMemory:8 """Persistent memory using vector store."""9 10 def __init__(self, user_id, persist_dir="./memory_db"):11 self.user_id = user_id12 self.embeddings = OpenAIEmbeddings(model="text-embedding-3-small")13 self.vectorstore = Chroma(14 collection_name=f"memory_{user_id}",15 embedding_function=self.embeddings,16 persist_directory=persist_dir17 )18 19 def store(self, content, memory_type="conversation"):20 """Store a memory."""21 doc = Document(22 page_content=content,23 metadata={24 "user_id": self.user_id,25 "type": memory_type,26 "timestamp": datetime.now().isoformat()27 }28 )29 self.vectorstore.add_documents([doc])30 31 def recall(self, query, k=5, memory_type=None):32 """Recall relevant memories."""33 filter_dict = {"user_id": self.user_id}34 if memory_type:35 filter_dict["type"] = memory_type36 37 results = self.vectorstore.similarity_search(38 query, k=k, filter=filter_dict39 )40 41 return [doc.page_content for doc in results]42 43 def store_preference(self, key, value):44 """Store user preference."""45 content = f"User preference: {key} = {value}"46 self.store(content, memory_type="preference")47 48 def recall_preferences(self, context=""):49 """Recall relevant user preferences."""50 return self.recall(51 f"user preferences {context}",52 k=3,53 memory_type="preference"54 )5556# Usage57memory = LongTermMemory("user_123")58memory.store_preference("language", "Vietnamese")59memory.store_preference("budget", "thích sản phẩm tầm trung")60memory.store("User asked about MacBook Air and bought one", "interaction")6162# Later recall63prefs = memory.recall_preferences("buying laptop")64# Returns: ['User preference: budget = thích sản phẩm tầm trung', ...]Structured Memory (JSON)
1import json2import os34class StructuredMemory:5 """JSON-based structured memory for user profiles."""6 7 def __init__(self, filepath="user_memory.json"):8 self.filepath = filepath9 self.data = self._load()10 11 def _load(self):12 if os.path.exists(self.filepath):13 with open(self.filepath, "r") as f:14 return json.load(f)15 return {}16 17 def _save(self):18 with open(self.filepath, "w") as f:19 json.dump(self.data, f, ensure_ascii=False, indent=2)20 21 def set(self, user_id, key, value):22 if user_id not in self.data:23 self.data[user_id] = {}24 self.data[user_id][key] = value25 self._save()26 27 def get(self, user_id, key, default=None):28 return self.data.get(user_id, {}).get(key, default)29 30 def get_profile(self, user_id):31 return self.data.get(user_id, {})Checkpoint
Bạn đã hiểu cách implement long-term memory với vector store và JSON chưa?
💻 Memory in LangGraph Agent
1from langgraph.prebuilt import create_react_agent2from langgraph.checkpoint.memory import MemorySaver3from langchain_openai import ChatOpenAI45# Memory saver enables conversation persistence6memory = MemorySaver()78llm = ChatOpenAI(model="gpt-4o-mini")9tools = [search_product, get_weather]1011agent = create_react_agent(12 llm,13 tools,14 checkpointer=memory15)1617# Thread ID = conversation session18config = {"configurable": {"thread_id": "user_123_session_1"}}1920# First message21result = agent.invoke(22 {"messages": [("user", "Tên tôi là Minh")]},23 config=config24)2526# Second message - agent remembers!27result = agent.invoke(28 {"messages": [("user", "Tên tôi là gì?")]},29 config=config30)31# Agent: "Tên bạn là Minh!"Checkpoint
Bạn đã hiểu cách sử dụng MemorySaver và thread_id trong LangGraph chưa?
📝 Memory Best Practices
| Practice | Reason |
|---|---|
| Limit buffer size | Tránh vượt context window |
| Summarize old messages | Giữ key info, save tokens |
| Separate memory types | Short-term vs long-term |
| Index with metadata | Dễ filter và recall |
| Clean up periodically | Remove outdated memories |
| Encrypt sensitive data | User privacy |
Checkpoint
Bạn đã nắm được các best practices khi quản lý memory cho agents chưa?
🎯 Tổng kết
📝 Quiz
-
3 loại memory chính cho agent?
- Short-term (working), Long-term (persistent), Semantic (knowledge)
- RAM, SSD, Cloud
- Input, Output, Cache
- Prompt, Response, History
-
Summary Memory giải quyết vấn đề gì?
- Token limit: summarize old messages để giữ key info trong context window
- Tăng tốc agent
- Giảm chi phí server
- Bảo mật
-
LangGraph dùng gì để persist conversation?
- MemorySaver checkpointer với thread_id
- Database trực tiếp
- File system
- Environment variables
Key Takeaways
- Short-term — Conversation buffer, window, summary
- Long-term — Vector store for semantic recall
- Structured — JSON for user profiles/preferences
- LangGraph — MemorySaver + thread_id cho persistence
- Best practice — Limit size, summarize, encrypt sensitive data
Câu hỏi tự kiểm tra
- Ba loại memory chính cho AI Agent là gì và chúng khác nhau thế nào?
- Summary Memory giải quyết vấn đề gì khi conversation quá dài?
- LangGraph sử dụng MemorySaver và thread_id để persist conversation như thế nào?
- Khi nào nên sử dụng vector store cho long-term memory thay vì conversation buffer?
🎉 Tuyệt vời! Bạn đã hoàn thành bài học Memory Systems!
Tiếp theo: Hãy cùng học State Management — quản lý state và checkpointing cho agent!
🚀 Bài tiếp theo
State Management — Quản lý state và checkpointing cho agent workflows!
