知识库模块流程图拆解降低开发难度
01. 文件上传模块运行流程
在整个知识库功能中涉及到大量的文件上传、图片上传功能,并且为了降低文件对象的维护难度,考虑使用 云端对象存储 的解决方案,例如:腾讯云 COS 对象存储、阿里云 OSS 对象存储,这类存储实现随时扩容、对接 CDN、私有读写、公共 URL 链接访问等功能,让我们更专注 LLMOps 业务开发,而非常规的基础业务。
在 dify,文件上传模块设计到两种上传机制:
- 上传文件(PDF、TXT、DOC、DOCX、MD 等),返回 文件ID 标识(后端存储上传记录),用于需要 引用文件 的地方,例如(知识库、Agent 对话界面文件上传)。
- 上传图片,返回 图片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/>片段启用标识
更多元数据字段