ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

LlamaIndex 向量数据库选型指南:从内存 SimpleVectorStore 到生产级向量存储

LlamaIndex 向量数据库选型指南:从内存 SimpleVectorStore 到生产级向量存储 LlamaIndex 向量数据库选型指南从内存 SimpleVectorStore 到生产级向量存储【免费下载链接】llama_indexLlamaIndex is the document processing platform for AI项目地址: https://gitcode.com/GitHub_Trending/ll/llama_index本文围绕 LlamaIndex 官方 FAQ 中关于是否需要使用向量数据库以及不同向量数据库之间的区别两个核心问题展开结合llama-index-core的SimpleVectorStore源码实现、向量存储功能对比表与真实测试用例为你梳理一条从本地快速原型到生产环境向量检索的清晰决策路径。读完本文你将掌握LlamaIndex 默认内存向量存储的工作机制与持久化方法、向量存储之间真正的差异维度类型、元数据过滤、混合搜索、删除、异步等以及如何根据数据规模与功能需求做出正确选型。一、FAQ 核心问题回顾LlamaIndex 官方 FAQ见 vector_database.md回答了社区最常问的两个问题Do I need to use a vector database?我是否必须使用向量数据库Whats the difference between the vector databases?不同的向量数据库之间有什么区别第一个问题关乎从零开始要不要上外部向量数据库第二个问题关乎面对众多集成怎么选。下面两节分别深入展开。二、我需要使用向量数据库吗——先理解默认的内存向量存储FAQ 给出的官方结论是LlamaIndex 自带一个内存in-memory向量数据库可以完全在本地运行。当你的文档量很大时外部向量数据库能提供更多特性、更好的扩展性并且内存占用更少具体取决于硬件配置。2.1 默认行为SimpleVectorStore在 LlamaIndex 中如果你不显式指定任何向量存储系统会默认使用SimpleVectorStore——一个把嵌入向量保存在内存字典里的极简实现。其源码位于 simple.py核心数据结构SimpleVectorStoreData由三张字典组成dataclass class SimpleVectorStoreData(DataClassJsonMixin): embedding_dict: Dict[str, List[float]] field(default_factorydict) # node_id - embedding text_id_to_ref_doc_id: Dict[str, str] field(default_factorydict) # node_id - ref_doc_id metadata_dict: Dict[str, Any] field(default_factorydict) # node_id - metadata从源码结构看该存储的设计意图非常明确只存嵌入向量与索引映射关系不存文档正文stores_text: bool False。因此它的内存开销主要取决于向量数量 × 向量维度 × 字节数而非原始文本大小。这也是 FAQ 中内存约束更少论断的源码依据——外部向量数据库把索引与向量卸载到独立服务中本地进程只保留少量结果集。2.2 如何显式使用 SimpleVectorStore默认情况下直接构建索引即可自动获得内存向量存储from llama_index.core import VectorStoreIndex index VectorStoreIndex.from_documents(documents)也可以显式创建并挂载便于后续持久化与复用from llama_index.core import StorageContext, VectorStoreIndex from llama_index.core.vector_stores import SimpleVectorStore vector_store SimpleVectorStore() storage_context StorageContext.from_defaults(vector_storevector_store) index VectorStoreIndex.from_documents( documents, storage_contextstorage_context )2.3 持久化SimpleVectorStore 的落盘能力虽然 SimpleVectorStore 是内存存储但它支持把数据序列化为 JSON 持久化到磁盘下次再从磁盘加载从而在单机场景下跨越进程/重启保留索引# 持久化到磁盘 vector_store.persist(persist_pathsimple_store.json) # 从磁盘加载 from llama_index.core.vector_stores import SimpleVectorStore vector_store SimpleVectorStore.from_persist_path(simple_store.json)其底层实现simple.py 中persist()方法会通过 fsspec 打开写入流将SimpleVectorStoreData序列化为 JSONfrom_persist_path()则读取 JSON 并调用SimpleVectorStoreData.from_dict()还原。此外还提供了from_persist_dir()与from_namespaced_persist_dir()支持从持久化目录按命名空间namespace加载多个向量存储命名空间通过NAMESPACE_SEP __分隔符拼接文件名如default__vector_store.json。提示由于 SimpleVectorStore 不保存节点文本get_nodes()直接抛出NotImplementedError加载后需要配合文档存储DocumentStore才能完成完整的检索-合成流程这一点在从磁盘恢复索引时尤其重要。2.4 SimpleVectorStore 支持的能力边界从 test_simple.py 的测试用例可以看出SimpleVectorStore 至少覆盖了以下能力按相似度排序返回 Top-K 结果test_query_without_filters_returns_all_rows_sorted_by_similarity基于MetadataFilters的元数据预过滤test_query_with_filters通过ref_doc_id删除节点delete持久化与重载test_persist_and_load。因此对于文档规模可控、单机开发调试、原型验证的场景默认的 SimpleVectorStore 完全够用无需引入任何外部服务。而当文档量级上升、需要并发写入、分布式部署、混合检索或更强过滤能力时就应当考虑下面的外部向量存储。三、不同向量数据库之间有什么区别——功能对比矩阵这是 FAQ 的第二个问题。官方文档给出了权威答案查看 Vector Store Options Feature Support仓库内对应文件为 vector_stores.md。3.1 完整功能对比表以下是该文档中列出的向量存储选项与特性支持矩阵原表完整收录Vector StoreTypeMetadata FilteringHybrid SearchDeleteStore DocumentsAsyncAlibaba Cloud OpenSearchcloud✓✓✓✓Apache Cassandra®self-hosted / cloud✓✓✓Astra DBcloud✓✓✓Azure AI Searchcloud✓✓✓✓Azure CosmosDB Mongo vCorecloud✓✓Azure CosmosDB NoSqlcloud✓✓BaiduVectorDBcloud✓✓✓ChatGPT Retrieval Pluginaggregator✓✓Chromaself-hosted✓✓✓Couchbaseself-hosted / cloud✓✓✓✓DashVectorcloud✓✓✓✓Databrickscloud✓✓✓Deeplakeself-hosted / cloud✓✓✓DocArrayaggregator✓✓✓DuckDBin-memory / self-hosted✓✓✓DynamoDBcloud✓✓Elasticsearchself-hosted / cloud✓✓✓✓✓FAISSin-memoryGoogle AlloyDBcloud✓✓✓✓Google Cloud SQL Postgrescloud✓✓✓✓Hnswlibin-memorytxtaiin-memoryJaguarself-hosted / cloud✓✓✓✓LanceDBcloud✓✓✓Lanternself-hosted / cloud✓✓✓✓✓MongoDB Atlasself-hosted / cloud✓✓✓✓MyScalecloud✓✓✓✓Milvus / Zillizself-hosted / cloud✓✓✓✓Neo4jVectorself-hosted / cloud✓✓✓OpenSearchself-hosted / cloud✓✓✓✓✓Pineconecloud✓✓✓✓Postgresself-hosted / cloud✓✓✓✓✓pgvecto.rsself-hosted / cloud✓✓✓✓Qdrantself-hosted / cloud✓✓✓✓✓Redisself-hosted / cloud✓✓✓S3cloud✓✓✓✓* (using asyncio.to_thread)Simplein-memory✓✓SingleStoreself-hosted / cloud✓✓✓Supabaseself-hosted / cloud✓✓✓Tablestorecloud✓✓✓✓Taircloud✓✓✓TiDBcloud✓✓✓TencentVectorDBcloud✓✓✓✓Timescale✓✓✓✓Typesenseself-hosted / cloud✓✓✓Upstashcloud✓VectorX DBcloud✓✓✓✓✓Vearchself-hosted✓✓✓Vespaself-hosted / cloud✓✓✓✓Vertex AI Vector Searchcloud✓✓✓Weaviateself-hosted / cloud✓✓✓✓WordLiftcloud✓✓✓✓✓3.2 如何解读这张对比表Type类型cloud表示托管云服务self-hosted表示可自托管如 Docker/本地部署in-memory表示纯内存型aggregator表示聚合器如 DocArray、ChatGPT Retrieval Plugin可把多个后端聚合为统一接口。这一列直接决定了你的运维成本与数据主权边界。Metadata Filtering元数据过滤决定查询时能否按MetadataFilters精确过滤如只看某作者/某时间段的文档。注意上表中Simple也支持元数据过滤但 FAISS、Hnswlib、txtai 等纯内存库不支持——选型时这是一个很容易被忽略的坑。Hybrid Search混合搜索是否支持向量检索 关键词/全文检索的混合模式。Elasticsearch、Qdrant、Weaviate、Pinecone、Milvus 等支持较好对专有名词、编号、精确匹配类查询混合搜索通常明显优于纯向量检索。Delete删除能否按ref_doc_id或节点删除数据。数据需要频繁增量更新/纠错的应用必须关注此项。Store Documents存储文档向量存储本身是否保存文档原文。Simple不存返回stores_text: False这意味着不配合文档存储就无法直接从向量存储恢复完整文本。Async异步支持是否提供异步接口。在高并发服务端场景如 FastAPI asyncio下异步支持可以避免阻塞事件循环。3.3 集成与安装方式仓库中的向量存储集成全部位于 llama-index-integrations/vector_stores 目录下每个子目录对应一个独立的 pip 包例如llama-index-vector-stores-chroma、llama-index-vector-stores-qdrant、llama-index-vector-stores-pinecone、llama-index-vector-stores-postgres等。选型确定后按包名安装并在代码中创建对应的VectorStore实例挂载到StorageContext即可替换默认的 SimpleVectorStorefrom llama_index.core import StorageContext, VectorStoreIndex from llama_index.vector_stores.chroma import ChromaVectorStore vector_store ChromaVectorStore(chroma_collectionchroma_collection) storage_context StorageContext.from_defaults(vector_storevector_store) index VectorStoreIndex.from_documents( documents, storage_contextstorage_context )此外docs/examples/vector_stores 目录下提供了大量可运行的示例 Notebook如 Simple、Chroma、Qdrant、Pinecone、Milvus、Weaviate、Elasticsearch、FAISS、Hnswlib 等可以按图索骥快速验证。四、选型时还需要知道的查询模式与过滤能力源码级不同向量数据库的另一层差异在于查询模式Query Mode与过滤算子的覆盖面。LlamaIndex 在 types.py 中统一抽象了这些能力各向量存储集成在此基础上实现。4.1 查询模式VectorStoreQueryModeclass VectorStoreQueryMode(str, Enum): DEFAULT default SPARSE sparse HYBRID hybrid TEXT_SEARCH text_search SEMANTIC_HYBRID semantic_hybrid SVM svm LOGISTIC_REGRESSION logistic_regression LINEAR_REGRESSION linear_regression MMR mmrDEFAULT标准向量相似度检索SPARSE/HYBRID/SEMANTIC_HYBRID稀疏检索与混合检索依赖向量存储自身能力即对比表中的 Hybrid Search 列SVM/LOGISTIC_REGRESSION/LINEAR_REGRESSION基于学习器的查询模式MMR最大边际相关性在相关性之外引入多样性控制避免返回结果过于同质。以 SimpleVectorStore 的query()实现为例simple.py它分别调用get_top_k_embeddings_learner学习器模式、get_top_k_mmr_embeddingsMMR 模式与get_top_k_embeddings默认模式对于不支持的模式则抛出ValueError。这意味着即便同样叫向量存储不同后端的可用查询模式集合也可能不同选型时需对照功能矩阵确认。4.2 元数据过滤算子FilterOperatorMetadataFilters提供了丰富的过滤算子同样定义于 types.py算子含义(EQ)等于字符串/整数/浮点///数值比较!(NE)不等于in/nin在/不在数组中any/all数组字段包含任意/全部元素text_match/text_match_insensitive全文匹配区分/不区分大小写contains元数据数组包含指定值is_empty字段不存在或为空过滤条件之间可用FilterConditionand/or/not组合。例如按数值区间与标签组合过滤from llama_index.core.vector_stores import ( MetadataFilters, MetadataFilter, FilterOperator, FilterCondition, ) filters MetadataFilters( filters[ MetadataFilter(keyweight, operatorFilterOperator.GT, value1.5), MetadataFilter(keyrank, valuec), ], conditionFilterCondition.AND, )需要提醒的是过滤算子的完整度取决于后端实现。SimpleVectorStore 会在内存中执行过滤其query()在检索前先构建build_metadata_filter_fn做预过滤并会在存储缺少元数据时主动报错提示重建而 Chroma、Qdrant 等后端则把过滤下推到数据库执行。因此如果业务高度依赖复杂过滤应优先选择在对比表中 Metadata Filtering 打勾且文档明确支持丰富算子的后端。五、决策建议什么时候该从 SimpleVectorStore 升级结合 FAQ 的结论与上述对比可以形成如下务实的决策路径原型与教学、文档量在数万 chunk 以内、单机运行直接用默认的 SimpleVectorStore零运维、零依赖配合persist()即可跨会话保留索引。需要并发写入、多实例共享索引、数据量持续增长升级到 Postgrespgvector、Qdrant、Milvus、Elasticsearch 等可自托管方案或按合规要求选择托管云服务Pinecone、Weaviate Cloud、Azure AI Search 等。查询包含大量专有名词/编号/精确短语优先选择支持 Hybrid Search 的后端Elasticsearch、Qdrant、Weaviate、Milvus 等并在VectorStoreQuery中启用混合模式。高并发异步服务关注对比表中 Async 列选择支持异步接口的后端如 Qdrant、Postgres、Elasticsearch、OpenSearch 等。无论选择哪种后端接入方式都保持一致实例化对应VectorStore→ 通过StorageContext.from_defaults(vector_store...)挂载 → 用同一个VectorStoreIndex接口构建索引与查询。这也是 LlamaIndex 抽象层设计BasePydanticVectorStore统一接口带来的核心价值——选型切换的成本被降到最低。六、小结是否必须用向量数据库不是。LlamaIndex 内置的内存SimpleVectorStoresimple.py足以支撑本地与中小规模场景且支持 JSON 持久化只有数据规模、并发、功能混合搜索、异步等提出更高要求时才需要引入外部向量数据库。不同向量数据库有什么区别核心差异集中在 Type云/自托管/内存、Metadata Filtering、Hybrid Search、Delete、Store Documents、Async 六个维度完整矩阵见 Vector Store Options Feature Support所有集成包位于 llama-index-integrations/vector_stores并配有 docs/examples/vector_stores 下的示例 Notebook 供实操参考。选型没有绝对最优解关键是先明确自己的数据规模、查询模式与运维边界再对照本文的功能矩阵做出决策。【免费下载链接】llama_indexLlamaIndex is the document processing platform for AI项目地址: https://gitcode.com/GitHub_Trending/ll/llama_index创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表