ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Feast Qdrant 在线存储(Qdrant Online Store):向量相似度检索的配置、数据模型与源码实现解析

2026/9/17 20:11:56 拓冰建站 浏览量
Feast Qdrant 在线存储(Qdrant Online Store):向量相似度检索的配置、数据模型与源码实现解析 Feast Qdrant 在线存储Qdrant Online Store向量相似度检索的配置、数据模型与源码实现解析【免费下载链接】feastThe Open Source Feature Store for AI/ML项目地址: https://gitcode.com/GitHub_Trending/fe/feastFeast 的 Qdrant 在线存储feast.infra.online_stores.qdrant_online_store将向量数据库 Qdrant 作为特征仓库的在线存储后端在标准特征读写能力之上提供了向量相似度KNN检索能力可用于 RAG、语义匹配、相似特征召回等 AI/ML 场景。本文将围绕该模块的配置项、写入/读取/检索流程、集合与索引管理以及测试验证方式展开并结合 qdrant.py 等源码给出可落地的实践参考。模块概述Qdrant 在 Feast 中的定位Qdrant 是一个向量相似度检索引擎提供生产级的服务化 API支持向量的存储、搜索与带额外 payload 的扩展过滤非常适合基于神经网络或语义匹配、分面搜索等场景。Feast 通过QdrantOnlineStore将其接入自己的在线存储抽象层OnlineStore基类使其同时具备按实体键写入/读取特征值与传统在线存储一致的能力基于向量的最近邻检索retrieve_online_documents面向文档/向量召回场景集合collection的创建、更新与销毁create_collection/update/teardown。该模块由两个文件构成对应 qdrant_online_store 包文件核心内容qdrant.pyQdrantOnlineStoreConfig配置类与QdrantOnlineStore存储实现类qdrant_repo_configuration.py集成测试仓库配置FULL_REPO_CONFIGS使用QdrantOnlineStoreCreator从类继承关系看qdrant.py#L38QdrantOnlineStoreConfig同时继承自FeastConfigBaseModelFeast 的 pydantic 配置基类与VectorStoreConfigvector_store.py后者提供了所有向量在线存储共有的两个基础配置项vector_enabled是否启用向量相似度检索默认FalsesimilarityKNN 检索使用的向量相似度度量默认cosine该值在 Qdrant 中于集合创建时固化Qdrant 不支持在检索运行时临时更换度量。配置详解feature_store.yaml 中的 Qdrant 参数使用 Qdrant 在线存储前需安装对应的 Python 依赖pip install feast[qdrant]在feature_store.yaml中声明在线存储一个最小示例参考 docs/reference/online-stores/qdrant.mdproject: my_feature_repo registry: data/registry.db provider: local online_store: type: qdrant host: localhost port: 6333 write_batch_size: 100完整配置参数QdrantOnlineStoreConfigqdrant.py#L38-L66定义的参数及其默认值如下参数类型默认值说明typestrqdrant在线存储类型标识YAML 中必须为qdrantlocationOptional[str]NoneQdrant 云服务Qdrant Cloud的 location 参数urlOptional[str]NoneQdrant 服务 URL使用 HTTP/gRPC 协议地址时配置hostOptional[str]NoneQdrant 服务主机名本地部署常用localhostportOptional[int]6333REST API 端口grpc_portint6334gRPC 端口prefer_grpcboolFalse是否优先使用 gRPC 通信httpsOptional[bool]None是否启用 HTTPS托管服务场景api_keyOptional[str]NoneQdrant 服务访问密钥托管服务场景prefixOptional[str]None集合名前缀用于多租户隔离timeoutOptional[int]None客户端请求超时时间秒pathOptional[str]None本地持久化路径本地嵌入模式vector_namestr使用的向量名称默认使用单个未命名向量Qdrant 命名向量特性write_batch_sizeOptional[int]64单次请求写入的点point数量upload_waitboolTrue是否等待服务端确认写入完成True时每个请求显式等待完成确认较慢False时收到确认即返回vector_enabledOptional[bool]False继承自VectorStoreConfig是否启用向量检索similarityOptional[str]cosine继承自VectorStoreConfig相似度度量这些参数最终会被原样透传给 Qdrant 官方 Python 客户端QdrantClientqdrant.py#L84-L96因此与 qdrant-client 的构造参数语义保持一致。相似度度量与距离映射similarity支持的值定义在DISTANCE_MAPPINGqdrant.py#L30-L35Feast 配置值Qdrant 距离类型说明cosineDistance.COSINE余弦距离默认值适合文本/语义向量l2Distance.EUCLID欧几里得距离dotDistance.DOT点积内积l1Distance.MANHATTAN曼哈顿距离注意_get_client中对similarity做了校验不支持的度量会直接抛出断言错误qdrant.py#L80-L82。由于度量在create_collection时写入集合定义qdrant.py#L211-L219修改similarity后需要重新创建集合才能生效。数据模型Point、Payload 与向量字段Feast 在 Qdrant 中用一个集合collection对应一个 FeatureView集合名即table.name。每个特征值被写入为一个 Qdrant point其结构如下qdrant.py#L108-L139iduuid.uuid4().hex随机生成vector从特征值中解析出的浮点列表通过get_list_val_str取出 list 类型特征值并json.loads还原以{vector_name: [...]}的命名向量形式写入无向量时为空 dictpayloadentity_key经serialize_entity_key序列化的实体键字节feature_name特征名feature_valueValueProto 序列化后 Base64 编码的字符串qdrant.py#L119-L121timestamp事件时间统一转换为 naive UTCcreated_ts创建时间可选。集合创建时除向量配置外还会为entity_key与feature_name建立 KEYWORD 类型的 payload 索引qdrant.py#L220-L229保证按实体键、按特征名过滤的高效性。向量字段的自动推导集合的向量维度并非手工配置而是从 FeatureView schema 中带vector_index标记的字段自动推导。_get_feature_view_vector_field_metadatautils.py#L1947-L1957会检查 schema 中的向量字段存在多个向量字段时抛出异常每个 FeatureView 只支持一个向量字段无向量字段时返回None此时create_collection回退使用默认向量长度512qdrant.py#L205-L207。批量写入写入路径为online_write_batchqdrant.py#L99-L146将多个实体键的特征数据组装为models.PointStruct列表后调用upload_points其中batch_size取自write_batch_size且固定waitTrue等待服务端确认。读取流程基于 payload 过滤的滚动查询online_readqdrant.py#L148-L195使用 Qdrant 的过滤 滚动scroll机制实现按实体键读取构造models.FieldCondition过滤条件entity_key使用MatchAny匹配传入的实体键列表若指定了requested_features则对feature_name同样使用MatchAny以SCROLL_SIZE 1000qdrant.py#L28为步长循环 scroll直到next_offset为None即全部取完结果按feature_name - feature_value组织返回。注意此处读取的集合名取自config.online_store.collection_nameqdrant.py#L175而写入时使用的是table.name两者需要保持一致。基础设施管理集合的创建、更新与销毁QdrantOnlineStore实现了在线存储的标准生命周期方法create_collectionqdrant.py#L197-L229按表创建集合配置向量维度与距离度量并建立 payload 索引updateqdrant.py#L231-L243删除tables_to_delete对应的集合并为tables_to_keep重新create_collectionteardownqdrant.py#L245-L257删除所有表的集合异常时记录日志并抛出。功能矩阵参考 docs/reference/online-stores/qdrant.md 中 Qdrant 在线存储的功能矩阵其能力边界如下能力Qdrant向在线存储写入特征值✅从在线存储读取特征值✅更新在线存储基础设施如表✅销毁在线存储基础设施✅生成基础设施变更计划❌支持 on-demand 转换✅可被 Python SDK 读取✅可被 Java 读取❌可被 Go 读取❌支持无实体 FeatureView✅支持并发写同一键❌检索时支持 TTL❌支持删除过期数据❌按 FeatureView 聚合✅按 FeatureService 聚合❌按实体键聚合❌也就是说Qdrant 在线存储目前仅面向 Python 生态的向量检索场景不支持 Java/Go 读取也不支持 TTL 过期机制与并发写同一键。向量检索retrieve_online_documentsQdrant 在线存储的核心差异化能力是文档向量检索。retrieve_online_documentsqdrant.py#L259-L323使用 Qdrant 的query_points执行近似最近邻查询query为查询向量limit为top_kusing指定使用哪个命名向量来自vector_name为空时使用默认向量对返回的每个 point解析 payload 中的entity_key、feature_valueBase64 解码还原 ValueProto、timestamp并将point.score作为距离值最后通过_build_retrieve_online_document_recordutils.py#L1899-L1944组装统一的检索记录包含事件时间、实体键、特征值、向量值与距离值实体键会按entity_key_serialization_version反序列化小于 3 时返回None。使用示例参考 docs/reference/online-stores/qdrant.mdfrom feast import FeatureStore feature_store FeatureStore(repo_pathfeature_store.yaml) query_vector [1.0, 2.0, 3.0, 4.0, 5.0] top_k 5 # 检索与查询向量最接近的 top_k 个特征 # 由于 Qdrant 支持一个条目多个向量 # 具体使用的向量可在仓库配置vector_name中指定 feature_values feature_store.retrieve_online_documents( features[my_feature], queryquery_vector, top_ktop_k, )需要说明的是此类 API 在 Feast 未来版本中可能为了提升性能与易用性而调整使用时建议关注版本变更。测试与验证集成测试仓库配置模块的测试配置位于 qdrant_repo_configuration.py其FULL_REPO_CONFIGS将online_storeqdrant与QdrantOnlineStoreCreator绑定。测试实现 tests/universal/feature_repos/universal/online_store/qdrant.py 使用testcontainers.qdrant.QdrantContainer拉起官方qdrant/qdrantDocker 镜像作为测试环境其创建的在线存储配置为{ host: self.container.get_container_host_ip(), type: qdrant, port: self.container.exposed_rest_port, vector_length: 2, similarity: cosine, }这印证了两点关键事实其一similarity与向量维度是集合创建时固化、测试通过vector_length此处为 2即测试向量维度与cosine度量组合验证其二本地测试最便捷的方式就是通过 Docker 运行qdrant/qdrant镜像再将host/port写入feature_store.yaml。此外tests/integration/doctest/test_all.py 也会对包含 Qdrant 相关文档示例进行 doctest 校验。小结Feast 的 Qdrant 在线存储在标准OnlineStore抽象之上叠加了向量相似度检索能力通过 qdrant.py 中的配置类与实现类完成集合管理、payload 过滤式特征读写与 KNN 文档检索。实践要点可概括为安装feast[qdrant]在feature_store.yaml中声明type: qdrant及连接参数在 FeatureView schema 中标记唯一的vector_index字段集合维度会自动推导默认 512similaritycosine / l2 / dot / l1在创建集合时固化变更后需重建集合向量检索使用feature_store.retrieve_online_documents(features..., query..., top_k...)本地开发可用 Docker 运行qdrant/qdrant镜像参照测试仓库配置快速验证。【免费下载链接】feastThe Open Source Feature Store for AI/ML项目地址: https://gitcode.com/GitHub_Trending/fe/feast创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考