RAG vs Fine-Tuning: เมื่อไหร่ควรใช้วิธีไหนสำหรับ AI ภาษาไทย
โดย ดร.กอบกฤตย์ วิริยะยุทธกร, CEO & Founder, iApp Technology
หนึ่งในคำถามที่พบบ่อยที่สุดที่เราได้ยินจากวิศวกร AI และทีมเทคนิคของไทยคือ: "ฉันควรใช้ RAG หรือ fine-tuning สำหรับแอปพลิเคชันภาษาไทยของฉัน?" นี่เป็นคำถามสำคัญที่ส่งผลโดยตรงต่อต้นทุนการพัฒนา ประสิทธิภาพ ความซับซ้อนในการบำรุงรักษา และความสามารถในการขยายขนาดในระยะยาว
คำตอบเช่นเดียวกับการตัดสินใจด้านวิศวกรรมส่วนใหญ่คือ: ขึ้นอยู่กับสถานการณ์ แต่การเข้าใจว่าเมื่อไหร่ควรใช้แต่ละวิธี และที่สำคัญกว่านั้นคือวิธีการรวมวิธีทั้งสองเข้าด้วยกัน สามารถหมายถึงความแตกต่างระหว่างการปรับใช้ AI ที่ประสบความสำเร็จและความล้มเหลวที่มีค่าใช้จ่ายสูง
บทความนี้นำเสนอการเปรียบเทียบทางเทคนิคที่ครอบคลุมของ Retrieval-Augmented Generation (RAG) และ fine-tuning โดยเฉพาะสำหรับแอปพลิเคชันภาษาไทย โดยอาศัยประสบการณ์ของเราที่ iApp Technology ในการปรับใช้ทั้งสองวิธีในองค์กรไทยหลายร้อยแห่ง
คำถามหลัก: การปรับ LLM สำหรับงานเฉพาะ
โมเดลภาษาขนาดใหญ่ (LLM) เช่น GPT-4, Claude และ Gemini เป็นระบบ AI ทั่วไปที่ทรงพลังอย่างเหลือเชื่อ อย่างไรก็ตาม สำหรับแอปพลิเคชันองค์กรระดับการผลิต คุณมักจะต้องปรับแต่งให้เหมาะกับ:
- ความรู้เฉพาะโดเมน: คำศัพท์อุตสาหกรรม นโยบายบริษัท แคตตาล็อกผลิตภัณฑ์
- ข้อมูลปัจจุบัน: เหตุการณ์หลังจากวันที่ตัดการฝึกอบรมโมเดล ข้อมูลเรียลไทม์
- สไตล์และรูปแบบ: สไตล์การเขียนของบริษัท เทมเพลตเอกสาร รูปแบบการตอบกลับ
- ความละเอียดอ่อนของภาษาไทย: บริบทท้องถิ่น มารยาททางธุรกิจ คำศัพท์ภาษาไทยเฉพาะอุตสาหกรรม
คุณมีเทคนิคหลักสองอย่างเพื่อให้บรรลุการปรับแต่งนี้:
- Retrieval-Augmented Generation (RAG): ให้บริบทที่เกี่ยวข้องกับโมเดลในเวลาที่สอบถาม
- Fine-Tuning: ฝึกโมเดลต่อจากข้อมูลเฉพาะของคุณเพื่อเปลี่ยนพฤติกรรม
แต่ละวิธีมีลักษณะ ต้นทุน และกรณีการใช้งานที่แตกต่างกัน มาดูรายละเอียดของทั้งสองวิธี

