ในโลกของการพัฒนา AI Application การจัดการ Context ที่มีประสิทธิภาพเป็นหัวใจสำคัญของการสร้าง Chatbot และ Assistant ที่แม่นยำ วันนี้เราจะมาเจาะลึกเทคนิค MCP Resource และ Prompt Template ที่จะช่วยให้คุณสร้างระบบ Context Management ที่ทรงพลังและประหยัดค่าใช้จ่ายได้อย่างมาก
ตารางเปรียบเทียบบริการ AI API
| เกณฑ์ | HolySheep AI | API อย่างเป็นทางการ | บริการรีเลย์อื่นๆ |
|---|---|---|---|
| อัตราแลกเปลี่ยน | ¥1 = $1 (ประหยัด 85%+) | ราคาเต็ม USD | มี Markup 10-30% |
| วิธีการชำระเงิน | WeChat/Alipay, บัตร | บัตรเครดิตระหว่างประเทศ | จำกัดเฉพาะบางภูมิภาค |
| ความหน่วง (Latency) | <50ms | 50-150ms | 100-300ms |
| เครดิตฟรี | ✅ มีเมื่อลงทะเบียน | ไม่มี | บางที่มี |
| GPT-4.1 | $8/MTok | $60/MTok | $45-55/MTok |
| Claude Sonnet 4.5 | $15/MTok | $18/MTok | $16-20/MTok |
| Gemini 2.5 Flash | $2.50/MTok | $3.50/MTok | $3-5/MTok |
| DeepSeek V3.2 | $0.42/MTok | $0.55/MTok | $0.50-0.70/MTok |
MCP Resource คืออะไร?
MCP (Model Context Protocol) Resource เป็นกลไกที่ช่วยให้ AI เข้าถึงข้อมูลภายนอกได้อย่างมีประสิทธิภาพ แทนที่จะต้องยัดข้อมูลทั้งหมดเข้าไปใน Prompt ทุกครั้ง Resource ช่วยให้เราจัดการ Context อย่างเป็นระบบ ลด Token usage และเพิ่มความเร็วในการตอบสนอง
Prompt Template: โครงสร้างพื้นฐาน
Prompt Template คือรูปแบบมาตรฐานของ Prompt ที่สามารถนำกลับมาใช้ใหม่ได้ การใช้ Template ช่วยให้:
- ความสม่ำเสมอของการตอบสนอง
- การจัดการ Context ที่เป็นระบบ
- การ Debug และปรับปรุงได้ง่าย
- การใช้งานร่วมกับ MCP Resource อย่างลงตัว
การตั้งค่า Environment และ Library
ก่อนเริ่มต้น ติดตั้ง Library ที่จำเป็นและตั้งค่า API Key:
# ติดตั้ง OpenAI SDK
pip install openai
ตั้งค่า Environment Variable
export HOLYSHEEP_API_KEY="YOUR_HOLYSHEEP_API_KEY"
หรือสร้างไฟล์ .env
HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY
การสร้าง MCP Resource Handler
นี่คือตัวอย่างการสร้างระบบ MCP Resource ที่เชื่อมต่อกับ HolySheep AI:
from openai import OpenAI
from typing import Dict, Any, List, Optional
import json
class MCPResourceHandler:
"""ตัวจัดการ MCP Resource สำหรับ Context Management"""
def __init__(self, api_key: str):
self.client = OpenAI(
api_key=api_key,
base_url="https://api.holysheep.ai/v1"
)
self.resources: Dict[str, Any] = {}
self.conversation_history: List[Dict[str, str]] = []
def register_resource(self, name: str, data: Any, metadata: Optional[Dict] = None):
"""ลงทะเบียน Resource ใหม่"""
self.resources[name] = {
"data": data,
"metadata": metadata or {},
"type": type(data).__name__
}
print(f"✅ ลงทะเบียน Resource: {name}")
def get_resource(self, name: str) -> Optional[Any]:
"""ดึงข้อมูลจาก Resource"""
if name in self.resources:
return self.resources[name]["data"]
return None
def create_prompt_from_template(
self,
template: str,
context: Dict[str, Any]
) -> str:
"""สร้าง Prompt จาก Template"""
prompt = template
for key, value in context.items():
placeholder = f"{{{{{key}}}}}"
if placeholder in prompt:
prompt = prompt.replace(placeholder, str(value))
return prompt
def chat(self, message: str, system_prompt: str = "") -> str:
"""ส่งข้อความและรับการตอบสนอง"""
self.conversation_history.append({"role": "user", "content": message})
# สร้าง Context จาก Resources
resources_context = ""
if self.resources:
resources_context = "\n\n📚 ข้อมูลจาก Resources:\n"
for name, resource in self.resources.items():
resources_context += f"- {name}: {resource['data']}\n"
full_system = system_prompt + resources_context
response = self.client.chat.completions.create(
model="gpt-4.1",
messages=[
{"role": "system", "content": full_system},
*self.conversation_history
],
temperature=0.7,
max_tokens=1000
)
assistant_message = response.choices[0].message.content
self.conversation_history.append({"role": "assistant", "content": assistant_message})
return assistant_message
ตัวอย่างการใช้งาน
handler = MCPResourceHandler(api_key="YOUR_HOLYSHEEP_API_KEY")
ลงทะเบียน Resources
handler.register_resource(
"product_catalog",
"สินค้า: กาแฟพิเศษ, ราคา 150 บาท, สต็อก: 50 ชิ้น",
{"category": "เครื่องดื่ม"}
)
handler.register_resource(
"store_policy",
"นโยบาย: ส่งฟรีเมื่อซื้อเกิน 500 บาท, คืนสินค้าภายใน 7 วัน",
{"type": "policy"}
)
สร้าง Template และส่งข้อความ
response = handler.chat(
message="มีกาแฟพิเศษกี่ชิ้น และถ้าซื้อ 5 ชิ้นต้องจ่ายเท่าไหร่?",
system_prompt="คุณเป็นผู้ช่วยขายสินค้าที่ให้ข้อมูลแม่นยำจาก Resource ที่มี"
)
print(f"🤖 คำตอบ: {response}")
Advanced Prompt Template พร้อม Variables
นี่คือระบบ Prompt Template ขั้นสูงที่รองรับ Variables และ Conditional Logic:
from dataclasses import dataclass
from typing import Dict, List, Callable, Any
import re
@dataclass
class PromptVariable:
name: str
default: Any = None
required: bool = False
validator: Callable[[Any], bool] = None
class PromptTemplate:
"""Template Engine สำหรับสร้าง Prompt แบบ Dynamic"""
def __init__(self, template: str):
self.template = template
self.variables: Dict[str, PromptVariable] = {}
self._parse_variables()
def _parse_variables(self):
"""แยกวิเคราะห์ Variables จาก Template"""
pattern = r'\{\{(\w+)(?::([^}]+))?\}\}'
matches = re.findall(pattern, self.template)
for var_name, default_value in matches:
if var_name not in self.variables:
self.variables[var_name] = PromptVariable(
name=var_name,
default=default_value if default_value else None,
required=(default_value is None)
)
def add_variable(
self,
name: str,
default: Any = None,
required: bool = True,
validator: Callable[[Any], bool] = None
):
"""เพิ่ม Variable พร้อม Validation"""
self.variables[name] = PromptVariable(
name=name,
default=default,
required=required,
validator=validator
)
def render(self, context: Dict[str, Any]) -> str:
"""Render Template พร้อม Validation"""
missing = []
invalid = []
for var_name, var_info in self.variables.items():
value = context.get(var_name, var_info.default)
if value is None and var_info.required:
missing.append(var_name)
continue
if var_info.validator and value is not None:
if not var_info.validator(value):
invalid.append(var_name)
if value is not None:
placeholder = f"{{{{{var_name}}}}}"
self.template = self.template.replace(placeholder, str(value))
if missing:
raise ValueError(f"Missing required variables: {', '.join(missing)}")
if invalid:
raise ValueError(f"Invalid values for: {', '.join(invalid)}")
return self.template
def get_required_variables(self) -> List[str]:
"""ดึงรายชื่อ Variables ที่จำเป็น"""
return [
name for name, var in self.variables.items()
if var.required
]
ตัวอย่างการใช้งาน Template Engine
customer_service_template = PromptTemplate("""
สวัสดีครับ {{customer_name}}!
ผมเห็นว่าคุณสนใจสินค้า "{{product_name}}"
ราคา {{price}} บาท ครับ
{{#if has_discount}}
🎉 ข่าวดี! วันนี้มีส่วนลด {{discount_percent}}%
ราคาพิเศษ: {{final_price}} บาท
{{/if}}
{{#if in_stock}}
✅ สินค้ามีพร้อมส่ง จำนวน {{stock_quantity}} ชิ้น
{{else}}
❌ สินค้าหมดสต็อก สั่งจองล่วงหน้าได้นะครับ
{{/if}}
มีสิ่งที่อยากถามเพิ่มเติมไหมครับ? 😊
""")
เพิ่ม Variable พร้อม Validator
customer_service_template.add_variable(
"price",
required=True,
validator=lambda x: isinstance(x, (int, float)) and x > 0
)
customer_service_template.add_variable(
"stock_quantity",
default=0,
required=False
)
Render ด้วย Context
context = {
"customer_name": "สมชาย",
"product_name": "กาแฟสดจากดอย",
"price": 299,
"discount_percent": 20,
"final_price": 239,
"in_stock": True,
"stock_quantity": 15
}
rendered_prompt = customer_service_template.render(context)
print(rendered_prompt)
Context Management สำหรับ Multi-Turn Conversation
การจัดการ Context ในบทสนทนายาวต้องมี стратегия ที่ดี นี่คือระบบ Context Manager ที่ช่วยจัดการ Token และ Memory:
import tiktoken
from collections import deque
from typing import List, Dict, Tuple
class ContextManager:
"""จัดการ Context และ Token อย่างมีประสิทธิภาพ"""
def __init__(self, max_tokens: int = 8000, model: str = "gpt-4.1"):
self.max_tokens = max_tokens
self.model = model
try:
self.encoder = tiktoken.encoding_for_model(model)
except:
self.encoder = tiktoken.get_encoding("cl100k_base")
self.messages: deque = deque()
self.system_prompt: str = ""
self.resources_summary: str = ""
def count_tokens(self, text: str) -> int:
"""นับจำนวน Token"""
return len(self.encoder.encode(text))
def add_message(self, role: str, content: str):
"""เพิ่มข้อความในบทสนทนา"""
self.messages.append({
"role": role,
"content": content,
"tokens": self.count_tokens(content)
})
self._optimize_context()
def set_system_prompt(self, prompt: str):
"""ตั้งค่า System Prompt"""
self.system_prompt = prompt
def set_resources(self, resources: List[str]):
"""กำหนด Summary ของ Resources"""
self.resources_summary = "\n".join([f"• {r}" for r in resources])
def _optimize_context(self):
"""Optimize Context โดยตัดข้อความเก่าทิ้ง"""
total_tokens = self.count_tokens(self.system_prompt)
total_tokens += self.count_tokens(self.resources_summary)
# คำนวณ Token ของทุกข้อความ
for msg in self.messages:
total_tokens += msg["tokens"]
# ตัดข้อความเก่าทิ้งจนกว่าจะอยู่ใน Limit
while total_tokens > self.max_tokens and len(self.messages) > 1:
removed = self.messages.popleft()
total_tokens -= removed["tokens"]
def get_messages(self) -> List[Dict[str, str]]:
"""ดึงรายการข้อความทั้งหมดสำหรับส่งให้ API"""
messages = []
# System Prompt
system_content = self.system_prompt
if self.resources_summary:
system_content += f"\n\n📚 ข้อมูลอ้างอิง:\n{self.resources_summary}"
if system_content.strip():
messages.append({"role": "system", "content": system_content})
# Conversation History
messages.extend([
{"role": msg["role"], "content": msg["content"]}
for msg in self.messages