随着大语言模型(LLM)能力的发展,从海量非结构化文档中自动化、规模化地提取关键信息已成为可能。无论是处理公司财报、技术白皮书,还是分析法律合同,LLM 都能扮演一个高效的"知识萃取专家"。
本指南将系统介绍从文档预处理到知识提取的三种主流方法,帮助您根据不同场景选择最优方案。
预处理:将任意文档转换为结构化的纯文本(Markdown)
在将任何文档交给大模型之前,有一个至关重要的预处理步骤:将任意格式的文档转换为大模型可处理的纯文本格式。信息的质量和格式,直接决定了模型提取知识的上限。
大语言模型本身不理解.pdf
的视觉布局、不认识.docx
的复杂样式,也无法直接解析.html
的标签。它们的核心输入是文本序列。因此,我们的首要任务,就是将五花八门的文档格式统一转换成一种既保留了原文结构、又便于模型理解的文本格式。
1. 我们的目标:为什么选择 Markdown?
我们的目标并非简单地将所有内容粗暴地揉成一团纯文本(.txt
),而是将其转换为一种 对大语言模型最友好的格式------Markdown。
为什么是 Markdown?
- 结构清晰 :Markdown 使用简单的符号(如
#
表示标题,-
或*
表示列表)来标记文本的层级和结构。这使得模型能够轻松识别哪些是标题、哪些是正文、哪些是列表项,从而更好地理解上下文关系。 - 人类可读:Markdown 格式本身就非常直观,易于人类阅读和校验。
- 轻量纯粹:它剔除了所有复杂的格式和样式信息,只保留最核心的文本内容和逻辑结构,减少了无关噪声对模型分析的干扰。
2. 核心挑战:格式的繁杂
在实际工作中,我们面临的文档格式多种多样,每种都有其处理难点:
- PDF:布局复杂,包含多栏、图表、页眉页脚,文本提取容易错位或混杂。
- DOCX/DOC:富文本格式,包含大量样式信息,直接转换可能产生冗余的 XML 标签。
- HTML:虽然是文本,但充满了导航栏、广告、脚本等与正文无关的"噪音"。
- PPTX:内容分散在各个幻灯片和文本框中,需要整合。
手动处理这些格式费时费力且容易出错。因此,我们需要一个强大的自动化工具来扮演"文档清洁工"的角色。
3. 推荐方案:使用 Python 的markitdown
库
在这里,我们推荐使用一个专为此目的设计的 Python 开源项目------markitdown
。它旨在将多种主流文档格式一键转换为干净、高质量的 Markdown。
开源地址:https://github.com/microsoft/markitdown
总结
文档预处理是构建高质量知识提取系统的基石 。通过使用markitdown
这类工具将任意文档统一转换为结构化的 Markdown 文本,我们为大语言模型铺平了道路,确保了输入数据的干净、规整和易于理解。
在拥有了这份坚实的地基之后,我们便可以自信地进入知识提取的核心环节,探索如何运用大语言模型从中挖掘出珍贵的知识宝藏了。接下来,我们将介绍第一种提取方法:直接提问,指定提取范式。
方法一:直接提问,指定提取范式
这种方法的核心思想是,当我们对目标文档的内容类型有一定先验知识时,可以主动为大模型设定一个清晰的"信息框架"或"提取模板",引导模型像填写一份结构化表单一样,将文档中的对应信息"填入"我们预设的类别中。
1. 核心原理
此方法模拟了人类专家阅读文档的过程。一位领域专家在阅读材料时,脑海中通常会带着明确的目标,例如:"这份财报的关键财务指标是什么?"或"这篇论文的核心技术贡献有哪些?"。
"指定提取范式"正是将这种目标导向的思维模式,转化为对大模型的明确指令。我们不让模型漫无目的地"阅读全文",而是给它一个"任务清单",要求它在文档中寻找并填充我们指定的知识类别。这种方式极大地约束了模型的输出空间,使其专注于提取我们最关心的信息。
2. 具体实现方式
实现此方法非常简单,主要包含两个步骤:
第一步:定义提取范式(Schema)
根据你的需求和文档类型,预先定义好需要提取的知识点类别。这个范式可以是一个简单的列表,也可以是更复杂的分类。
例如:
- 对于历史事件文档 :可定义为
[关键人物, 事件起因, 发生时间, 地点, 主要影响]
- 对于产品说明书 :可定义为
[产品名称,核心功能, 技术规格, 适用人群, 价格]
- 对于科研论文摘要 :可定义为
[研究背景, 研究方法, 主要发现, 结论与意义]
第二步:构建提示词(Prompt)
将提取范式和原始文档组合成一个清晰的提示词。一个简洁的提示词结构通常如下:
# 任务指令
请根据下面提供的 {文档类型} 内容,严格按照我给定的范式提取关键知识点。
# 提取范式
- {类别一}: [请在此处填写提取内容]
- {类别二}: [请在此处填写提取内容]
- {类别三}: [请在此处填写提取内容]
...
# 文档内容
{此处粘贴你的完整文档文本}
3. 实战示例:提取一篇人物简介的核心信息
假设我们有一段关于玛丽·居里的简介,希望能快速抽取出其中的核心要素。
第一步:定义范式
对于人物简介,我们关心的通常是人物、成就、关键时间和相关领域。因此,我们定义范式如下:
- 关键人物:
- 国籍/领域:
- 主要成就:
- 重要时间节点:
- 核心概念:
第二步:构建并发送 Prompt
prompt
# 任务指令
请根据下面提供的人物简介,严格按照我给定的范式提取关键知识点。如果某一项在原文中未提及,请填写"未提及"。
# 提取范式
- 关键人物: [请在此处填写提取内容]
- 国籍/领域: [请在此处填写提取内容]
- 主要成就: [请在此处填写提取内容]
- 重要时间节点: [请在此处填写提取内容]
- 核心概念: [请在此处填写提取内容]
# 文档内容
玛丽·居里(Marie Curie,1867年11月7日---1934年7月4日),出生于波兰华沙,是世界著名的物理学家、化学家。她是放射性研究的先驱者,与其丈夫皮埃尔·居里共同发现了放射性元素钋(Po)和镭(Ra)。1903年,他们因此与亨利·贝克勒勒共同获得了诺贝尔物理学奖。1911年,玛丽·居里因成功分离出纯的金属镭而再次荣获诺贝尔化学学奖,成为世界上第一位两次获得诺贝尔奖的人。她的研究极大地推动了原子物理学的发展,并为癌症的放射性治疗奠定了基础。
第三步:获取模型输出
大模型会根据指令,生成如下结构清晰的输出:
markdown
- 关键人物: 玛丽·居里(Marie Curie)
- 国籍/领域: 波兰裔;物理学家、化学家
- 主要成就: 发现放射性元素钋和镭;成功分离出纯的金属镭;成为首位两获诺贝尔奖的人。
- 重要时间节点: 1867 年(出生),1903 年(获诺贝尔物理学奖),1911 年(获诺贝尔化学学奖),1934 年(逝世)。
- 核心概念: 放射性研究、原子物理学、放射性治疗
4. 优点与局限性
优点:
- 高精度与可控性:由于输出格式被严格限定,模型"自由发挥"的空间小,减少了信息编造(幻觉)的风险,提取结果的准确率和稳定性非常高。
- 结构化输出:直接得到规整的、半结构化的数据,非常便于后续的程序处理、数据入库或分析(当然,提示词也可以改为结构化的 JSON Schema)。
- 简单高效:实现门槛低,无需复杂的编程,只需精心设计提示词即可完成任务,对于特定、重复性的提取任务效率极高。
局限性:
- 通用性不足:这是该方法最主要的缺点。提取范式与文档类型和分析目的强绑定。处理新类型的文档时,必须重新设计一套范式,无法"一招鲜吃遍天"。
- 可能遗漏未知信息:模型只会提取范式中列出的类别。如果文档中包含了范式之外的重要知识点,这些信息将被直接忽略。这限制了其在探索性分析(不知道文档里有什么重点)场景下的应用。
- 依赖先验知识:设计一个有效的提取范式,需要用户对该领域或该类文档有基本的理解,知道"什么才是重要的"。
5. 适用场景
基于其优缺点,此方法特别适用于以下场景:
- 批量处理同类文档 :例如,从上千份简历中提取
[姓名, 联系方式, 工作年限, 毕业院校, 技能标签]
;或从大量财务报告中提取[公司名称, 报告期, 总收入, 净利润, 资产负债率]
。 - 特定信息抽取任务:当你的目标非常明确,只关心文档中的某几个特定数据点时,此方法最为直接有效。
- 构建知识图谱的初始数据:提取出的结构化实体和关系,可以作为构建知识图谱的原子数据来源。
总而言之,"指定提取范式"是一种强大而可靠的"精确制导"型知识提取工具。它最适合那些目标明确、结构重复的场景。然而,当我们面对内容多样、结构未知的复杂文档,或希望进行更全面的开放式知识探索时,就需要接下来将要介绍的、更具自适应性的方法了。
方法二:直接提问,提取为 JSON 结构
当方法一中预设的固定范式无法满足我们对知识复杂性和灵活性的要求时,就需要一种更具弹性的提取方式。方法二"提取为 JSON 结构"应运而生。它利用 JSON 的强大数据表达能力,让大语言模型自行发现并组织文档中的知识结构,从而实现从"填空题"到"简答题"的升级。
1. 核心原理
此方法的核心在于,我们不再为模型提供一个僵化的"表单",而是要求它将文档内容理解、归纳后,以一种通用的、自描述的、层次化的格式------JSON------进行输出。
JSON 格式天然支持键值对、数组和对象嵌套,这使其能够完美地表示现实世界中复杂的、非线性的知识关系。例如,一个"项目"可以包含多个"成员",每个"成员"又有自己的"姓名"和"职责"。这种层级关系用方法一的扁平列表很难表达,但用 JSON 则轻而易举。
通过要求 LLM 生成 JSON,我们实际上是授权模型:
- 识别实体(Entities):找出文档中的关键对象,如人物、公司、产品。
- 提取属性(Attributes):捕捉每个实体的相关信息,如人物的职位、产品的价格。
- 发现关系(Relationships):理解实体间的联系,并用嵌套结构将其组织起来。
2. 具体实现方式
第一步:确定提取的广度和深度
你不需要定义每一个具体的字段,但需要给模型一个大致的方向。是希望提取一个扁平的键值对集合,还是一个深度嵌套的复杂结构?希望关注哪些宏观层面的信息?
第二步:构建提示词(Prompt)
提示词是这里的关键。一个好的提示词应该清晰地传达以下几点:
- 明确要求输出 JSON 格式:这是最基本的要求,可以直接使用"请提取为 JSON 格式"等字样。
- (可选)建议顶层结构:可以建议一些顶层的 Key,引导模型组织信息,例如:"请以'主要概念'、'关键事件'和'核心人物'为顶层键构建 JSON 对象。"
- (可选)给出示例(Few-shot):提供一个简单的输入和期望的 JSON 输出示例,能极大地帮助模型理解你想要的结构,提升输出的稳定性和质量。
一个通用的提示词模板如下:
# 任务指令
请仔细阅读下方的文档,并提取其中所有的关键知识点。
请将提取的结果组织成一个结构清晰、多层嵌套的JSON对象。
JSON的结构应该能反映信息之间的逻辑层级关系。
# 文档内容
{此处粘贴你的完整文档文本}
3. 实战示例:再次提取玛丽·居里的简介
我们继续使用相同的玛丽·居里简介文本,但这次采用 JSON 提取方法,以对比其与方法一的差异。
构建并发送 Prompt
prompt
# 任务指令
请仔细阅读下方的个人简介,并提取其中所有的关键信息。
请将提取的结果组织成一个结构清晰的JSON对象,其中应包含人物的基本信息、教育背景以及其主要科学成就(成就应作为一个列表,每个成就包含年份和描述)。
# 文档内容
玛丽·居里(Marie Curie,1867年11月7日---1934年7月4日),出生于波兰华沙,是世界著名的物理学家、化学家。她是放射性研究的先驱者,与其丈夫皮埃尔·居里共同发现了放射性元素钋(Po)和镭(Ra)。1903年,他们因此与亨利·贝克勒勒共同获得了诺贝尔物理学奖。1911年,玛丽·居里因成功分离出纯的金属镭而再次荣获诺贝尔化学学奖,成为世界上第一位两次获得诺贝尔奖的人。她的研究极大地推动了原子物理学的发展,并为癌症的放射性治疗奠定了基础。
获取模型输出
模型会生成一个结构化的 JSON 对象,能够清晰地展示信息层级:
json
{
"person": {
"name": "玛丽·居里",
"english_name": "Marie Curie",
"lifespan": {
"birth": "1867-11-07",
"death": "1934-07-04"
},
"birthplace": "波兰华沙",
"fields": ["物理学", "化学"],
"titles": ["物理学家", "化学家", "放射性研究的先驱者"],
"achievements": [
{
"year": 1903,
"award": "诺贝尔物理学奖",
"description": "与皮埃尔·居里、亨利·贝克勒勒共同因对放射性的研究获奖。",
"related_discoveries": ["钋 (Po)", "镭 (Ra)"]
},
{
"year": 1911,
"award": "诺贝尔化学学奖",
"description": "因成功分离出纯的金属镭而获奖,成为首位两次获得诺贝尔奖的人。"
}
],
"legacy": "极大地推动了原子物理学的发展,并为癌症的放射性治疗奠定了基础。"
}
}
对比方法一的扁平列表,这个 JSON 输出显然包含了更丰富、更有条理的结构化信息。
4. 优点与局限性
优点:
- 自适应与灵活性:模型可以根据文档内容自主决定最合适的知识结构,无需预先定义死板的范式,通用性强。
- 层次化表达能力:能够捕捉文本信息中的嵌套关系,比扁平结构更能反映知识的真实面貌。
- 高度机器可读性:JSON 是现代软件开发的标准数据交换格式,输出结果可以直接被各类应用程序和数据库消费,便于自动化处理。
局限性:
- 结构不稳定性 :这是该方法最大的挑战。即使是相同的输入,每次请求模型返回的 JSON 结构也可能存在细微差异(例如,键名是
"name"
还是"full_name"
,"achievements"
是列表还是对象)。这给需要稳定数据结构的下游应用带来了困难。 - 长文档信息丢失:正如参考文章中所指出的,当处理长篇文档时,大模型有限的"注意力"可能会被分散。模型可能会"忘记"文档开头或中间的细节,导致生成的 JSON 丢失重要信息或只覆盖了文档的一部分。这是由当前 LLM 的上下文窗口(Context Window)和注意力机制的内在局限性决定的。
- 格式错误风险:模型偶尔会生成不符合规范的 JSON(如缺少逗号、括号不匹配、注释使用不当),尤其是较深的嵌套结构时,导致程序解析失败。因此,必须在应用中加入健壮的错误处理和容错机制,例如通过正则匹配等方式进行回退处理。
5. 适用场景
尽管存在局限性,JSON 提取方法依然在许多场景下表现出色:
- 探索性知识发现:当你对一份文档的内容结构不甚了解,希望模型帮助你梳理出其中的知识脉络时,此方法是理想选择。
- 处理半结构化数据:对于那些本身就包含一定结构(如产品规格表、组织架构图描述)的文档,JSON 能很好地还原并规范化这些结构。
- 为 API 或应用准备数据:当最终目的是将提取的知识点通过 API 提供服务或存入数据库时,JSON 是天然的、最适配的格式。
总的来说,将知识提取为 JSON 是一种兼具灵活性和强大表达能力的先进方法。它将知识提取的自主权更多地交给了模型。然而,要真正发挥其威力,开发者必须正视并解决其在稳定性和长文档处理上的挑战,通常需要结合后续的数据校验、清洗以及更精巧的文档分块处理策略(如参考下文中提到的"两阶段记忆-聚焦对话机制")。
方法三:直接提问,提取为 QA 问答对
前面两种方法分别解决了"按固定模板填空"和"按内容自主构建层级结构"的问题。然而,知识的最终目的是被应用和查询。方法三"提取为 QA 问答对"将知识提取的焦点从"存储"转向了"使用",它将文档内容转化为一系列直观的、可供问答的知识单元,是构建智能问答系统和 RAG(Retrieval-Augmented Generation)应用的核心基石。
1. 核心原理
此方法的核心思想是 将陈述性知识转换为可对话的、可检索的原子单元。它不再问"这份文档里有什么?",而是问"这份文档能回答哪些问题?"。
模型被要求扮演一个"出题老师"的角色,通读全文后,针对其中的每一个关键知识点,设计一个问题(Question)并给出精准的答案(Answer)。这种转换具有深远的意义:
- 模拟用户意图:生成的问题(Q)天然地模拟了真实用户在查询相关信息时可能会提出的问题,这使得后续的语义匹配和检索变得异常高效。
- 知识原子化:每个 QA 对都是一个独立的、自包含的知识点。这种原子化的形式易于存储、验证、更新和单独调用。
- 为 RAG 铺路:在 RAG 系统中,用户的提问会与知识库中所有问题的向量进行相似度计算,快速找到最相关的几个 QA 对。然后,将其对应的答案(A)作为上下文(Context)提供给大模型,从而生成精准且有据可依的回答。
2. 具体实现方式
实现 QA 提取,需要根据文档的长度采用不同的策略,下面给出非常成熟的工程实践。
第一步:基础实现 - 简单提示词
对于中短篇幅、信息密度适中的文档,一个简单的指令即可生效。
构建提示词(Prompt) :
提示词需要明确任务目标和输出格式。
prompt
# 任务指令
请仔细阅读以下文档,并将其中的核心知识点提取为一系列「一问一答」的QA问答对。
请确保问题具有代表性,答案严格来源于原文内容。
# 输出格式
请以JSON数组的格式输出,每个对象包含"Question"和"Answer"两个键。
[
{"Question": "string", "Answer": "string"},
{"Question": "string", "Answer": "string"}
]
# 文档内容
{此处粘贴你的完整文档文本}
第二步:进阶策略 - 应对复杂文档
简单的全文输入在处理极短或极长的文档时会遇到瓶颈。因此,必须采用更精巧的策略。
-
针对短文档(如 1-2 句话)的精准控制:
- 问题:模型容易过度解读,编造原文未提及的信息。
- 解决方案 :采用"基于句子计数的动态控制"。
- 将文档分割成句子列表,计算总句数
N
。 - 假设每个句子对应一个知识点,在提示词中明确要求模型生成
N
个 QA 对。这为模型提供了强约束,迫使其聚焦于原文,避免信息创造。
- 将文档分割成句子列表,计算总句数
-
针对长文档(如技术白皮书)的完整覆盖:
- 问题:模型存在"注意力天花板",输出 QA 数量有限(如 10-15 个),且容易遗漏细节或重复提问。
- 解决方案 :采用"两阶段记忆-聚焦对话机制"。
- 分块:将长文档按句子数量(如每 10 句)切分为多个片段。
- 记忆阶段 :在第一轮对话中,将 全文 发送给模型,指令其"记住下面的技术文档",为模型建立完整的上下文背景(长期记忆)。
- 聚焦阶段 :在第二轮对话中,依次发送 每一个文档片段,指令其"仅针对当前片段提取 QA 问答对"。由于模型已具备全文记忆,它在处理局部片段时能更好地理解其在全局中的位置和意义,从而实现对局部内容的专注、深度提取。
- 合并:将所有片段生成的 QA 对合并,形成覆盖整篇文档的完整 QA 知识库。
3. 实战示例:依然是玛丽·居里的简介
我们使用基础实现方式来处理这段文本。
构建并发送 Prompt
prompt
# 任务指令
请仔细阅读以下文档,并将其中的核心知识点提取为一系列「一问一答」的QA问答对。
请确保问题具有代表性,答案严格来源于原文内容。
# 输出格式
请以JSON数组的格式输出,每个对象包含"Question"和"Answer"两个键。
# 文档内容
玛丽·居里(Marie Curie,1867年11月7日---1934年7月4日),出生于波兰华沙,是世界著名的物理学家、化学家。她是放射性研究的先驱者,与其丈夫皮埃尔·居里共同发现了放射性元素钋(Po)和镭(Ra)。1903年,他们因此与亨利·贝克勒勒共同获得了诺贝尔物理学奖。1911年,玛丽·居里因成功分离出纯的金属镭而再次荣获诺贝尔化学学奖,成为世界上第一位两次获得诺贝尔奖的人。她的研究极大地推动了原子物理学的发展,并为癌症的放射性治疗奠定了基础。
获取模型输出
模型会生成一个可以直接用于知识库的 JSON 数组:
json
[
{
"Question": "玛丽·居里的出生地和职业是什么?",
"Answer": "她出生于波兰华沙,是一位世界著名的物理学家和化学家。"
},
{
"Question": "玛丽·居里在放射性研究领域的主要贡献是什么?",
"Answer": "她是放射性研究的先驱者,并与其丈夫皮埃尔·居里共同发现了放射性元素钋(Po)和镭(Ra)。"
},
{
"Question": "玛丽·居里分别在哪一年获得了诺贝尔奖?获得了什么奖项?",
"Answer": "她于1903年获得了诺贝尔物理学奖,并于1911年再次荣获诺贝尔化学学奖。"
},
{
"Question": "玛丽·居里为何成为世界上第一位两次获得诺贝尔奖的人?",
"Answer": "她因在1903年获得诺贝尔物理学奖,并在1911年因成功分离出纯的金属镭而再次获得诺贝尔化学学奖。"
},
{
"Question": "玛丽·居里的研究对后世产生了哪些重要影响?",
"Answer": "她的研究极大地推动了原子物理学的发展,并为癌症的放射性治疗奠定了基础。"
}
]
4. 优点与局限性
优点:
- 极高的检索适用性 :QA 格式是为检索而生的。用户提问可以直接与库中的"Question"和"Answer"同时进行语义匹配,召回率和精确率都非常高。
- 提升知识库质量:生成 QA 的过程本身就是对原文信息的一次深度理解和验证,有助于筛选出真正的核心知识点。
- 易于人工审核和维护:单个 QA 对清晰明了,便于人工快速判断其准确性,也易于对单个知识点进行增删改查。
局限性:
- 对模型能力要求高:生成高质量、不重复、全覆盖的 QA 对,对大模型的理解、推理和概括能力提出了很高的要求。从工程实践的经验来看,通常需要 70B 参数规模以上的模型才能取得理想效果。
- 存在幻觉风险:尤其在处理信息模糊或句子简短的文本时,模型可能会生成不准确或超范围的答案,需要引入校验机制。
- 成本较高:相比前两种方法,生成高质量 QA 对(特别是采用长文档处理策略时)需要更精巧的提示词工程和可能更多的 API 调用,计算成本更高。
5. 适用场景
- 构建企业级智能问答系统或知识库:这是最核心、最普遍的应用场景,用于内部知识管理、外部客户支持等。
- 自动化生成 FAQ 页面:将冗长的产品文档、服务条款或技术手册,一键转化为用户易于查询的 FAQ 列表。
- 创建学习和培训材料:从教材、讲义或规章制度中提取 QA 对,用于制作学习卡片、在线测验或培训考核。
- 为模型微调准备高质量数据集:生成的 QA 对可以作为有监督微调(SFT)的优质数据,用于训练更小、更专注的垂直领域问答模型。
综上所述,提取 QA 问答对是一种面向应用的、高级的知识提取范式。它虽然实现起来最具挑战性,但其产出物在知识检索和人机交互场景中具有无与伦比的价值,是打通"文档"到"智能服务"最后一公里的关键技术。
进阶优化:多维度的知识增强与扩展
至此,我们已经掌握了三种核心的知识提取方法。然而,在追求卓越的知识服务时,仅仅"提取"出知识是不够的。就像从矿石中提炼出黄金后,我们还需要将其打磨、雕琢,才能制成精美的饰品。同样,提取出的基础知识点(如 QA 对),其"价值"可以通过进一步的加工和扩展得到极大的提升。
在我们的实践中,我们探索并验证了一些行之有效的知识增强手段。这些方法尤其在构建先进的 RAG 检索增强系统中,能够发挥出巨大的威力。下面,我们分享三种主要的增强策略。
1. 摘要生成 (Summary):为知识片段添加"导航标签"
在处理长文档时,我们通常会将其切分为多个片段进行处理(如方法三所述)。这时,我们可以顺便为每个片段生成一个高度浓缩的摘要。
实现方式
这通常不是一个独立的操作,而是可以整合在 QA 提取的提示词中。在要求模型提取 QA 对的同时,额外增加一条指令:
prompt
...
# 任务指令
1. 提取当前文档片段的QA问答对。
2. 为该片段生成一个不超过50字的简洁摘要。
# 输出格式
请以JSON格式输出,包含"Summary"和"PossibleQA"两个键。
...
价值所在
这个简单的摘要,为每个知识片段贴上了一个清晰的"内容导航标签"。它的价值体现在多个层面:
- 提升检索效率 :摘要可以作为元数据(Metadata)与 QA 对一同存入向量数据库的
payload
字段。在检索时,系统不仅可以匹配问题(Question),还可以匹配摘要内容。这使得即使用户的提问与标准问题不完全一致,但只要与片段的主题相关,也能被成功召回(需与 Question/Answer 进行多路检索融合排序)。 - 优化用户体验:在搜索结果列表中,向用户展示的不仅仅是生硬的 QA 对,还可以附上该 QA 所属片段的摘要。这能让用户快速了解该知识点的上下文背景,判断其是否为自己所需,从而更快地找到答案。
- 丰富生成上下文:在 RAG 的最后一步------将检索到的内容交给大模型生成最终回答时,将相关的摘要也一并喂给模型。这能帮助模型更好地理解知识来源,甚至在最终答案中引用或推荐相关的参考来源,提升回答的专业性和可信度。
示例(玛丽·居里)
假设一个片段同时包含了居里夫人的两次诺奖经历,其增强后的输出可能如下:
json
{
"Summary": "本片段介绍了玛丽·居里分别在1903年和1911年因放射性研究和分离纯镭而两次荣获诺贝尔奖的经历。",
"PossibleQA": [
{
"Question": "玛丽·居里在哪两年获得了诺贝尔奖?",
"Answer": "她分别在1903年和1911年获得了诺贝尔奖。"
}
// ... 其他QA ...
]
}
2. 答案扩展 (Full Answer):从"一句话答案"到"一段话解释"
模型提取的答案(Answer)为了精准,往往非常简洁。但在某些场景下,用户可能需要更详尽的解释。为此,我们可以对核心的 QA 进行"答案扩展"。
实现方式
这是一个二次处理过程。在生成基础 QA 对之后,可以对每个简略的 QA 对,再次调用大模型:
prompt
# 原始信息
- 问题: "玛丽·居里为何成为世界上第一位两次获得诺贝尔奖的人?"
- 简洁答案: "她因在1903年获得诺贝尔物理学奖,并在1911年因成功分离出纯的金属镭而再次获得诺贝尔化学学奖。"
# 相关原文
"{...粘贴相关的原文...}"
# 任务指令
请基于上述原文,为这个问题提供一个更详细、更完整的回答。
价值所在
这个"完整答案"(Full Answer)同样是宝贵的元数据,存入payload
中。
- 提供深度信息 :在应用界面上,可以在简洁答案旁设置一个"查看详情"的按钮。用户点击后,即可展示这段更丰富的
Full Answer
,满足其深度阅读的需求。 - 增强最终生成质量 :在 RAG 流程中,如果检索到了这个 QA,可以将
Full Answer
作为更高质量的上下文注入给模型。这使得最终生成的回答不再是简单复述,而是可以综合更丰富信息,给出更有深度、更具解释性的答案。
3. 同义问法扩增 (Question Variants):让知识库"听得懂人话"
一个知识点往往可以用无数种方式来提问。我们的标准问题可能只是其中最规范的一种,但用户的实际提问却是五花八门的。为了弥补这一差距,同义问法扩增应运而生。
实现方式
这也是一个二次处理步骤。针对每个生成的标准问题,再次调用大模型:
prompt
# 标准问题
"玛丽·居里在哪两年获得了诺贝尔奖?"
# 任务指令
请为上面的问题生成3-5个语义完全相同,但表述方式不同的同义问法。
价值所在
我们认为,这是*显著提升检索系统召回率的手段。用户不会总是按照我们预设的标准问题来提问。
- 提升召回率:通过为每个知识点预置多种可能的问法,并为所有这些问法生成向量,我们的知识库就能够覆盖更广泛的查询意图。无论用户问"居里夫人拿过几次诺奖?"还是"介绍下居里夫人的诺奖历史",系统都能准确地定位到同一个知识点。这极大地降低了因表述差异而导致"有答案却搜不到"的尴尬情况。
示例(玛丽·居里)
一个完整的、经过多维度增强的知识单元,在数据库中可能看起来是这样的:
json
{
"id": "doc_chunk_123",
"question_vector": [0.12, -0.45, ...], // 这是问题的向量(也可以同时有稀疏向量和稠密语义向量)
"answer_vector": [0.12, -0.45, ...], // 这是答案的向量(也可以同时有稀疏向量和稠密语义向量)
"summary_vector": [0.12, -0.45, ...], // 这是片段概要的向量(可选的)
"payload": {
"Summary": "本片段介绍了玛丽·居里分别在1903年和1911年因放射性研究和分离纯镭而两次荣获诺贝尔奖的经历。",
"Question": "玛丽·居里在哪两年获得了诺贝尔奖?",
"Answer": "她分别在1903年和1911年获得了诺贝尔奖。",
"FullAnswer": "玛丽·居里于1903年,因对亨利·贝克勒勒发现的放射性现象的深入研究,与丈夫皮埃尔·居里及贝克勒勒本人共同荣获诺贝尔物理学奖。随后,她继续不懈努力,于1911年成功分离出纯的金属镭,并精确测定了其性质,因此独立获得了诺贝尔化学学奖,这一成就使她成为历史第一人。"
"...":"..." // 其他属性
}
}
通过这三种进阶优化,我们手中的知识点不再是孤立、单薄的条目,而是转化为了信息层次丰富的知识对象,为构建真正智能、强大且用户友好的知识应用奠定了坚实的基础。
附:开源项目 GC-QA-RAG
以上知识增强方法,源自项目 GC-QA-RAG,这是一个面向高质量知识检索与问答的开源解决方案。
项目地址:https://github.com/GrapeCity-AI/gc-qa-rag (MIT License)