引言:多跳问答的数据困境
在自然语言处理领域,多跳问答(Multi-hop Question Answering,MHQA)一直被视为评估AI系统(如熟知的RAG)高级推理能力的黄金标准。多跳问题要求模型跨越多个文档,通过逻辑推理找出答案,而不是简单地从单一段落中提取信息。然而,高质量的多跳问答数据集极其稀缺,主要受限于三大因素:
- 人工标注成本高昂:专业人员需花费大量时间设计跨文档的推理路径和相应问题
- 特定领域数据匮乏:现有多跳公开数据集主要集中在通用知识领域,专业领域(如医学、法律)的多跳数据几乎空白
- 问题合成缺乏关键的"关联能力":之前给模型的输入都是一两篇文档,却没有想过采用更高一层(语料库)作为输入,让合成系统自行挖掘海量语料之间的关联来生成问题。现在丢给模型一个语料库,就可以让HopWeaver自动生成数据了!
今天,我为大家介绍一个在数据合成领域的突破------HopWeaver,这是首个能够从任意非结构化文本语料库自动合成跨文档多跳问题的框架,无需人工标注即可生成媲美甚至超越人工标注的高质量问题。
数据质量评估结果的展示:
HopWeaver:开创性的多跳问题自动合成框架
核心特点
HopWeaver在多跳问答研究领域具有多项重大创新:
- 🥇 首创全自动框架:首个基于非结构化语料库进行跨文档多跳问题合成的全自动框架
- 🌐 通用性极强:适用于任何领域的非结构化文本,不受特定知识结构限制
- 💯 质量保障:实验证明,生成的问题质量可媲美甚至超越人工标注数据集
- 🧠 真实推理路径:三维评估体系确保生成问题需要真正的多跳推理能力
- 📊 多样性问题:支持桥接型(实体连接)和比较型(属性分析)两种主要多跳问题类型
论文:HopWeaver github代码:Hopweaver
为什么HopWeaver是数据合成领域的革新突破?
与现有方法的关键区别
传统上,获取多跳问答数据主要有三种途径:
- 人工标注:成本高,速度慢,难以扩展到专业领域,依赖于维基百科中超链接关系跳转标注(如HotpotQA等数据集的标注流程)
- 基于结构化知识的合成:依赖于知识图谱,受限于特定领域知识结构
- 简单LLM生成:如给定文档后通过prompt让LLM生成一些提问(现阶段常见的LLM数据合成方式)。缺乏严格的跨文档推理路径保证,质量参差不齐
而HopWeaver从根本上改变了这一现状:
- 无需知识图谱:直接从非结构化文本中发现潜在的跨文档连接
- 自动发现关联文档:智能识别能够连接不同文档的关键实体,在开放域海量数据库中"大海捞针",找到关联的信息并提问。丢给模型一个语料库,就可以让Hopweaver自动生成数据了!
- 明确推理路径构建:确保每个问题都有清晰的跨文档推理链
- 质量过滤机制:多层筛选确保最终问题的高质量和多样性

HopWeaver如何工作?简明技术原理

HopWeaver的工作流程可以分为两类,每一类涉及独特的算法设计:
1. 桥接型问题合成
- 实体抽取:识别文档中的关键实体及其类型
- 桥梁实体识别:发现能够连接多个文档的关键"桥梁实体"
- 相关文档查询:多阶段(粗排+精排),大海捞针,找到语料库直接的实体信息关联
- 推理路径构建:确定跨文档的逻辑推理链
- 问题生成与优化:基于推理路径合成高质量多跳问题
2. 比较型问题合成
- 相似实体识别:寻找具有可比较属性的实体对
- 属性抽取与对比:分析实体的关键属性及其异同
- 实体-属性过滤:过滤得到高质量的实体-属性对
- 相关文档查询构建:构建可能关联的"实体-属性"文档
- 比较型问题构建:生成需要跨文档分析和比较的问题
- 问题生成与优化:基于推理路径合成高质量多跳问题
3. 多维度评估系统
🔥 实际应用案例:HopWeaver的强大之处
案例1:医学领域桥接型问题

这个案例展示了HopWeaver如何在医学文献中构建高质量的多跳问题:
文档A描述了膈肌脚的解剖结构,特别是左右膈肌脚如何在主动脉前方汇合形成正中弓状韧带。(解剖学知识)
文档B则介绍了正中弓状韧带综合征,这是一种由正中弓状韧带压迫腹腔动脉导致的病症。(病理学知识)
生成的多跳问题:"当膈肌脚在主动脉处汇合形成的解剖结构压迫腹腔动脉和神经节时,会引起什么综合征?"
回答这个问题需要先从文档A确定膈肌脚汇合形成的是"正中弓状韧带",然后在文档B中找到这个结构导致的综合征是"正中弓状韧带综合征"。这是一个需要真正跨文档推理的问题,难度与专业人员设计的问题相当。
案例2:音乐领域比较型问题

