在检索增强生成(RAG)系统中,幻觉(hallucination)问题一直是影响输出质量的关键挑战。传统解决方案主要针对英语场景,而现实中的多语言需求往往被忽视。我们团队开发的LettuceDetect框架首次实现了跨语言的幻觉检测能力,通过微调EuroBERT模型,在德语、法语、意大利语等六种语言上取得了显著优于GPT-4.1-mini基线的表现。
这个项目的核心价值在于:当RAG系统用德语回答"法国人口是多少"时,能准确识别"69百万"这样的错误数据(正确应为67百万),即使这个数字是用中文提问、西班牙语回答也同样有效。这种跨语言一致性对全球化应用至关重要。
关键突破:相比需要昂贵LLM的方案,我们的EuroBERT微调模型在单块A100显卡上就能运行,F1分数最高提升17个百分点,且推理速度提升3倍以上。
原始RAGTruth数据集包含英语的问答对,其中幻觉内容用<hal>标签标注。要扩展到其他语言,我们设计了特殊的标注保留翻译流程:
标签预处理:合并嵌套或重叠的<hal>标签,确保每个待翻译段落中的标注结构简单明确。例如将<hal>1788<hal>简化为<hal>1788</hal>
并行翻译:使用Gemma-3-27b-it模型配合vLLM框架,在A100显卡上批量处理30个样本/次。关键技巧:
后处理验证:
python复制def validate_translation(orig_en, translated):
en_hal_count = orig_en.count('<hal>')
trans_hal_count = translated.count('<hal>')
assert en_hal_count == trans_hal_count,
f"Tag count mismatch: {en_hal_count} vs {trans_hal_count}"
# 检查标签闭合和嵌套关系
return parsed_xml.is_valid()
EuroBERT成为理想选择主要基于三大特性:
我们测试了两种配置:
针对token级别的幻觉检测任务,我们改进了标准训练流程:
输入构造:
code复制[CLS]上下文[SEP]问题[SEP]回答[SEP]
使用动态padding将总长度限制在4,096 tokens内
标签处理:
关键超参数:
yaml复制optimizer: AdamW
learning_rate: 1e-5
weight_decay: 0.01
batch_size: 8
epochs: 6
warmup_ratio: 0.1
实战经验:在波兰语等形态复杂的语言中,将学习率降至7e-6能减少过拟合,同时增加10%训练数据扰动可提升2-3%的召回率。
我们在六种语言上进行了系统测试,以下是关键发现:
| 语言 | 模型版本 | 精确率 | 召回率 | F1分数 | 相比GPT-4.1提升 |
|---|---|---|---|---|---|
| 德语 | 610M | 77.04% | 72.96% | 74.95% | +14.04% |
| 法语 | 610M | 67.08% | 80.38% | 73.13% | +10.76% |
| 中文 | 610M | 78.90% | 75.72% | 77.27% | +17.04% |
| 意大利语 | 210M | 60.57% | 72.32% | 65.93% | +4.87% |
两个显著模式:
通过人工检查300个德语样本,发现主要错误类型:
文化特定表达:
数字格式差异:
复合词分割:
解决方案:在数据增强阶段加入10%的本地化表达样本,并对数字格式进行统一标准化预处理。
根据吞吐量需求推荐两种部署方式:
低成本方案:
高性能方案:
我们推荐使用FastAPI构建微服务:
python复制@app.post("/detect")
async def detect_hallucination(
request: HallucinationRequest # 包含context,question,answer
):
detector = HallucinationDetector(
method="transformer",
model_path=f"KRLabsOrg/lettucedect-610m-eurobert-{request.lang}-v1",
trust_remote_code=True
)
return detector.predict(
context=request.context,
question=request.question,
answer=request.answer
)
性能优化技巧:
@lru_cache缓存模型加载现象:翻译后的<hal>标签意外改变了原文语义(如中文<hal>被翻译为<嗨>)
解决方案:
__HAL_START__)r'<hal>.*?</hal>'对于波兰语等表现相对较弱的语言,我们采用以下策略:
数据增强:
模型调整:
python复制trainer = Trainer(
model_init=model_init,
args=training_args,
train_dataset=dataset["train"],
eval_dataset=dataset["validation"],
data_collator=collator,
compute_metrics=compute_metrics,
callbacks=[EarlyStoppingCallback(early_stopping_patience=2)] # 增加早停
)
集成方法:
当应用于医疗、法律等专业领域时:
领域词汇注入:
bash复制python -m spacy download de_core_news_lg
python -m spacy download zh_core_web_lg
两阶段训练:
后处理规则:
在实际部署中,我们发现结合领域术语表能额外提升3-5%的精确率,特别是在处理德语复合词和中文缩略语时效果显著。