跳到主要内容

功能发布:知识实体构建与知识检索内置插件

· 阅读需 16 分钟
Yak Project
网络安全垂直语言团队

在之前的文章中有提到我们为处理超长输入的上下文,进行一些知识蒸馏萃取的功能,在最近的一段时间里这部分的工程有了一些的应用,也就是在 yakit 中新增的两个内置插件——知识构建与知识检索。

知识实体构建

数据预处理与结构化层

我们的内置插件提供了对绝大多数文件格式的强大支持,其在知识实体构建的预处理阶段。根据信息载体的不同,我们将文件处理策略划分为三大类:

1、多媒体文件 (以MP4为代表)

针对视频、音频这类动态信息流,我们创新性地提出了**聚焦式音频语义触发采样 (**Focused Audio-Semantic Triggered Sampling,F.A.S.T.) 框架。该技术能智能识别内容中的关键语义节点(如对话转换、事件发生),并据此进行非线性采样,从而高效、精准地捕捉核心信息,避免了传统等时采样带来的大量冗余。

2、富文本文件 (以PDF为代表)此类文件常包含图片、表格等非纯文本信息,传统 OCR 容易丢失版式和视觉元素。出于这点考虑,我们采用保真视觉解析路径:首先通过底层基础设施将文件按页稳定地转换为图片,再运用视觉模型进行理解。这种“所见即所得”的处理方式,最大限度地保留了原始文档的全部信息,确保知识提取的真实性可靠性**。

3、纯文本文件 (以TXT、源代码为代表)对于纯粹的文本文件处理就十分简易。通过这套差异化、专业化的预处理与模态转化步骤,我们确保了从不同来源的异构数据提取数据的准确性与高效性,并且在完成了归一化让后面的建模处理的数据都是提取完成的文本数据。**

实体建模层

这一层的工作可以分解为三个紧密衔接的步骤:统一文本入口、AI 实体提取与关系分析(包含核心的 RAG 语义聚合)、以及最终的 ER 模型生成。

所有的结构化描述文本都在此汇集。无论原始输入是 PDF、视频还是纯文本,此刻都已被转化为信息密度高、上下文连贯的文本流。这个统一的入口确保了后续处理流程的标准化和一致性。

AI实体提取与关系分析(核心环节)**

这是知识提纯的核心。我们采用大模型作为执行引擎,但并非简单地让其进行一次性的实体抽取。整个过程是一个“抽取-验证-聚合”的闭环,其中 RAG 语义聚合扮演了关键的“验证与聚合”角色。

1、初步实体与关系抽取 (Initial Extraction)

首先,使用大模型对输入的结构化描述文本进行初步扫描,执行传统的命名实体识别( NER )和关系抽取( RE )任务。

产出:一系列候选实体( Candidate Entities )和候选关系( Candidate Relations )。例如,从文本“艾伦·图灵在布莱切利园工作期间,为‘巨人’计算机的设计做出了贡献”中,初步抽取结果为实体 [艾伦·图灵 (人名)], [布莱切利园 (地名)], [巨人计算机 (产品)]关系 (艾伦·图灵, 工作于, 布莱切利园), (艾伦·图灵, 贡献于, 巨人计算机)。

**2、核心问题:实体的多义性、别名与模糊性 (The Core Problem)**初步抽取出的实体存在诸多问题:

  • 别名问题艾伦·图灵图灵 指的是同一个人。

  • 指代消解:这位计算机科学之父 可能也指代图灵。

  • 上下文依赖的语义差异:苹果 可以是水果,也可以是一家公司。

仅仅依靠实体名称字符串进行聚合(例如,所有叫“图灵”的都归为一一个实体),显然是粗糙且容易出错的。

3、解决方案:基于RAG的流式语义聚合 (RAG-based Semantic Aggregation)

为了解决上述聚合实体的问题,综合性能考虑,我们引入了基于流式实体RAG存储的聚合机制。这套机制是我们知识库的核心资产,它实时更新,并存储了所有已被确立的、唯一的实体及其丰富的语义信息。

