ในโลกของ AI Agent ที่กำลังเติบโตอย่างรวดเร็ว หน่วยความจำคือหัวใจสำคัญที่ทำให้ตัวแทน AI สามารถจดจำบริบท เรียนรู้จากปฏิสัมพันธ์ก่อนหน้า และให้คำตอบที่สอดคล้องกับสถานการณ์ ในบทความนี้ ผมจะพาคุณไปสำรวจรูปแบบการออกแบบโมดูลหน่วยความจำที่ใช้งานได้จริงใน production พร้อมตัวอย่างโค้ดที่คุณสามารถนำไปประยุกต์ใช้ได้ทันที

ทำไมต้องมี Memory Module สำหรับ AI Agent

จากประสบการณ์ของผมในการพัฒนา AI Agent มากว่า 3 ปี ปัญหาที่พบบ่อยที่สุดคือ Agent ไม่สามารถจดจำสิ่งที่เกิดขึ้นก่อนหน้าได้ ทำให้ต้องอธิบายบริบทซ้ำๆ เหมือนกับคุยกับคนที่สูญเสียความจำระยะสั้นทุกครั้งที่ถามคำถามใหม่

กรณีศึกษา: ระบบตอบคำถามลูกค้าอีคอมเมิร์ซ

สมมติว่าคุณกำลังสร้างแชทบอทสำหรับร้านค้าออนไลน์ที่มีสินค้าหลายพันรายการ ลูกค้าถามเรื่องนโยบายการคืนสินค้า จากนั้นถามเรื่องสินค้าที่ต้องการสั่งซื้อ แล้วถามเรื่องการชำระเงินตามลำดับ หากไม่มี Memory Module ที่ดี Agent จะไม่รู้ว่าลูกค้าคนเดียวกันกำลังสนทนาเรื่องอะไร และอาจให้ข้อมูลที่ขัดแย้งกัน

รูปแบบหน่วยความจำหลัก 4 แบบ

1. Buffer Memory (ความจำระยะสั้น)

ความจำแบบนี้เก็บเฉพาะปฏิสัมพันธ์ล่าสุดในรอบการสนทนาปัจจุบัน เหมาะสำหรับการสนทนาที่ไม่ต้องการบริบทย้อนหลังมาก

"""
Buffer Memory Implementation สำหรับ AI Agent
เก็บเฉพาะข้อความล่าสุดในรอบการสนทนา
"""
from typing import List, Dict, Any
from collections import deque
import json

class BufferMemory:
    """ความจำระยะสั้นแบบ FIFO - เก็บเฉพาะ N ข้อความล่าสุด"""
    
    def __init__(self, max_messages: int = 10):
        self.max_messages = max_messages
        self.buffer = deque(maxlen=max_messages)
    
    def add_message(self, role: str, content: str, metadata: Dict = None):
        """เพิ่มข้อความเข้าสู่ buffer"""
        message = {
            "role": role,
            "content": content,
            "metadata": metadata or {}
        }
        self.buffer.append(message)
    
    def get_messages(self) -> List[Dict[str, Any]]:
        """ดึงข้อความทั้งหมดใน buffer"""
        return list(self.buffer)
    
    def get_context_window(self) -> str:
        """สร้าง context string สำหรับส่งให้ LLM"""
        context_parts = []
        for msg in self.buffer:
            role_label = "ผู้ใช้" if msg["role"] == "user" else "AI"
            context_parts.append(f"{role_label}: {msg['content']}")
        return "\n".join(context_parts)
    
    def clear(self):
        """ล้าง buffer ทั้งหมด"""
        self.buffer.clear()
    
    def to_dict(self) -> Dict:
        return {
            "type": "buffer",
            "max_messages": self.max_messages,
            "messages": list(self.buffer)
        }


ตัวอย่างการใช้งาน

memory = BufferMemory(max_messages=6) memory.add_message("user", "สินค้านี้มีสีอะไรบ้าง?", {"product_id": "SKU-001"}) memory.add_message("assistant", "สินค้านี้มีสีดำ ขาว และน้ำเงินครับ", {"timestamp": "2025-01-20T10:30:00Z"}) memory.add_message("user", "จัดส่งกี่วัน?", {"product_id": "SKU-001"}) memory.add_message("assistant", "จัดส่งภายใน 3-5 วันทำการครับ", {"timestamp": "2025-01-20T10:31:00Z"}) print(memory.get_context_window()) print(f"จำนวนข้อความใน buffer: {len(memory.buffer)}")

