{"chat_id": "article_agent_memory_system"}
ระบบความจำระยะยาวสำหรับ AI Agent: การผสมผสาน Vector Database กับ Knowledge Graph
ในโลกของ AI Agent ที่ทำงานอัตโนมัติ หนึ่งในความท้าทายที่สำคัญที่สุดคือ **"Agent จะจดจำข้อมูลที่เคยประมวลผลไปแล้วได้อย่างไร?"** เพราะตามธรรมชาติแล้ว AI จะไม่มีความจำระหว่างการสนทนาแต่ละครั้ง บทความนี้จะพาคุณสร้างระบบความจำระยะยาวที่ทรงพลังโดยใช้เทคโนโลยีสองตัวร่วมกัน
ทำไม AI Agent ถึงต้องการความจำระยะยาว?
ลองนึกภาพว่าคุณมี Assistant ทำงานให้คุณทุกวัน วันแรกมันช่วยคุณจัดงาน วันที่สองมันต้องรู้ว่างานที่ค้างอยู่คืออะไร วันที่สามต้องเข้าใจบริบททั้งหมดที่เคย Discuss มา นี่คือสิ่งที่ระบบความจำระยะยาวต้องทำให้
┌─────────────────────────────────────────────────────────┐
│ AI Agent Memory System │
├─────────────────────────────────────────────────────────┤
│ │
│ Session 1 ──► จำได้ว่าผู้ใช้ชื่อ "สมชาย" │
│ │ │
│ ▼ │
│ Session 2 ──► จำได้ว่าสมชายชอบกาแฟเย็น │
│ │ │
│ ▼ │
│ Session 3 ──► รู้ว่าต้องสั่งกาแฟเย็นให้สมชาย │
│ │
└─────────────────────────────────────────────────────────┘
Vector Database คืออะไร? ทำงานอย่างไร?
Vector Database เปรียบเสมือน "ห้องสมุดที่จำรูปแบบความหมายได้" แทนที่จะเก็บข้อความตรงๆ มันจะแปลงข้อความเป็นตัวเลขหลายตัว (เรียกว่า Vector) ที่แทนความหมาย
**ข้อดี:** ค้นหาข้อมูลที่มีความหมายคล้ายกันได้รวดเร็ว แม้คำที่ใช้ไม่ตรงกัน
**ตัวอย่างเช่น:** ถามว่า "ราคาหุ้น Apple" แล้วระบบก็เจอข้อมูลที่พูดถึง "AAPL stock price" ได้ เพราะมันเข้าใจว่าทั้งสองมีความหมายใกล้เคียงกัน
Knowledge Graph คืออะไร?
Knowledge Graph เปรียบเสมือน "แผนที่ความสัมพันธ์" ที่แสดงว่าสิ่งต่างๆ เชื่อมโยงกันอย่างไร
[บริษัท]
│
┌────┼────┐
│ │ │
[CEO] [พนักงาน] [สินค้า]
│ │
[ชื่อ] [ราคา]
**ข้อดี:** เข้าใจความสัมพันธ์ชัดเจน ตอบคำถามเชิงตรรกะได้ดี เช่น "CEO ของบริษัทนี้มีอายุเท่าไหร่?" หรือ "สินค้าของบริษัทราคาเท่าไหร่?"
ทำไมต้องใช้ทั้งสองแบบผสมกัน?
จากประสบการณ์การพัฒนา AI Agent หลายตัว พบว่าแต่ละแบบมีจุดแข็งต่างกัน
| ความสามารถ | Vector Database | Knowledge Graph |
|------------|-----------------|-----------------|
| ค้นหาตามความหมาย | ✅ เยี่ยมมาก | ⚠️ พอได้ |
| เข้าใจความสัมพันธ์ | ⚠️ พอได้ | ✅ เยี่ยมมาก |
| ความเร็วในการค้นหา | ✅ เร็วมาก | ⚠️ ช้ากว่า |
| เหมาะกับข้อมูลประเภท | ข้อความ, เอกสาร | โครงสร้าง, ความสัมพันธ์ |
**การผสมผสานทำให้ได้ทั้งสองโลก:** Vector ใช้ค้นหาเนื้อหาที่เกี่ยวข้อง ส่วน Graph ใช้เข้าใจความสัมพันธ์ระหว่างข้อมูล
ขั้นตอนที่ 1: เตรียม API Key จาก HolySheep AI
ก่อนเริ่มต้นเขียนโค้ด คุณต้องมี API Key ก่อน ซึ่งผมแนะนำให้ใช้บริการของ **HolyShehe AI** เพราะมีข้อดีหลายอย่าง:
- อัตราเฉลี่ย $1 ต่อ ¥1 ประหยัดกว่า 85% เมื่อเทียบกับบริการอื่น
- รองรับ WeChat และ Alipay สำหรับผู้ใช้ในประเทศจีน
- ความหน่วงต่ำกว่า 50 มิลลิวินาที
- ราคาเข้าถึงได้: DeepSeek V3.2 เพียง $0.42/MTok
- รับเครดิตฟรีเมื่อลงทะเบียน
สมัครที่นี่ เพื่อรับ API Key ฟรี
ขั้นตอนที่ 2: ติดตั้งเครื่องมือที่จำเป็น
สำหรับผู้เริ่มต้น ผมจะใช้ Python ซึ่งเป็นภาษาที่เข้าใจง่ายที่สุด คุณต้องติดตั้ง Package ดังนี้:
bash
เปิด Terminal หรือ Command Prompt แล้วพิมพ์คำสั่งนี้
pip install openai faiss-cpu networkx matplotlib requests numpy
**คำอธิบายแต่ละ Package:**
- **openai** - ใช้เรียก API สำหรับสร้าง Vector
- **faiss-cpu** - ฐานข้อมูล Vector (ฟรี, ใช้ CPU)
- **networkx** - สร้างและจัดการ Knowledge Graph
- **matplotlib** - แสดงภาพ Graph
- **requests** - เรียก HTTP API
- **numpy** - คำนวณตัวเลข
ขั้นตอนที่ 3: เชื่อมต่อ HolySheep API
สร้างไฟล์ใหม่ชื่อ memory_system.py แล้วเขียนโค้ดสำหรับเชื่อมต่อ API:
python
import os
import requests
import numpy as np
============================================
ตั้งค่า API Key จาก HolySheep AI
============================================
HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY" # แทนที่ด้วย API Key ของคุณ
BASE_URL = "https://api.holysheep.ai/v1"
def get_embedding(text):
"""
สร้าง Vector จากข้อความโดยใช้ HolySheep API
Vector คือตัวเลขหลายตัวที่แทนความหมายของข้อความ
"""
url = f"{BASE_URL}/embeddings"
headers = {
"Authorization": f"Bearer {HOLYSHEEP_API_KEY}",
"Content-Type": "application/json"
}
data = {
"input": text,
"model": "text-embedding-3-small" # โมเดลสร้าง Vector
}
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
result = response.json()
return np.array(result["data"][0]["embedding"])
else:
print(f"เกิดข้อผิดพลาด: {response.status_code}")
print(response.text)
return None
ทดสอบการเชื่อมต่อ
if __name__ == "__main__":
test_text = "สวัสดีครับ ผมชื่อสมชาย"
vector = get_embedding(test_text)
if vector is not None:
print(f"สร้าง Vector สำเร็จ! ขนาด: {len(vector)} มิติ")
print(f"ค่า 5 มิติแรก: {vector[:5]}")
**วิธีการรัน:**
1. เปิด Terminal
2. ไปที่โฟลเดอร์ที่เก็บไฟล์
3. พิมพ์ python memory_system.py
**ผลลัพธ์ที่คาดหวัง:**
สร้าง Vector สำเร็จ! ขนาด: 1536 มิติ
ค่า 5 มิติแรก: [0.0231, -0.0452, 0.0891, ...]
ขั้นตอนที่ 4: สร้างระบบความจำแบบ Vector
ต่อไปเราจะสร้างคลาสสำหรับจัดการ Vector Database:
python
import faiss
import json
from datetime import datetime
from typing import List, Dict, Tuple
class VectorMemory:
"""
ระบบความจำแบบ Vector - เก็บข้อมูลและค้นหาตามความหมาย
"""
def __init__(self, dimension: int = 1536):
"""
สร้าง Vector Database ใหม่
Args:
dimension: จำนวนมิติของ Vector (1536 คือค่ามาตรฐาน)
"""
self.dimension = dimension
# สร้าง Index สำหรับค้นหาแบบเร็ว
self.index = faiss.IndexFlatL2(dimension)
# เก็บข้อมูลต้นฉบับและ Metadata
self.memories = []
self.vectors = np.zeros((0, dimension), dtype=np.float32)
def add_memory(self, text: str, metadata: Dict = None):
"""
เพิ่มข้อมูลเข้าสู่ความจำ
Args:
text: ข้อความที่ต้องการจำ
metadata: ข้อมูลเพิ่มเติม เช่น เวลา, หมวดหมู่
"""
# สร้าง Vector จากข้อความ
vector = get_embedding(text)
if vector is None:
return False
# เพิ่ม Vector เข้า Index
vector = vector.reshape(1, -1).astype(np.float32)
self.index.add(vector)
# เก็บข้อมูลต้นฉบับ
memory_data = {
"text": text,
"metadata": metadata or {},
"timestamp": datetime.now().isoformat()
}
self.memories.append(memory_data)
return True
def search(self, query: str, top_k: int = 5) -> List[Dict]:
"""
ค้นหาข้อมูลที่เกี่ยวข้องกับ Query
Args:
query: คำถามหรือข้อความที่ต้องการค้นหา
top_k: จำนวนผลลัพธ์ที่ต้องการ
Returns:
รายการข้อมูลที่เกี่ยวข้องพร้อมคะแนนความใกล้เคียง
"""
# สร้าง Vector จาก Query
query_vector = get_embedding(query)
query_vector = query_vector.reshape(1, -1).astype(np.float32)
# ค้นหา K ผลลัพธ์ที่ใกล้เคียงที่สุด
distances, indices = self.index.search(query_vector, min(top_k, len(self.memories)))
# รวบรวมผลลัพธ์
results = []
for i, idx in enumerate(indices[0]):
if idx < len(self.memories):
result = {
**self.memories[idx],
"similarity_score": float(1 / (1 + distances[0][i])) # แปลงระยะทางเป็นคะแนนความใกล้เคียง
}
results.append(result)
return results
ทดสอบระบบ
if __name__ == "__main__":
memory = VectorMemory()
# เพิ่มข้อมูลหลายอย่าง
memory.add_memory(
"ผู้ใช้ชื่อ สมชาย ทำงานที่บริษัท ABC",
{"type": "user_info"}
)
memory.add_memory(
"สมชายชอบกาแฟเย็น ไม่ใส่น้ำตาล",
{"type": "preference"}
)
memory.add_memory(
"สมชายมีประชุมทุกวันจันทร์ เวลา 10:00 น.",
{"type": "schedule"}
)
print("เพิ่มข้อมูลสำเร็จ!")
# ค้นหาข้อมูล
results = memory.search("สมชายชอบอะไรดื่ม?")
print("\nผลการค้นหา:")
for r in results:
print(f"- {r['text']} (คะแนน: {r['similarity_score']:.2f})")
ขั้นตอนที่ 5: สร้าง Knowledge Graph สำหรับความสัมพันธ์
ตอนนี้เราจะสร้างส่วนที่จัดการความสัมพันธ์ระหว่างข้อมูล:
python
import networkx as nx
import matplotlib.pyplot as plt
class KnowledgeGraph:
"""
ระบบ Knowledge Graph - เก็บความสัมพันธ์ระหว่างข้อมูล
โครงสร้าง: [โหนด] --[ความสัมพันธ์]--> [โหนด]
ตัวอย่าง: สมชาย --is_a--> พนักงาน
สมชาย --works_at--> บริษัท ABC
"""
def __init__(self):
"""สร้าง Graph ว่างเปล่า"""
self.graph = nx.DiGraph()
def add_entity(self, entity_id: str, entity_type: str, properties: Dict = None):
"""
เพิ่ม Entity (สิ่งของ/บุคคล) เข้าสู่ Graph
แหล่งข้อมูลที่เกี่ยวข้อง
บทความที่เกี่ยวข้อง