该机制的工作流程如下:

**1、语义向量化 (Semantic Vectorization):**对于每一个从文本中新抽取的候选实体(如“图灵”),我们不仅仅看它的名字,更会结合其在原文中的一些属性,通过 Embedding 模型将其转换成一个高维语义向量。这个向量在向量空间中的位置,代表了该实体在当前语境下的语义。

2、检索增强 (Retrieval-Augmented)3、决策 (Generation for Decision)

将初步抽取的实体、以及从 RAG 库中检索到的最相似的几个权威实体的信息进行聚合,将信息与关系代表聚合在相似度达标且最高的实体中,由此实体来担任关系连接者,这样处理可以一定程度上兼顾效率与实体语义聚合。

4、流式更新 (Streaming Update)

一旦 LLM 做出决策(无论是聚合还是创建),这个结果会立即反馈并更新到流式实体 RAG 存储库中。这意味着,当处理下一份文档时,新创建的“图灵手机”实体已经成为可供检索的权威实体了。这种流式特性保证了知识库的实时性和动态演进能力。

通过这种“名称匹配 + 语义匹配”的双重保险机制,我们能够极其精准地将不同表述、不同语言、甚至隐晦指代的同一个现实世界实体,正确地聚合到统一ID下。

5、ER 模型生成**

经过上述精确的实体聚合和关系分析后,我们得到了一系列被唯一标识的实体和它们之间的关系。最后一步就是将这些信息固化下来。

系统会将这些实体和关系加入到对应的实体仓库中,使其能在之后需要的时候查询构建处理对应的 ERM 模型图,或者知识图谱。

使用

插件的使用界面被设计得直观明了,整个过程可以概括为简单的两步:

1、选择输入源:用户只需点击“选择文件”,即可从本地上传需要处理的文档。如下方截图所示,我们支持多种格式,从技术文档(如 PDF、Word )、代码库,到多媒体文件(未来规划)。

在这里,我们以之前发布的《编译拾遗(一):代码静态行为分析》的 PDF文件**作为本次演示的输入源。

2、指定知识库:选择希望将分析结果存入的目标知识库。这允许用户将不同主题、不同来源的知识进行归类管理,例如可以创建“编译器知识库”、“项目 A 代码库”、“安全规范库”等。

完成这两步后,只需点击“开始分析”,系统便会自动在后台执行我们前面所详述的四层知识处理流程。

分析过程是全自动的。当处理完成后,系统就成功地:

  • 构建出 127 个的实体
  • 识别出 106 条的实体间关系

我们已经成功地将一篇线性的、供人类阅读的 PDF 文档,转化成了一个网状的、机器可理解的知识模型**。

  • 127个实体**:经过了 RAG 语义聚合与消歧“概念节点”。例如“SSA (静态单赋值)”、“CFG (控制流图)”、“AST (抽象语法树)”这样的核心概念
  • 106条关系**:这些关系(如 (SSA, is a form of, IR)(Clang, uses, AST)) 构成了知识的骨架。它们揭示了这 127 个实体之间是如何相互关联、相互作用的,将孤立的概念点连接成了富有逻辑的知识网络。

这样就完成了一次小规模的知识图谱构建。这127个实体和106条关系可以成为我们知识库中供查询、供 AI 使用的数据。

检索知识

在标准的 RAG 流程中,通常直接将用户的原始查询( Query )向量化,然后在知识库中进行相似性搜索。这种方法简单直接,但面对复杂、模糊或多主题的查询,往往会检索到次优甚至无关的知识,或者说面对输出的查询比较简略的时候会出现搜索不到的情况,从而影响最终生成答案的质量。

为了克服这一问题,我们引入了一些高级检索策略,能够在检索前对用户的查询进行深度加工和策略性调整。

检索增强

