RAG vs 微调:何时为泰语 AI 选择每种方法
作者:Kobkrit Viriyayudhakorn 博士,艾艾普科技 CEO 及创始人
我们从泰语 AI 工程师和技术团队那里听到的最常见问题之一是:“我的泰语应用程序应该使用 RAG 还是微调?” 这是一个直接影响开发成本、性能、维护复杂性和长期可扩展性的关键问题。
答案,就像大多数工程决策一样,是:这取决于。但了解何时使用每种方法——以及越来越多地了解如何结合使用它们——可能是成功部署 AI 和昂贵失败之间的区别。
本文详细比较了检索增强生成 (RAG) 和微调在泰语应用程序中的应用,借鉴了我们在艾艾普科技公司在数百家泰语企业中部署这两种方法的经验。
核心问题:为特定任务调整 LLM
像 GPT-4、Claude 和 Gemini 这样的语言模型 (LLM) 是功能强大的通用人工智能系统。然而,对于生产企业应用程序,您几乎总是需要对其进行调整以适应:
- 特定领域知识:行业术语、公司政策、产品目录
- 最新信息:模型训练截止日期之后发生的事件、实时数据
- 风格和格式:公司写作风格、文档模板、响应格式
- 泰语细微差别:本地语境、商务礼仪、行业特定泰语术语
您有两种主要技术可以实现这种适应:
- 检索增强生成 (RAG):在查询时为模型提供相关上下文
- 微调:使用您的特定数据重新训练模型以改变其行为
每种方法都有独特的特征、成本和用例。让我们深入探讨这两种方法。

