Agent开发 基于dify知识库实现RAG

0 阅读2分钟

知识库模块流程图拆解降低开发难度

01. 文件上传模块运行流程

在整个知识库功能中涉及到大量的文件上传、图片上传功能,并且为了降低文件对象的维护难度,考虑使用 云端对象存储 的解决方案,例如:腾讯云 COS 对象存储、阿里云 OSS 对象存储,这类存储实现随时扩容、对接 CDN、私有读写、公共 URL 链接访问等功能,让我们更专注 LLMOps 业务开发,而非常规的基础业务。

在 dify,文件上传模块设计到两种上传机制:

  1. 上传文件(PDF、TXT、DOC、DOCX、MD 等),返回 文件ID 标识(后端存储上传记录),用于需要 引用文件 的地方,例如(知识库、Agent 对话界面文件上传)。
  2. 上传图片,返回 图片URL 链接,用于需要直接使用到图片的地方。

文件模块运行流程如下:

上传文件模块(返回文件标识id)

graph LR
    A[图片上传<br/>JPG/JPEG/GIF/PNG等] -- 上传文件 --> B[后端<br/>文件服务]
    B -- 调用三方 --> C[腾讯云<br/>COS 对象存储]
    C -- 获取位置<br/>并存储 --> D[Postgres<br/>记录文件上传id]
    D -- 生成 --> E[返回图片URL]
    B -. 调用数据库 .-> D

上传文件模块(返回文件标识id)

graph LR
    A[文件上传<br/>PDF/TXT/DOC/MD等] -- 上传文件 --> B[后端<br/>文件服务]
    B -- 调用三方 --> C[腾讯云<br/>COS 对象存储]
    C -- 获取位置<br/>并存储 --> D[Postgres<br/>记录文件上传id]
    D -- 生成 --> E[返回文件上传id]
    B -. 调用数据库 .-> D

02. 知识库模块运行流程

在 RAG/AI/Agent/LLM 应用开发中,如果涉及到 向量数据库 的功能,尽可能做 数据双重存储方案,即传统的业务数据库(例如 Postgres/MySQL/MongoDB 等)中存储一份数据,在向量数据库(例如 weaviate/TCVectordb 等)中存储一份,并且在每一次操作的时候都进行双向同步。

由于向量数据库的发展仍然在早期,并没有这么多表/库等功能,也并没有类似 SQL 之类的标准,所以每个向量数据库的差异比较大,想从某个向量数据库切换到另外一个向量数据库的成本比较高,所以一开始的选型非常重要。

在课程的 LLMOps 项目中,我们的向量数据库选型为 weaviate,这是一个支持本地部署、云端 API 调用、基于 Go 的完全开源的向量数据库,并且功能丰富(支持对数据的原生元数据过滤与原生增删改查),替代方案为 TCVectordb(国内的业务方案,对数据的原生增删改查支持相比 weaviate 较差)。

因为执行 数据双向存储方案,所以在 weaviate 向量数据库中存储文档时,会在元数据中存储额外的信息,以便和 业务数据库 的记录进行相应的关联,Document 文档元数据示例如下:

mindmap
  root((Document/向量数据库文档))
    page_content/文档内容
    metadata/元数据
      account_id<br/>文档归属账号id
      dataset_id<br/>关联知识库id
      document_id<br/>关联文档id
      segment_id<br/>关联文档片段id
      document_enabled<br/>文档启用标识
      segment_enabled<br/>片段启用标识
      更多元数据字段