RAG
本篇的目的是为了 将文件向量化后 存到数据库中 这里面的步骤有
-
读取文件
-
切分文件
-
索引 (embedding 和 存醋)

流程编排
解释一下 下面的这个流程
-
Start 程序启动
-
File loader 读取文件 转换成 schema.Document (文档对象列表)
-
Markdown Transfomer 转换成 Markdown 格式
-
Milvus Index 向量索引
- 使用 oepnai 进行 Embedding 把文本变成向量
- 然后 把 [原文 + 向量 + 元数据] 写入 Milvus Collections
-
结束

生成完后,会在目录看到这些组件

最终实现
- 我们的一个文本 最后会被分片插入到向量数据库中


代码解析
首先调用 knowledge_index_pipeline.BuildKnowledgeIndexing 创建了一个 runner
并且使用 r.Invoke 传入了文件的地址
|
|
Runnable
详细拆解一下 BuildKnowledgeIndexing
-
我们可以看到 这个方法返回了一个
compose.Runnable[document.Source, []string]接口 使用 doucument 返回 []string -
Invoke 在注释里面说明 。 是输出的意思
|
|
BuildKnowledgeIndexing
详细看一下其他流程
-
这里有很多 AddEdge 。 我们看里面的参数
start, fileLoader, markdown...可以看出来 就是我们在Eino里面绘制的点 -
也就是这里组装了一下整个流程 然后返回一个执行器
|
|
Loader
我们看下面的这个代码 可以看 返回值是一个 document.Loader 的接口
这个接口需要实现 load 方法
|
|
File Load
详细看一下官方的 file loader 是怎么实现的
-
OpenFile 打开文件
-
读取文件
-
构建元数据 ExtraMeta
-
构造返回值 然后返回
|
|
Transformer
newDocumentTransformer 返回一个 Transformer 的接口
|
|
HeaderSplitter
-
可以看 这里先进行了 Split
-
然后每个切片复制一个 uuid
-
并且给每个分片增加元数据信息
-
返回
|
|
Index
- 构建 Indexer 返回一个 Indexer 接口
|
|
Milvus Indexer
-
首先是 对分片 进行向量 获取向量数组
-
构造符合 milvus 表记录的结构体 。 id、content、vector、metadata
-
构造完成记录后 , 插入到数据库 。最后返回所有 id
|
|
总结
总到来看,主要就是我们上面编排的流程
-
文件加载
-
文件分块
-
文件索引 (分片 - 向量化)