学习 Chat2Graph 的知识库服务

在前面的系列文章中,我们已经深入学习了 Chat2Graph 的多个核心模块:从智能体的协作机制,到任务规划与执行,再到工作流引擎,以及推理机和工具系统的实现。今天,我们将继续学习 Chat2Graph 的另一个关键组件------知识库服务,探索它如何为智能体系统提供强大的知识管理和检索能力。

知识库为智能体提供持久化的知识存储和检索服务,使得智能体能够基于领域知识回答专业问题,而不仅仅依赖于大模型的训练数据。在 Chat2Graph 中,知识库的设计兼顾了向量检索和图检索两种方式,形成了一套完整的知识管理体系。

知识库基本使用

Chat2Graph 的知识库在使用上分为 全局知识库会话知识库 两个层次:

  • 全局知识库:存储整个智能体系统的基础知识,任何会话都可以获取全局知识库中的知识;
  • 会话知识库:存储与当前会话相关的私有知识,与会话一一对应,只在当前会话中生效,不会被其他会话的知识干扰;

可以在 "知识库管理" 页面对这两种知识库进行管理:

另外,Chat2Graph 支持两种不同的知识存储和检索方式:

  • 向量知识库:基于 Chroma 设计的向量知识库,检索时根据向量相似度匹配与问题最接近的文档片段;
  • 图知识库:基于 TuGraph 设计的图知识库,检索时在知识图谱中匹配与问题相关的子图与社区摘要;

尽管 Chat2Graph 支持 TuGraph 和 Neo4j 两种图数据库的管理,但是知识库这里暂时只支持 TuGraph。

用户可以通过 .env 环境变量配置来选择使用哪种知识库类型。

配置向量知识库:

bash 复制代码
KNOWLEDGE_STORE_TYPE=VECTOR

向量知识库默认存储在本地 Chroma 文件中,位于 ~/.chat2graph/knowledge_bases 目录。

配置图知识库:

bash 复制代码
KNOWLEDGE_STORE_TYPE=GRAPH
# TuGraph 配置
GRAPH_KNOWLEDGE_STORE_HOST=127.0.0.1
GRAPH_KNOWLEDGE_STORE_PORT=17687
GRAPH_KNOWLEDGE_STORE_USERNAME=admin
GRAPH_KNOWLEDGE_STORE_PASSWORD=password

配置好知识库类型后,点击 "全局知识库" 或 "会话知识库",上传文件:

支持 PDF、TXT、XLSX、DOC、DOCX、MD 等文件格式。然后点击 "下一步" 进入数据处理的配置,这块目前很粗糙,就一个分块大小参数:

然后点击 "确定" 完成知识的添加。

知识库接口

Chat2Graph 的知识库服务提供了一套完整的 RESTful API:

python 复制代码
# 获取所有知识库
GET /knowledgebases/

# 获取指定知识库
GET /knowledgebases/{kb_id}

# 更新知识库信息
PUT /knowledgebases/{kb_id}

# 清空/删除知识库
DELETE /knowledgebases/{kb_id}?drop=true

# 向知识库添加文档
POST /knowledgebases/{kb_id}/files/{file_id}

# 从知识库删除文档
DELETE /knowledgebases/{kb_id}/files/{file_id}

上一节点击 "确实" 后实际上调用的就是 "向知识库添加文档" 这个接口:

python 复制代码
@knowledgebases_bp.route("/<string:knowledge_base_id>/files/<string:file_id>", methods=["POST"])
def load_knowledge_with_file_id(knowledge_base_id: str, file_id: str):
  
  manager = KnowledgeBaseManager()
  data: Dict[str, Any] = cast(Dict[str, Any], request.json)

  # 加载文档
  result, message = manager.load_knowledge(
    kb_id=knowledge_base_id,
    file_id=file_id,
    knowledge_config=KnowledgeBaseViewTransformer.deserialize_knowledge_config(
      json.loads(data.get("config", "{}"))
    ),
  )
  return make_response(data=result, message=message)

