


























在当下的时代,组织和个人积累了大量的非结构化文档——财务报告、技术白皮书、法律合同、产品手册等。这些文档承载着宝贵的知识,但其价值往往被格式的壁垒和人工处理的瓶颈所掩盖。
大语言模型(Large Language Model, LLM)的出现,为这一问题提供了一条可行的路径。凭借对自然语言的深层理解能力,LLM 能够从非结构化文本中识别、抽取并组织关键信息,使知识提取在规模和效率上获得显著提升。
本文将围绕"如何利用大语言模型从文档中提取知识"这一主题,系统地介绍从文档预处理到知识提取的完整流程。我们将依次讨论三种各有侧重的提取方法,并在此基础上探讨若干进阶优化策略,以期为读者在实际工程中提供参考。
需要指出的是,这些方法并非完美无缺,每一种都有其适用边界和固有局限。我们将如实地呈现这些限制,以便读者根据自身的具体场景做出恰当的选择。
在将文档交给大语言模型处理之前,存在一个容易被忽视却至关重要的环节:文档格式的标准化预处理。输入数据的质量,在很大程度上决定了知识提取的效果上限。
大语言模型的核心输入是文本序列。它并不理解 PDF 文件的视觉布局,也无法直接解析 DOCX 文件中的复杂样式标记,更不能处理 HTML 中混杂的脚本与导航元素。
因此,我们的首要任务是将形形色色的文档格式,统一转换为一种既保留原文逻辑结构、又便于模型处理的纯文本格式。
在诸多纯文本标记语言中,Markdown 是一个较为理想的选择,原因如下:
# 标记标题、- 标记列表等)表达文本的层级关系。模型能够据此识别标题、正文、列表等结构,从而更准确地理解上下文。不同的文档格式各有其处理难点:
| 格式 | 主要挑战 |
|---|---|
| 布局复杂,可能包含多栏排版、嵌入图表、页眉页脚,文本提取时容易出现错位或混杂 | |
| DOCX/DOC | 富文本格式,直接转换可能产生大量冗余的 XML 标记 |
| HTML | 正文与导航栏、广告、脚本等无关内容混杂,需要有效地分离噪音 |
| PPTX | 内容分散在各个幻灯片和文本框中,需要合理地整合与排序 |
手动处理这些格式不仅费时费力,而且容易引入误差。借助自动化工具来完成这一步骤,是更为务实的做法。
在此,我们推荐一个专为文档格式转换设计的 Python 开源项目——markitdown。该工具能够将多种主流文档格式转换为干净的 Markdown 文本,在实践中表现出较好的适用性。
开源地址:https://github.com/microsoft/markitdown
文档预处理是整个知识提取流程的基石。通过将任意文档统一转换为结构化的 Markdown 文本,我们为大语言模型提供了规整、清洁的输入,也为后续的知识提取工作打下了必要的基础。
当我们对目标文档的内容类型具备一定的先验知识时,可以主动为大语言模型设定一个明确的"信息框架"——即预定义好需要提取的知识类别,引导模型将文档中的对应信息逐一填入。
这一思路模拟了领域专家阅读文档的过程。一位有经验的分析师在审阅材料时,通常不会漫无目的地通读全文,而是带着明确的目标去寻找特定的信息点。"指定提取范式"正是将这种目标导向的思维方式,转化为对大模型的结构化指令。
通过预设提取类别,我们有效地约束了模型的输出空间,使其专注于我们所关注的核心信息,减少了不必要的发散。
实现此方法分为两个步骤:
第一步:定义提取范式(Schema)
根据文档类型和分析目的,预先确定需要提取的知识点类别。范式可简可繁,视需求而定。
以下是几种常见文档类型的范式示例:
[关键人物, 事件起因, 发生时间, 地点, 主要影响][产品名称, 核心功能, 技术规格, 适用人群, 价格][研究背景, 研究方法, 主要发现, 结论与意义]第二步:构建提示词(Prompt)
将提取范式与原始文档文本组合为一条完整的提示词指令。基本结构如下:
# 任务指令
请根据下面提供的 {文档类型} 内容,严格按照我给定的范式提取关键知识点。
# 提取范式
- {类别一}: [请在此处填写提取内容]
- {类别二}: [请在此处填写提取内容]
- {类别三}: [请在此处填写提取内容]
...
# 文档内容
{此处粘贴完整的文档文本}
以一段关于玛丽·居里的人物简介为例,演示该方法的具体应用。
定义范式
对于人物简介类文档,我们通常关注以下要素:
构建提示词
# 任务指令
请根据下面提供的人物简介,严格按照我给定的范式提取关键知识点。
如果某一项在原文中未提及,请填写"未提及"。
# 提取范式
- 关键人物: [请在此处填写提取内容]
- 国籍/领域: [请在此处填写提取内容]
- 主要成就: [请在此处填写提取内容]
- 重要时间节点: [请在此处填写提取内容]
- 核心概念: [请在此处填写提取内容]
# 文档内容
玛丽·居里(Marie Curie,1867年11月7日—1934年7月4日),出生于波兰华沙,
是世界著名的物理学家、化学家。她是放射性研究的先驱者,与其丈夫皮埃尔·居里
共同发现了放射性元素钋(Po)和镭(Ra)。1903年,他们因此与亨利·贝克勒勒
共同获得了诺贝尔物理学奖。1911年,玛丽·居里因成功分离出纯的金属镭而再次
荣获诺贝尔化学奖,成为世界上第一位两次获得诺贝尔奖的人。她的研究极大地推动了
原子物理学的发展,并为癌症的放射性治疗奠定了基础。
模型输出
- 关键人物: 玛丽·居里(Marie Curie)
- 国籍/领域: 波兰裔;物理学家、化学家
- 主要成就: 发现放射性元素钋和镭;成功分离出纯的金属镭;成为首位两获诺贝尔奖的人
- 重要时间节点: 1867年(出生),1903年(获诺贝尔物理学奖),1911年(获诺贝尔化学奖),1934年(逝世)
- 核心概念: 放射性研究、原子物理学、放射性治疗
优点
局限
基于上述特点,此方法较为适合以下场景:
[姓名, 联系方式, 工作年限, 毕业院校, 技能标签],或从财务报告中提取 [公司名称, 报告期, 总收入, 净利润, 资产负债率]。当方法一中预设的固定范式无法满足对知识复杂性和灵活性的要求时,需要一种更具弹性的提取方式。方法二的核心思路是:不再为模型预设具体的提取字段,而是要求它将文档内容理解、归纳后,以 JSON 格式自主组织输出。
JSON(JavaScript Object Notation)天然支持键值对、数组和对象嵌套,能够表示现实世界中复杂的、非线性的知识关系。例如,一个"项目"可以包含多个"成员",每个"成员"又有自己的"姓名"和"职责"——这种层级关系用方法一的扁平列表难以表达,但用 JSON 则较为自然。
从本质上看,这一方法是授权模型完成三个层面的工作:
第一步:确定提取的广度与深度
不必定义每一个具体字段,但需要给模型一个大致的方向指引:希望得到扁平的键值对集合还是深度嵌套的结构?关注哪些宏观层面的信息?
第二步:构建提示词
提示词应清晰地传达以下要点:
通用提示词模板:
# 任务指令
请仔细阅读下方的文档,并提取其中所有的关键知识点。
请将提取的结果组织成一个结构清晰、多层嵌套的 JSON 对象。
JSON 的结构应当反映信息之间的逻辑层级关系。
# 文档内容
{此处粘贴完整的文档文本}
仍以玛丽·居里的人物简介为例,对比方法一的输出差异。
构建提示词
# 任务指令
请仔细阅读下方的个人简介,并提取其中所有的关键信息。
请将提取的结果组织成一个结构清晰的 JSON 对象,其中应包含人物的基本信息、
教育背景以及其主要科学成就(成就应作为一个列表,每个成就包含年份和描述)。
# 文档内容
玛丽·居里(Marie Curie,1867年11月7日—1934年7月4日),出生于波兰华沙,
是世界著名的物理学家、化学家。她是放射性研究的先驱者,与其丈夫皮埃尔·居里
共同发现了放射性元素钋(Po)和镭(Ra)。1903年,他们因此与亨利·贝克勒勒
共同获得了诺贝尔物理学奖。1911年,玛丽·居里因成功分离出纯的金属镭而再次
荣获诺贝尔化学奖,成为世界上第一位两次获得诺贝尔奖的人。她的研究极大地推动了
原子物理学的发展,并为癌症的放射性治疗奠定了基础。
模型输出
{
"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 输出呈现出更丰富的层次结构和更细致的信息组织。
优点
局限
"name" 与 "full_name" 之间变化,某个字段可能在列表与对象之间切换。这对需要稳定数据结构的下游应用构成了困难。除 JSON 外,XML(eXtensible Markup Language) 也是一种值得考虑的结构化输出格式,在某些场景下具有独特的优势。
XML 的优势
<name>...</name>)界定数据。这种明确的闭合结构,相较于 JSON 对逗号、括号和引号位置的敏感性,在大语言模型生成时不易出错,输出稳定性更高。<award year="1903">诺贝尔奖</award>),使数据表达更为紧凑。<![CDATA[...]]> 可以安全地嵌入任意自由文本,包括含有特殊字符(<、& 等)或代码片段的内容,无需进行转义处理。这在提取含代码或富文本的文档时,具有 JSON 难以比拟的便利性。<!-- ... --> 格式的注释,方便后续的人工审核与调试。XML 的劣势
其主要劣势在于冗长。成对标签和复杂的语法结构显著增加了文本量,在与大语言模型交互时会消耗更多的 Token,意味着更高的 API 调用成本和更快的上下文窗口占用。此外,在现代 Web 开发和数据科学领域,JSON 因其轻量级特性和更广泛的生态支持而更为流行。
选择建议
前两种方法分别解决了"按模板填空"和"按内容自主构建层级结构"的问题。然而,知识的最终价值在于被有效地应用和查询。方法三将提取的焦点从"如何存储知识"转向"如何使用知识",将文档内容转化为一系列可供问答的知识单元。
这一方法在构建智能问答系统和 RAG(Retrieval-Augmented Generation,检索增强生成)应用中尤为关键。
其核心思想可以表述为:将陈述性知识转换为可对话、可检索的原子单元。它不再问"这份文档里有什么",而是问"这份文档能够回答哪些问题"。
模型被要求扮演一个"出题者"的角色,通读全文后,针对每一个关键知识点设计一个问题(Question)并给出精准的答案(Answer)。这种转换的意义在于:
根据文档长度的不同,需要采取相应的策略。
对于信息密度适中的中短篇文档,一条简明的提示词即可胜任:
# 任务指令
请仔细阅读以下文档,并将其中的核心知识点提取为一系列「一问一答」的 QA 问答对。
请确保问题具有代表性,答案严格来源于原文内容。
# 输出格式
请以 JSON 数组的格式输出,每个对象包含 "Question" 和 "Answer" 两个键。
[
{"Question": "string", "Answer": "string"},
{"Question": "string", "Answer": "string"}
]
# 文档内容
{此处粘贴完整的文档文本}
基础方法在处理过短或过长的文档时会遇到瓶颈,需要更精细的策略。
针对短文档(如仅 1-2 句话)
N,在提示词中明确要求模型生成不超过 N 个 QA 对。这一强约束迫使模型聚焦于原文,抑制信息编造。针对长文档(如技术白皮书)
以基础实现方式处理玛丽·居里的简介文本。
构建提示词
# 任务指令
请仔细阅读以下文档,并将其中的核心知识点提取为一系列「一问一答」的 QA 问答对。
请确保问题具有代表性,答案严格来源于原文内容。
# 输出格式
请以 JSON 数组的格式输出,每个对象包含 "Question" 和 "Answer" 两个键。
# 文档内容
玛丽·居里(Marie Curie,1867年11月7日—1934年7月4日),出生于波兰华沙,
是世界著名的物理学家、化学家。她是放射性研究的先驱者,与其丈夫皮埃尔·居里
共同发现了放射性元素钋(Po)和镭(Ra)。1903年,他们因此与亨利·贝克勒勒
共同获得了诺贝尔物理学奖。1911年,玛丽·居里因成功分离出纯的金属镭而再次
荣获诺贝尔化学奖,成为世界上第一位两次获得诺贝尔奖的人。她的研究极大地推动了
原子物理学的发展,并为癌症的放射性治疗奠定了基础。
模型输出
[
{
"Question": "玛丽·居里的出生地和职业是什么?",
"Answer": "她出生于波兰华沙,是一位世界著名的物理学家和化学家。"
},
{
"Question": "玛丽·居里在放射性研究领域的主要贡献是什么?",
"Answer": "她是放射性研究的先驱者,并与其丈夫皮埃尔·居里共同发现了放射性元素钋(Po)和镭(Ra)。"
},
{
"Question": "玛丽·居里分别在哪一年获得了诺贝尔奖?获得了什么奖项?",
"Answer": "她于1903年获得了诺贝尔物理学奖,并于1911年再次荣获诺贝尔化学奖。"
},
{
"Question": "玛丽·居里为何被称为世界上第一位两次获得诺贝尔奖的人?",
"Answer": "她于1903年获得诺贝尔物理学奖,又于1911年因成功分离出纯的金属镭而获得诺贝尔化学奖,因此成为首位两次获得该奖项的人。"
},
{
"Question": "玛丽·居里的研究对后世产生了哪些重要影响?",
"Answer": "她的研究极大地推动了原子物理学的发展,并为癌症的放射性治疗奠定了基础。"
}
]
优点
局限
掌握了上述三种核心提取方法之后,我们还可以通过进一步的加工与扩展来提升知识的应用价值。以下介绍三种在实践中被证明行之有效的增强策略,它们在构建 RAG 检索增强系统时尤为有用。
在处理长文档时,我们通常会将其切分为多个片段逐一处理。在此过程中,可以顺便为每个片段生成一段高度浓缩的摘要。
实现方式
摘要生成通常不需要作为独立的操作,而是可以整合在 QA 提取的提示词中。例如:
# 任务指令
1. 提取当前文档片段的 QA 问答对。
2. 为该片段生成一个不超过 50 字的简洁摘要。
# 输出格式
请以 JSON 格式输出,包含 "Summary" 和 "PossibleQA" 两个键。
价值
摘要为每个知识片段提供了一个清晰的"内容导航标签",其作用体现在以下方面:
示例输出
{
"Summary": "本片段介绍了玛丽·居里分别在1903年和1911年因放射性研究和分离纯镭而两次荣获诺贝尔奖的经历。",
"PossibleQA": [
{
"Question": "玛丽·居里在哪两年获得了诺贝尔奖?",
"Answer": "她分别在1903年和1911年获得了诺贝尔奖。"
}
]
}
模型提取的答案为求精准,往往较为简洁。但在某些场景下,用户可能需要更为详尽的解释。答案扩展正是为此而设。
实现方式
这是一个二次处理过程。在生成基础 QA 对之后,对每个简略的 QA 对再次调用大模型进行扩写:
# 原始信息
- 问题: "玛丽·居里为何成为世界上第一位两次获得诺贝尔奖的人?"
- 简洁答案: "她于1903年获得诺贝尔物理学奖,又于1911年因成功分离出纯的金属镭而获得诺贝尔化学奖。"
# 相关原文
"{...相关的原文内容...}"
# 任务指令
请基于上述原文,为这个问题提供一个更详细、更完整的回答。
价值
同一个知识点可以用许多不同的方式来提问。我们生成的标准问题仅是其中一种表述,而用户的实际提问方式往往多种多样。同义问法扩增旨在弥合这一差距。
实现方式
针对每个标准问题,再次调用大模型生成多种语义等价但表述不同的变体:
# 标准问题
"玛丽·居里在哪两年获得了诺贝尔奖?"
# 任务指令
请为上面的问题生成 3-5 个语义完全相同,但表述方式不同的同义问法。
价值
这是提升检索系统召回率的一种有效手段。通过为每个知识点预置多种可能的问法并生成对应的向量,知识库能够覆盖更广泛的查询意图。无论用户问"居里夫人拿过几次诺奖?"还是"请介绍居里夫人的诺奖历史",系统都有更大的概率准确定位到对应的知识点。
经过上述多维度增强后,一个完整的知识单元在向量数据库中的存储形态大致如下:
{
"id": "doc_chunk_123",
"question_vector": [0.12, -0.45, ...],
"answer_vector": [0.33, -0.21, ...],
"summary_vector": [0.08, -0.67, ...],
"payload": {
"Summary": "本片段介绍了玛丽·居里分别在1903年和1911年因放射性研究和分离纯镭而两次荣获诺贝尔奖的经历。",
"Question": "玛丽·居里在哪两年获得了诺贝尔奖?",
"Answer": "她分别在1903年和1911年获得了诺贝尔奖。",
"FullAnswer": "玛丽·居里于1903年,因对亨利·贝克勒勒发现的放射性现象的深入研究,与丈夫皮埃尔·居里及贝克勒勒本人共同荣获诺贝尔物理学奖。此后她继续深入研究,于1911年成功分离出纯的金属镭并精确测定了其性质,因此独立获得了诺贝尔化学奖,成为历史上首位两次获得诺贝尔奖的人。"
}
}
通过这些增强手段,知识点不再是孤立、单薄的条目,而是转化为信息层次丰富的知识对象,为构建高质量的知识应用提供了更坚实的基础。
为便于读者在实际工作中做出选择,我们将三种方法的核心特征汇总如下:
| 维度 | 方法一:指定提取范式 | 方法二:提取为 JSON | 方法三:提取为 QA 问答对 |
|---|---|---|---|
| 核心思路 | 预定义模板,按类别填充 | 模型自主构建层级结构 | 将知识转化为问答单元 |
| 灵活性 | 低(与范式绑定) | 高(自适应) | 中(面向问答场景) |
| 输出稳定性 | 高 | 较低(结构可能不一致) | 中等 |
| 实现难度 | 低 | 低至中 | 中至高 |
| 对模型能力的要求 | 一般 | 中等 | 较高(建议 70B+) |
| 最佳适用场景 | 批量同类文档处理 | 探索性知识发现 | RAG 系统与智能问答 |
需要说明的是,这三种方法并非互斥关系。在实际项目中,完全可以根据需要将它们组合使用:先用方法一快速提取关键指标,再用方法二补充发现非预期的知识结构,最后用方法三将核心内容转化为可检索的问答知识库。
本文系统地介绍了利用大语言模型从文档中提取知识的完整流程:从文档预处理的格式标准化,到三种各有侧重的提取方法,再到面向实际应用的多维度知识增强策略。
坦率地说,这些方法中没有一种是万能的。每一种都有其适用的边界和需要注意的局限。大语言模型的幻觉问题、长文档处理中的注意力衰减、输出格式的不稳定性——这些都是在工程实践中需要认真面对的挑战。
但正是通过对这些方法的合理选择与组合,辅以必要的工程化手段(如数据校验、分块处理、容错机制),我们能够构建出具有实用价值的知识提取与管理系统。
希望本文的梳理能够为读者提供一些有用的参考。
本文中讨论的知识增强方法,部分源自开源项目 GC-QA-RAG,这是一个面向高质量知识检索与问答的解决方案。
项目地址:https://github.com/GrapeCity-AI/gc-qa-rag(MIT License)
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。