news 2026/9/15 19:43:40

FlagEmbedding 评估器 AbsEvaluator 深度解析:从检索、重排到指标计算的完整评估流水线

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FlagEmbedding 评估器 AbsEvaluator 深度解析:从检索、重排到指标计算的完整评估流水线

FlagEmbedding 评估器 AbsEvaluator 深度解析:从检索、重排到指标计算的完整评估流水线

【免费下载链接】FlagEmbeddingRetrieval and Retrieval-augmented LLMs项目地址: https://gitcode.com/GitHub_Trending/fl/FlagEmbedding

本篇技术指南围绕 FlagEmbedding 中抽象评估组件FlagEmbedding.abc.evaluation.AbsEvaluator展开,系统讲解如何在 BEIR、MS MARCO、MIRACL、MKQA、MLDR、AIR-Bench 等检索评测任务上,通过统一的"数据加载 → 稠密检索 → 重排 → 指标计算 → 结果输出"流水线完成模型评估。读完本文,你将掌握AbsEvaluator的核心调用流程、每项参数的真实作用,以及如何自定义评估器、复用检索结果缓存、选择正确的评测指标并输出对比报告。本文对应的 API 文档入口为 docs/source/API/abc/evaluation/evaluator.rst。

一、AbsEvaluator 在 FlagEmbedding 评估体系中的定位

FlagEmbedding 在FlagEmbedding/abc/evaluation/目录下提供了一套面向信息检索(IR)评估的抽象基类(abc),用于把"评估什么数据、用什么模型检索、怎么重排、算什么指标"这四件事解耦成四个可替换的组件。AbsEvaluator正是其中负责编排整条评估流水线的核心类,源码位于 FlagEmbedding/abc/evaluation/evaluator.py。

从 FlagEmbedding/abc/evaluation/init.py 的导出列表可以看出,这套评估体系由以下组件协同工作:

组件职责源码
评估器AbsEvaluator编排检索、重排、评估全过程,管理结果读写evaluator.py
数据加载器AbsEvalDataLoader加载语料(corpus)、查询(queries)与相关性标注(qrels)data_loader.py
检索器EvalRetriever/EvalDenseRetriever编码语料与查询、建 Faiss 索引并返回 Top-k 结果searcher.py
重排器EvalReranker对检索结果做交叉编码重排searcher.py
运行器AbsEvalRunner组装上述组件并驱动整个评估runner.py
参数类AbsEvalArgs/AbsEvalModelArgs声明评估与模型相关的全部命令行参数arguments.py

这一设计直接服务于FlagEmbedding/evaluation/下的各评测入口(如FlagEmbedding/evaluation/beirmsmarcomiraclmkqamldrair_benchbrightmtebcustom等)。这些下游评测模块要么直接复用AbsEvaluator,要么像BEIREvaluator(见 FlagEmbedding/evaluation/beir/evaluator.py)和MKQAEvaluator(见 FlagEmbedding/evaluation/mkqa/evaluator.py)那样继承它并重写部分方法,以适应多子数据集聚合、跨语言共享语料等特殊场景。

注:本文档对应的 Sphinx API 页面 evaluator.rst 通过.. autoclass:: FlagEmbedding.abc.evaluation.AbsEvaluator指令自动生成AbsEvaluator的 API 说明,因此其权威内容即源码中的 docstring 与实现,本文在此基础上展开。

二、AbsEvaluator 的构造与三个核心入参