KnowledgeBaseManager 通过核心服务 KnowledgeBaseService 实现知识的管理。它采用单例模式,负责:

  • 知识库的创建、管理和删除
  • 文件与知识库的映射关系管理
  • 知识的加载、检索和删除
  • 全局知识库和会话知识库的统一管理

知识库服务实现

KnowledgeStore 是一个抽象基类,定义了知识存储的标准接口:

python 复制代码
class KnowledgeStore(ABC):

  @abstractmethod
  def load_document(self, file_path: str, config: Optional[KnowledgeConfig]) -> str:
    """加载文档"""

  @abstractmethod
  def delete_document(self, chunk_ids: str) -> None:
    """删除文档"""

  @abstractmethod
  def retrieve(self, query: str) -> List[KnowledgeChunk]:
    """检索知识"""

  @abstractmethod
  def drop(self) -> None:
    """删除整个知识库"""

Chat2Graph 通过 KnowledgeStoreFactory 工厂模式提供了两种实现:

python 复制代码
class KnowledgeStoreFactory:

  @classmethod
  def get_or_create(cls, name: str) -> KnowledgeStore:
    if SystemEnv.KNOWLEDGE_STORE_TYPE == KnowledgeStoreType.VECTOR:
      return VectorKnowledgeStore(name)
    elif SystemEnv.KNOWLEDGE_STORE_TYPE == KnowledgeStoreType.GRAPH:
      return GraphKnowledgeStore(name)

有意思的是,这两种都是基于 DB-GPT 框架实现的:

  • 向量知识库:使用 ChromaStore 定义向量存储,使用 EmbeddingAssembler 加载知识,使用 EmbeddingRetriever 检索知识;
  • 图知识库:使用 CommunitySummaryKnowledgeGraph 定义图存储,使用 EmbeddingAssembler 加载知识,使用图存储的 asimilar_search_with_scores() 方法检索知识;

实现都比较简单,这里就不赘述了。具体内容可参考 DB-GPT 的 RAG 文档:

与推理机的集成

知识库服务与推理机系统紧密集成,在算子的执行过程中,会通过知识库服务获取相关知识,注入到推理上下文中:

python 复制代码
task = Task(
  job=job,
  operator_config=self._config,
  workflow_messages=merged_workflow_messages,
  tools=rec_tools,
  actions=rec_actions,
  knowledge=self.get_knowledge(job), # 注入知识
  insights=self.get_env_insights(),
  lesson=lesson,
  file_descriptors=file_descriptors,
)

result = await reasoner.infer(task=task)

推理机会将检索到的知识作为上下文信息,帮助大模型生成更准确、更符合领域知识的回答。

与记忆系统的关系

20 世纪 70 年代,管理学家 罗素・艾可夫(Russell L. Ackoff) 等人提出 DIKW 金字塔模型,它将人类对世界的认知过程拆解为四个层层递进的层级,清晰展现了原始素材如何转化为决策能力的逻辑链条。

  1. 数据(Data) 是未经处理的、客观存在的原始符号或事实,不包含任何上下文或意义,仅代表 "是什么"。它是认知的起点,没有价值判断,也无法直接指导决策。
  2. 信息(Information) 是经过加工、赋予上下文和意义的数据,通过 "数据 + 背景" 的组合,回答 "这是什么意思"。它解决了数据的无意义性,让原始素材具备了初步价值。
  3. 知识(Knowledge) 是信息之间建立关联、经过验证并可用于指导实践的结构化体系,它回答 "为什么会这样""如何应用"。知识源于对信息的归纳、总结和验证,是可复用的经验或规律。
  4. 智慧(Wisdom) 是基于知识进行价值判断、权衡利弊后做出最优决策的能力,它回答 "这样做是否明智""如何实现长期目标"。智慧是认知的最高层级,需要结合价值观、伦理观和长期视角。

DIKW 模型是信息科学与知识管理领域的核心框架,如今已广泛应用于企业管理、信息技术、教育、科研等多个领域。

