跳转至

Embedding评测方法

mteb

介绍

MTEB(Multilingual Text Embedding Benchmark)是一个用于评估多语言文本嵌入的基准测试。它提供了一组标准化的任务和数据集,以便研究人员可以比较不同的多语言嵌入模型的性能。

评测方法

MTEB评测方法包括以下几个步骤: 1. 选择任务:MTEB提供多种任务,也能够自定义任务。 2. 选择模型:提供多种常见模型,也可以使用自定义模型。 3. 运行评测:在选定的任务和模型上运行评测。 4. 分析结果:对评测结果进行处理。

示例:

import json
from mteb import MTEB
import mteb
from hunyuan import HunyuanModel
from ollama_model import OllamaModel

benchs = [
    {"model": HunyuanModel(), "output_file": "results_hunyuan.json"},
    {"model": OllamaModel("bge-m3"), "output_file": "results_bge_m3.json"},
    {"model": OllamaModel("nomic-embed-text"), "output_file": "results_nomic_embed_text.json"},
]

for bench in benchs:
    results = None
    # Select model
    model = bench["model"]

    # Select tasks
    evaluation = MTEB(tasks=["CodeFeedbackMT"])

    # evaluate
    results = evaluation.run(model)

    # results is NamedTuple, encode to json and save to file
    results_json = json.dumps({"results": [results[i].to_dict() for i in range(len(results))]}, indent=4)
    with open(bench["output_file"], "w") as f:
        f.write(results_json)

自定义模型

模型需要实现一个encode方法,该方法接受一个字符串列表作为输入,并返回一个二维浮点数列表作为输出。每个输入字符串对应一个嵌入向量。 下面是一个简单的自定义模型示例:

class OllamaModel:
    def __init__(self, model_name: str = "bge-m3") -> None:
        self.model_name = model_name
    def encode(
        self,
        inputs: List[str],
        batch_size=50,
        **kwargs,
    ) -> np.ndarray:
        # split batches
        batches = [inputs[i:min(i + batch_size, len(inputs))] for i in range(0, len(inputs), batch_size)]
        embeddings = []
        for batch in batches:
            resp = ollama.embed(self.model_name, batch)
            for item in resp["embeddings"]:
                embeddings.append(item)
        return np.array(embeddings)