ninehills / blog

https://ninehills.tech
741 stars 65 forks source link

Embedding 模型在 RAG 场景下的评估和微调 #104

Open ninehills opened 9 months ago

ninehills commented 9 months ago

为检验 Embedding 模型在 RAG 应用中的性能,我们引入 C-MTEB 评测用来评估 Embedding 模型的性能。

已有的 Embedding 模型的 C-MTEB 分数在 MTEB Leaderboard 上可以通过选择 Chinese 选项卡查看。

而针对有明确数据集的场景,我们也可以复用 C-MTEB 的评估方法,评估 Embedding 模型在特定数据集上的性能,从而为后续微调提供参考。

C-MTEB 评估任务

C-MTEB 有多种任务,其中和 RAG 能力相关是 Reranking 和 Retrieval 任务,其数据集格式如下:

Reranking 任务的数据集格式为:

{
    "query": "大学怎么网上选宿舍",
    "positive": ["long text", "long text"],
    "negative": ["long text", "long text"]
}

目前通用场景的 Reranking 数据集主要是 T2Reranking

在评测分数中,我们主要关心 map 分数,这是因为任务不涉及排序,而是看是否命中 positive 。

Retrieval 任务的数据集以 T2Retrieval 为例,分为三个部分:

在评测分数中,我们主要关心 ndcg@10 分数,是检验 top10 检索结果中排序是否一致的指标。

此外由于 Retrieval 数据集比较难构造,所以一般自定义数据集都是用 Reranking 数据集。Reranking 数据集的格式还和 FlagEmbedding fine-tune 所需的数据格式相同,方便用于微调后的评估。

自定义模型的通用任务评测

选择 T2Reranking 进行评测,评测目标是文心千帆上的 Embedding-V1 模型。

参见 Colab Notebook

取 1000 条测试数据(总数据的 1/6,为了降低 token 使用),评测 map 得分为 66.54。超过了 Leaderboard 上的 SOTA 分数 66.46 分。(不过并不是全部数据,这个分数仅供参考,如果是全部数据,得分可能会低于 SOTA)

自定义数据集微调和评测

使用 T2Reranking 数据集拆分出训练集和测试集,对 BAAI/bge-small-zh-v1.5 模型进行微调和测试。

参见 Colab Notebook

可以看到微调效果不尽如人意(第一个 checkpoint 就提升了 3% 的效果,然后后续无明显提升)。这可能是因为数据集的质量不高,导致模型无法学到有效的信息。

社区相关讨论:https://github.com/FlagOpen/FlagEmbedding/issues/179

微调资源占用:small 模型,4090 显存占用 20G。

ninehills commented 9 months ago

微调效果不佳的原因是 bge 模型本身就在 T2Reranking 数据集上训练,重复训练没有突出提升是合理的。

在实际项目中,在行业专业知识上微调,有极大的效果提升。

liyunhan commented 3 months ago

@ninehills 您好,请问:

  1. 行业知识问答中,用户问题口语化严重,但是知识库专业名词偏多,这种情况BM25和BGE选择哪个更好?
  2. 如果微调的话,数据是不是也要准备很多口语化的“问题”
ninehills commented 3 months ago

这种情况可以用HyDE 方法。

使用一个快速模型(如gpt-3.5-turbo或者自托管的10B以内模型),对query进行直接回答(可以指令要求简短回答)。

然后对回答进行embedding ,用回答来检索文档。

这个模型如果在行业知识上post-pretain或者sft就更好了。

On Fri, Apr 26, 2024 at 15:57 liyunhan @.***> wrote:

@ninehills https://github.com/ninehills 您好,请问:

  1. 行业知识问答中,用户问题口语化严重,但是知识库专业名词偏多,这种情况BM25和BGE选择哪个更好?
  2. 如果微调的话,数据是不是也要准备很多口语化的“问题”

— Reply to this email directly, view it on GitHub https://github.com/ninehills/blog/issues/104#issuecomment-2078837686, or unsubscribe https://github.com/notifications/unsubscribe-auth/AACB7WQWQ6W72LLOOLODVVTY7ICHXAVCNFSM6AAAAAA64WF6PWVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDANZYHAZTONRYGY . You are receiving this because you were mentioned.Message ID: @.***>

liyunhan commented 3 months ago

这种情况可以用HyDE 方法。 使用一个快速模型(如gpt-3.5-turbo或者自托管的10B以内模型),对query进行直接回答(可以指令要求简短回答)。 然后对回答进行embedding ,用回答来检索文档。 这个模型如果在行业知识上post-pretain或者sft就更好了。 On Fri, Apr 26, 2024 at 15:57 liyunhan @.> wrote: @ninehills https://github.com/ninehills 您好,请问: 1. 行业知识问答中,用户问题口语化严重,但是知识库专业名词偏多,这种情况BM25和BGE选择哪个更好? 2. 如果微调的话,数据是不是也要准备很多口语化的“问题” — Reply to this email directly, view it on GitHub <#104 (comment)>, or unsubscribe https://github.com/notifications/unsubscribe-auth/AACB7WQWQ6W72LLOOLODVVTY7ICHXAVCNFSM6AAAAAA64WF6PWVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDANZYHAZTONRYGY . You are receiving this because you were mentioned.Message ID: @.>

快速模型仅在行业知识上post-pretrain也可以?这样不是会丢失对齐能力吗

ninehills commented 3 months ago

这个回答并不是用来直接提供的,而是用来检索的。

On Fri, Apr 26, 2024 at 16:53 liyunhan @.***> wrote:

这种情况可以用HyDE 方法。 使用一个快速模型(如gpt-3.5-turbo或者自托管的10B以内模型),对query进行直接回答(可以指令要求简短回答)。 然后对回答进行embedding ,用回答来检索文档。 这个模型如果在行业知识上post-pretain或者sft就更好了。 … <#m-5074319437563760008> On Fri, Apr 26, 2024 at 15:57 liyunhan @.> wrote: @ninehills https://github.com/ninehills https://github.com/ninehills https://github.com/ninehills 您好,请问: 1. 行业知识问答中,用户问题口语化严重,但是知识库专业名词偏多,这种情况BM25和BGE选择哪个更好? 2. 如果微调的话,数据是不是也要准备很多口语化的“问题” — Reply to this email directly, view it on GitHub <#104 (comment) https://github.com/ninehills/blog/issues/104#issuecomment-2078837686>, or unsubscribe https://github.com/notifications/unsubscribe-auth/AACB7WQWQ6W72LLOOLODVVTY7ICHXAVCNFSM6AAAAAA64WF6PWVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDANZYHAZTONRYGY https://github.com/notifications/unsubscribe-auth/AACB7WQWQ6W72LLOOLODVVTY7ICHXAVCNFSM6AAAAAA64WF6PWVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDANZYHAZTONRYGY . You are receiving this because you were mentioned.Message ID: @.>

快速模型仅在行业知识上post-pretrain也可以?这样不是会丢失对齐能力吗

— Reply to this email directly, view it on GitHub https://github.com/ninehills/blog/issues/104#issuecomment-2078940706, or unsubscribe https://github.com/notifications/unsubscribe-auth/AACB7WSPUPGJ6GM32SGMSZTY7IIZTAVCNFSM6AAAAAA64WF6PWVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDANZYHE2DANZQGY . You are receiving this because you were mentioned.Message ID: @.***>

liyunhan commented 3 months ago

@ninehills 谢谢您,还想请教您在检索中怎么先做一次信息过滤呢?比如很多无关的内容我希望直接过滤掉,缩小检索范围、提升检索精度