Embedding微调学习笔记
参考:
https://mp.weixin.qq.com/s/5IPz4T8hdp7qUV3D9BVaFg
https://github.com/FlagOpen/FlagEmbedding/blob/master/README_zh.md
1、为什么需要embedding微调
在一些专业领域,比如医疗、法律或金融,通用嵌入模型往往难以捕捉专业术语的细微差别,检索表现就会大打折扣。此时,嵌入微调(Embedding Fine-tuning)成为提升系统准确率的关键一步。
2、什么是embedding
嵌入(Embedding)可以看作是将文本转化为向量的“翻译器”,它把语义关系编码成多维空间中的位置。相似的句子在空间中相距更近,不相似的则更远。这种机制支撑着文本分类、语义搜索、问答系统等核心任务,也为RAG提供了“检索基础设施”。

3、embedding微调目的
嵌入微调的目的,就是用领域内的专业语料重新训练模型,让它“入行”,从而精准建模你关心的知识边界。
4、数据集构建的几种格式
- 正向配对:如问答对、定义与术语,适用于对比损失或余弦相似度损失;
- 三元组(anchor, positive, negative):适用于triplet loss,引导模型拉近正例、远离负例;
- 相似度评分:为每对句子打分,引导模型学习相似度的连续分布;
- 类别标签:适合用作分类任务的辅助监督信号。
建议从问答对数据集入手,简单且直观,适合大多数垂直领域。
5、损失函数
在训练过程中,损失函数(Loss Function)决定了模型如何“学会相似性”。
三元组损失(Triplet Loss)适合构建相对关系;对比损失(Contrastive Loss)适合引导模型对正负样本分界清晰;而余弦相似度损失(Cosine Similarity Loss)则更适合数值回归场景。
6、数据集生成
作者的场景是query-passage,即匹配出与query最相关的段落。正例的构造是使用baichuan2-13b-chat生成的,让LLM根据给定的段落生成问答对,query是生成的问题,passage是给定的段落,query-passage构成一个正例对,当然,LLM生成的数据也是需要过滤的,最后生成不到一万条,负例的构造是使用以上两种方法生成。作者的prompt(仅供参考)。
prompt = f"""
'''
{paragraph}
'''
请你从以上文献段落中抽取问答对, 务必严格遵守以下要求:抽取出来的问题和答案必须包含主语谓语宾语, 不得出现 本研究、本实验 等指代不明的词语, 请确保抽取出的问题必须能在原文中找到答案, 返回结果的格式请严格按照'''中的格式
'''
[
{{
"问题": "问题1内容",
"回答": "问题1的答案"
}},
{{
"问题": "问题2内容",
"回答": "问题2的答案"
}},
{{
"问题": "问题3内容",
"回答": "问题3的答案"
}}
]
'''
"""
7、训练
重点: batch_size一定要大,显存不够就结合gradient_accumulation_steps 一起使用,小batch_size训练过程中loss非常抖,而且效果很差:
更多推荐


所有评论(0)