W
AI-Wiki
CONCEPT

增量知识演进

定义

增量知识演进,是指在首次完成知识抽取之后,已有的 Knowledge Abstracts 还可以继续接收新的文档输入,把新增事实合并进原有知识对象中,而不是每来一批新材料就重新处理全部历史文本、重新从头生成一份结果。

Hyper-Extract 的语境里,这不是一个附属功能,而是被明确列为核心亮点之一。它强调的不是“再跑一次抽取”,而是“让已经存在的知识对象继续演化”。

在本文档中的语境

原文把 Hyper-Extract 描述为一个由 LLM 驱动的知识提取与演进框架,目标是把高度非结构化文本转成持久化、可预测、强类型的 Knowledge Abstracts。因此,抽取只是第一步;真正重要的是,这些抽取结果之后还能被保存、查询、展示、搜索,并在新材料到来时继续扩充。

这使 增量知识演进 与普通的一次性信息抽取有本质区别:

  • 一次性抽取把输出看成某轮任务的最终结果。
  • 增量知识演进 把知识对象看成可以持续维护、持续吸收新证据、持续扩展结构的长期资产。

原文还直接指出:知识在这种机制下可以被持久化、搜索和演化,这说明它服务的是长期知识积累,而不是单次文档处理。

依赖前提:可合并的强类型数据载体

增量知识演进 能成立,不是因为简单地把新文本再喂给模型,而是因为底层数据层先被设计成了稳定的、可合并的对象。

原文给出的关键前提是:Auto-Types 被设计为支持 merge 的强类型对象。

具体来说,Hyper-Extract 的数据层由 8 类 Auto-Types 构成,基于 Pydantic 实现,具备以下与增量更新直接相关的特征:

  • 类型安全:输出不是松散文本,而是有字段约束的结构化对象。
  • 可序列化:可以保存为持久化结果,便于之后继续读取和更新。
  • 支持增量合并:类型本身内置 merge() 能力,是 feed 新文档的基础。
  • 可视化与搜索:更新后的对象仍可继续 search()visualize()save()

原文在技术架构部分进一步明确写到:数据流最后会落到 Auto-Type 实例,并且“支持增量是因为 Auto-Types 设计为可合并的”。这句话基本说明了它的工程基础:没有可 merge 的强类型对象,就没有稳定的增量演进。

关键机制

1. 先有抽取结果,再做追加演进

增量知识演进 不是脱离初始抽取单独存在的。典型模式是先依据模板完成一次 parse,得到已有知识对象;之后再把新文档 feed 进去,让系统把新增内容并入现有结果。

因此它的对象不是“原始文本集合”,而是“已经生成的知识抽象”。增量的输入是新文档,增量的承载体是现有 Knowledge Abstracts。

2. 模板与类型共同约束合并行为

原文虽没有展开完整 merge 算法细节,但已经给出结构基础:

  • 模板中的 output schema 定义提取什么。
  • guideline 定义如何高质量提取。
  • identifiers 用于确保实体或关系唯一性。
  • 图类型还会有时间、地点等专用标识逻辑,例如 time_fieldlocation_field

这意味着增量合并并不是完全无约束地堆叠文本,而是依赖既有 schema、标识规则和类型语义,把新信息并到已有对象里,避免每次更新都把知识结构打散重建。

3. 对不同类型结果都成立

原文把支持增量合并描述为 Auto-Types 的整体能力,而不是只属于某一种图类型。因此它适用的范围并不限于传统知识图谱,还覆盖记录型和图结构型两大类对象,例如:

  • 记录型:AutoModelAutoListAutoSet
  • 图结构型:AutoGraphAutoHypergraphAutoTemporalGraphAutoSpatialGraphAutoSpatioTemporalGraph

这点很重要,因为它说明 增量知识演进 不只是“图谱补边”,也可以是对单个结构化摘要、步骤列表、去重实体集合、时序关系或时空关系的持续扩充。

CLI 典型流程

原文给出了非常明确的命令行流程,可以概括为“先 parse,再 feed,再 show”。

第一步:先做初始抽取

先使用 he parse 基于模板和输入文本生成输出目录,例如:

he parse examples/en/tesla.md -t general/biography_graph -o ./output/ -l en

这里的重要点不是示例文件名本身,而是:抽取结果会被保存到一个输出位置,这个输出结果随后就成为可继续演进的已有知识对象。

第二步:对已有结果做增量补充

然后使用 he feed 把新文档增量并入已有结果:

he feed ./output/ examples/en/tesla_question.md

he feed 的语义不是重新对全部文本跑一次全量抽取,而是基于已有输出目录中的知识结果,吸收新文档中的新增信息。

第三步:查看更新后的效果

增量更新后,可以继续使用 he show 检查知识对象当前状态:

he show ./output/

原文示例甚至明确展示了更新前后都可 he show,也就是:

he show ./output/
he feed ./output/ examples/en/tesla_question.md
he show ./output/

这体现了一个重要特征:知识对象被保存下来并可反复操作,既不是一次性 stdout 输出,也不是只能在内存里短暂存在的中间结果。

Python API 对应流程

在 Python API 中,增量知识演进 的对应流程同样很直接:先创建模板实例,再 parse,然后对结果执行 feed

原文示例流程如下:

import os
from dotenv import load_dotenv
from hyperextract import Template

load_dotenv()

ka = Template.create("general/biography_graph", language="en")

with open("examples/en/tesla.md", "r", encoding="utf-8") as f:
text = f.read()

result = ka.parse(text)  # 提取
ka.show(result)          # 可视化
ka.feed(result, new_text)  # 增量

可见其核心顺序是:

  1. Template.create(...) 创建模板驱动的知识抽取器。
  2. ka.parse(text) 先从已有文本生成初始结果。
  3. ka.feed(result, new_text) 在已有 result 上合并新文本带来的新增知识。

这里的关键不是单独调用某个“更新模型”,而是在现有结果对象上继续演进。这与 CLI 中“对已有输出目录 feed 新文档”是同一个思想的 API 形式。

与一次性抽取的区别

一次性抽取的思路

一次性抽取通常把输入文档视为单轮任务,把输出视为这轮任务的终点:

  • 输入一批文本。
  • 生成一份结构化结果。
  • 任务结束。