sentence-transformers 的 Natural Questions 模型:基于 nq-distilbert-base-v1 构建问答检索系统
sentence-transformers 的 Natural Questions 模型基于 nq-distilbert-base-v1 构建问答检索系统【免费下载链接】sentence-transformersState-of-the-Art Embeddings, Retrieval, and Reranking项目地址: https://gitcode.com/gh_mirrors/se/sentence-transformers本指南围绕 sentence-transformers 官方预训练模型nq-distilbert-base-v1展开介绍其背后的 Natural Questions 数据集、问答式question-answer检索的使用方法、段落编码格式标题 正文以及 MRR10 评估指标并结合仓库中的语义搜索示例与检索评估器源码说明如何在真实问答检索场景中落地。读完本文你将掌握用单个 Bi-Encoder 模型完成问题 → Wikipedia 段落检索的完整流程并理解其性能优势的度量方式。Natural Questions 数据集与模型定位nq-distilbert-base-v1是 sentence-transformers 基于Google 的 Natural Questions 数据集训练的双编码器Bi-Encoder模型。Natural Questions 数据集包含约 10 万条来自 Google 搜索的真实用户查询以及从 Wikipedia 中标注出的包含答案的相关段落。正因为训练数据来自真实搜索日志基于该数据集训练的模型在问题-答案检索question-answer retrieval这类非对称检索任务上表现良好——即查询是口语化的自然语言问题而检索目标是长篇知识段落。该模型的定位可见于仓库示例 semantic_search_wikipedia_qa.py 中的说明它专门针对 Natural Questions 数据集训练适用于问答检索在 semantic_search_nq_opensearch.py 中同样被明确描述为专门为 Natural Questions 数据集上的问答训练。基本用法一行代码加载模型按照 nq-v1.md 的用法说明加载与使用模型非常直接from sentence_transformers import SentenceTransformer model SentenceTransformer(sentence-transformers/nq-distilbert-base-v1) query_embedding model.encode(How many people live in London?) # The passages are encoded as [ [title1, text1], [title2, text2], ...] passage_embedding model.encode( [[London, London has 9,787,426 inhabitants at the 2011 census.]] ) print(Similarity:, model.similarity(query_embedding, passage_embedding))其中query_embedding与passage_embedding都是固定维度的稠密向量model.similarity(...)返回两批嵌入两两之间的相似度矩阵。查询向量形状为[embedding_dim]段落向量形状为[num_passages, embedding_dim]二者点积后得到[num_passages]的相似度分数。关键细节段落必须以标题 正文形式编码原文档特别强调了一个极易踩坑的细节编码段落时必须将 Wikipedia 文章标题与正文段落拼接在一起即传入形如[London, London has 9,787,426 inhabitants at the 2011 census.]的成对输入对应[[title1, text1], [title2, text2], ...]的列表。这一设计的原因在于Natural Questions 数据集中的答案段落天然带有来源文章标题训练时模型正是以标题 段落文本作为段落侧输入。因此推理阶段也必须保持同样的输入格式否则标题这一关键上下文信息缺失检索效果会明显下降。这一约定在仓库示例中得到了完整贯彻。在 semantic_search_wikipedia_qa.py 中Simple English Wikipedia 的每个段落都被组织为[data[title], paragraph]passages [] with gzip.open(wikipedia_filepath, rt, encodingutf8) as fIn: for line in fIn: data json.loads(line.strip()) for paragraph in data[paragraphs]: # We encode the passages as [title, text] passages.append([data[title], paragraph])实战基于 Simple English Wikipedia 的问答语义搜索仓库提供了开箱即用的端到端示例 semantic_search_wikipedia_qa.py展示完整的问答检索链路。由于完整英文 Wikipedia 体量过大示例选用约 17 万篇文章的 Simple English Wikipediasimplewiki-2020-11-01将文章切分为段落并与标题组合成[title, text]结构。整体流程如下加载 Bi-Encoder 模型sentence-transformers/nq-distilbert-base-v1下载并解析语料若本地无data/simplewiki-2020-11-01.jsonl.gz则自动下载逐行解析 JSON将每个段落组织为[title, paragraph]编码语料使用bi_encoder.encode(passages, convert_to_tensorTrue, show_progress_barTrue)预计算全部段落向量示例还提供了simplewiki-2020-11-01-nq-distilbert-base-v1.pt预计算嵌入文件可直接torch.load加载以跳过耗时的语料编码步骤交互式问答检索循环接收用户输入问题用semantic_search(question_embedding, corpus_embeddings, top_ktop_k)在全部段落嵌入中检索 top-5 命中并输出(score, [title, text])。semantic_search来自 sentence_transformers/util/init.py其核心是对语料嵌入与查询嵌入做批量内积排序。该示例完整演示了真实查询 → 语义检索 → 返回带标题段落的问答式检索闭环适合作为二次开发的基础模板。进阶与 OpenSearch 集成实现混合检索如果语料规模超出内存可容纳范围仓库在 semantic_search_nq_opensearch.py 中提供了基于 OpenSearch 的向量检索方案思路与内存版一致从sentence-transformers/natural-questions数据集加载 1 万个答案段落作为语料load_dataset用nq-distilbert-base-v1将段落编码为 768 维向量model.encode(corpus, batch_size32)在 OpenSearch 中创建含knn_vector维度 768、space_type: cosinesimil、HNSW 方法映射的索引将answer原文与answer_vector批量写入查询时既执行基于knn查询的语义检索也执行基于match查询的 BM25 关键词检索两种结果并排输出以便对比。该示例表明nq-distilbert-base-v1不仅可用于内存内语义搜索也能与主流向量数据库配合构建可横向扩展的问答检索服务。性能NQ dev 集上的 MRR10 对比原文档给出了模型在 Natural Questions 开发集small 子集上的 MRR10 评测结果ApproachMRR10 (NQ dev set small)nq-distilbert-base-v172.36Other modelsDPR58.96MRR10Mean Reciprocal Rank10是检索排序的标准指标对每个查询若第一个相关文档出现在第 k 位k ≤ 10则记分 1/k否则记 0最后对所有查询取平均。从结果看nq-distilbert-base-v1以 72.36 显著高于 DPRDense Passage Retrieval基线模型的 58.96体现了单模型双编码器在问答检索上的竞争力。仓库对 MRR 的计算有完整的源码实现可供参照。在 information_retrieval.py 的InformationRetrievalEvaluator.compute_metrics中检索器按分数降序排序每个查询的命中结果随后遍历 top-k 命中若命中corpus_id属于相关文档集合则累加1.0 / (rank 1)并跳出循环# MRRk for k_val in self.mrr_at_k: for rank, hit in enumerate(top_hits[0:k_val]): if hit[corpus_id] in query_relevant_docs: MRR[k_val] 1.0 / (rank 1) break最终MRR[k_val] / len(self.queries)对所有查询取平均。评估器默认mrr_at_k[10]information_retrieval.py且同时支持 Accuracyk、Precision/Recallk、NDCGk、MAPk 等多种指标可复用于自定义检索评测。相似度计算底层similarity 方法与余弦相似度model.similarity(...)的实现位于 sentence_transformer/model.py。SentenceTransformer通过similarity_fn_name属性默认cosine见 model.py确定相似度函数并在首次访问时惰性初始化。similarity接收两批嵌入返回形状为[num_embeddings_1, num_embeddings_2]的相似度矩阵def similarity(self, embeddings1, embeddings2): # Access similarity_fn_name to trigger lazy initialization of _similarity self.similarity_fn_name # noqa: B018 return self._similarity(embeddings1, embeddings2)除余弦相似度外还可通过similarity_fn_name切换为dot、euclidean、manhattan。需要说明的是对于nq-distilbert-base-v1这类基于 Natural Questions 训练的检索模型编码后的嵌入已做过归一化处理使用默认余弦相似度即可获得正确的排序效果。与其他预训练检索模型的关系DPR 模型文档 提供了另一类问答检索基线的用法DPR 采用双塔结构——question_encoder编码查询、ctx_encoder编码段落两塔不可互换段落侧同样需要标题信息但以London [SEP] London is the capital ...的显式[SEP]分隔格式输入且必须使用**点积dot-product**而非余弦相似度。对比之下nq-distilbert-base-v1的优势在于单一模型即可同时编码查询与段落输入格式统一段落为[title, text]列表并使用默认的余弦相似度工程实现更简洁。两者在 nq-v1.md 的 MRR10 对比中差距明显72.36 vs 58.96这也是推荐优先选用nq-distilbert-base-v1的依据。小结与适用场景nq-distilbert-base-v1是 sentence-transformers 生态中面向问答检索的成熟预训练模型。将其投入生产时需要牢记三个要点输入格式段落必须是[title, text]成对结构标题信息不可省略评估口径官方成绩基于 NQ dev 集的 MRR10可用 information_retrieval.py 中的InformationRetrievalEvaluator复现或扩展评估规模扩展小语料可直接在内存中执行semantic_search参考 semantic_search_wikipedia_qa.py大规模语料可借助 OpenSearch 等向量数据库落地参考 semantic_search_nq_opensearch.py。对于需要从真实自然语言问题中检索 Wikipedia 知识段落的场景该模型是开箱即用、效果经过验证的首选方案之一。【免费下载链接】sentence-transformersState-of-the-Art Embeddings, Retrieval, and Reranking项目地址: https://gitcode.com/gh_mirrors/se/sentence-transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

