
Kag Vs Rag:无与伦比的准确性知识扩充生成实用指南!
1. 什么是 KAG?
KAG 是一个基于 OpenSPG 引擎和大型语言模型的逻辑推理和问答框架,用于构建垂直领域知识库的逻辑推理和问答解决方案。KAG 可以有效克服传统 RAG 向量相似度计算的模糊性以及 OpenIE 引入的 GraphRAG 噪声问题。KAG 支持逻辑推理和多跳事实问答等,并且显著优于当前的 SOTA 方法。
KAG 的目标是在专业领域构建一个知识增强的 LLM 服务框架,支持逻辑推理、事实问答等。KAG 完全整合了 KGs 的逻辑和事实特征。其核心特性包括:
- 知识与 Chunk 互索引结构,以整合更完整的上下文文本信息
- 使用概念语义推理进行知识对齐,以减轻 OpenIE 引起的噪声问题
- 基于模式约束的知识构建,以支持领域专家知识的表示和构建
- 逻辑形式引导的混合推理和检索,以支持逻辑推理和多跳推理问答
2. 核心功能
2.1 知识表示
在私有知识库的背景下,非结构化数据、结构化信息和业务专家经验往往共存。KAG 参考 DIKW 层次结构,将 SPG 升级到对 LLM 友好的版本。
对于新闻、事件、日志和书籍等非结构化数据,以及交易、统计和审批等结构化数据,结合业务经验和领域知识规则,KAG 采用布局分析、知识提取、属性规范化和语义对齐等技术,将原始业务数据和专家规则整合为统一的业务知识图谱。
这使其能够兼容同一知识类型(例如,实体类型、事件类型)上的无模式信息提取和有模式专业知识构建,并支持图结构与原始文本块之间的交叉索引表示。
这种互索引表示有助于基于图结构的倒排索引的构建,并促进逻辑形式的统一表示和推理。
2.2 混合推理由逻辑形式引导
KAG 提出了一个逻辑形式引导的混合解决方案和推理引擎。
该引擎包括三种类型的操作符:规划、推理和检索,能够将自然语言问题转化为结合语言和符号的问题解决过程。
在这个过程中,每一步可以使用不同的操作符,例如精确匹配检索、文本检索、数值计算或语义推理,从而实现四种不同问题解决过程的整合:检索、知识图谱推理、语言推理和数值计算。
引擎与依赖镜像安装
-
推荐系统版本:
macOS 用户:macOS Monterey 12.6 或更高版本
Linux 用户:CentOS 7 / Ubuntu 20.04 或更高版本
Windows 用户:Windows 10 LTSC 2021 或更高版本
-
软件要求:
macOS / Linux 用户:Docker, Docker Compose
Windows 用户:WSL 2 / Hyper-V, Docker, Docker Compose
使用以下命令下载 docker-compose.yml
文件并使用 Docker Compose 启动服务。
## 设置 HOME 环境变量(仅 Windows 用户需要执行此命令)
## set HOME=%USERPROFILE%
curl -sSL https://raw.githubusercontent.com/OpenSPG/openspg/refs/heads/master/dev/release/docker-compose-west.yml -o docker-compose-west.yml
docker compose -f docker-compose-west.yml up -d
4.1.2 使用产品
使用浏览器导航到 KAG 产品的默认 URL:http://127.0.0.1:8887
有关详细介绍,请参见 KAG 使用(产品模式)。
4.2 基于工具包的(针对开发者)
4.2.1 引擎及依赖镜像安装
请参考 3.1 节以完成引擎及依赖镜像的安装。
4.2.2 KAG的安装
macOS / Linux开发者
-
克隆代码:
git clone https:
-
安装KAG:
cd KAG && pip install -e .
Windows开发者
-
创建并激活Python venv:
py -m venv kag-demo && kag-demo\Scripts\activate
-
克隆代码:
git clone https:
-
安装KAG:
cd KAG && pip install -e .
技术架构
KAG 框架包括三个部分:kg-builder、kg-solver 和 kag-model。本次发布仅涉及前两部分;kag-model 将在未来逐步开源。
kg-builder 实现了一种对大型语言模型(LLM)友好的知识表示。基于 DIKW(数据、信息、知识和智慧)的层次结构,IT 提升了 SPG 知识表示能力,并兼容无模式约束的信息提取和对同一知识类型(如实体类型和事件类型)有模式约束的专业知识构建。它还支持图结构与原始文本块之间的互索引表示,支持推理问答阶段的高效检索。
kg-solver 使用逻辑符号引导的混合求解和推理引擎,包括三种类型的操作符:规划、推理和检索,将自然语言问题转化为结合语言和符号的问题解决过程。在这个过程中,每一步可以使用不同的操作符,如精确匹配检索、文本检索、数值计算或语义推理,实现四种不同问题解决过程的整合:检索、知识图谱推理、语言推理和数值计算。
3.1 创建知识库
3.1.1 全局配置
● 通用配置:用户可以在通用配置中自定义数据库、向量模型和提示。
NOO4J:1/RELOASE-OPENSPG-NEO4J:7687
API_KEY
BAAI/BGE-M3
[HTTPS://API.SILLICONFLOW.CN/V1](http://https//API.SILLICONFLOW.CN/V1)
○ 数据库配置:默认情况下,可以填写本地 openspg-neo4j 图存储数据库。示例:
{
"database": "neo4j", // 默认数据库名称,将被知识库的命名空间替换
"uri": "neo4j://release-openspg-neo4j:7687", // neo4j 服务器地址,可以替换为可访问的自定义 neo4j 服务器
"user": "neo4j", // neo4j 用户名,默认为 neo4j
"password": "neo4j@openspg" // neo4j 密码,默认为 neo4j@openspg
}
- 向量配置
{
"type": "openai", // KAG 支持 openai 兼容的嵌入服务接口
"model": "BAAI/bge-m3", // 嵌入服务的模型名称
"base_url": "[https://api.siliconflow.cn/v1](https://api.siliconflow.cn/v1)", // 嵌入服务的 URL
"api_key": "your api key"
}
- 提示
必填。用于确定在调用模型时是否使用中文(zh)或英文(en)。示例:
{
"biz_scene": "default", // kag 模板的 biz_scene
"language": "en" // en 表示英文,zh 表示中文
}
- 模型配置
KAG 支持与 Open-AI 兼容的生成模型 API(chatgpt、deepseek、qwen2 等),提供 maas、vllm、ollama 等模式。有关详细信息,请参阅 生成(聊天)模型配置。
- maas
{
"model": "deepseek-chat",
"base_url": "[https://api.deepseek.com](https://api.deepseek.com/)",
"api_key": "deepseek api key"
}
- 用户配置
用户配置中可以进行账户管理,包括创建/删除用户、修改密码等。
新知识库
用户可以使用特定知识库的全局配置,或自定义新的配置。
-
命名空间和图存储配置
我们可以使用在全局配置中设置的默认配置,默认数据库名称将被知识库的名称替换。
-
向量配置与提示
我们可以使用在全局配置中设置的默认配置。
特别注意: 不同表示模型生成的嵌入向量不能混合,即使它们具有相同的维度;因此,在知识库配置中,与表示模型相关的配置一旦设置后不能修改。
3.2 导入文档
创建构建任务
进入知识库构建 => 创建任务以启动知识构建任务。用户可以下载示例文件 📎David Eagleman.txt、📎Karl Deisseroth.txt 和 📎Thomas C. Sudhof.txt 进行多跳问答任务测试。
检查知识提取结果。用户可以通过点击产品侧的 [知识探索] 菜单查看图形数据。用户可以参考 知识探索 文档以获取详细信息。
中文
TUTORIAL
知识库构建
网站
TCDEMO1
配置
OPENSPG
知识库构建
知识探索
知识模型
知识名称:
知识类型: 所有
重置
THOMAS C SUDHOF
知识探索
过滤
可以按知识过滤…
知识列表 6
- 类型名称
- THOMAS C. SUDHOF
- C89953D2415051A6A007EB3…
- THOMAS C. SUDHOF
- TCDEMO1.CHUNK
- THOMAS CHRISTIAN SUDHOF 是
- TCDEMO1.PERSON
- THOMAS C SUDHOF
- 生物化学家
- THOMAS C SUDHOF
- THOMAS C.S.的出生日期…
- TCDEMO1.DATE
- 出生日期:
- 1955年12月22日
- THOMAS C. SUDHOF
- THOMAS C. SUDHOF
- THOMAS CHRISTIAN SUDHOF
- TCDEMO1.PERSON
- THOMAS CHRISTIAN SUDHOF
- 生物化学家
- SUDHOF的研究
知识库构建
配置
THOMAS C SUDHOF
推理问答
基本信息
知识库构建
知识探索
实体类型: 人物 (TCDEMO1.PERSON)
知识模型
返回表格
静态属性
知识探索
基本属性
- 属性 (CHI…
- 属性 (EN…
实体主链
名称: THOMAS C SUDHOF
描述: 1956年12月22日
巴路北京自由自由
3.3 推理问答
输入问题“哪位斯坦福大学教授研究阿尔茨海默病?”并等待结果返回。
TUTORIAL
网站
中文
推理问答
配置
OPENSPG
知识库构建
新查询对话框
X
子问题 1
哪位斯坦福大学教授研究阿尔茨海默病?
问题描述
我最喜欢的
历史
哪位斯坦福大学教授研究阿尔茨海默病?
问题回答
子问题 2
研究阿尔茨海默病的斯坦福大学教授是
这些教授中哪位研究阿尔茨海默病?
为什么?
证据记忆明确指出THOMAS C. SUDHOF是一位研究阿尔茨海默病的斯坦福大学教授。它将他描述为一位著名的德裔美国生物化学家,在斯坦福医学院的多个部门任职。他的研究显著推动了对阿尔茨海默病的理解,并且他继续在霍华德休斯医学研究所进行相关研究。这使他成为斯坦福大学阿尔茨海默病研究的关键人物。
问题回答
问题: 哪位斯坦福大学教授研究阿尔茨海默病?
4 KAG使用(开发者模式)
在私有领域知识库的背景下,图形构建和基于推理的问答的有效性与模式设计、知识提取提示、表示模型的选择、问题规划提示、图形检索算法和答案生成提示密切相关。这些自定义尚未在产品侧公开,用户需要利用KAG开发者模式来实现他们的自定义。当使用开发者模式时,用户在本地环境中执行KAG Python包代码。OpenSPG服务器仅提供模式管理、推理执行和图形数据库适配等功能。在知识提取和图形推理阶段,对生成模型和表示模型的调用是在本地环境中发起的。
环境配置
4.1.1 预依赖
- OpenSPG-Server
KAG 依赖 OpenSPG-Server 进行元数据管理和图像存储服务。请参考本文件的第一部分和第二部分以完成服务器部署。
4.1.2 虚拟环境安装
安装 conda
Conda 安装: https://docs.anaconda.com/miniconda/
安装 Python 虚拟环境
conda create -n kag-demo python=3.10 && conda activate kag-demo
代码克隆
git clone [https://github.com/OpenSPG/KAG.git](https://github.com/OpenSPG/KAG.git)
KAG 安装
cd ./KAG && pip install -e .
确认
knext --version
knext --help
用法: knext [OPTIONS] COMMAND [ARGS]…
选项:
- —version 显示版本并退出。
- —help 显示此消息并退出。
命令:
- project 项目客户端。
- reasoner 推理客户端。
- schema 模式客户端。
- thinker 思考客户端。
创建知识库
新项目
- 进入项目示例目录
$ cd kag/examples
- 编辑项目配置
$ vim ./example_config.yaml
## — — — — — — 项目配置开始 — — — — — — — — #
openie_llm: &openie_llm
api_key: key
base_url: https://api.deepseek.com
model: deepseek-chat
type: maas
chat_llm: &chat_llm
api_key: key
base_url: https://api.deepseek.com
model: deepseek-chat
type: maas
vectorize_model: &vectorize_model
api_key: key
base_url: https://api.siliconflow.cn/v1/
model: BAAI/bge-m3
type: openai
vector_dimensions: 1024
vectorizer: *vectorize_model
log:
level: INFO
project:
biz_scene: default
host_addr: http://127.0.0.1:8887
id: "1"
language: en
namespace: TwoWikiTest
## — — — — — — 项目配置结束 — — — — — — — — #
## — — — — — — kag-builder 配置开始 — — — — — — — — #
kag_builder_pipeline:
chain:
type: unstructured_builder_chain
extractor:
type: schema_free_extractor
llm: *openie_llm
ner_prompt:
type: default_ner
std_prompt:
type: default_std
triple_prompt:
type: default_triple
reader:
type: dict_reader
post_processor:
type: kag_post_processor
similarity_threshold: 0.9
splitter:
type: length_splitter
split_length: 100000
window_length: 0
vectorizer:
type: batch_vectorizer
vectorize_model: *vectorize_model
writer:
type: kg_writer
num_threads_per_chain: 1
num_chains: 16
scanner:
type: 2wiki_dataset_scanner
## — — — — — — kag-builder 配置结束 — — — — — — — — #
## — — — — — — kag-solver 配置开始 — — — — — — — — #
search_api: &search_api
type: openspg_search_api
graph_api: &graph_api
type: openspg_graph_api
exact_kg_retriever: &exact_kg_retriever
type: default_exact_kg_retriever
el_num: 5
llm_client: *chat_llm
search_api: *search_api
graph_api: *graph_api
fuzzy_kg_retriever: &fuzzy_kg_retriever
type: default_fuzzy_kg_retriever
el_num: 5
vectorize_model: *vectorize_model
llm_client: *chat_llm
search_api: *search_api
graph_api: *graph_api
chunk_retriever: &chunk_retriever
type: default_chunk_retriever
llm_client: *chat_llm
recall_num: 10
rerank_topk: 10
kag_solver_pipeline:
memory:
type: default_memory
llm_client: *chat_llm
max_iterations: 3
reasoner:
type: default_reasoner
llm_client: *chat_llm
lf_planner:
type: default_lf_planner
llm_client: *chat_llm
vectorize_model: *vectorize_model
lf_executor:
type: default_lf_executor
llm_client: *chat_llm
force_chunk_retriever: true
exact_kg_retriever: *exact_kg_retriever
fuzzy_kg_retriever: *fuzzy_kg_retriever
chunk_retriever: *chunk_retriever
merger:
type: default_lf_sub_query_res_merger
vectorize_model: *vectorize_model
chunk_retriever: *chunk_retriever
generator:
type: default_generator
llm_client: *chat_llm
generate_prompt:
type: resp_simple
reflector:
type: default_reflector
llm_client: *chat_llm
## — — — — — — kag-solver 配置结束 — — — — — — — — #
* **创建项目**(与产品中的知识库一对一映射):
```bash
$ knext project create --config_path ./example_config.yaml
- 目录初始化
创建项目后,将在 kag/examples 目录下创建一个与项目配置中的 namespace
字段同名的目录(例如示例中的 TwoWikiTest
),并初始化 KAG 项目代码框架。
用户可以修改以下一个或多个文件,以自定义特定业务的知识图谱构建和基于推理的问题回答。
TwoWikiTest
├── builder
│ ├── data
│ ├── indexer.py
│ └── prompt
│ ├── ner.py
│ ├── std.py
│ └── tri.py
├── kag_config.cfg
├── reasoner
├── schema
│ ├── TwoWikiTest.schema
└── solver
├── evaForHotpotqa.py
└── prompt
├── logic_form_plan.py
└── resp_generator.py
更新项目 (可选)
如果有任何配置更改,您可以参考本节的内容在服务器端更新配置。
- 进入项目示例目录
$ cd kag/examples/TwoWikiTest
- 编辑项目配置
注意:由于不同表示模型的使用差异,不建议在项目创建后更新 vectorizer
配置。如果需要更新 vectorizer
配置,建议创建一个新项目。
$ vim ./kag_config.yaml
请再次确保所有 api-key
字段已正确填写。
- 运行命令:
$ knext project update — proj_path ./
导入文档
进入项目目录
$ cd kag/examples/TwoWikiTest
获取语料文件
2wiki 数据集的测试语料数据位于 examples/2wiki/builder/data/2wiki_corpus.json
,包含 6,119 个文档和 1,000 对问答。为了快速完成整个过程,目录中还有一个 2wiki_sub_corpus.json
文件,仅包含 3 个文档。我们将使用这个较小的数据集作为实验示例。
将语料文件复制到 TwoWikiTest
项目的相应目录中:
$ cp ../2wiki/builder/data/2wiki_sub_corpus.json builder/data/
编辑模式(可选)
提交更新的模式到 SPG 服务器
$ knext schema commit
执行构建任务
在 builder/indexer.py
文件中定义构建脚本:
$ vim ./builder/indexer.py
import os
import logging
from kag.common.registry import import_modules_from_path
from kag.builder.runner import BuilderChainRunner
logger = logging.getLogger(__name__)
def buildKB(file_path):
from kag.common.conf import KAG_CONFIG
runner = BuilderChainRunner.from_config(KAG_CONFIG.all_config["kag_builder_pipeline"])
runner.invoke(file_path)
logger.info(f"\n\nbuildKB successfully for {file_path}\n\n")
if __name__ == "__main__":
import_modules_from_path(".")
dir_path = os.path.dirname(__file__) # 将 `file_path` 设置为之前准备的语料文件的路径。
file_path = os.path.join(dir_path, "data/2wiki_sub_corpus.json")
buildKB(file_path)
构建链运行
运行 indexer.py
脚本以完成非结构化数据的图构建:
$ cd builder
$ python ./indexer.py
一旦构建脚本启动,任务的检查点目录将会在当前工作目录下生成(即 ./builder
),记录构建管道的检查点和统计信息。
builder
├── ckpt
│ ├── chain
│ ├── extractor
│ ├── kag_checkpoint_0_1.ckpt
│ ├── postprocessor
│ ├── reader
│ └── splitter
├── data
│ ├── 2wiki_sub_corpus.json
│ ├── indexer.py
使用以下命令查看提取任务的统计信息,例如从每个文档中提取了多少节点/边:
$ less ckpt/kag_checkpoint_0_1.ckpt
使用以下命令检查成功处理并写入图数据库的文档条目数量:
$ wc -l ckpt/kag_checkpoint_0_1.ckpt
KAG 框架提供基于检查点的恢复功能。如果任务因程序错误或其他外部原因(如 LLM 余额不足)中断,可以重新执行 indexer.py
。KAG 将自动检测检查点文件并重用现有结果。
结果检查
推理问题与答案
- 进入项目目录
cd kag/examples/TwoWikiTest
- 编辑 QA 脚本
$ vim ./solver/qa.py
将以下内容粘贴到 qa.py
中。
import json
import logging
import os
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
from tqdm import tqdm
from kag.common.benchmarks.evaluate import Evaluate
from kag.solver.logic.solver_pipeline import SolverPipeline
from kag.common.conf import KAG_CONFIG
from kag.common.registry import import_modules_from_path
from kag.common.checkpointer import CheckpointerManager
logger = logging.getLogger(__name__)
class EvaFor2wiki:
""" init for kag client """
def __init__(self):
pass
""" qa from knowledge base, """
def qa(self, query):
resp = SolverPipeline.from_config(KAG_CONFIG.all_config["kag_solver_pipeline"])
answer, traceLog = resp.run(query)
logger.info(f"\n\nso the answer for ‘{query}’ is: {answer}\n\n")
return answer, traceLog
if __name__ == "__main__":
import_modules_from_path("./prompt")
evalObj = EvaFor2wiki()
evalObj.qa("Which Stanford University professor works on Alzheimer’s?")
GitHub 链接: https://github.com/OpenSPG/KAG?tab=readme-ov-file
URL: https://openspg.yuque.com/ndx6g9/docs_en/rs7gr8g4s538b1n7#cikso