Chat2Graph 参考 DIKW 模型,设计了一个分层的记忆架构:

每一层和 DIKW 的对应关系如下:

注意,目前 Chat2Graph 的记忆系统功能还在建设中,文档中只是介绍了它的设计理念,我们在设计记忆系统时也可以参考之。

分层记忆系统引入了多级的知识抽象,包含三个关键能力:

  1. 知识精练(Knowledge Refinement):原始知识经过逐级的处理、分析、抽象、压缩,形成更高层次的知识;
  2. 知识下钻(Knowledge Drilling):在使用高维知识的同时,还可以按需下钻低维知识,让推理上下文粗中有细;
  3. 知识延拓(Knowledge Expansion):同层级知识关联的构建和召回,通过特定方法丰富知识上下文;

不难看出,知识库服务可以视为记忆系统 L2 层(Lesson)的初步实现,主要存储领域知识和最佳实践。当前 Chat2Graph 只是初步地将 RAG 作为知识库的实现形式,未来随着分层记忆架构的完善,知识库将进一步整合到完整的记忆体系中,形成更加智能的知识管理和利用机制。

此外,除了知识库,环境也可以当做记忆的一部分。环境指的是智能体执行过程中可交互的外部空间,智能体可以通过工具操作感知环境变化,影响环境状态。Chat2Graph 还提出了一个有趣的观点:环境可以被视为当前时刻的外部记忆,而记忆则是历史时刻的环境快照。这种同质性使得环境可以无缝地融入分层记忆模型中,从技术实现角度来看,记忆系统、知识库和环境的架构可以统一。通过工具这座桥梁,打通记忆系统与环境状态,构建智能体的精神世界与外部环境的物理世界的映射关系,即世界知识模型。

小结

通过这篇文章,我们学习了 Chat2Graph 知识库服务的设计与实现,包括全局知识库与会话知识库的分离,基于 DB-GPT 的向量知识库和图知识库实现,以及与记忆系统的关系。知识库服务作为智能体系统的重要组成部分,为智能体提供了强大的知识管理和检索能力。同时,它也是更大的记忆系统的一部分,通过多层级记忆系统的设计,从记忆存储、信息评估、经验提取到洞察生成,记忆系统从原始数据逐步提炼到高层次的智慧洞察,为 Chat2Graph 提供持久化的学习和适应能力,提升系统的整体智能水平。

欢迎关注

如果这篇文章对您有所帮助,欢迎关注我的同名公众号:日习一技,每天学一点新技术

我会每天花一个小时,记录下我学习的点点滴滴。内容包括但不限于:

  • 某个产品的使用小窍门
  • 开源项目的实践和心得
  • 技术点的简单解读

目标是让大家用5分钟读完就能有所收获,不需要太费劲,但却可以轻松获取一些干货。不管你是技术新手还是老鸟,欢迎给我提建议,如果有想学习的技术,也欢迎交流!

相关推荐
IT_陈寒2 小时前
Redis 性能翻倍的 7 个冷门技巧,第 5 个大多数人都不知道!
前端·人工智能·后端
飞哥数智坊12 小时前
GPT-5-Codex 发布,Codex 正在取代 Claude
人工智能·ai编程
倔强青铜三12 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试
虫无涯13 小时前
Dify Agent + AntV 实战:从 0 到 1 打造数据可视化解决方案
人工智能
Dm_dotnet15 小时前
公益站Agent Router注册送200刀额度竟然是真的
人工智能
算家计算15 小时前
7B参数拿下30个世界第一!Hunyuan-MT-7B本地部署教程:腾讯混元开源业界首个翻译集成模型
人工智能·开源
机器之心16 小时前
LLM开源2.0大洗牌:60个出局,39个上桌,AI Coding疯魔,TensorFlow已死
人工智能·openai
Juchecar17 小时前
交叉熵:深度学习中最常用的损失函数
人工智能
林木森ai17 小时前
爆款AI动物运动会视频,用Coze(扣子)一键搞定全流程(附保姆级拆解)
人工智能·aigc