ทำความเข้าใจ RAG (Retrieval-Augmented Generation)
RAG คืออะไร?
RAG เป็นรูปแบบสถาปัตยกรรมที่ปรับปรุงการตอบสนองของ LLM โดยการดึงข้อมูลที่เกี่ยวข้องจากฐานความรู้ภายนอกและรวมไว้ในบริบทของพรอมต์
กระบวนการ RAG (แบบง่าย):
-
ขั้นตอนการจัดทำดัชนี (ตั้งค่าครั้งเดียว):
- นำฐานความรู้ของคุณ (เอกสาร, PDF, ฐานข้อมูล)
- แบ่งออกเป็นชิ้นเล็ก (โดยทั่วไป 200-1000 โทเค็น)
- แปลงแต่ละชิ้นเป็นเวกเตอร์ embedding
- จัดเก็บในฐานข้อมูลเวกเตอร์ (Pinecone, Weaviate, pgvector, ฯลฯ)
-
ขั้นตอนการสอบถาม (รันไทม์):
- ผู้ใช้ถามคำถาม
- แปลงคำถามเป็นเวกเตอร์ embedding
- ค้นหาฐานข้อมูลเวกเตอร์สำหรับชิ้นที่คล้ายกันที่สุด
- ดึงชิ้น K ชิ้นที่เกี่ยวข้องที่สุด (โดยทั่วไป 3-10)
- สร้างพรอมต์: คำสั่งระบบ + บริบทที่ดึงมา + คำถามผู้ใช้
- ส่งไปยัง LLM เพื่อสร้างคำตอบ
ตัวอย่าง การใช้งาน RAG แบบง่าย (เอกสารภาษาไทย):
from openai import OpenAI
from pinecone import Pinecone
import numpy as np
# เริ่มต้น clients
client = OpenAI(api_key="your-api-key")
pc = Pinecone(api_key="your-pinecone-key")
index = pc.Index("thai-knowledge-base")
def embed_text(text: str) -> list:
"""แปลงข้อความเป็นเวกเตอร์ embedding"""
response = client.embeddings.create(
model="text-embedding-3-small",
input=text
)
return response.data[0].embedding
def retrieve_context(query: str, top_k: int = 5) -> list:
"""ดึงชิ้นเอกสารที่เกี่ยวข้องสำหรับคำค้นหา"""
# แปลงคำค้นหาเป็น embedding
query_embedding = embed_text(query)
# ค้นหาฐานข้อมูลเวกเตอร์
results = index.query(
vector=query_embedding,
top_k=top_k,
include_metadata=True
)
# ดึงข้อความจากผลลัพธ์
contexts = [match['metadata']['text'] for match in results['matches']]
return contexts
def rag_query(user_question: str) -> str:
"""ตอบคำถามโดยใช้ RAG"""
# ดึงบริบทที่เกี่ยวข้อง
contexts = retrieve_context(user_question)
# สร้างพรอมต์ด้วยการเพิ่มประสิทธิภาพภาษาไทย
context_str = "\n\n".join(contexts)
prompt = f"""คุณเป็นผู้ช่วย AI ที่ตอบคำถามโดยอ้างอิงจากเอกสารที่ให้มา
เอกสารอ้างอิง:
{context_str}
คำถาม: {user_question}
กรุณาตอบคำถามโดยอ้างอิงจากเอกสารที่ให้มา หากไม่พบข้อมูลในเอกสาร ให้บอกว่าไม่มีข้อมูล"""
# สร้างการตอบสนอง
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "คุณเป็นผู้ช่วยตอบคำถามที่ซื่อสัตย์และแม่นยำ"},
{"role": "user", "content": prompt}
],
temperature=0.7
)
return response.choices[0].message.content
# ตัวอย่างการใช้งานด้วยคำถามภาษาไทย
question = "นโยบายการลาพักร้อนของบริษัทคืออะไร?"
answer = rag_query(question)
print(answer)
จุดแข็งของ RAG
1. การอัปเดตความรู้แบบไดนามิก
- เพิ่ม/อัปเดต/ลบเอกสารได้โดยไม่ต้องฝึกใหม่
- เหมาะสำหรับข้อมูลที่เปลี่ยนแปลงบ่อย (ราคา นโยบาย ข่าว)
- การรวมความรู้แบบเรียลไทม์เกือบ
2. การอ้างอิงแหล่งที่มา
- สามารถอ้างถึงเอกสาร/ส่วนเฉพาะที่ใช้ในคำตอบ
- สร้างความไว้วางใจของผู้ใช้ผ่านความโปร่งใส
- สำคัญสำหรับการปฏิบัติตามข้อกำหนดและการตรวจสอบข้อเท็จจริง
3. ต้นทุนต่ำกว ่า
- ไม่มีกระบวนการ fine-tuning ที่มีค่าใช้จ่ายสูง
- ต้นทุน inference สูงขึ้นเล็กน้อยเท่านั้น (โทเค็นเพิ่มเติมในบริบท)
- สามารถใช้โมเดลพื้นฐานที่เล็กกว่า/ถูกกว่า
4. การแก้ไขข้อบกพร่องง่ายกว่า
- สามารถตรวจสอบชิ้นที่ดึงมาเพื่อเข้าใจการตอบสนอง
- แก้ไขตรรกะการดึงข้อมูลโดยไม่ต้องเปลี่ยนโมเดล
- ทดสอบชุดบริบทที่แตกต่างกันได้อย่างรวดเร็ว
5. ความยืดหยุ่นหลายโดเมน
- โมเดลเดียวกันสามารถจัดการโดเมนความรู้หลายโดเมน
- สลับระหว่างบริบทตามคำค้นหาของผู้ใช้
- มีประสิทธิภาพสำหรับองค์กรที่มีกรณีการใช้งานที่หลากหลาย
ข้อจำกัดของ RAG
1. ข้อจำกัดหน้าต่างบริบท
- จำกัดด้วยความยาวบริบทของโมเ ดล (4K-128K โทเค็นขึ้นอยู่กับโมเดล)
- สามารถรวมข้อมูลจำกัดต่อคำค้นหา
- อาจพลาดบริบทที่เกี่ยวข้องหากการดึงข้อมูลไม่สมบูรณ์แบบ
2. การพึ่งพาคุณภาพการดึงข้อมูล
- คุณภาพของระบบทั้งหมดขึ้นอยู่กับความแม่นยำของการดึงข้อมูล
- การค้นหาความหมายอาจพลาดเนื้อหาที่เกี่ยวข้องแต่ใช้คำพูดที่แตกต่างกัน
- Thai language embeddings ยังไม่เติบโตเท่ากับภาษาอังกฤษ
3. เวลาแฝง
- กระบวนการสองขั้นตอน (ดึง + สร้าง) เพิ่มเวลาแฝง
- คำค้นหาฐานข้อมูลเวกเตอร์เพิ่ม 50-200ms
- สามารถลดลงได้ด้วยการแคช
4. ไม่เรียนรู้สไตล์/รูปแบบ
- โมเดลไม่ "เรียนรู้" สไตล์การเขียนของคุณ
- ทุกการตอบสนองต้องการคำแนะนำการจัดรูปแบบที่ชัดเจน
- อาจไม่สอดคล้องกันโดยไม่มี prompt engineering ที่ระมัดระวัง
5. ต้นทุนโทเค็นในขนาดใหญ่
- การรวมบริบทใ นทุกคำค้นหาเพิ่มการใช้โทเค็น
- สำหรับแอปพลิเคชันที่มีปริมาณสูง ต้นทุนโทเค็นอาจเกิน fine-tuning
ทำความเข้าใจ Fine-Tuning
Fine-Tuning คืออะไร?
Fine-tuning เป็นกระบวนการฝึกอบรมโมเดลภาษาที่ผ่านการฝึกอบรมมาแล้วต่อด้วยชุดข้อมูลเฉพาะของคุณเพื่อปรับพฤติกรรม ความรู้ และสไตล์
กระบวนการ Fine-Tuning:
-
การเตรียมข้อมูล:
- รวบรวมตัวอย่างการฝึกอบรม (โดยทั่วไป 100s ถึง 10,000s)
- จัดรูปแบบเป็นคู่อินพุต-เอาต์พุต
- สำหรับโมเดลแชท: รูปแบบการสนทนาพร้อมบทบาท (system/user/assistant)
-
การฝึกอบรม:
- เริ่มต้นด้วยโมเดลพื้นฐานที่ผ่านการฝึกอบรมมาแล้ว
- ฝึกอบรมต่อด้วยข้อมูลของคุณ
- ปรับน้ำหนักโมเดลผ่าน backpropagation
- ตรวจสอบกับชุดทดสอบที่แยกออก
-
การปรับใช้:
- ปรับใช้โมเดลที่ fine-tuned เป็นจุดสิ้นสุดแบบกำหนดเอง
- ใช้เหมือนโมเดลพื้นฐานแต่มีพฤติกรรมที่ปรับแต่งแล้ว
ตัวอย่าง Fine-Tuning (บริการลูกค้าภาษาไทย):
# รูปแบบข้อมูลการฝึกอบรม (ไฟล์ JSONL)
# training_data.jsonl
{"messages": [
{"role": "system", "content": "คุณเป็นพนักงานฝ่ายบริการลูกค้าของธนาคารไทย ตอบคำถามด้วยภาษาที่สุภาพและเป็นมืออาชีพ"},
{"role": "user", "content": "ดอกเบี้ยเงินฝากประจำ 1 ปีเท่าไหร่ค่ะ"},
{"role": "assistant", "content": "สวัสดีค่ะ ขอบคุณที่สอบถามค่ะ\n\nอัตราดอกเบี้ยเงินฝากประจำ 1 ปีของธนาคารในปัจจุบันอยู่ที่ 1.50% ต่อปี สำหรับเงินฝากตั้งแต่ 10,000 บาทขึ้นไป\n\nหากคุณสนใจเปิดบัญชีเงินฝากประจำหรือมีคำถามเพิ่มเติม กรุณาติดต่อที่สาขาของธนาคารหรือโทร 02-XXX-XXXX ค่ะ\n\nมีอะไรให้ช่วยเหลือเพิ่มเติมไหมคะ?"}
]}
{"messages": [
{"role": "system", "content": "คุณเป็นพนักงานฝ่ายบริการลูกค้าของธนาคารไทย ตอบคำถามด้วยภาษาที่สุภาพและเป็นมืออาชีพ"},
{"role": "user", "content": "โอนเงินข้ามธนาคารใช้เวลานานไหม"},
{"role": "assistant", "content": "สวัสดีค่ะ\n\nสำหรับการโอนเงินข้ามธนาคารผ่านระบบ PromptPay จะเข้าบัญชีปลายทางภายในไม่กี่วินาที (Real-time)\n\nหากโอนผ่านระบบ ORFT (ธนาคารแห่งประเทศไทย) เวลาทำการจะใช้เวลาประมาณ 30 นาที - 2 ชั่วโมง และนอกเวลาทำการจะประมวลผลในวันทำการถัดไป\n\nแนะนำให้ใช้ PromptPay สำหรับความรวดเร็วค่ะ\n\nมีคำถามอื่นๆ อีกไหมคะ?"}
]}
# ... (ตัวอย่างอื่นๆ อีกมาก)
from openai import OpenAI
client = OpenAI(api_key="your-api-key")
# อัปโหลดไฟล์การฝึกอบรม
training_file = client.files.create(
file=open("training_data.jsonl", "rb"),
purpose="fine-tune"
)
# สร้างงาน fine-tuning
fine_tune_job = client.fine_tuning.jobs.create(
training_file=training_file.id,
model="gpt-4o-mini-2024-07-18", # โมเดลพื้นฐาน
hyperparameters={
"n_epochs": 3, # จำนวนรอบการฝึกอบรม
"learning_rate_multiplier": 1.8
}
)
# ตรวจสอบการฝึกอบรม
print(f"Fine-tuning job ID: {fine_tune_job.id}")
# เมื่อเสร็จสิ้น ใช้โมเดลที่ fine-tuned
# response = client.chat.completions.create(
# model="ft:gpt-4o-mini-2024-07-18:your-org:custom-model-name:identifier",
# messages=[...]
# )
จุดแข็งของ Fine-Tuning
1. ความสอดคล้องของสไตล์และน้ำเสียง
- โมเดลเรียนรู้เสียงและสไตล์การสื่อสารขององค์กรของคุณ
- การจัดรูปแบบที่สอดคล้องโดยไม่ต้องมีคำแนะนำที่ชัดเจน
- การรวมคำศัพท์บริษัทอย่างเป็นธ รรมชาติ
2. ประสิทธิภาพงานที่ดีขึ้น
- สามารถเพิ่มความแม่นยำสำหรับงานเฉพาะได้อย่างมีนัยสำคัญ
- เรียนรู้รูปแบบการให้เหตุผลเฉพาะโดเมน
- ดีกว่าในการใช้ภาษาไทยที่ละเอียดอ่อนในบริบทของคุณ
3. ลด Prompt Engineering
- ต้องการคำแนะนำโดยละเอียดน้อยลงในทุกพรอมต์
- พรอมต์สั้นกว่า = ต้นทุนโทเค็นต่ำกว่าในขนาดใหญ่
- ตรรกะแอปพลิเคชันที่เรียบง่ายกว่า
4. การรวมความรู้เฉพาะทาง
- ฝังความรู้เฉพาะโดเมนลึกลงไปในน้ำหนักโมเดล
- การจัดการแนวคิดที่ซับซ้อนและเชื่อมโยงกันได้ดีขึ้น
- แข็งแกร่งสำหรับคำศัพท์ทางเทคนิคภาษาไทย
5. ต้นทุน Inference ต่ำกว่า (ในขนาดใหญ่)
- พรอมต์สั้นกว่าลดการใช้โทเค็น
- สำหรับแอปพลิเคชันที่มีปริมาณสูง สามารถประหยัดกว่า RAG
ข้อจำกัดขอ ง Fine-Tuning
1. ความรู้คงที่
- ความรู้ถูกตรึงในเวลา fine-tuning
- การอัปเดตต้องการการฝึกใหม่ที่มีค่าใช้จ่ายสูง
- ไม่เหมาะสำหรับข้อมูลที่เปลี่ยนแปลงอย่างรวดเร็ว
2. ต้นทุนเริ่มต้นสูง
- ต้นทุนการฝึกอบรม (การคำนวณ การเตรียมข้อมูล การทดลอง)
- โดยทั่วไป 50,000 - 500,000 บาทสำหรับความพยายาม fine-tuning ที่จริงจัง
- ต้องการความเชี่ยวชาญในการทำได้ดี
3. ข้อกำหนดข้อมูล
- ต้องการตัวอย่างคุณภาพสูงหลายร้อยถึงหลายพัน
- ข้อมูลภาษาไทยอาจมีจำกัดสำหรับโดเมนเฉพาะทาง
- ใช้แรงงานมากในการคัดสรรและใส่คำอธิบายประกอบ
4. ความเสี่ยงจาก Overfitting
- สามารถสูญเสียความสามารถทั่วไปหากฝึกมากเกินไป
- อาจทำงานได้แย่ลงในกรณีขอบนอกการกระจายการฝึกอบรม
- ต้องการการตรวจสอบอย่างระมัดระวัง
5. วงจรการพัฒนาที่ยาวกว่า
- สัปดาห์ถึงเดือนสำหรับการรวบรวมข้อมูล การฝึกอบรม การประเมิน
- การทำซ้ำช้า (วันต่อการทดลอง)
- ความซับซ้อนในการปรับใช้ (การกำหนดเวอร์ชันโมเดล การย้อนกลับ ฯลฯ)
การพิจารณาเฉพาะภาษาไทย
ภาษาไทยเพิ่มความซับซ้อนที่ไม่เหมือนใครให้กับทั้งสองวิธี:
ความท้าทายของ RAG สำหรับภาษาไทย
1. คุณภาพโมเดล Embedding
- โมเดล embedding ส่วนใหญ่ฝึกอบรมเป็นหลักในภาษาอังกฤษ
- การค้นหาความหมายภาษาไทยแม่นยำน้อยกว่าภาษาอังกฤษ
- โมเดลหลายภาษา (text-embedding-3, Cohere multilingual) กำลังดีขึ้นแต่ไม่สมบูรณ์แบบ
2. ความซับซ้อนของการแบ่งชิ้น
- ไม่มีขอบเขตคำในสคริปต์ไทย
- การแบ่งชิ้นตามโทเค็นแบบดั้งเดิมสามารถแบ่งคำ/วลีได้อย่างแปลก
- ต้องการการแบ่งคำที่รู้จักภาษาไทย (PyThaiNLP, deepcut)
3. ความไม่ตรงกันของคำค้นหา-เอกสาร
- ภาษาไทยมีหลายวิธีในการแสดงแนวคิดเดียวกัน
- ภาษาทางการกับภาษาไม่เป็นทางการสร้างช่องว่างในการดึงข้อมูล
- คำยืมภาษาอังกฤษกับคำเทียบเท่าภาษาไทย
ตัวอย่างการแบ่งชิ้นภาษาไทย:
from pythainlp.tokenize import word_tokenize
from pythainlp.util import normalize
def chunk_thai_document(text: str, chunk_size: int = 500) -> list:
"""
แบ่งเอกสารภาษาไทยด้วยขอบเขตที่รู้จักคำ
"""
# ทำให้ข้อความไทยเป็นมาตรฐาน
normalized_text = normalize(text)
# แบ่งคำออกเป็นคำ
words = word_tokenize(normalized_text, engine='newmm')
chunks = []
current_chunk = []
current_length = 0
for word in words:
word_length = len(word)
if current_length + word_length > chunk_size and current_chunk:
# บันทึกชิ้นปัจจุบัน
chunks.append(''.join(current_chunk))
current_chunk = [word]
current_length = word_length
else:
current_chunk.append(word)
current_length += word_length
# เพิ่มชิ้นสุดท้าย
if current_chunk:
chunks.append(''.join(current_chunk))
return chunks
# ตัวอย่าง
thai_doc = """บริษัทของเรามีนโยบายการลาพักร้อนที่ยืดหยุ่น
พนักงานที่ทำงานครบ 1 ปีจะได้รับสิทธิ์ลาพักร้อน 10 วันต่อปี
และจะเพิ่มขึ้นเป็น 15 วันสำหรับพนักงานที่ทำงานครบ 5 ปี"""
chunks = chunk_thai_document(thai_doc, chunk_size=100)
for i, chunk in enumerate(chunks):
print(f"Chunk {i+1}: {chunk}\n")
ความท้าทายของ Fine-Tuning สำหรับภาษาไทย
1. ข้อมูลการฝึกอบรมจำกัด
- ข้อมูลองค์กรภาษาไทยมีน้อยกว่าภาษาอังกฤษ
- ความกังวลด้านความเป็นส่วนตัวจำกัดการแชร์ข้อมูล
- ความเชี่ยวชาญในการใส่คำอธิบายประกอบหายากและมีราคาแพง
2. ความพร้อมใช้งานของโมเดล
- ไม่ใช่โมเดลทั้งหมดที่รองรับ fine-tuning สำหรับภาษาไทย
- ผู้ให้บริการบางรายมีการสนับสนุนภาษาไทยที่ดีกว่าคนอื่น
- โมเดลไทยท้องถิ่น (เช่น Chinda ของ iApp) นำเสนอข้อได้เปรียบ
3. ความยากในการประเมิน
- เกณฑ์มาตรฐานภาษาไทยเติบโตน้อยกว่า
- ต้องการการประเมินคุณภาพเชิงอัตวิสัย
- ต้องการผู้พูดภาษาไทยเจ้าของภาษาสำหรับการตรวจสอบ