生成的多跳问题:"哪位作曲家的出生日期更早:Mihály Mosonyi 还是 Franz Liszt?"
这个问题要求从两个不同的作曲家传记文档中提取出生日期信息(Mosonyi生于1815年,Liszt生于1811年),并进行比较分析,是一个典型的跨文档比较型多跳问题。
🛠 快速上手指南:如何使用HopWeaver
想要体验HopWeaver的强大功能?以下是简明的操作流程(详细流程可参考github代码:Hopweaver):
-
克隆代码库并安装依赖:
bashgit clone https://github.com/Zh1yuShen/HopWeaver.git cd HopWeaver pip install -r requirements.txt
-
准备核心数据与模型:
- 下载预处理的Wiki数据集: 从我们上传的数据集链接 Hugging Face 或 ModelScope 下载
wiki18_fulldoc_trimmed_4096.jsonl
文件。 - 下载GTE嵌入模型: 从 Hugging Face 下载 GTE 模型。
- 下载预构建的FAISS索引: 从 Hugging Face 或 ModelScope 下载预构建的
gte_Flat.index
文件 (推荐)。
- 下载预处理的Wiki数据集: 从我们上传的数据集链接 Hugging Face 或 ModelScope 下载
-
配置API和路径:
-
复制
config_lib/example_config.yaml
并重命名为例如config_lib/my_quickstart_config.yaml
(或者,您可以直接修改example_config.yaml
,但不推荐用于保留原始示例)。 -
LLM API密钥和模型配置: 在您的配置文件中(例如
my_quickstart_config.yaml
)设置LLM API密钥。系统会依据您在YAML中指定的generator_model
名称内的关键字,来选择对应的API设置块(如openai_setting
,google_setting
)。 请确保您选择的generator_model
与YAML中正确配置的*_setting
块相对应,并包含api_keys
和base_url
。例如,若设置
generator_model: "gpt-4o"
,则会使用openai_setting
:yaml# OpenAI 设置 (若模型名称暗示为OpenAI,或默认情况下使用) openai_setting: api_keys: - "YOUR_OPENAI_API_KEY" # <--- 设置您的OpenAI密钥 base_url: "https://api.openai.com/v1" # 若需要,可定义其他设置(如 google_setting, anthropic_setting), # 确保它们与您选择的 generator_model匹配。例如: # google_setting: # api_key: "YOUR_GOOGLE_API_KEY" # base_url: "https://generativelanguage.googleapis.com/v1" # anthropic_setting: # api_key: "YOUR_ANTHROPIC_API_KEY" # base_url: "https://api.anthropic.com" # 各组件的模型选择。 # 每个模型名称(如果其使用的生成器依赖基于关键字的设置选择逻辑, # 如 openai_generator.py)都决定了哪个 *_setting 配置块(例如 openai_setting, google_setting) # 必须已正确配置API密钥和base_url。 generator_model: "gpt-4o" entity_extractor_model: "gpt-4o" # 若使用gpt-4o,请确保openai_setting已配置 question_generator_model: "gpt-4o" # 请确保openai_setting已配置 polisher_model: "gpt-4o" # 请确保openai_setting已配置 filter_model: "gpt-4o" # 请确保openai_setting已配置
-
数据与模型路径: 更新配置文件中的以下路径,指向您在步骤2中下载的文件和模型文件夹:
yaml# 全局路径映射 model2path: gte: "您下载的GTE模型文件夹的完整路径" # <--- 修改这里, 例如 /home/user/models/gte_sentence-embedding_multilingual-base # 各嵌入模型的池化方法 (GTE 通常使用 cls, 此处通常无需修改) model2pooling: gte: "cls" # 检索模型的索引路径 method2index: gte: '您下载的gte_Flat.index文件的完整路径' # <--- 修改这里, 例如 /home/user/data/HopWeaver/index/gte_Flat.index # 不同方法的语料库路径 method2corpus: gte: '您下载的wiki18_fulldoc_trimmed_4096.jsonl文件的完整路径' # <--- 修改这里, 例如 /home/user/data/HopWeaver/datasets/wiki18_fulldoc_trimmed_4096.jsonl
请确保将
"YOUR_OPENAI_API_KEY"
和"您下载的...的完整路径"
替换为您的实际密钥和本地文件/文件夹的绝对路径。
-
-
运行示例合成: 使用您配置好的文件(例如
my_quickstart_config.yaml
)运行一个简单的桥接问题合成任务:bashpython -m hopweaver.generate_and_evaluate_bridge --config ./config_lib/my_quickstart_config.yaml --count 3 --name quick_test_bridge --retriever standard
这将会生成3个桥接问题,并将结果保存在
output/quick_test_bridge/
目录下。
PS:只有检索模型需要使用计算资源(简单的消费级显卡或CPU就可以满足,需要占用内存),LLM调用的部分最简便的方式是先调用api试用各类模型(如免费的google gemini),有批量调用需求的时候可以考虑本地使用vllm部署模型。
完成以上步骤后,您应该能够成功运行HopWeaver。如需了解更多高级功能和自定义选项,请继续阅读后续的详细使用指南。