假设性回答 (Hypothetical Answer / HyDE)

  • 核心思想:我们不直接用“问题”去寻找“答案”,而是先让 LLM 根据问题“想象”出一个理想的、可能的“答案”,然后再用这个虚构的“答案”去知识库中寻找最相似的真实文档。
  • 工作流程

1、提问:用户输入问题,例如:“为什么说在 RAG 流程中引入多维检索策略很重要?”

2、生成假设答案:LLM 接收到问题后,并不立即去检索。它会“脑补”出一个回答,例如:“在 RAG 流程中引入多维检索策略至关重要,因为用户的原始问题可能存在模糊性、主题交叉或包含深层意图,单一的检索方式无法精准捕获这些复杂性。通过假设性回答、查询分解等策略,可以更准确地定位到相关的知识片段,从而提升最终生成答案的准确性和全面性。”

3、检索:系统将这个由 LLM 生成的、内容详实的“假设答案”进行向量化,然后用这个向量去知识库中进行相似性搜索。

  • 优势与适用场景

1、解决语义鸿沟:用户的简短问题和知识库中详细的答案文档之间存在巨大的“语义鸿沟”。通过生成一个语言风格和信息密度都与答案文档更接近的“假设答案”,可以极大地提升检索相关性。

2、捕捉深层意图:对于意图模糊的查询,LLM 的“脑补”过程本身就是一种意图澄清和具体化的过程。

3、适用场景:非常适合处理开放性、解释性和需要推理的复杂问题。

多次查询 (SplitQuery**/ Multi-Query)**

  • 核心思想:一个复杂的问题通常包含多个子问题或关注点。与其用一个大而全的查询去检索,不如将其拆解成多个更具体、更聚焦的子查询,分别进行检索,然后汇总结果。
  • 工作流程

1、提问:用户输入一个复合型问题,例如:“对比一下 HyDE 和 Multi-Query 这两种 RAG 检索策略的优缺点以及各自的应用场景。”

2、查询拆分:LLM 将原始问题分解为多个独立的子查询:

3、并行检索**:系统对这三个子查询分别执行向量检索,各自召回最相关的文档片段。

4、结果汇总:将所有检索到的文档去重、合并,作为最终的上下文信息提供给 LLM。

查询1: “HyDE 检索策略的优点和缺点是什么?”

查询2: “Multi-Query 检索策略的优点和缺点是什么?”

查询3: “HyDE 和 Multi-Query 策略分别适用于哪些场景?”

  • 优势与适用场景

1、提高召回率:确保问题中的每一个方面都能被充分检索,避免因某个方面在原始查询中权重较低而被忽略。

2、提升检索精度:每个子查询都更简单、更明确,更容易匹配到精准的知识。

3、适用场景:非常适合处理包含“和”、“对比”、“以及”等关联词的复合型问题,或用户一次性询问多个实体或概念的问题。

泛化回答 (GeneralizeQuery)**

  • 核心思想:当用户的查询过于具体,可能导致在知识库中找不到完全匹配的内容时(“零召回”风险),此策略尝试将问题进行适度泛化或抽象,以扩大检索范围,找到相关的上位概念或背景知识。
  • 工作流程

1、提问:用户输入一个非常具体或使用了罕见术语的问题,例如:“请介绍一下‘光子反刍式神经网络’在 RAG 中的应用。”(假设这是一个非常前沿或虚构的概念)

2、查询泛化:LLM 识别出这种情况,并将查询改写得更通用,例如:“介绍一下新型神经网络在 RAG 检索增强中的应用趋势”或“RAG 技术可以结合哪些前沿的 AI 模型进行优化?”

3、再次检索:使用泛化后的查询进行检索,此时能够找到关于“RAG 与神经网络结合”、“RAG 最新进展”等相关性较高的背景知识。

  • 优势与适用场景

1、避免零结果:有效提升了系统的鲁棒性,即使用户的问题过于“偏门”,也能返回有价值的相关信息,而不是简单地回答“不知道”。

2、提供背景知识:即使无法直接回答,也能提供有用的上下文,帮助用户理解相关领域。

