CocoIndex github.com/cocoindex-i… 是世界上第一个开源引擎,它既支持自定义转换逻辑,又支持专门用于数据索引的增量更新。那么,什么是自定义转换逻辑呢?
索引即服务(或 RAG 即服务)通常会打包一个预设计的服务,并向用户公开两个端点 - 一个用于配置源,另一个是从索引读取的 API。许多针对非结构化文档的预定都是这样做的。需求相当简单:解析 PDF,执行一些分块和嵌入,然后存入向量存储。如果您的需求简单且主要集中在文档解析上,这种方式效果很好。
我们与各个领域需要数据索引的许多开发人员交谈过,能够自定义逻辑对于高质量的数据检索至关重要。例如:
- 管道组件的基本选择
- 不同文件使用哪种解析器?
- 如何分块文件(具有结构的文档通常有不同的最佳分块策略)?
- 使用哪种嵌入模型?使用哪种向量数据库?
- 管道应该做什么?
- 是简单的文本嵌入吗?
- 是构建知识图谱吗?
- 是否应该为每个源执行简单的摘要,以便在不分块的情况下进行检索?
- 需要哪些额外工作来提高管道质量?
- 我们需要去重吗?
- 我们需要查找不同的源来丰富我们的数据吗?
- 我们需要协调和对齐多个文档吗?
在这里,我们将通过一些索引拓扑的例子,未来我们可以探索更多!
基本嵌入
在这个例子中,我们执行以下操作:
- 从源读取,例如,一系列 PDF 文件
- 对于每个源文件,使用 PDF 解析器将其解析为 markdown。有很多选择:Llama Parse、Unstructured IO、Gemini、DeepSeek 等。
- 对所有 markdown 文件进行分块。这是一种将文本分解成更小的块或单元的方法,以帮助组织和处理信息。 这里有很多选项:平面块、层次块、次级块,以及该领域的许多出版物。对于不同的垂直领域也有特殊的分块策略 - 对于代码,像 Tree-sitter 这样的工具可以帮助基于语法进行解析和分块。通常,最佳选择与您的文档结构和需求相关。
- 对每个块执行嵌入。有很多很好的选择:Voyage,像 OpenAI 等模型。
- 在向量存储中收集嵌入。嵌入通常附带元数据,例如,这个嵌入属于哪个文件等。向量存储有很多很好的选择:Chromadb、Milvus、Pinecone,现在许多数据库也支持向量索引,例如 PostgreSQL (pgvector) 和 MongoDB。
TF-IDF 和向量搜索的组合
Anthropic 发表了一篇关于上下文检索的精彩文章,建议结合基于向量的搜索和 TF-IDF。
管道的数据流可以这样思考:
除了像上面基本嵌入示例那样准备向量嵌入外,在源数据解析后,我们可以执行以下操作:
- 对于每个文档,从中提取关键词及其频率。
- 在所有文档中,按关键词分组并汇总其频率,放入内部存储。
- 对于每个文档的每个关键词,使用两个输入计算 TF-IDF 分数:当前文档中的频率,以及所有文档中的频率总和。将关键词及其 TF-IDF 分数(如果超过某个阈值)存储到关键词索引中。
在查询时,我们可以同时查询向量索引和关键词索引,并结合两者的结果。