天亮以后说再见性能优化速查手册:3招解决面试被问懵

天亮以后说再见性能优化速查手册:3招解决面试被问懵

天亮以后说再见性能优化速查手册:3招解决面试被问懵 面试时被追问底层原理,脑子一片空白?别慌,这份天亮以后说再见性能优化速查手册,帮你把“答不上来”变成“张口就来”。…

2026/9/21 19:06:48 阅读更多 →
陶平生性能优化保姆级教程:告别代码卡死

陶平生性能优化保姆级教程:告别代码卡死

陶平生性能优化保姆级教程:告别代码卡死 复制来的代码跑不通,报错信息看得人头皮发麻,这种绝望感谁懂?别慌,今天这篇【陶平生】性能优化的 保姆级教程…

2026/9/21 19:06:48 阅读更多 →
Edict 安全加固实战:Dashboard 鉴权、文件锁与状态机审计如何守住 AI Agent 系统安全红线

Edict 安全加固实战:Dashboard 鉴权、文件锁与状态机审计如何守住 AI Agent 系统安全红线

Edict 安全加固实战:Dashboard 鉴权、文件锁与状态机审计如何守住 AI Agent 系统安全红线 【免费下载链接】edict 🏛️ 三省六部制 OpenClaw Multi-Agent Orchestration System — 9 specialized AI agents with real-time dashboard, model config, an…

