如何从用于检索/语义搜索的嵌入模型中获得更好的性能?

问题描述 投票:0回答:1

我正在尝试构建一个文档检索接口,它可以接受示例文档并从 postgres 数据库检索最接近的现有文档。这似乎是一个简单的用例,但是我看到的大多数示例都使用较长形式的文本文档,这些文档会被分块,并且嵌入是在较大文本的较短部分上完成的,而查找通常只是搜索特定信息。

在我的用例中,文档是客户评论,用于相似性搜索的嵌入是虚假的示例评论。当我使用 Open AI 的 text-embedding-ada-002 时,它基本上就可以工作。我确信我可以调整它以获得更好的结果,但如果我提供带有具体批评的虚假评论,它会找到具有相同或相似批评的真实评论,对于积极的评论也是如此。然而,当我尝试使用拥抱面部 Transformers-js 并使用 gte-small 或 all-miniLM-L6-v2 时,输出通常很糟糕。由于某种原因,无论输入评论是正面还是负面,它几乎只检索正面评论,并且对于绝大多数人来说,提到的任何具体事物似乎都与所提供的评论完全无关。当我查看 MTEB 排行榜时,在所有看似相关的任务中,gte-small 的排名似乎都高于 text-embedding-ada-002,那么为什么它在这里的表现明显较差呢?在使用 Huggingface 模型时,我绝对必须做一些不同的事情,或者 HF 上可能有一个更适合这种检索的特定模型?我将把嵌入代码和 sql 查询放在下面,以防出现明显错误,但我在这里不知所措,查找是通过 pgvector 顺便说一句。

const generateEmbedding = await pipeline('feature-extraction', 'Supabase/all-MiniLM-L6-v2')
 
    let data = null
    let error = null

    try {
        // Generate a vector using Transformers.js
        const output = await generateEmbedding(text, {
            pooling: 'mean',
            normalize: true,
        })
    
        // Extract the embedding output
        const embedding = JSON.stringify(Array.from(output.data))

        data = {embedding: embedding}
    } catch (e) {
        error = e
    }`

`-- CREATE HNSW index on reviews
CREATE INDEX ON public.reviews USING hnsw (embedding vector_cosine_ops);

-- CREATE function to retrieve review by embedding similarity
CREATE OR REPLACE FUNCTION get_reviews_by_embedding(
    v vector(1536),
    n INTEGER
)
RETURNS SETOF reviews
LANGUAGE plpgsql AS $$
BEGIN
    SET LOCAL hnsw.ef_search = 150;
    RETURN QUERY SELECT * FROM public.reviews ORDER BY reviews.embedding <#> v LIMIT n;
END
$$;
huggingface-transformers embedding pgvector
1个回答
0
投票

代码中一切正常

为什么这里的表现明显更差?

您观察到的 OpenAI 的 text-embedding-ada-002 和 Hugging Face 的 gte-small 或 all-miniLM-L6-v2 之间的性能差异可能归因于以下几个因素:

  1. 模型架构和训练数据:

每个模型都在不同的架构和数据集上进行了训练。架构、训练数据和预训练目标的差异可能会导致特定下游任务的性能不同。 text-embedding-ada-002 使用的架构可能更适合您的特定用例。

  1. 特定领域的嵌入:

客户评论可能包含特定领域的语言和细微差别。如果 gte-small 或 all-miniLM-L6-v2 的训练数据未涵盖与客户评论类似的领域或用例,则其性能可能会不佳。有些模型可能可以更好地跨领域推广,而另一些模型则在更专业的领域表现出色。看来 ada-002 更适合您的用例。

  1. 嵌入生成和相似度计算:

根据输入评论生成嵌入和计算相似度的过程可能因模型而异。嵌入的标记化、截断和聚合等参数可能会影响最终结果。据我所知,还没有发布 ada-002 如何计算句子嵌入(单词嵌入的求和、平均值、加权平均值等),它如何填充、截断句子、标记等......因此很难调试嵌入方法的差异

在使用 Huggingface 模型时,我绝对必须做一些不同的事情,或者 HF 上可能有一个特定的模型更适合这种检索?

您的用例是信息检索。因此,我会检查 MTEB 基准中检索用例的模型排行榜 (https://huggingface.co/spaces/mteb/leaderboard)。

然后,按照以下准则在您的用例上测试模型:

  1. 最适合您的用例,即根据您的专业知识检索类似的产品评论
  2. Socres MTEB 含量高,确保其可靠、稳定和最先进。
  3. 还要考虑模型大小 (GB),它会影响性能,并且难以部署,因为您需要存储大量权重来为模型提供服务。如果 OpenAI 或 Llama 中存在 API,那么它可能是一个不错的选择。
  4. 还要考虑嵌入大小。尺寸越短,性能越好,但是尺寸越大,捕获的信息越多。尝试通过测试不同的模型来找到最适合您的组合或性能/检索质量。

此外,您可能想阅读论文以了解培训策略...如果模型在 QA 或评论中进行培训,它可能更适合旅游用例 [1]:https://arxiv.org/pdf/2210.07316.pdf

© www.soinside.com 2019 - 2024. All rights reserved.