索引指南
本节深入介绍了如何使用txtai进行数据索引。我们将涵盖向量化、数据索引/更新/删除以及嵌入数据库的各种组件。
向量化
构建索引时最耗计算资源的步骤是向量化。path参数设置向量模型的路径。有逻辑自动检测向量模型的method,但也可以直接设置。
batch和encodebatch参数控制向量化过程。batch
的较大值将传递更大的批次给向量化方法。encodebatch
的较大值将传递更大的批次给每次向量编码调用。对于GPU向量模型,较大的值将消耗更多的GPU内存。
在索引过程中,数据被缓冲到临时存储中,因为嵌入向量可能非常大(例如,768维的float32是768 * 4 = 3072字节每向量)。向量化完成后,会创建一个包含所有向量的mmapped数组,用于近似最近邻(ANN)索引。
在txtai的文档中,术语ANN
和密集向量索引
可以互换使用。
设置后端
如上所述,计算出的向量存储在ANN中。可以配置各种索引后端。Faiss是默认后端。
内容存储
嵌入索引可以选择存储内容。启用此功能后,输入内容将与计算出的向量一起保存在数据库中。这使得可以在附加字段和内容检索上进行过滤。
索引 vs 更新
embeddings.index([(uid, text, None) for uid, text in enumerate(data)])
embeddings.upsert([(uid, text, None) for uid, text in enumerate(data)])
index
调用将构建一个全新的索引,替换现有索引。upsert
将插入或更新记录。upsert
操作不需要完全重建索引。
保存
可以使用save方法将索引存储在目录中。
embeddings.save("/path/to/save")
还支持压缩索引。
embeddings.save("/path/to/save/index.tar.gz")
除了本地保存索引外,还可以将索引持久化到云存储。
embeddings.save("/path/to/save/index.tar.gz", cloud={...})
这在无服务器环境中运行或在临时计算上运行时特别有用。云存储仅支持压缩索引。
可以使用load方法恢复嵌入索引。
embeddings.load("/path/to/load")
删除
可以使用delete方法从索引中删除内容。此方法接受要删除的id列表。
embeddings.delete(ids)
重新索引
当内容存储启用时,可以调用reindex以使用新设置重建索引。例如,可以将后端从faiss切换到hnsw,或者更新向量模型。这避免了返回到原始原始数据。
embeddings.reindex(path="sentence-transformers/all-MiniLM-L6-v2", backend="hnsw")
图
启用图网络会在数据向量化时添加一个语义图。向量嵌入用于自动在图中创建关系。关系也可以在索引时手动指定。
# 通过id手动关系
embeddings.index([{"id": "0", "text": "...", "relationships": ["2"]}])
# 带有附加边属性的手动关系
embeddings.index(["id": "0", "text": "...", "relationships": [
{"id": "2", "type": "MEMBER_OF"}
]])
此外,图可以用于主题建模。结合UMAP和HDBSCAN的降维是一种在多个库中流行的主题建模方法。txtai采用了一种不同的方法,使用社区检测算法来构建主题集群。
这种方法的优点是只需向量化数据一次。由于没有降维操作(UMAP),它还具有更好的主题精度。语义图示例如下所示。
获取发现的主题到关联id的映射。
embeddings.graph.topics
embeddings.graph.centrality()
Graphs are persisted alongside an embeddings index. Each save and load will also save and load the graph.
Sparse vectors
Scoring instances can create a standalone keyword or sparse index (BM25, TF-IDF). This enables hybrid search when there is an available dense vector index.
The terms sparse vector index
, keyword index
, terms index
and scoring index
are used interchangeably throughout txtai's documentation.
See this link to learn more.
Subindexes
An embeddings instance can optionally have associated subindexes, which are also embeddings databases. This enables indexing additional fields, vector models and much more.
Word vectors
When using word vector backed models with scoring set, a separate call is required before calling index
as follows:
embeddings.score(rows)
embeddings.index(rows)
Both calls are required to support generator-backed iteration of data with word vectors models.