预训练Mistral-7B-v0.1基础模型后事实检索不全的技术问询
问题:微调后模型无法完整检索目标实体的全部事实
背景
- 基于GitHub上Chinese-LLaMA-Alpaca仓库的
pretrain_chinese_llama_lora.ipynb脚本,对Mistral-7B-v0.1基础模型完成预训练 - 后续用50行包含地点、人物、历史、地理事实的文本做文本完成任务微调,事实行按非连续的多实体混合排列(如纽约、John Doe的事实交替出现)
- 核心目标:通过文本完成提示词,让模型检索出所有关于New York的事实
观察结果
即便使用多样化波束搜索解码,模型仍无法召回所有与New York相关的事实
已尝试的推理代码
with torch.no_grad(): outputs = pt_model.generate(**model_input, max_new_tokens=100, repetition_penalty=1.15, num_beams=15, num_beam_groups=15, diversity_penalty=2.0, num_return_sequences=15) model_output = tokenizer.batch_decode(outputs, skip_special_tokens=True)
不使用数据库/RAG的原因
- 拥有数千份PDF数据,无法逐一处理并编写脚本存储实体事实
- 担心RAG基于相似度搜索生成近似而非精确事实
- 计划针对特定用例进一步微调模型,需要模型尽可能多地记住并检索事实
可行优化方案
1. 调整微调数据格式
把同一实体的所有事实打包成连续块,或在每个事实前加上明确的实体标记(比如[实体: New York] <fact内容>),让模型更容易关联实体与对应事实。示例微调数据格式:
[实体: New York] <fact #1 about New York> [实体: New York] <fact #2 about New York> [实体: New York] <fact #3 about New York> [实体: John Doe] <fact #1 about John Doe> [实体: John Doe] <fact #2 about John Doe> ...
结构化标记能帮模型建立更清晰的实体-事实映射,提升召回率。
2. 修改推理策略
- 增大
max_new_tokens:当前设置的100可能不足以容纳所有New York的事实,可根据单条事实长度和总条数调整为300或更高 - 调整波束搜索参数:降低
num_beams和num_beam_groups至5-8(过高组数易导致内容碎片化),同时将diversity_penalty微调至1.0-1.5,避免过度追求多样性而丢失关键事实 - 尝试采样式生成+结果合并:用
do_sample=True, temperature=0.7做采样生成,多次运行后合并结果并去重,可能覆盖更多遗漏的事实
3. 微调阶段优化
- 增加微调轮数:若之前训练轮次较少,模型可能未充分记住实体的所有事实,可适当增加epochs至3-5轮,同时监控验证集避免过拟合
- 改用实体聚焦的指令式微调:把任务从通用文本完成改成“给定实体,输出所有相关事实”的指令任务,示例样本格式:
这种指令微调能让模型更明确任务目标,提升检索针对性指令:请列出所有关于New York的事实 输出:<fact #1 about New York> <fact #2 about New York> <fact #3 about New York>
4. 模型基础优化
若资源允许,改用Mistral-7B-Instruct-v0.1作为基础模型,它本身对指令理解能力更强,微调后在检索类任务上表现更稳定
内容的提问来源于stack exchange,提问作者Deepak Tatyaji Ahire
相关产品推荐
相关产品推荐