3、适用场景:适合处理包含专有名称、冷僻术语或长尾问题的查询。

  • 核心思想:向量语义搜索擅长理解意图,但有时可能丢失精确的关键词信息。此策略利用 LLM 从用户问题中提取出最核心、最不可能被省略的“关键词”,然后结合传统的关键词搜索。这是一种语义扩充的传统搜索
  • 工作流程

1、提问:用户提问:“RAG 技术的核心论文是什么?”

2、AI提取关键词**:LLM 分析问题,并精确地提取出必须匹配的关键词,例如 ["RAG", "核心", "论文"]

3、关键词搜索:使用提取出的关键词,在数据库中进行模糊搜索

  • 优势与适用场景

1、精确性与相关性的平衡:弥补了纯向量搜索可能“天马行空”而忽略了字面关键信息的缺点。

2、应对专有名词和ID查询:在查询包含产品型号、论文标题、人名地名等精确信息时效果极佳。

3、适用场景:查询目标有特定固定关键词的时候,比如概念性问题

使用

为了验证我们构建的代码分析知识库的实际效能,我们通过一个具体的检索实例来展示其强大的信息检索与知识呈现能力。这个实例将模拟开发者在日常工作中遇到的典型场景:查询一个专业缩写术语。

1、场景设定

我们提出的问题是:“什么是 SSA?”

这是一个非常典型的查询:

  • 概念性质:它询问的是一个专业术语的定义和解释。
  • 高度简略:仅由一个缩写词构成,缺乏上下文,对检索系统的语义理解能力提出了很高的要求。
  • 潜在歧义:在不同技术领域,“SSA”可能代表不同的概念(例如,在编译器领域是静态单赋值,在安全领域可能是其他缩写)。

直接使用“SSA”这个词进行简单的关键词或向量检索,很可能会因为信息量过少而导致结果不准确,或者返回大量不相关的噪声信息。

2、策略选择:假设性回答

针对这类简短、概念性的问题,我们启用“假设性回答 ( HyDE )”这一高级检索策略。该策略的核心优势在于,它能够主动弥补原始查询中缺失的上下文信息。

3、执行流程如下:

  • 接收原始问题:系统接收到用户输入的查询:“什么是 SSA?”

  • 生成假设性回答:在访问知识库之前,我们首先指令大语言模型( LLM )根据其通用知识储备,**“想象”**一个关于“SSA”的理想答案。

  • 使用假设答案进行检索:我们不再使用简短的“SSA”进行检索,而是将上述由LLM生成的、内容丰富、语义明确的“假设性回答”文本进行向量化处理。这个新生成的向量在向量空间中,精准地指向了关于“编译器”、“中间表示”、“变量赋值”和“优化算法”等概念的区域。

  • 精准召回知识片段:系统使用这个信息量饱满的向量,在我们的代码分析知识库中进行高效的相似性搜索。结果是,系统成功地绕过了歧义,精准地召回了与编译器理论中“静态单赋值”概念相关的、经过向量化的核心知识数据块

如下方截图所示,检索结果清晰地展示了与 SSA 概念直接相关的知识内容,证明了“假设性回答”策略在处理模糊、简略查询时的卓越效果。

4、帮助数据

除去查询到知识的结果外我们还提供了一些帮助性数据,他们是结果数据的结构化与可视化呈现,帮助用户从不同维度快速理解和溯源知识。

5、实体关系图

  • 功能:对于检索到的核心知识,系统能够即时生成一张实体关系图(ER图)。这张有向图以可视化的方式,结构化地展现了与“SSA”相关的实体及其相互关系。
  • 价值:这种图形化的表达方式,远比阅读大段文字描述更高效,能帮助使用者在几快速建立起关于一个复杂概念的关系认知。

6、关联实体列表:精准溯源,支持微调

  • 功能:除了关系图,系统还会提供一个与查询问题相关的实体列表。该列表详细列出了在本次查询中涉及到的所有关键实体
  • 价值与应用

本文首发于 Yak Project 公众号,阅读原文