ในฐานะนักพัฒนาที่ทำงานกับ LLM มาหลายปี ผมพบว่าการจัดการ context ใน multi-turn conversation เป็นหัวใจสำคัญของการสร้างแชทบอทที่มีประสิทธิภาพ วันนี้ผมจะมาแชร์ประสบการณ์การใช้งาน ConversationBufferMemory จาก LangChain ร่วมกับ HolySheep AI ที่ช่วยให้ประหยัดค่าใช้จ่ายได้มากกว่า 85% เมื่อเทียบกับการใช้ API ทางการ
บทความนี้เหมาะกับใคร
- นักพัฒนา Python ที่ต้องการสร้างแชทบอทแบบ context-aware
- ผู้ที่ต้องการประหยัดค่าใช้จ่ายในการเรียก LLM API
- ทีมงานที่ต้องการ implement multi-turn conversation ในโปรเจกต์
- ผู้เริ่มต้นศึกษา LangChain และ memory management
สรุปคำตอบ: ConversationBufferMemory คืออะไร
ConversationBufferMemory เป็น class ใน LangChain ที่ใช้เก็บประวัติการสนทนาทั้งหมดในรูปแบบ "buffer" (หน่วยความจำชั่วคราว) โดยจะเก็บ message ทุกข้อความไว้ทั้งหมดแล้วส่งให้ LLM ทุกครั้งที่มีการสนทนาใหม่ ทำให้ model สามารถ "จำ" สิ่งที่คุยกันก่อนหน้าได้
ข้อดีของ ConversationBufferMemory
- ใช้งานง่าย เพียง import และสร้าง instance
- เก็บข้อมูลครบถ้วน ไม่มีการ compress หรือ summarize
- เหมาะกับการสนทนาที่มีจำนวนรอบน้อย (ไม่เกิน 5-10 รอบ)
- ดีบักง่าย เพราะเห็น context ทั้งหมดชัดเจน
ข้อจำกัดที่ต้องรู้
- Token usage สูงขึ้นเรื่อยๆ ตามจำนวนรอบการสนทนา
- ไม่เหมาะกับ long conversation (ควรใช้ ConversationSummaryMemory แทน)
- ต้นทุนต่อ conversation สูงกว่าวิธีอื่น
ตารางเปรียบเทียบผู้ให้บริการ LLM API
| ผู้ให้บริการ | ราคา GPT-4.1 ($/MTok) | ราคา Claude Sonnet 4.5 ($/MTok) | ราคา Gemini 2.5 Flash ($/MTok) | ราคา DeepSeek V3.2 ($/MTok) | ความหน่วง (Latency) | วิธีชำระเงิน | เหมาะกับทีม |
|---|---|---|---|---|---|---|---|
| HolySheep AI | $8.00 | $15.00 | $2.50 | $0.42 | <50ms | WeChat, Alipay | ทีม startup, indie developer |
| OpenAI API ทางการ | $60.00 | ไม่มี | $1.25 | ไม่มี | 100-300ms | บัตรเครดิต | องค์กรใหญ่ |
| Anthropic API ทางการ | ไม่มี | $45.00 | ไม่มี | ไม่มี | 150-400ms | บัตรเครดิต | องค์กรที่ต้องการ Claude โดยเฉพาะ |
| Google AI Studio | ไม่มี | ไม่มี | $1.25 | ไม่มี | 80-200ms | บัตรเครดิต | ทีมที่ใช้ Google ecosystem |
หมายเหตุ: อัตราแลกเปลี่ยน HolySheep ¥1=$1 ทำให้ประหยัดได้มากกว่า 85% เมื่อเทียบกับ API ทางการ นอกจากนี้ยังรองรับ WeChat/Alipay ที่คนไทยที่ทำงานกับทีมจีนใช้ได้สะดวก
การติดตั้งและ Setup
ก่อนจะเริ่มเขียนโค้ด ต้องติดตั้ง package ที่จำเป็นก่อน:
pip install langchain langchain-community langchain-openai python-dotenv
จากนั้นสร้างไฟล์ .env เพื่อเก็บ API key:
# ไฟล์ .env
HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY
โค้ดตัวอย่างที่ 1: Basic ConversationBufferMemory
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
โหลด environment variables
load_dotenv()
ตั้งค่า HolySheep AI เป็น base_url
os.environ["OPENAI_API_BASE"] = "https://api.holysheep.ai/v1"
os.environ["OPENAI_API_KEY"] = os.getenv("HOLYSHEEP_API_KEY")
สร้าง LLM instance ด้วย GPT-4.1
llm = ChatOpenAI(
model="gpt-4.1",
temperature=0.7,
max_tokens=500
)
สร้าง ConversationBufferMemory
memory = ConversationBufferMemory(
memory_key="history", # ชื่อ key ที่จะใช้ใน prompt
return_messages=True # คืนค่าเป็น message objects
)
สร้าง ConversationChain
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)
ทดสอบการสนทนาหลายรอบ
print("=== รอบที่ 1 ===")
response1 = conversation.predict(input="สวัสดีครับ ผมชื่อนนท์")
print(f"Bot: {response1}")
print("\n=== รอบที่ 2 ===")
response2 = conversation.predict(input="ผมเคยบอกชื่อผมไปแล้วใช่ไหม?")
print(f"Bot: {response2}")
print("\n=== รอบที่ 3 ===")
response3 = conversation.predict(input="ชื่อผมอะไรนะ?")
print(f"Bot: {response3}")
ดูประวัติการสนทนาที่เก็บไว้
print("\n=== ประวัติการสนทนา ===")
print(memory.chat_memory.messages)
โค้ดตัวอย่างที่ 2: ConversationBufferMemory กับ Chain
ตัวอย่างนี้จะเป็นการสร้าง chatbot ที่สามารถจำข้อมูลผู้ใช้ได้ตลอดการสนทนา:
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.schema import SystemMessage
โหลด environment variables
load_dotenv()
ตั้งค่า HolySheep AI
os.environ["OPENAI_API_BASE"] = "https://api.holysheep.ai/v1"
os.environ["OPENAI_API_KEY"] = os.getenv("HOLYSHEEP_API_KEY")
สร้าง LLM instance ด้วย Claude Sonnet 4.5
llm = ChatOpenAI(
model="claude-sonnet-4.5",
temperature=0.8,
base_url="https://api.holysheep.ai/v1",
api_key=os.getenv("HOLYSHEEP_API_KEY")
)
กำหนด prompt template
prompt = ChatPromptTemplate.from_messages([
SystemMessage(content="คุณเป็นผู้ช่วย AI ที่เป็นมิตร ชื่อ หนิงหนิง คุณจะช่วยเหลือผู้ใช้ในเรื่องต่างๆ และจำข้อมูลที่ผู้ใช้บอกได้"),
MessagesPlaceholder(variable_name="history"),
("human", "{input}")
])
สร้าง memory
memory = ConversationBufferMemory(
memory_key="history",
return_messages=True,
output_key="response" # ระบุ output key
)
สร้าง LLMChain
chain = LLMChain(
llm=llm,
prompt=prompt,
memory=memory,
verbose=True
)
ฟังก์ชันสำหรับสนทนา
def chat_with_memory(user_input):
response = chain.run(input=user_input)
return response
ทดสอบการใช้งาน
print("เริ่มสนทนากับ หนิงหนิง...")
print("=" * 50)
questions = [
"ฉันชอบกินผลไม้ โดยเฉพาะมะม่วง",
"จำได้ไหมว่าฉันชอบกินอะไร?",
"แนะนำเมนูอาหารที่เหมาะกับฉันหน่อยสิ"
]
for i, q in enumerate(questions, 1):
print(f"\nคำถามที่ {i}: {q}")
answer = chat_with_memory(q)
print(f"ตอบ: {answer}")
แสดงจำนวน tokens ที่ใช้
print(f"\nจำนวน messages ใน memory: {len(memory.chat_memory.messages)}")
โค้ดตัวอย่างที่ 3: Save และ Load Memory
ในการใช้งานจริง คุณอาจต้องการ save memory เพื่อใช้งานต่อภายหลัง:
import os
import json
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain.schema import HumanMessage, AIMessage
โหลด environment variables
load_dotenv()
ตั้งค่า HolySheep AI
os.environ["OPENAI_API_BASE"] = "https://api.holysheep.ai/v1"
os.environ["OPENAI_API_KEY"] = os.getenv("HOLYSHEEP_API_KEY")
สร้าง LLM
llm = ChatOpenAI(
model="deepseek-v3.2",
temperature=0.7,
base_url="https://api.holysheep.ai/v1",
api_key=os.getenv("HOLYSHEEP_API_KEY")
)
สร้าง memory
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
เพิ่มข้อมูลตัวอย่าง
memory.chat_memory.add_user_message("สวัสดีครับ")
memory.chat_memory.add_ai_message("สวัสดีครับ มีอะไรให้ช่วยไหมคะ?")
วิธีที่ 1: Save memory เป็น dict
def save_memory(memory, filepath="memory.json"):
"""บันทึก memory เป็น JSON file"""
messages = []
for msg in memory.chat_memory.messages:
if isinstance(msg, HumanMessage):
messages.append({"type": "human", "content": msg.content})
elif isinstance(msg, AIMessage):
messages.append({"type": "ai", "content": msg.content})
with open(filepath, "w", encoding="utf-8") as f:
json.dump({"messages": messages}, f, ensure_ascii=False, indent=2)
print(f"✅ บันทึก memory ไปที่ {filepath} สำเร็จ")
วิธีที่ 2: Load memory จาก dict
def load_memory(memory, filepath="memory.json"):
"""โหลด memory จาก JSON file"""
if not os.path.exists(filepath):
print("❌ ไม่พบไฟล์ memory")
return memory
with open(filepath, "r", encoding="utf-8") as f:
data = json.load(f)
# ล้าง memory เดิม
memory.chat_memory.messages = []
# เพิ่ม messages กลับเข้าไป
for msg_data in data.get("messages", []):
if msg_data["type"] == "human":
memory.chat_memory.add_user_message(msg_data["content"])
elif msg_data["type"] == "ai":
memory.chat_memory.add_ai_message(msg_data["content"])
print(f"✅ โหลด memory จาก {filepath} สำเร็จ")
return memory
ทดสอบ save
save_memory(memory)
ทดสอบ load
print("\n--- ทดสอบโหลด memory ---")
loaded_memory = load_memory(ConversationBufferMemory(return_messages=True), "memory.json")
print(f"จำนวน messages หลังโหลด: {len(loaded_memory.chat_memory.messages)}")
for msg in loaded_memory.chat_memory.messages:
print(f" - {type(msg).__name__}: {msg.content[:30]}...")