ในโลกของ AI ที่เปลี่ยนแปลงอย่างรวดเร็ว การสร้างแชทบอทที่ "จำ" สิ่งที่คุยกันไปและเข้าใจบริบทต่อเนื่องไม่ใช่เรื่องง่าย แต่ Dify ทำให้สิ่งนี้เป็นจริงได้อย่างน่าประทับใจ บทความนี้จะพาคุณเจาะลึกการจัดการ context และ memory ใน Dify พร้อมโค้ดตัวอย่างที่ใช้งานได้จริง
ทำไมการจัดการบริบทถึงสำคัญ?
จากประสบการณ์การพัฒนา AI ลูกค้าสัมพันธ์ให้ร้านค้าออนไลน์ระดับใหญ่ ผมพบว่า 70% ของปัญหาที่ผู้ใช้พบคือบอทไม่ "จำ" สิ่งที่คุยไปก่อนหน้า เช่น ถามเรื่องไซส์เสื้อ แล้วถามต่อว่า "สีนั้นมีไซส์อะไรบ้าง" บอทกลับไม่รู้ว่าถามสีไหน
กรณีศึกษา: ร้านอีคอมเมิร์ซ LnwShop
ร้านค้าเสื้อผ้าออนไลน์ LnwShop ใช้ Dify สร้าง AI ขายของ พบว่าหลังเพิ่ม memory system:
- ยอดขายเพิ่มขึ้น 35% เพราะลูกค้าอยู่ใน conversation ถึง 3-5 รอบ
- อัตราการซื้อสูงขึ้นจาก 12% เป็น 28%
- ลูกค้าถามซ้ำน้อยลง 60%
การตั้งค่า Context Management ใน Dify
1. Conversation Context Settings
ใน Dify Studio ให้ไปที่แถบ "Context" และตั้งค่าดังนี้:
{
"max_context_tokens": 4096,
"history_window": 10,
"memory_strategy": "summary",
"context_mode": "conversation_history"
}
2. Memory Types ที่ Dify รองรับ
Dify มี memory type หลัก 3 แบบ:
- Conversation History — จำประวัติการสนทนาทั้งหมด
- Summary Memory — สรุปจุดสำคัญแล้วจำ
- Entity Memory — จำ entity เฉพาะ เช่น ชื่อลูกค้า ความชอบ
การใช้งานจริง: เชื่อมต่อ Dify กับ HolySheep AI
สำหรับนักพัฒนาที่ต้องการใช้งาน Dify ร่วมกับ HolySheep AI ซึ่งให้บริการ API คุณภาพสูงในราคาที่ประหยัดกว่า 85% เมื่อเทียบกับ OpenAI โดยอัตรา ¥1=$1 ทำให้ต้นทุนต่ำมาก รองรับโมเดลหลากหลายตั้งแต่ GPT-4.1 ($8/MTok), Claude Sonnet 4.5 ($15/MTok), Gemini 2.5 Flash ($2.50/MTok) ไปจนถึง DeepSeek V3.2 ($0.42/MTok) และยังมีเครดิตฟรีเมื่อสมัคร เพียงไปที่ สมัครที่นี่
import requests
import json
class DifyConversationManager:
"""ตัวจัดการการสนทนาหลายรอบพร้อม Context"""
def __init__(self, api_key, user_id):
self.api_key = api_key
self.user_id = user_id
self.base_url = "https://api.holysheep.ai/v1"
self.conversation_history = []
self.max_history = 10
def add_message(self, role, content):
"""เพิ่มข้อความในประวัติการสนทนา"""
self.conversation_history.append({
"role": role,
"content": content
})
# รักษาจำนวนข้อความในประวัติไม่ให้เกิน max_history
if len(self.conversation_history) > self.max_history:
self.conversation_history = self.conversation_history[-self.max_history:]
def build_context_prompt(self, system_prompt):
"""สร้าง prompt พร้อม context ทั้งหมด"""
messages = [{"role": "system", "content": system_prompt}]
messages.extend(self.conversation_history)
return messages
def chat(self, user_message, system_prompt=None):
"""ส่งข้อความพร้อม context ไปยัง API"""
if system_prompt is None:
system_prompt = "คุณเป็นผู้ช่วย AI ที่ใจดี จำบริบทการสนทนาก่อนหน้าเสมอ"
# เพิ่มข้อความผู้ใช้ในประวัติ
self.add_message("user", user_message)
messages = self.build_context_prompt(system_prompt)
response = requests.post(
f"{self.base_url}/chat/completions",
headers={
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
},
json={
"model": "gpt-4.1",
"messages": messages,
"temperature": 0.7,
"max_tokens": 500
}
)
if response.status_code == 200:
result = response.json()
assistant_message = result["choices"][0]["message"]["content"]
# เพิ่มข้อความ assistant ในประวัติ
self.add_message("assistant", assistant_message)
return assistant_message
else:
raise Exception(f"API Error: {response.status_code} - {response.text}")
วิธีใช้งาน
manager = DifyConversationManager(
api_key="YOUR_HOLYSHEEP_API_KEY",
user_id="user_123"
)
รอบที่ 1
response1 = manager.chat("ฉันต้องการซื้อเสื้อสีแดง ไซส์ M")
print(f"AI: {response1}")
รอบที่ 2 - AI จะ "จำ" ว่าผู้ใช้ถามเรื่องเสื้อสีแดง
response2 = manager.chat("สีนั้นมีไซส์อะไรบ้าง?")
print(f"AI: {response2}")
การใช้ Summary Memory สำหรับบริบทยาว
สำหรับการสนทนาที่ยาวมาก การสรุป context จะช่วยประหยัด token ได้มาก:
import hashlib
class SummaryMemoryManager:
"""ระบบ memory แบบสรุปสำหรับบริบทยาว"""
def __init__(self, api_key):
self.api_key = api_key
self.base_url = "https://api.holysheep.ai/v1"
self.summary = ""
self.raw_history = []
self.summary_threshold = 6 # สรุปทุก 6 ข้อความ
def _create_summary(self, messages):
"""สร้าง summary ของข้อความทั้งหมด"""
summary_prompt = f"""จงสรุปบทสนทนาต่อไปนี้เป็นภาษาไทย
โดยเน้น: ความต้องการหลักของผู้ใช้, ข้อมูลสำคัญที่ให้มา, และสิ่งที่ยังต้องติดตาม
ข้อความ: {messages}"""
response = requests.post(
f"{self.base_url}/chat/completions",
headers={
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
},
json={
"model": "gpt-4.1",
"messages": [{"role": "user", "content": summary_prompt}],
"temperature": 0.3
}
)
return response.json()["choices"][0]["message"]["content"]
def add_message(self, role, content):
"""เพิ่มข้อความและสร้าง summary เมื่อถึง threshold"""
self.raw_history.append({"role": role, "content": content})
# เมื่อครบ threshold ให้สร้าง summary ใหม่
if len(self.raw_history) >= self.summary_threshold:
recent_messages = self.raw_history[-self.summary_threshold:]
self.summary = self._create_summary(recent_messages)
# เก็บเฉพาะ summary และข้อความล่าสุด 2 ข้อ
self.raw_history = self.raw_history[-2:]
def get_context(self):
"""ดึง context ทั้งหมดสำหรับส่งให้ API"""
context = [{"role": "system", "content": f"สรุปบทสนทนาก่อนหน้า: {self.summary}"}]
context.extend(self.raw_history)
return context
ทดสอบ
memory = SummaryMemoryManager("YOUR_HOLYSHEEP_API_KEY")
memory.add_message("user", "อยากได้รองเท้าวิ่งสำหรับผู้เริ่มต้น งบ 3000 บาท")
memory.add_message("assistant", "แนะนำรองเท้าวิ่ง Asics Gel-Contend ราคา 2,890 บาท รองรับกระดูกเท้า เหมาะสำหรับผู้เริ่มต้น")
memory.add_message("user", "มีสีอะไรบ้าง")
memory.add_message("assistant", "มีสีดำ น้ำเงิน และเทา")
memory.add_message("user", "สีดำมีไซส์ 8 ไหม")
memory.add_message("assistant", "สีดำมีไซส์ 8 ค่ะ สนใจสั่งซื้อไหมคะ")
เมื่อถึง 6 ข้อความ ระบบจะสร้าง summary อัตโนมัติ
context = memory.get_context()
print(f"จำนวน context: {len(context)} ข้อความ")
print(f"Summary: {memory.summary[:100]}...")
RAG System with Context Awareness
สำหรับองค์กรที่ต้องการเปิดตัวระบบ RAG (Retrieval-Augmented Generation) การเพิ่ม context awareness จะทำให้การค้นหาแม่นยำขึ้นมาก:
from collections import defaultdict
class ContextAwareRAG:
"""ระบบ RAG ที่รู้จักบริบทการสนทนา"""
def __init__(self, api_key):
self.api_key = api_key
self.base_url = "https://api.holysheep.ai/v1"
self.knowledge_base = {}
self.conversation_entities = {} # เก็บ entity ที่พูดถึงในการสนทนา
def extract_entities(self, text):
"""ดึง entity สำคัญจากข้อความ"""
prompt = f"""จงระบุสิ่งที่เกี่ยวข้องกับสินค้า/บริการจากข้อความต่อไปนี้:
รูปแบบ: ชื่อ, ประเภท, รายละเอียด
ข้อความ: {text}
หากไม่มีให้ตอบ "ไม่พบ entity""""
response = requests.post(
f"{self.base_url}/chat/completions",
headers={
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
},
json={
"model": "gpt-4.1",
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.2
}
)
return response.json()["choices"][0]["message"]["content"]
def update_context_entities(self, user_message):
"""อัปเดต entity ที่พูดถึงในการสนทนา"""
entities = self.extract_entities(user_message)
if entities != "ไม่พบ entity":
self.conversation_entities[user_message] = entities
def retrieve_with_context(self, query, top_k=5):
"""ค้นหาข้อมูลโดยคำนึงถึงบริบทการสนทนา"""
# รวม query ปัจจุบันกับ entity จากการสนทนาก่อนหน้า
enhanced_query = query
if self.conversation_entities:
recent_entities = list(self.conversation_entities.values())[-3:]
context_hint = " | Context: " + " ".join(recent_entities)
enhanced_query += context_hint
# ทำ retrieval ใน knowledge base
results = self._vector_search(enhanced_query, top_k)
return results
def _vector_search(self, query, top_k):
"""ค้นหาแบบ vector similarity (สมมติมี vector DB)"""
# สำหรับ demo ใช้ keyword search แทน
results = []
for doc_id, doc in self.knowledge_base.items():
if any(keyword in doc.lower() for keyword in query.split()[:3]):
results.append({"id": doc_id, "content": doc})
return results[:top_k]
def generate_answer(self, query, retrieved_docs):
"""สร้างคำตอบจากเอกสารที่ค้นหาได้"""
context = "\n\n".join([doc["content"] for doc in retrieved_docs])
prompt = f"""อ่านข้อมูลต่อไปนี้และตอบคำถาม:
ข้อมูล: {context}
คำถาม: {query}
ตอบเป็นภาษาไทย กระชับ และเป็นประโยชน์"""
response = requests.post(
f"{self.base_url}/chat/completions",
headers={
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
},
json={
"model": "gpt-4.1",
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.5
}
)
return response.json()["choices"][0]["message"]["content"]
ทดสอบ
rag = ContextAwareRAG("YOUR_HOLYSHEEP_API_KEY")
rag.knowledge_base = {
"prod_001": "Asics Gel-Contend 7 - รองเท้าวิ่งสำหรับผู้เริ่มต้น ราคา 2,890 บาท มีสีดำ น้ำเงิน เทา",
"prod_002": "Asics Gel-Excite 9 - รองเท้าวิ่งสำหรับวิ่งระยะไกล ราคา 3,590 บาท",
"prod_003": "Nike Air Zoom Pegasus 39 - รองเท้าวิ่งทั่วไป ราคา 4,500 บาท"
}
รอบที่ 1
rag.update_context_entities("ฉันต้องการรองเท้าวิ่งสำหรับผู้เริ่มต้น")
docs = rag.retrieve_with_context("มีไซส์ 8 ไหม")
print(f"ค้นหา: {docs}")
รอบที่ 2 - ระบบจะรู้ว่าถามเรื่องรองเท้าวิ่ง
answer = rag.generate_answer("ราคาเท่าไหร่?", docs)
print(f"คำตอบ: {answer}")
ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข
1. ข้อผิดพลาด: "Context window exceeded"
สาเหตุ: ประวัติการสนทนายาวเกิน limit ของโมเดล ทำให้ส่งไปไม่ได้
# ❌ วิธีผิด - ปล่อยให้ history ขึ้นเรื่อยๆ
for message in user_messages:
manager.add_message("user", message)
# ไม่มีการตรวจสอบขนาด
✅ วิธีถูก - ตรวจสอบและสรุป context เมื่อเกิน limit
class SafeConversationManager:
def __init__(self, api_key, max_tokens=3500):
self.api_key = api_key
self.base_url = "https://api.holysheep.ai/v1"
self.conversation_history = []
self.max_tokens = max_tokens
def _estimate_tokens(self, messages):
"""ประมาณ token โดยคร่าว (1 token ≈ 4 characters)"""
total_chars = sum(len(m["content"]) for m in messages)
return total_chars // 4
def add_message(self, role, content):
self.conversation_history.append({"role": role, "content": content})
# ตรวจสอบขนาดทุกครั้ง
while self._estimate_tokens(self.conversation_history) > self.max_tokens:
# ลบข้อความเก่าที่สุด 2 ข้อความ
if len(self.conversation_history) > 4:
self.conversation_history = self.conversation_history[2:]
else:
break # ถ้าเหลือน้อยมากแล้วให้หยุด
def get_context(self):
return self.conversation_history.copy()
2. ข้อผิดพลาด: "Invalid base_url format"
สาเหตุ: URL ไม่ถูกต้องหรือมี trailing slash
# ❌ วิธีผิด
base_url = "https://api.holysheep.ai/v1/" # มี slash ต่อท้าย
base_url = "api.holysheep.ai/v1" # ขาด https://
base_url = "https://api.openai.com/v1" # ผิด API เลย!
✅ วิธีถูก - ตรวจสอบ URL ก่อนใช้งาน
def validate_base_url(url):
"""ตรวจสอบว่า URL ถูกต้อง"""
valid_urls = [
"https://api.holysheep.ai/v1",
]
if not url.startswith("https://"):
raise ValueError("URL ต้องใช้ HTTPS")
if url.endswith("/"):
url = url.rstrip("/")
if url not in valid_urls:
raise ValueError(f"base_url ต้องเป็นหนึ่งใน: {valid_urls}")
return url
ใช้งาน
base_url = validate_base_url("https://api.holysheep.ai/v1")
print(f"✅ base_url ถูกต้อง: {base_url}")
3. ข้อผิดพลาด: Memory สูญหายเมื่อ restart
สาเหตุ: ไม่ได้เก็บ state ของ memory ไว้ พอ server restart ก็หายหมด
import json
import os
from datetime import datetime
class PersistentConversationManager:
"""ระบบ memory ที่เก็บ state ไว้ถาวร"""
def __init__(self, user_id, storage_path="./conversations"):
self.user_id = user_id
self.storage_path = storage_path
self.file_path = os.path.join(storage_path, f"{user_id}.json")
# สร้างโฟลเดอร์ถ้ายังไม่มี
os.makedirs(storage_path, exist_ok=True)
# โหลด state เก่าถ้ามี
self.conversation_history = self._load_state()
self.metadata = self._load_metadata()
def _load_state(self):
"""โหลด state จากไฟล์"""
if os.path.exists(self.file_path):
with open(self.file_path, "r", encoding="utf-8") as f:
data = json.load(f)
print(f"📂 โหลด conversation ของ {self.user_id} ({len(data)} ข้อความ)")
return data
return []
def _load_metadata(self):
"""โหลด metadata"""
meta_path = self.file_path.replace(".json", "_meta.json")
if os.path.exists(meta_path):
with open(meta_path, "r", encoding="utf-8") as f:
return json.load(f)
return {"created_at": datetime.now().isoformat(), "last_updated": None}
def save_state(self):
"""บันทึก state ลงไฟล์"""
with open(self.file_path, "w", encoding="utf-8") as f:
json.dump(self.conversation_history, f, ensure_ascii=False, indent=2)
self.metadata["last_updated"] = datetime.now().isoformat()
meta_path = self.file_path.replace(".json", "_meta.json")
with open(meta_path, "w", encoding="utf-8") as f:
json.dump(self.metadata, f, ensure_ascii=False, indent=2)
print(f"💾 บันทึก conversation ของ {self.user_id} แล้ว")
def add_message(self, role, content):
self.conversation_history.append({
"role": role,
"content": content,
"timestamp": datetime.now().isoformat()
})
self.save_state() # บันทึกทุกครั้งที่เพิ่มข้อความ
ทดสอบ
manager = PersistentConversationManager("user_001")
manager.add_message("user", "สวัสดีครับ")
manager.add_message("assistant", "สวัสดีครับ มีอะไรให้ช่วยไหมครับ?")
พอ restart และสร้าง object ใหม่ ข้อมูลจะยังอยู่
print(f"ข้อความที่โหลดได้: {len(manager.conversation_history)} ข้อความ")
4. ข้อผิดพลาด: Token usage สูงผิดปกติ
สาเหตุ: ส่ง system prompt ซ้ำทุกข้อความโดยไม่จำเป็น
# ❌ วิธีผิด - ส่ง system ซ้ำทุกครั้ง
def chat_bad(api_key, message, history):
messages = [
{"role": "system", "content": "คุณเป็น AI ผู้ช่วย..."} # ซ้ำทุกครั้ง!
]
for h in history:
messages.append(h)
messages.append({"role": "user", "content": message})
return call_api(api_key, messages)
✅ วิธีถูก - ส่ง system prompt แค่ครั้งเดียว
class TokenOptimizedManager:
def __init__(self, api_key, system_prompt):
self.api_key = api_key
self.base_url = "https://api.holysheep.ai/v1"
# System prompt เก็บไว้ที่ตัว manager ไม่ต้องส่งทุกครั้ง
self.system_prompt = system_prompt
self.conversation_history = []
self.total_tokens_saved = 0
def chat(self, user_message):
# ไม่ต้องใส่ system prompt ซ้ำ
messages = [{"role": "system", "content": self.system_prompt}]
messages.extend(self.conversation_history)
messages.append({"role": "user", "content": user_message})
response = call_api(self.api_key, messages)
# เก็บ history โดยไม่รวม system
self.conversation_history.append({"role": "user", "content": user_message})
self.conversation_history.append({"role": "assistant", "content": response})
# ประมาณ token ที่ประหยัดได้
self.total_tokens_saved += len(self.system_prompt) // 4
print(f"💰 ประหยัดไปแล้ว ~{self.total_tokens_saved} tokens")
return response
สรุป
การจัดการ context และ memory ใน Dify เป็นหัวใจสำคัญของการสร้าง AI ที่ใช้งานได้จริงในเชิงธุรกิจ หลักการสำคัญคือ:
- จำประวัติอย่างชาญฉลาด — ใช้ sliding window หรือ summary เพื่อไม่ให้ context ล้น
- เก็บ state ถาวร — ใช้ database หรือ file