跳到内容

索引指南

indexing indexing

本节深入概述了如何使用 txtai 对数据进行索引。我们将涵盖向量化、数据索引/更新/删除以及嵌入数据库的各种组件。

向量化

构建索引中最计算密集的一步是向量化。`path` 参数设置向量模型的路径。有逻辑可以自动检测向量模型的 `method`,但也可以直接设置。

`batch` 和 `encodebatch` 参数控制向量化过程。更大的 `batch` 值会将更大的批次传递给向量化方法。更大的 `encodebatch` 值会在每次向量编码调用时传递更大的批次。对于 GPU 向量模型,更大的值会消耗更多 GPU 内存。

在索引过程中,数据会缓冲到临时存储,因为嵌入向量可能很大(例如,768 维 float32 向量是 768 * 4 = 3072 字节/向量)。向量化完成后,会创建一个包含所有向量的 mmapped 数组,用于近似最近邻 (ANN) 索引。

在 txtai 的文档中,术语 `ANN` 和 `密集向量索引` 可互换使用。

设置后端

如上所述,计算出的向量存储在 ANN 中。可以配置多种索引 `backends`。Faiss 是默认后端。

内容存储

嵌入索引可以选择性地 `store content`。启用此功能后,输入内容会与计算出的向量一起保存在数据库中。这使得能够对附加字段进行过滤以及检索内容。

索引 vs Upsert

数据通过 `index` 或 `upsert` 调用加载到索引中。

embeddings.index([(uid, text, None) for uid, text in enumerate(data)])
embeddings.upsert([(uid, text, None) for uid, text in enumerate(data)])

[`index`](../methods#txtai.embeddings.base.Embeddings.index) 调用将构建一个全新的索引,替换现有的索引。[`upsert`](../methods#txtai.embeddings.base.Embeddings.upsert) 将插入或更新记录。`upsert` 操作不需要完全重建索引。

保存

可以使用 `save` 方法将索引存储在目录中。

embeddings.save("/path/to/save")

也支持压缩索引。

embeddings.save("/path/to/save/index.tar.gz")

除了在本地保存索引外,它们还可以持久化到 `cloud storage`。

embeddings.save("/path/to/save/index.tar.gz", cloud={...})

这在无服务器环境或其他临时计算环境中运行时特别有用。云存储仅支持压缩索引。

可以使用 `load` 方法恢复嵌入索引。

embeddings.load("/path/to/load")

删除

可以使用 `delete` 方法从索引中移除内容。此方法接受一个要删除的 id 列表。

embeddings.delete(ids)

重建索引

启用 `content storage` 后,可以调用 `reindex` 以新设置重建索引。例如,后端可以从 faiss 切换到 hnsw,或者可以更新向量模型。这避免了回到原始的原始数据。

embeddings.reindex(path="sentence-transformers/all-MiniLM-L6-v2", backend="hnsw")

启用 `graph network` 后,在数据向量化时会在索引时添加一个语义图。向量嵌入用于自动创建图中的关系。关系也可以在索引时手动指定。

# Manual relationships by id
embeddings.index([{"id": "0", "text": "...", "relationships": ["2"]}])

# Manual relationships with additional edge attributes
embeddings.index(["id": "0", "text": "...", "relationships": [
    {"id": "2", "type": "MEMBER_OF"}
]])

此外,图可用于主题建模。UMAP 结合 HDBSCAN 的降维是许多库中常见的一种流行主题建模方法。txtai 采用了一种不同的方法,使用社区检测算法来构建主题聚类。

这种方法具有只向量化数据一次的优势。鉴于没有降维操作 (UMAP),它还具有更好的主题精度的优势。语义图示例如下所示。

获取发现的主题到相关 id 的映射。

embeddings.graph.topics

显示索引中最中心的节点。

embeddings.graph.centrality()

图与嵌入索引一起持久化。每次 save 和 load 操作也会保存和加载图。

稀疏向量

Scoring 实例可以创建独立的 `keyword` 或稀疏索引(BM25、TF-IDF)。当存在可用的密集向量索引时,这可以实现 `hybrid` 搜索。

在 txtai 的文档中,术语 `稀疏向量索引`、`关键词索引`、`术语索引` 和 `评分索引` 可互换使用。

请参阅 此链接 以了解更多信息。

子索引

嵌入实例可以选择性地具有相关的 `subindexes`,它们也是嵌入数据库。这使得能够索引附加字段、向量模型等等。

词向量

当使用设置了评分的 `word vector backed models` 时,在调用 `index` 之前需要一个单独的调用,如下所示

embeddings.score(rows)
embeddings.index(rows)

这两个调用都是必需的,以便支持使用词向量模型的数据的生成器支持的迭代。