2. Summary Memory (ความจำแบบสรุป)

แทนที่จะเก็บข้อความทุกข้อความ เราจะใช้ LLM สรุปเนื้อหาสำคัญเป็นระยะ ลดการใช้ token และโฟกัสเฉพาะข้อมูลที่จำเป็น

"""
Summary Memory - ใช้ LLM สรุปความจำเป็นระยะ
ประหยัด token และโฟกัสเฉพาะข้อมูลสำคัญ
"""
import requests
import json
from typing import List, Dict, Optional

class SummaryMemory:
    """ความจำแบบสรุปที่ใช้ AI จับสาระสำคัญ"""
    
    def __init__(self, api_key: str, base_url: str = "https://api.holysheep.ai/v1"):
        self.api_key = api_key
        self.base_url = base_url
        self.short_term = []  # ข้อความดิบล่าสุด
        self.long_term = []   # ความจำที่สรุปแล้ว
        self.summary_threshold = 8  # สรุปทุก 8 ข้อความ
    
    def _call_llm_for_summary(self, messages: List[Dict]) -> str:
        """เรียก HolySheep API เพื่อสรุปข้อความ"""
        prompt = """คุณคือผู้ช่วย AI ที่ต้องสรุปเนื้อหาการสนทนาต่อไปนี้:
เป็นข้อความสั้นไม่เกิน 3 ประโยค ระบุเฉพาะข้อมูลสำคัญที่ต้องจำ:
- ความต้องการ/ปัญหาของผู้ใช้
- ข้อมูลสินค้าหรือบริการที่กล่าวถึง
- ข้อตกลงหรือคำตอบที่ให้ไว้

การสนทนา:
"""
        for msg in messages:
            role = "ผู้ใช้" if msg["role"] == "user" else "AI"
            prompt += f"{role}: {msg['content']}\n"
        
        response = requests.post(
            f"{self.base_url}/chat/completions",
            headers={
                "Authorization": f"Bearer {self.api_key}",
                "Content-Type": "application/json"
            },
            json={
                "model": "gpt-4o-mini",
                "messages": [{"role": "user", "content": prompt}],
                "max_tokens": 200,
                "temperature": 0.3
            }
        )
        return response.json()["choices"][0]["message"]["content"]
    
    def add_message(self, role: str, content: str, metadata: Dict = None):
        """เพิ่มข้อความและสรุปเมื่อถึง threshold"""
        self.short_term.append({
            "role": role,
            "content": content,
            "metadata": metadata or {}
        })
        
        # สรุปเมื่อมีข้อความครบ threshold
        if len(self.short_term) >= self.summary_threshold:
            summary = self._call_llm_for_summary(self.short_term)
            self.long_term.append({
                "summary": summary,
                "message_count": len(self.short_term),
                "timestamp": metadata.get("timestamp") if metadata else None
            })
            self.short_term = []  # ล้าง short-term หลังสรุป
    
    def get_full_context(self) -> str:
        """ดึงบริบทความจำทั้งหมด"""
        context = "## ความจำระยะยาว:\n"
        for item in self.long_term:
            context += f"- {item['summary']}\n"
        
        context += "\n## การสนทนาล่าสุด:\n"
        for msg in self.short_term:
            role = "ผู้ใช้" if msg["role"] == "user" else "AI"
            context += f"{role}: {msg['content']}\n"
        
        return context


ตัวอย่างการใช้งาน