理解 RAG(检索增强生成)
什么是 RAG?
RAG 是一种架构模式,通过从外部知识库检索相关信息并将其包含在提示上下文中来增强 LLM 的响应。
RAG 流程(简化):
-
索引阶段(一次性设置):
- 收集您的知识库(文档、PDF、数据库)
- 分成块(通常为 200-1000 个 token)
- 将每个块转换为嵌入向量
- 存储在向量数据库中(Pinecone、Weaviate、pgvector 等)
-
查询阶段(运行时):
- 用户提出问题
- 将问题转换为嵌入向量
- 在向量数据库中搜索最相似的块
- 检索排名前 K 的最相关块(通常为 3-10 个)
- 构建提示:系统指令 + 检索到的上下文 + 用户问题
- 发送给 LLM 以生成答案
简单的 RAG 实现示例(泰语文档):
from openai import OpenAI
from pinecone import Pinecone
import numpy as np
# 初始化客户端
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:
"""将文本转换为嵌入向量"""
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:
"""为查询检索相关文档块"""
# 将查询转换为嵌入
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. 成本较低
- 无需昂贵的微调过程
- 推理成本仅略高(额外的 token 上下文)
- 可以使用更小/更便宜的基础模型
4. 更易于调试
- 可以检查检索到的块以理解响应
- 无需更改模型即可修改检索逻辑
- 快速测试不同的上下文组合
5. 多领域灵活性
- 同一个模型可以处理多个知识领域
- 根据用户查询在上下文之间切换
- 对于拥有多样化用例的组织来说效率很高
RAG 的局限性
1. 上下文窗口限制
- 受模型上下文长度限制(取决于模型,4K-128K token)
- 每次查询只能包含有限的信息
- 如果检索不完美,可能会错过相关上下文
2. 依赖检索质量
- 整个系统的质量取决于检索的准确性
- 语义搜索可能会错过措辞不同但相关的内容
- 泰语嵌入模型不如英语成熟
3. 延迟
- 两步流程(检索 + 生成)会增加延迟
- 向量数据库查询会增加 50-200 毫秒
- 可以通过缓存来缓解
4. 不学习风格/格式
- 模型不会“学习”您的写作风格
- 每个响应都需要明确的格式说明
- 如果提示工程不当,可能不一致
5. 大规模 token 成本
- 在每次查询中包含上下文会增加 token 使用量
- 对于高流量应用程序,token 成本可能会超过微调成本
理解微调
什么是微调?
微调是继续训练预训练语言模型,以适应其行为、知识和风格的过程。
微调过程:
-
数据准备:
- 收集训练样本(通常为数百到数万个)
- 格式化为输入-输出对
- 对于聊天模型:包含角色(系统/用户/助手)的对话格式
-
训练:
- 从预训练的基础模型开始
- 在您的数据上继续训练
- 通过反向传播调整模型权重
- 在保留的测试集上进行验证
-
部署:
- 将微调模型部署为自定义端点
- 使用方式与基础模型相同,但行为已调整
泰语客服微调示例:
# 训练数据格式 (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_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}")
# 训练完成后,使用微调后的模型
# response = client.chat.completions.create(
# model="ft:gpt-4o-mini-2024-07-18:your-org:custom-model-name:identifier",
# messages=[...]
# )
微调的优势
1. 风格和语气一致性
- 模型学习您组织的语气和沟通风格
- 无需明确说明即可获得一致的格式
- 自然地整合公司术语
2. 提高任务性能
- 可以显著提高特定任务的准确性
- 学习领域特定的推理模式
- 更好地在您的语境中使用细微的泰语
3. 减少提示工程
- 在每个提示中需要更少的详细说明
- 更短的提示 = 更低的 token 成本(大规模)
- 更简单的应用程序逻辑
4. 专业知识集成
- 将领域知识深度嵌入模型权重
- 更好地处理复杂、相互关联的概念
- 适用于高度技术性的泰语术语
5. 推理成本更低(大规模)
- 更短的提示减少了 token 的使用
- 对于高流量应用程序,可能比 RAG 更经济
微调的局限性
1. 静态知识
- 知识在微调时冻结
- 更新需要昂贵的重新训练
- 不适用于快速变化的信息
2. 高昂的初始成本
- 训练成本(计算、数据准备、实验)
- 认真进行微调通常需要 50,000 - 500,000 泰铢
- 需要专业知识才能做好
3. 数据需求
- 需要数百到数千个高质量的样本
- 特定领域的泰语数据可能有限
- 策划和标注工作量大
4. 过拟合风险
- 如果过度训练,可能会失去通用能力
- 在训练分布之外的边缘情况下表现可能更差
- 需要仔细验证
5. 开发周期较长
- 数据收集、训练、评估需要数周到数月
- 迭代缓慢(每次实验需要数天)
- 部署复杂(模型版本控制、回滚等)
泰语特定考量
泰语为这两种方法都增加了独特的复杂性:
泰语 RAG 的挑战
1. 嵌入模型质量
- 大多数嵌入模型主要针对英语进行训练
- 泰语语义搜索不如英语准确
- 多语言模型(text-embedding-3、Cohere multilingual)正在改进但并不完美
2. 分块复杂性
- 泰语脚本中没有词语边界
- 传统的基于 token 的分块可能会笨拙地分割单词/短语
- 需要泰语感知的分词(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")
泰语微调的挑战
1. 训练数据有限
- 与英语相比,可用的泰语公司数据较少
- 隐私问题限制了数据共享
- 注释专家稀缺且昂贵
2. 模型可用性
- 并非所有模型都支持泰语微调
- 一些提供商对泰语的支持比其他提供商更好
- 本地泰语模型(如艾艾普的 Chinda)具有优势
3. 评估难度
- 泰语基准测试不成熟
- 需要主观质量评估
- 需要母语为泰语的人进行验证
决策框架:何时使用什么
这是一个为泰语应用程序选择 RAG 或微调的实用决策树:
何时使用 RAG:
✅ 知识经常变化
- 产品目录、定价、新闻、政策
- 需要实时数据集成
- 信息每天/每周更新
✅ 需要来源归属
- 法律/合规应用程序
- 医疗建议(引用来源)
- 研究辅助
✅ 预算受限
- 资源有限的初创公司/中小企业
- 概念验证阶段
- 对长期使用不确定
✅ 优先考虑快速上市
- 可以在几天/几周内部署
- 根据反馈快速迭代
- 在大量投资前验证概念
✅ 多个知识领域
- 跨多种产品的客户支持
- 多部门企业助手
- 通用问答系统
泰语 RAG 用例:
- 泰语政府文件搜索
- 泰语法律文件问答
- 泰语新闻聚合和摘要
- 泰语电子商务产品推荐