AbsEvaluator的构造函数非常精简(evaluator.py#L27-L35):

class AbsEvaluator: def __init__( self, eval_name: str, data_loader: AbsEvalDataLoader, overwrite: bool = False, ): self.eval_name = eval_name self.data_loader = data_loader self.overwrite = overwrite
参数类型默认值作用
eval_namestr必填当前评估实验的名称,如beirmsmarcomiracl。它会写入每个结果文件的元数据,并在读取结果时用于一致性校验
data_loaderAbsEvalDataLoader必填负责加载语料、查询、相关性标注的数据加载器,通常由AbsEvalRunner.load_data_loader()创建
overwriteboolFalse若为True,即使磁盘上已存在检索/重排结果文件也会重新计算并覆盖;否则会复用已有缓存,实现断点续跑

在实际运行中,AbsEvaluator通常不是被直接实例化的,而是由AbsEvalRunner(FlagEmbedding/abc/evaluation/runner.py)在__init__阶段装配好。从 runner.py#L127-L138 可以看到,AbsEvalRunner.load_evaluator()正是用eval_args.eval_namedata_loadereval_args.overwrite构造评估器,随后在run()中调用self.evaluator(...)触发完整评估流程。

三、评估主流程:call中的检索与重排两阶段

AbsEvaluator的全部核心逻辑都在__call__方法中(evaluator.py#L102-L264),它把一个数据集上的评估划分为检索阶段重排阶段。先看完整的参数签名:

def __call__( self, splits: Union[str, List[str]], search_results_save_dir: str, retriever: EvalRetriever, reranker: Optional[EvalReranker] = None, corpus_embd_save_dir: Optional[str] = None, ignore_identical_ids: bool = False, k_values: List[int] = [1, 3, 5, 10, 100, 1000], dataset_name: Optional[str] = None, **kwargs, ):
参数类型默认值说明
splitsstr/List[str]必填要评估的数据切分,如testdev;会被data_loader.check_splits()过滤掉不存在的切分
search_results_save_dirstr必填检索/重排结果的保存根目录
retrieverEvalRetriever必填稠密检索器实例
rerankerEvalRerankerNone可选的交叉编码重排器,为None时跳过重排阶段
corpus_embd_save_dirstrNone语料向量缓存目录,None表示不保存向量
ignore_identical_idsboolFalse是否在结果中剔除与查询 id 相同的文档(如 MS MARCO 等需要排除,MIRACL 等则不应开启)
k_valuesList[int][1, 3, 5, 10, 100, 1000]计算指标时采用的截断点集合
dataset_namestrNone数据集名称;为None时评估默认数据集

3.1 前置准备:切分校验与保存路径规划

__call__首先调用data_loader.check_splits(splits, dataset_name=dataset_name)过滤无效切分;若全部切分都不可用,则直接告警并跳过评估。随后根据dataset_name决定结果文件命名模板:

if dataset_name is not None: save_name = f"{dataset_name}-" + "{split}.json" else: save_name = "{split}.json"

即:评估单个数据集时每个切分生成一个dataset-split.json文件;评估默认数据集时生成split.json

接下来通过get_corpus_embd_save_dir()(evaluator.py#L80-L100)计算语料向量缓存目录。基类实现中,若指定了corpus_embd_save_dir,会在此基础上追加retriever_name,若有dataset_name再追加一层dataset_name,最终形如<corpus_embd_save_dir>/<retriever>/<dataset>/。这一方法的设计意图在 docstring 中写明:对于 MKQA 这类多语言查询共享同一语料的评测,子类可以重写该方法,把不同dataset_name的语料向量存到同一目录以复用。MKQAEvaluator正是这样做的——见 FlagEmbedding/evaluation/mkqa/evaluator.py#L14-L33,它省略了dataset_name层级,所有语言变体共享一份doc.npy

3.2 检索阶段(Retrieval Stage)

检索阶段的目录约定为<search_results_save_dir>/<retriever>/NoReranker/,其中<retriever>取自str(retriever)。需要说明的是,EvalRetriever.__str__返回的是os.path.basename(self.embedder.model.config._name_or_path)(见 searcher.py#L27-L31),即模型名,因此结果目录天然按模型名组织。

流程如下:

  1. 缓存判断:遍历所有切分,若任一切分的结果文件split_no_reranker_search_results_save_path不存在,或self.overwriteTrue,则置flag = True进入"重新检索"分支。
  2. 重新检索分支
    • 通过data_loader.load_corpus()加载语料,通过data_loader.load_queries()为每个切分加载查询;
    • 所有切分的查询合并后一次性交给retriever(corpus, all_queries, corpus_embd_save_dir=..., ignore_identical_ids=..., **kwargs),避免重复编码查询;
    • 将合并结果按切分拆分回no_reranker_search_results_dict[split]
    • 调用save_search_results()把每个切分的结果写入<NoReranker 目录>/<save_name>.json
  3. 复用缓存分支:若结果文件已存在且overwrite=False,则通过load_search_results()读回结果,并用check_data_info()校验元数据。
  4. 回收资源:检索完成后调用retriever.stop_multi_process_pool(),其内部转发给embedder.stop_self_pool()释放多进程/显存资源(见 searcher.py#L33-L40)。
  5. 指标落盘:若<NoReranker>/EVAL/eval_results.json不存在、或overwrite、或本次重新检索过(flag),则调用evaluate_results()计算指标并写入该EVAL子目录。

3.3 重排阶段(Reranking Stage)

仅当传入的reranker不为None时执行。重排结果的目录约定为<search_results_save_dir>/<retriever>/<reranker>/,即"检索器名 + 重排器名"双层目录,二者可直接对比是否重排带来的收益。

重排阶段的流程与检索阶段对称:

  1. 对每个切分,若结果文件已存在且overwrite=False则跳过(continue);
  2. 否则调用reranker(corpus, queries, search_results=no_reranker_search_results_dict[split], ignore_identical_ids=..., **kwargs)进行重排;
  3. save_search_results()保存结果,其中reranker_name字段写入str(reranker)(即重排器模型名);
  4. 全部切分完成后调用reranker.stop_multi_process_pool()释放资源;
  5. <reranker 目录>/EVAL/eval_results.json缺失、overwrite或本次有重排过,则计算并写入重排后的指标。

从 searcher.py#L183-L249 可以看到EvalReranker的内部逻辑:先把检索结果截断到rerank_top_k(默认 100),构造(query, doc)句子对,调用reranker.compute_score(pairs)批量打分,再按新分数重新组织{qid: {docid: score}}返回。这也解释了AbsEvaluatorrerank_top_k参数(arguments.py#L49)与重排阶段的关系——重排只对检索 Top-k 的子集进行,以控制计算开销。

四、数据校验机制:check_data_info 与结果元数据

为了确保"读回的缓存结果"与"当前评估配置"严格一致,AbsEvaluator在复用结果时会调用check_data_info()(evaluator.py#L37-L78)逐项比对元数据,任何一项不匹配都会抛出ValueError

  • data_info["eval_name"] != self.eval_nameeval_name mismatch
  • data_info["model_name"] != model_namedata_info["reranker_name"] != reranker_namemodel_name or reranker_name mismatch
  • data_info["split"] != splitsplit mismatch
  • dataset_name is not Nonedata_info["dataset_name"] != dataset_namedataset_name mismatch

这些元数据由save_search_results()(evaluator.py#L266-L299)写入,每个结果 JSON 的结构固定为:

{ "eval_name": "beir", "model_name": "bge-large-en-v1.5", "reranker_name": "NoReranker", "split": "test", "dataset_name": "fiqa", "search_results": { "qid_1": {"docid_a": 0.912, "docid_b": 0.873} } }

load_search_results()(evaluator.py#L301-L315)读取该文件时会把search_results字段弹出,返回(data_info, search_results)两个值,供后续校验与指标计算使用。子类可以像BEIREvaluator那样重写check_data_infosave_search_results增加额外的sub_dataset_name元数据字段(见 FlagEmbedding/evaluation/beir/evaluator.py#L16-L64 与 #L418-L454)。

五、指标计算:compute_metrics 与 evaluate_results

AbsEvaluator将指标计算拆成两层:单文件粒度的compute_metrics()和目录粒度的evaluate_results()

5.1 compute_metrics:六类检索指标一次算齐

compute_metrics()(evaluator.py#L317-L356)接受qrelssearch_resultsk_values三个输入,内部调用 utils.py 中的三个指标函数:

  • evaluate_metrics()(utils.py#L95-L147):基于pytrec_eval.RelevanceEvaluator计算NDCG@k、MAP@k、Recall@k、Precision@k(P@k),其对每个查询在给定 k 截断点下求均值,结果保留 5 位小数;
  • evaluate_mrr()(utils.py#L14-L52):计算MRR@k(平均倒数排名),该实现改编自 BEIR 的自定义指标;
  • evaluate_recall_cap()(utils.py#L56-L91):计算R_cap@k(封顶召回率),分母取min(相关文档数, k),同样改编自 BEIR。

最终compute_metrics把六个字典统一拼装成如下形式的分数表:

scores = { "ndcg_at_1": 0.31, "ndcg_at_3": 0.42, ..., # 对应 NDCG@k "map_at_1": 0.18, "map_at_3": 0.25, ..., # 对应 MAP@k "recall_at_1": 0.10, "recall_at_10": 0.55, ..., # 对应 Recall@k "precision_at_1": 0.31, ..., # 对应 P@k "mrr_at_1": 0.31, ..., # 对应 MRR@k "recall_cap_at_1": 0.10, ..., # 对应 R_cap@k }

注意命名风格:字典键用下划线形式(如ndcg_at_10recall_at_100),这与你后续在--eval_metrics命令行参数中填写的指标名一一对应。

5.2 evaluate_results:遍历结果目录聚合指标

evaluate_results()(evaluator.py#L358-L400)遍历search_results_save_dir下所有.json文件,对每个文件:

  1. load_search_results()读回data_infosearch_results
  2. 断言data_info['eval_name'] == self.eval_name,不一致直接assert失败,防止混入其他实验的结果;
  3. data_infosplitdataset_name
  4. 通过data_loader.load_qrels(dataset_name=..., split=...)加载该切分的相关性标注;
  5. 调用compute_metrics()计算指标,并以f"{dataset_name}-{split}"(有数据集名时)或split作为键写入结果字典。

需要重点说明的是,evaluate_results的输入目录就是"某个 (检索器, 重排器) 组合"下的结果目录,例如<output_dir>/<retriever>/NoReranker/。这意味着每对"检索器 × 重排器"组合只产出一份EVAL/eval_results.json,天然支持在同一套检索结果上测试多个重排器的实验设计。

MKQAEvaluator还演示了如何重写evaluate_results:由于 MKQA 的答案召回需要把语料拼成"title text"文本后交给问答侧评估(evaluate_qa_recall,见 FlagEmbedding/evaluation/mkqa/utils/compute_metrics.py),其评估逻辑与通用的pytrec_eval指标不同,因此整体重写了该方法(FlagEmbedding/evaluation/mkqa/evaluator.py#L35-L117)。

六、结果输出:JSON、DataFrame 与 Markdown 报告

评估完成后,AbsEvaluator提供三个输出相关的方法,覆盖"机器可读"与"人类可读"两类场景。

6.1 输出 JSON

output_eval_results_to_json()(evaluator.py#L402-L414)把eval_results_dictindent=4写入指定路径,并在日志中打印Results saved to <path>。它是检索/重排阶段写EVAL/eval_results.json所用的方法。

6.2 生成 DataFrame 透视表

get_results_df()(evaluator.py#L416-L464)用于把"多模型 × 多重排器 × 多切分"的三层嵌套结果字典展平为一个透视表。它遍历eval_results_dict[model_name][reranker_name][split],构建以(Model, Reranker)MultiIndex、以各切分为列、末尾附average平均列的 DataFrame。某切分缺失时该单元格为None,且只要任一列缺失,average也会置为None(避免用不完整数据平均)。其数据结构对应AbsEvalRunner.evaluate_metrics<output_dir>/<model>/<reranker>/EVAL/eval_results.json汇总出来的eval_results_dict(runner.py#L159-L177)。

6.3 输出 Markdown 对比报告

output_eval_results_to_markdown()(evaluator.py#L466-L499)按指标逐个生成 Markdown 表格:

  • 每个指标生成一个## <metric>章节;
  • 表格列为Model | Reranker | <split1> | ... | average
  • 每行对应一个(Model, Reranker)组合,数值以*100的百分比形式保留 3 位小数输出;
  • 每列最高分用**加粗**标出,便于快速定位每个切分上的最优组合。

这是AbsEvalRunner.run()末尾生成最终报告所走的路径(runner.py#L223-L229):先汇总各组合的EVAL/eval_results.json,再按eval_output_methodjsonmarkdown)与eval_metrics指定的指标列表输出到eval_output_path

七、端到端实战:命令行参数与一次完整评估

7.1 命令行参数速查

评估的全部行为由AbsEvalArgsAbsEvalModelArgs两个 dataclass 声明(FlagEmbedding/abc/evaluation/arguments.py)。与AbsEvaluator直接相关的评估侧参数如下:

参数默认值说明
--eval_name必填评估任务名,如beirmsmarco
--dataset_dirNone本地数据集目录;需含corpus.jsonl<split>_queries.jsonl<split>_qrels.jsonl,或包含多个此类子目录;传None时数据集仅下载到缓存
--dataset_namesNone要评估的数据集/语言名称列表,None表示评估全部可用数据集
--splitstest要评估的切分(可多个)
--corpus_embd_save_dirNone语料向量缓存目录,None则不保存
--output_dir./search_results检索/重排结果保存根目录
--search_top_k1000检索阶段每个查询保留的候选数
--rerank_top_k100重排阶段每个查询处理的候选数
--overwriteFalse是否覆盖已有结果
--ignore_identical_idsFalse是否剔除与查询同 id 的文档
--k_values1 3 5 10 100 1000指标截断点集合
--eval_output_methodmarkdown结果输出方式:jsonmarkdown
--eval_output_path./eval_results.md最终报告输出路径
--eval_metricsndcg_at_10 recall_at_10报告中要展示的指标(需与compute_metrics输出的键一致)

模型侧(AbsEvalModelArgs)的关键参数包括:--embedder_name_or_path(必填)、--embedder_model_class(如encoder-only-m3decoder-only-basedecoder-only-icl等)、--reranker_name_or_path--reranker_model_class--devices--use_fp16/--use_bf16--normalize_embeddings(默认True)、各类 instruction 参数、--embedder_batch_size(默认 3000)、--embedder_query_max_length/--embedder_passage_max_length(默认 512)以及--truncate_dim(用于 Matryoshka 截断)。这些参数会经 runner.py#L37-L93 的get_models()传入FlagAutoModel.from_finetuned()FlagAutoReranker.from_finetuned()完成模型加载。

7.2 真实运行脚本解读

仓库提供了各评测任务的官方示例脚本,例如 BEIR 评测脚本 examples/evaluation/beir/eval_beir.sh:

dataset_names="fiqa arguana cqadupstack" eval_args="\ --eval_name beir \ --dataset_dir ./beir/data \ --dataset_names $dataset_names \ --splits test dev \ --corpus_embd_save_dir ./beir/corpus_embd \ --output_dir ./beir/search_results \ --search_top_k 1000 --rerank_top_k 100 \ --cache_path $HF_HUB_CACHE \ --overwrite False \ --k_values 10 100 \ --eval_output_method markdown \ --eval_output_path ./beir/beir_eval_results.md \ --eval_metrics ndcg_at_10 recall_at_100 \ --ignore_identical_ids True \ " model_args="\ --embedder_name_or_path BAAI/bge-large-en-v1.5 \ --reranker_name_or_path BAAI/bge-reranker-v2-m3 \ --devices cuda:0 cuda:1 \ --cache_dir $HF_MODEL_CACHE \ --reranker_max_length 1024 \ " cmd="python -m FlagEmbedding.evaluation.beir \ $eval_args \ $model_args \ " echo $cmd eval $cmd

要点拆解:

  • --dataset_names fiqa arguana cqadupstack指定三个 BEIR 子数据集;其中cqadupstack是特殊的子数据集族,BEIREvaluator.evaluate_results会把其多个子集(如cqadupstack-androidcqadupstack-english等)的指标平均后合并为cqadupstack-test一行(见 FlagEmbedding/evaluation/beir/evaluator.py#L400-L414)。
  • --ignore_identical_ids True剔除与查询同 id 的文档(BEIR 惯例);注意 dense 检索器在ignore_identical_ids=True时会告警提示"类似 MIRACL 的数据集不应开启该选项"(searcher.py#L101-L102)。
  • --overwrite False让二次运行直接复用./beir/search_results./beir/corpus_embd中的缓存,实现增量评估与断点续跑。
  • 指定了--reranker_name_or_path,因此评估会同时产出NoRerankerbge-reranker-v2-m3两个目录,并各自生成EVAL/eval_results.json,最终在beir_eval_results.md中对比。

脚本最终通过python -m FlagEmbedding.evaluation.beir调用对应评测模块,其运行入口位于 FlagEmbedding/evaluation/beir/main.py。其他评测任务(MS MARCO、MIRACL、MKQA、MLDR、AIR-Bench、MTEB、BRIGHT 等)的脚本分别位于 examples/evaluation/,结构完全一致,可照此扩展。

八、如何自定义评估器:继承 AbsEvaluator 的三种模式

BEIREvaluatorMKQAEvaluator的实际用法可以总结出三种自定义模式,供你在自己的评测任务中参考:

模式一:重写get_corpus_embd_save_dir共享语料向量。当多个dataset_name共享同一份语料时(如 MKQA 的多语言变体),重写该方法让它们写入同一目录,避免重复编码与重复存储。示例见 FlagEmbedding/evaluation/mkqa/evaluator.py#L14-L33。

模式二:重写check_data_info/save_search_results增加元数据维度。当结果需要按子数据集(如sub_dataset_name)区分时,在元数据中追加字段并同步扩展校验逻辑。示例见 FlagEmbedding/evaluation/beir/evaluator.py#L16-L64 与 #L418-L454。

模式三:重写evaluate_results定制指标聚合逻辑。当评测指标不是标准检索指标时(如 MKQA 的答案召回率、BEIR 的 CQADupstack 子集平均),整体重写该方法。示例见 FlagEmbedding/evaluation/mkqa/evaluator.py#L35-L117 与 FlagEmbedding/evaluation/beir/evaluator.py#L351-L416。

若你需要评估自定义格式的本地数据集,AbsEvalDataLoader已内置corpus.jsonl+<split>_queries.jsonl+<split>_qrels.jsonl的本地加载逻辑(data_loader.py#L232-L317),只需按此格式组织数据目录并通过--dataset_dir传入;对于远程数据集,则需要继承AbsEvalDataLoader并实现_load_remote_corpus_load_remote_qrels_load_remote_queries三个抽象方法。

九、使用注意事项与最佳实践

  1. 结果文件即缓存<output_dir>/<retriever>/NoReranker/<output_dir>/<retriever>/<reranker>/下的 JSON 既是结果也是缓存。修改了k_values等只影响指标计算的参数时,无需重新检索,直接重跑指标计算即可;修改了模型、指令或search_top_k时,务必设置--overwrite True或更换--output_dir,否则旧缓存可能被误用——check_data_info的元数据校验会在此时抛出ValueError提醒你配置不匹配。
  2. 指标名与--eval_metrics对齐compute_metrics输出的键是ndcg_at_10recall_at_100等下划线格式,--eval_metrics必须严格匹配这些键,否则get_results_df中该列会全部为None
  3. ignore_identical_ids需按数据集谨慎选择:MS MARCO 等数据集建议开启以排除查询-文档同 id 的干扰;MIRACL 等数据集不应开启(searcher.py#L101-L102)。
  4. 多切分查询合并检索__call__会把所有切分的查询合并后一次性检索,再从总结果中按切分拆回,避免重复编码,但要求各切分查询 id 不冲突。
  5. corpus_embd_save_dir是加速关键:语料向量(doc.npy)与 Faiss 索引可在多次实验间复用;对大型语料(如 MS MARCO、BEIR)而言,这是避免重复编码的主要手段。底层索引构建与检索实现在 utils.py#L150-L228,默认使用Flat索引与内积度量(faiss.METRIC_INNER_PRODUCT),在 GPU 可用时自动尝试index_cpu_to_all_gpus分片构建(useFloat16半精度)。
  6. 重排只作用于检索 Top-krerank_top_k(默认 100)会先截断检索结果再打分,控制交叉编码器开销;compute_score采用批量打分(默认 batch size 3000,见 arguments.py#L153-L154)。

十、与其他 API 的关系

AbsEvaluator并不是孤立组件。它在评估流水线中的上下游关系如下:

  • 上游AbsEvalRunner(FlagEmbedding/abc/evaluation/runner.py)负责从AbsEvalArgs/AbsEvalModelArgs解析参数、加载模型与数据加载器,并在run()中调用evaluator(...)
  • 数据侧AbsEvalDataLoader(FlagEmbedding/abc/evaluation/data_loader.py)为评估器提供语料、查询与 qrels。
  • 检索/重排侧EvalRetriever/EvalDenseRetriever/EvalReranker(FlagEmbedding/abc/evaluation/searcher.py)包装FlagEmbedding.abc.inference中的AbsEmbedderAbsReranker,通过encode_corpus/encode_queries/compute_score完成向量化与打分。
  • 指标侧:FlagEmbedding/abc/evaluation/utils.py 提供基于pytrec_eval与 Faiss 的底层指标与索引实现。
  • 下游评测FlagEmbedding/evaluation/下的 BEIR、MS MARCO、MIRACL、MKQA、MLDR、AIR-Bench 等模块通过继承AbsEvaluator或直接复用其流程,构建各自的评测入口;对应的命令行示例见 examples/evaluation/。

综上,AbsEvaluator通过"两阶段(检索 + 重排)、双目录(模型名分层)、四要素(语料/查询/qrels/指标)"的统一设计,为 FlagEmbedding 覆盖的多语言、多领域检索评测提供了可复用、可缓存、可扩展的评估骨架——无论是跑一份官方 benchmark 报告,还是为自定义数据集编写新的评测器,它都是最直接的起点。

延伸阅读

  • 评估器基类源码:FlagEmbedding/abc/evaluation/evaluator.py
  • 评估参数定义:FlagEmbedding/abc/evaluation/arguments.py
  • 数据加载器:FlagEmbedding/abc/evaluation/data_loader.py
  • 检索器与重排器:FlagEmbedding/abc/evaluation/searcher.py
  • 指标与索引工具:FlagEmbedding/abc/evaluation/utils.py
  • 评估运行器:FlagEmbedding/abc/evaluation/runner.py
  • API 文档目录:docs/source/API/abc/evaluation/
  • 命令行示例:examples/evaluation/

【免费下载链接】FlagEmbeddingRetrieval and Retrieval-augmented LLMs项目地址: https://gitcode.com/GitHub_Trending/fl/FlagEmbedding

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 19:41:40

STM32F103老人护理监测仪:多传感器数据采集与嵌入式开发实战

简介&#xff1a;基于STM32F103的多传感器护理监测项目&#xff0c;面向嵌入式开发者和物联网爱好者&#xff0c;集成DHT11温湿度、微波生命雷达、红外体温、一氧化碳、液晶屏及WiFi等模块&#xff0c;可实时监测老人或病人的环境与生理状态&#xff0c;适用于智慧养老、病房监…

作者头像 李华
网站建设 2026/9/15 19:38:09

aidlc config 首次运行前必知的6件事(附常见陷阱)

aidlc config 首次运行前必知的6件事&#xff08;附常见陷阱&#xff09; 【免费下载链接】aidlc-workflows AI-Driven Life Cycle (AI-DLC) adaptive workflow steering rules for AI coding agents 项目地址: https://gitcode.com/GitHub_Trending/ai/aidlc-workflows …

作者头像 李华
网站建设 2026/9/15 19:35:51

工控安全实战:从IT到OT的差异与纵深防御落地指南

做了这么多年工控安全&#xff0c;最常被问到的一句话是&#xff1a;“你们这行和IT安全到底有什么区别&#xff1f;”说实话&#xff0c;区别太大了。你在写字楼里给服务器打补丁、装杀毒&#xff0c;最多影响一个网站访问速度&#xff1b;但在工厂里&#xff0c;一个不当的扫…

作者头像 李华