memory = SummaryMemory( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1" )

เพิ่มข้อความหลายรายการ

for i in range(10): memory.add_message("user", f"สอบถามเรื่องสินค้ารายการที่ {i+1}", {"product_id": f"SKU-{i:03d}"}) print("บริบทความจำทั้งหมด:") print(memory.get_full_context())

3. Vector Memory (ความจำแบบเวกเตอร์)

ใช้ embedding เพื่อค้นหาความจำที่เกี่ยวข้องกับคำถามปัจจุบัน เหมาะสำหรับ RAG (Retrieval-Augmented Generation) ที่ต้องการดึงข้อมูลจากฐานความรู้ขนาดใหญ่

"""
Vector Memory - ค้นหาความจำที่เกี่ยวข้องด้วย semantic search
ใช้ embedding เพื่อหาข้อมูลที่สอดคล้องกับคำถามปัจจุบัน
"""
import requests
import numpy as np
from typing import List, Dict, Tuple, Optional
from datetime import datetime

class VectorMemory:
    """ความจำแบบ vector search สำหรับ semantic retrieval"""
    
    def __init__(self, api_key: str, base_url: str = "https://api.holysheep.ai/v1", embedding_model: str = "text-embedding-3-small"):
        self.api_key = api_key
        self.base_url = base_url
        self.embedding_model = embedding_model
        self.memory_store = []  # List of (embedding, metadata)
    
    def _get_embedding(self, text: str) -> np.ndarray:
        """สร้าง embedding vector จาก HolySheep API"""
        response = requests.post(
            f"{self.base_url}/embeddings",
            headers={
                "Authorization": f"Bearer {self.api_key}",
                "Content-Type": "application/json"
            },
            json={
                "model": self.embedding_model,
                "input": text
            }
        )
        data = response.json()
        return np.array(data["data"][0]["embedding"])
    
    def _cosine_similarity(self, vec1: np.ndarray, vec2: np.ndarray) -> float:
        """คำนวณ cosine similarity ระหว่าง vector สองตัว"""
        dot_product = np.dot(vec1, vec2)
        norm_product = np.linalg.norm(vec1) * np.linalg.norm(vec2)
        return dot_product / norm_product if norm_product > 0 else 0
    
    def add_memory(self, content: str, metadata: Dict):
        """เพิ่มความจำพร้อม embedding"""
        embedding = self._get_embedding(content)
        self.memory_store.append({
            "embedding": embedding,
            "content": content,
            "metadata": metadata,
            "created_at": datetime.now().isoformat()
        })
    
    def search(self, query: str, top_k: int = 5, threshold: float = 0.7) -> List[Dict]:
        """ค้นหาความจำที่เกี่ยวข้องกับ query"""
        query_embedding = self._get_embedding(query)
        
        results = []
        for item in self.memory_store:
            similarity = self._cosine_similarity(query_embedding, item["embedding"])
            if similarity >= threshold:
                results.append({
                    "content": item["content"],
                    "metadata": item["metadata"],
                    "similarity": float(similarity),
                    "created_at": item["created_at"]
                })
        
        # เรียงลำดับตาม similarity และดึง top_k
        results.sort(key=lambda x: x["similarity"], reverse=True)
        return results[:top_k]
    
    def get_context_for_query(self, query: str, max_items: int = 3) -> str:
        """สร้าง context string สำหรับ query"""
        relevant_memories = self.search(query, top_k=max_items)
        
        if not relevant_memories:
            return "ไม่พบความจำที่เกี่ยวข้อง"
        
        context = "## ข้อมูลจากความจำที่เกี่ยวข้อง:\n"
        for i, mem in enumerate(relevant_memories, 1):
            context += f"{i}. {mem['content']} (ความเหมือน: {mem['similarity']:.2%})\n"
        
        return context


ตัวอย่างการใช้งาน - ระบบ RAG สำหรับฐานความรู้สินค้า

memory = VectorMemory( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1" )

เพิ่มข้อมูลสินค้าลงในความจำ vector

products = [ ("รองเท้าผ้าใบ Nike Air Max สีดำ ขนาด 42 ราคา 4,500 บาท มีโปรโมชั่นลด 15%", {"type": "product", "category": "รองเท้า"}), ("เสื้อยืด Adidas ผ้า cotton 100% ราคา 890 บาท มีสีขาว ดำ เทา", {"type": "product", "category": "เสื้อผ้า"}), ("นโยบายการคืนสินค้า: คืนได้ภายใน 30 วัน ไม่ต้องกล่อง สินค้าต้องไม่ผ่านการใช้", {"type": "policy", "category": "การคืนสินค้า"}), ("วิธีการชำระเงิน: บัตรเครดิต พร้อมเพย์ ชำระปลายทาง ได้ทุกช่องทาง", {"type": "payment", "category": "การชำระเงิน"}), ] for content, metadata in products: memory.add_memory(content, metadata)

ค้นหาความจำที่เกี่ยวข้อง

query = "รองเท้าสีดำราคาเท่าไหร่" context = memory.get_context_for_query(query, max_items=2) print(f"Query: {query}\n") print(f"Context:\n{context}") query2 = "ถ้าไม่พอใจสินค้าคืนยังไง" context2 = memory.get_context_for_query(query2, max_items=1) print(f"\nQuery: {query2}\n") print(f"Context:\n{context2}")

สถาปัตยกรรม Memory Module แบบครบวงจร

สำหรับ production system ที่ต้องรองรับ use cases หลากหลาย ผมแนะนำให้ใช้สถาปัตยกรรมแบบ Layered Memory ที่รวมทุกรูปแบบเข้าด้วยกัน

"""
Layered Memory Architecture - รวม Buffer + Summary + Vector เป็นหนึ่งเดียว
สถาปัตยกรรม production-ready สำหรับ AI Agent ทุกประเภท
"""
import requests
from typing import Dict, List, Optional, Any
from dataclasses import dataclass, field
from datetime import datetime
from collections import deque

@dataclass
class MemoryConfig:
    """การตั้งค่าสำหรับ Memory Module"""
    api_key: str
    base_url: str = "https://api.holysheep.ai/v1"
    buffer_size: int = 10
    summary_threshold: int = 8
    vector_top_k: int = 3
    vector_threshold: float = 0.7
    embedding_model: str = "text-embedding-3-small"
    llm_model: str = "gpt-4o-mini"

class HybridMemorySystem:
    """
    ระบบหน่วยความจำแบบลำดับชั้นที่รวม:
    - Buffer: ความจำระยะสั้น (การสนทนาปัจจุบัน)
    - Summary: ความจำสรุป (บริบทย้อนหลัง)
    - Vector: ความจำเวกเตอร์ (ค้นหาตามความหมาย)
    """
    
    def __init__(self, config: MemoryConfig):
        self.config = config
        
        # Layer 1: Buffer Memory
        self.buffer = deque(maxlen=config.buffer_size)
        
        # Layer 2: Summary Memory
        self.summaries: List[Dict] = []
        self.pending_messages: List[Dict] = []
        
        # Layer 3: Vector Memory
        self.vector_store: List[Dict] = []
    
    def _call_llm(self, prompt: str, max_tokens: int = 300) -> str:
        """เรียก HolySheep API สำหรับ LLM operations"""
        response = requests.post(
            f"{self.config.base_url}/chat/completions",
            headers={
                "Authorization": f"Bearer {self.config.api_key}",
                "Content-Type": "application/json"
            },
            json={
                "model": self.config.llm_model,
                "messages": [{"role": "user", "content": prompt}],
                "max_tokens": max_tokens,
                "temperature": 0.3
            }
        )
        return response.json()["choices"][0]["message"]["content"]
    
    def _get_embedding(self, text: str) -> List[float]:
        """สร้าง embedding vector"""
        response = requests.post(
            f"{self.config.base_url}/embeddings",
            headers={
                "Authorization": f"Bearer {self.config.api_key}",
                "Content-Type": "application/json"
            },
            json={
                "model": self.config.embedding_model,
                "input": text
            }
        )
        return response.json()["data"][0]["embedding"]
    
    def add_interaction(self, user_message: str, assistant_message: str, metadata: Dict = None):
        """เพิ่มปฏิสัมพันธ์ใหม่เข้าสู่ทุก layer"""
        timestamp = datetime.now().isoformat()
        
        # Layer 1: เพิ่มลง Buffer
        self.buffer.append({
            "user": user_message,
            "assistant": assistant_message,
            "timestamp": timestamp,
            "metadata": metadata or {}
        })
        
        # Layer 2: เพิ่มลง Pending และสรุปเมื่อครบ threshold
        self.pending_messages.append({"user": user_message, "assistant": assistant_message})
        
        if len(self.pending_messages) >= self.config.summary_threshold:
            self._create_summary()
    
    def _create_summary(self):
        """สร้าง summary จาก pending messages"""
        prompt = f"""สรุปการสนทนาต่อไปนี้เป็นภาษาไทย 2-3 ประโยค:
เฉพาะข้อมูลสำคัญเท่านั้น (ความต้องการ ปัญหา ข้อตกลง)

"""
        for i, msg in enumerate(self.pending_messages, 1):
            prompt += f"{i}. ถาม: {msg['user']}\n   ตอบ: {msg['assistant']}\n"
        
        summary_text = self._call_llm(prompt, max_tokens=150)
        
        self.summaries.append({
            "summary": summary_text,
            "message_count": len(self.pending_messages),
            "created_at": datetime.now().isoformat()
        })
        self.pending_messages = []
    
    def add_to_vector_store(self, content: str, metadata: Dict):
        """เพิ่มข้อมูลลง vector store สำหรับ RAG"""
        embedding = self._get_embedding(content)
        self.vector_store.append({
            "embedding": embedding,
            "content": content,
            "metadata": metadata,
            "created_at": datetime.now().isoformat()
        })
    
    def _semantic_search(self, query: str, top_k: int) -> List[Dict]:
        """ค้นหาแบบ semantic ใน vector store"""
        if not self.vector_store:
            return []
        
        query_embedding = self._get_embedding(query)
        results = []
        
        import numpy as np
        for item in self.vector_store:
            similarity = np.dot(query_embedding, item["embedding"]) / (
                np.linalg.norm(query_embedding) * np.linalg.norm(item["embedding"])
            )
            if similarity >= self.config.vector_threshold:
                results.append({
                    "content": item["content"],
                    "metadata": item["metadata"],
                    "similarity": float(similarity)
                })
        
        results.sort(key=lambda x: x["similarity"], reverse=True)
        return results[:top_k]
    
    def get_context_for_agent(self, current_query: str = "") -> str:
        """สร้าง context string สำหรับส่งให้ Agent"""
        context_parts = []
        
        # 1. Vector search results (ถ้ามี query)
        if current_query:
            vector_results = self._semantic_search(current_query, self.config.vector_top_k)
            if vector_results:
                context_parts.append("## ข้อมูลจากฐานความรู้:")
                for r in vector_results:
                    context_parts.append(f"- {r['content']} (ความเหมือน: {r['similarity']:.2%})")
        
        # 2. Summary memories
        if self.summaries:
            context_parts.append("\n## บริบทจากการสนทนาก่อนหน้า:")
            for s in self.summaries[-3:]:  # เอาแค่ 3 summary ล่าสุด
                context_parts.append(f"- {s['summary']}")
        
        # 3. Recent buffer
        if self.buffer:
            context_parts.append("\n## การสนทนาล่าสุด:")
            for item in list(self.buffer)[-3:]:
                context_parts.append(f"ถาม: {item['user']}")
                context_parts.append(f"ตอบ: {item['assistant']}")
        
        return "\n".join(context_parts) if context_parts else "ไม่มีข้อมูลบริบท"
    
    def get_memory_stats(self) -> Dict:
        """ดึงสถิติหน่วยความจำ"""
        return {
            "buffer_count": len(self.buffer),
            "summary_count": len(self.summaries),
            "vector_store_count": len(self.vector_store),
            "pending_messages": len(self.pending_messages)
        }


========== ตัวอย่างการใช้งานจริง ==========

ตั้งค่า config

config = MemoryConfig( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1", buffer_size=10, summary_threshold=4, # สรุปทุก 4 ข้อความเพื่อ demo vector_top_k=2, vector_threshold=0.6 )

สร้างระบบหน่วยความจำ

memory_system = HybridMemorySystem(config)

เพิ่มข้อมูลสินค้าลง vector store

memory_system.add_to_vector_store( "รองเท้าผ้าใบ Nike Air Max 90 ราคา 5,900 บาท มีสีขาว ดำ และเขียว", {"type": "product", "category": "รองเท้า", "brand": "Nike"} ) memory_system.add_to_vector_store( "นโยบายการส่งสินค้า: สั่งก่อน 14:00 จัดส่งวันเดียว ในกรุงเทพฯ", {"type": "policy", "category": "การจัดส่ง"} )

เพิ่มปฏิสัมพันธ์การสนทนา

interactions = [ ("สวัสดีครับ สนใจรองเท้าวิ่ง", "สวัสดีครับ! ย