2026/9/21 19:06:48 阅读更多 →

最新新闻

5个致命坑:一文搞懂五笔反查工具选型与避坑

5个致命坑:一文搞懂五笔反查工具选型与避坑

5个致命坑:一文搞懂五笔反查工具选型与避坑 看了一堆教程还是不会写项目?别急,这真不是你笨。很多开发者在做输入法辅助工具或文本处理系统时,盯着屏幕上的报错发呆,明明逻辑看着没错,一跑起来就崩。今天咱们不聊虚的,直接切入正题,帮你一文搞懂【五…

2026/9/21 19:37:05 阅读更多 →
C#上位机通信实战:HSLCommunication搞定Modbus TCP与PLC

C#上位机通信实战:HSLCommunication搞定Modbus TCP与PLC

1. 为什么我最终选了HSLCommunication做PLC通信做C#上位机开发的朋友,十有八九绕不开和PLC打交道这件事。我最早接触这块是在一个产线数据采集项目里,当时现场有西门子S7-1200、三菱FX系列、还有几台汇川的PLC,品牌杂、协议多,光是…

2026/9/21 19:37:05 阅读更多 →
新浪短链生成器实战:新手避坑指南,解决API失效难题

新浪短链生成器实战:新手避坑指南,解决API失效难题

新浪短链生成器实战:新手避坑指南,解决API失效难题 新浪短链 API 突然升级导致旧代码全报 404? 这是无数新手在复现教程时遇到的噩梦。 版本迭代太快,文档滞后,导致大量项目直接瘫痪。 很多学员拿着三年前的博客教程去写代码,结果发现…

2026/9/21 19:37:05 阅读更多 →
微信小程序开发睡眠助眠音乐系统实践

微信小程序开发睡眠助眠音乐系统实践

1. 项目概述:当音乐遇见科技失眠问题已经成为现代社会的普遍困扰。根据中国睡眠研究会发布的调查报告显示,我国有超过3亿人存在不同程度的睡眠障碍。传统药物治疗虽然见效快,但长期使用容易产生依赖性和副作用。作为一名长期受失眠困扰的程序…

2026/9/21 19:37:05 阅读更多 →
Java+SSM与Flask混合架构在医疗知识系统中的应用

Java+SSM与Flask混合架构在医疗知识系统中的应用

1. 项目背景与核心价值小儿肺炎作为儿童常见呼吸道疾病,其防治知识的普及率直接影响家庭护理质量和医疗资源合理利用。传统健康宣教存在信息碎片化、更新滞后、互动性差等痛点,而医疗机构的线下宣教又受限于时间和空间。这个基于JavaSSMFlask的混合架构知…

2026/9/21 19:37:05 阅读更多 →
11点11分源码深扒:解决复制代码跑不通的性能优化实战

11点11分源码深扒:解决复制代码跑不通的性能优化实战

11点11分源码深扒:解决复制代码跑不通的性能优化实战 刚把CSDN上那篇“11点11分”高精度计时Demo复制到本地,双击运行直接报 ImportError…

2026/9/21 19:36:05 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →