Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
ninehills opened this issue Nov 3, 2023 · 6 comments
Open

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

ninehills opened this issue Nov 3, 2023 · 6 comments
Labels

Comments

@ninehills
Copy link
Owner

ninehills commented Nov 3, 2023

为检验 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 为例,分为三个部分:

  • corpus:是一个长文本集合。
  • queries:是检索用的问题。
  • qrels: 将检索问题和长文本对应起来,通过 score 进行排序。不过目前数据集中的 score 都为 1。(这可能是规避了数据错误标注,但是也影响了评测效果)。

在评测分数中,我们主要关心 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% 的效果,然后后续无明显提升)。这可能是因为数据集的质量不高,导致模型无法学到有效的信息。

社区相关讨论:FlagOpen/FlagEmbedding#179

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

@ninehills ninehills added the blog label Nov 3, 2023
@ninehills
Copy link
Owner Author

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

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

@liyunhan
Copy link

@ninehills 您好,请问:

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

@ninehills
Copy link
Owner Author

ninehills commented Apr 26, 2024 via email

@liyunhan
Copy link

这种情况可以用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
Copy link
Owner Author

ninehills commented Apr 26, 2024 via email

@liyunhan
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants