ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Feast 集成 Milvus 在线存储:配置详解、向量检索与源码级实现剖析

Feast 集成 Milvus 在线存储:配置详解、向量检索与源码级实现剖析 Feast 集成 Milvus 在线存储配置详解、向量检索与源码级实现剖析【免费下载链接】feastThe Open Source Feature Store for AI/ML项目地址: https://gitcode.com/GitHub_Trending/fe/feastMilvus 是面向 AI/ML 场景的高性能向量数据库Feast 通过milvus_online_store模块将其作为在线存储Online Store后端既支持传统按键读取特征值也支持向量相似度检索与全文关键词检索是构建 RAG检索增强生成等语义检索应用的特征基础设施。本文以 feast.infra.online_stores.milvus_online_store 模块 为骨架结合仓库内 milvus.py 的实现源码、官方在线存储文档 与 Milvus 教程示例完整讲解安装配置、参数语义、数据模型映射、读写链路与向量检索调用方式帮助读者把 Milvus 真正跑进 Feast 特征平台。Milvus 在线存储模块的定位feast.infra.online_stores.milvus_online_store是 Feast 的 Python SDK 中负责与 Milvus 交互的在线存储实现模块由两个核心文件构成milvus.py定义MilvusOnlineStoreConfig配置类与MilvusOnlineStore存储实现类实现 FeastOnlineStore抽象接口milvus_repo_configuration.py提供集成测试仓库配置注册milvus在线存储类型及对应的MilvusOnlineStoreCreator。从源码结构看MilvusOnlineStore直接继承OnlineStore基类并混入VectorStoreConfig定义于 vector_store.py因此它同时具备「普通在线存储」与「向量存储」两类能力既可以通过复合主键精确读取特征值也可以通过向量近邻搜索ANN或关键词过滤检索文档类特征。在 Feast 的整体架构中在线存储负责保存已物化materialized的最新特征值供在线推理场景低延迟读取Milvus 在线存储使这份能力扩展到向量维度让特征平台可以直接支撑语义检索、相似商品推荐、文档召回等场景这正是 examples/rag 等示例所演示的 RAG 用法的底层支撑。安装与依赖使用 Milvus 在线存储需要安装 Feast 的 Milvus 扩展依赖同时还要安装所选离线存储所需的依赖例如file、bigquery、snowflake等pip install feast[milvus]仓库中 Milvus 教程示例 还展示了通过docker compose up -d启动 Milvus 服务的标准前置步骤若使用 Milvus Lite本地嵌入式模式则无需额外部署服务端直接指定一个本地.db文件路径即可。关于 milvus-lite 版本升级的重要提示官方文档 docs/reference/online-stores/milvus.md 明确提醒Feast 同时支持 milvus-lite 2.x 与 3.x但若从 2.x 升级到 3.0.0旧版存储格式生成的.db文件与 3.0.0 引擎不兼容必须将数据重新导入新数据库不存在自动迁移。因此升级前务必评估存量数据的迁移方案。feature_store.yaml 配置详解在特征仓库的feature_store.yaml中将online_store的type设置为milvus即可启用。以下为官方文档给出的完整配置示例对应 docs/reference/online-stores/milvus.mdproject: my_feature_repo registry: data/registry.db provider: local online_store: type: milvus path: data/online_store.db embedding_dim: 128 index_type: FLAT metric_type: COSINE username: username password: passwordMilvusOnlineStoreConfig类milvus.py 第 197 行起完整定义了所有可配置项及其默认值整理如下配置项默认值说明typemilvus固定标识配置类名必须以OnlineStoreConfig后缀结尾pathMilvus Lite 本地数据库文件路径当provider: local且配置了path时走本地模式hosthttp://localhost远程 Milvus 服务地址连接时拼成uri host:portport19530远程 Milvus 服务端口index_typeFLAT向量索引类型如FLAT、IVF_FLAT、HNSW等metric_typeCOSINE向量检索距离度量如COSINE、L2、IPembedding_dim128向量字段维度创建 Collection 时使用vector_enabledTrue是否启用向量相似度检索继承自VectorStoreConfigtext_search_enabledFalse是否启用文本关键词检索nlist128索引参数构建向量索引时传入username/passwordMilvus 认证凭据同时配置时以username:password作为 token 传入enable_openai_compatible_storeFalse是否以原生数值类型存储数值字段详见下文「数值字段存储」小节varchar_max_length65535VARCHAR 字段默认最大长度取值必须介于 1~65535 之间其中varchar_max_length由 Pydantic 校验器强制约束milvus.py 第 218-223 行传入 0、负数或大于 65535 的值会直接抛出ValidationError对应单元测试见 test_milvus_varchar_max_length.py。仓库内实际可运行的示例配置 examples/online_store/milvus_tutorial/feature_store.yaml 如下project: milvus_tutorial provider: local registry: data/registry.db online_store: type: milvus host: localhost port: 19530 vector_enabled: true embedding_dim: 384 index_type: FLAT metric_type: L2 offline_store: type: file entity_key_serialization_version: 3该示例采用 384 维 embedding对应all-MiniLM-L6-v2模型的输出维度使用L2距离度量并与file类型离线存储搭配是最容易本地复现的入门组合。连接模式本地 Lite 与远程服务_connect方法milvus.py 第 251-269 行根据配置决定连接方式本地模式当config.provider local且配置了path时使用MilvusClient(db_path)打开本地数据库文件若path是相对路径会基于config.repo_path解析见_get_db_path方法远程模式否则使用MilvusClient(urif{host}:{port}, token...)连接远端服务当同时配置username与password时以username:password形式作为 token 认证。MilvusClient连接对象在 Store 实例上缓存复用且 Collection 元数据缓存在_collections字典中避免重复创建。数据类型映射Feast 类型到 Milvus 类型Feast 的特征类型体系与 Milvus 的 Field 类型并不一一对应模块通过两张映射表完成转换milvus.py 第 57-105 行PROTO_TO_MILVUS_TYPE_MAPPING由 proto 值类型直接映射到 MilvusDataType例如bytes_val → VARCHAR、bool_val → BOOL、string_val → VARCHAR、float_val → FLOAT、double_val → DOUBLE、int32_val → INT32、int64_val → INT64各类列表类型被映射为向量或文本字段float_list_val、int32_list_val、int64_list_val、double_list_val → FLOAT_VECTORbool_list_val → BINARY_VECTOR而map_val、json_val、struct_val等复杂类型一律落到VARCHARFEAST_PRIMITIVE_TO_MILVUS_TYPE_MAPPING在上一张表基础上按 Feast 类型系统重建覆盖PrimitiveFeastType、Array、ComplexFeastType三类其中数值型数组Array(INT32/INT64/FLOAT/DOUBLE)映射为FLOAT_VECTOR字符串数组映射为VARCHAR布尔数组映射为BINARY_VECTOR。从源码可以推断这种设计让「向量字段」与「普通字段」在 schema 层被统一管理只有被标记为vector_indexTrue的 Field 才真正参与向量索引构建其余数值字段默认以 VARCHAR 文本形式落库除非开启enable_openai_compatible_store。Collection 结构设计_get_or_create_collection方法milvus.py 第 271-401 行为每个 FeatureView 创建/获取一个 Milvus Collection命名规则为{project}_{feature_view_name}若开启在线特征视图版本化则追加_v{version}后缀_table_id辅助函数对应测试见 test_milvus_versioning.py。Collection 的字段构成如下复合主键{entity1}_{entity2}_..._pk_get_composite_key_name生成milvus.py 第 991-992 行VARCHAR类型存放序列化后的实体键serialize_entity_key(...).hex()保证多实体 FeatureView 也能唯一标识一行event_ts、created_tsINT64类型分别保存微秒级时间戳to_naive_utc(...).timestamp() * 1e6特征字段按FEAST_PRIMITIVE_TO_MILVUS_TYPE_MAPPING映射FLOAT_VECTOR字段使用embedding_dim维度VARCHAR字段优先使用 Field 标签tags[max_length]指定的长度须在 1~65535 之间否则回退到varchar_max_length占位向量字段_placeholder_vector当 FeatureView 不包含任何向量字段时自动追加一个维度为 1 的FLOAT_VECTOR字段以保证 Milvus 索引机制可用写入时填充float(nan)。Collection 创建后对每个声明了vector_index的向量字段单独构建索引索引类型与度量取自index_type/metric_type配置字段自身的vector_search_metric可覆盖全局配置nlist作为索引参数传入。写入链路online_write_batchonline_write_batchmilvus.py 第 403-495 行实现特征物化写入其处理逻辑值得关注对每条记录将实体键序列化为 hex 字符串作为复合主键通过_extract_proto_values_to_dict把 proto 特征值转换为 Python 字典向量列保留原始数值列表其余字段在serialize_to_stringTrue时序列化为字符串复杂类型采用 base64 编码 proto 字节bytes_val也做 base64 编码若 Collection 启用了原生数值字段则数值字段直接保留原生类型剥离event_timestamp、created_timestamp、event_ts、created_ts等时间戳字段避免与内部字段冲突对同一实体键仅保留最新event_ts的记录unique_entities去重最终通过client.upsert批量写入天然支持并发写同一键后写覆盖。读取链路online_readonline_readmilvus.py 第 497-639 行按实体键批量精确读取将请求的实体键逐一序列化为复合主键字符串构造{composite_key} in [...]的 Milvus 查询过滤器通过client.query拉取指定输出字段含请求的特征字段与created_ts/event_ts按复合主键分组后把存储的字符串/数值按 Feast 特征类型还原为ValueProtobytes_val重新编码、数值类型强转、列表类型 extend、map/struct/json 类型尝试 base64 反序列化按请求实体键的顺序返回结果缺失的键返回(None, None)。支持按project:feature_view:feature形式的requested_features精确投影也兼容feature_view:feature双段形式内部做字段名拆分处理。向量检索retrieve_online_documents_v2Milvus 在线存储的差异化能力在于retrieve_online_documents_v2milvus.py 第 677-965 行该方法是 FeatureStore.retrieve_online_documents_v2 在存储层的实现支持三种检索模式1. 纯向量检索embedding非空且vector_enabledTrue时通过client.search在 ANN 字段上执行近邻搜索search_params使用metric_type可用参数distance_metric覆盖与nprobe10返回top_k条最相似记录。2. 纯关键词检索query_string非空时对所有字符串类型特征字段构造LIKE %query%过滤表达式字段需包含在输出字段中通过client.query做全文匹配距离置为-1.0若 FeatureView 没有任何字符串字段则抛出ValueError。3. 混合检索embedding与query_string同时提供时先做关键词LIKE过滤得到文本候选再在该结果上执行向量近邻搜索实现「文本粗筛 向量精排」的混合召回。三类检索都支持叠加filters元数据过滤见下文并将结果反序列化为(event_ts, entity_key_proto, features_dict)元组列表其中向量字段会还原为浮点列表距离值写入distance字段。调用示例可参考 milvus_example.pyresults store.retrieve_online_documents_v2( features[ product_embeddings:embedding, product_embeddings:name, product_embeddings:description, ], queryquery_embedding, top_ktop_k, distance_metricL2, ).to_df()对应的检索入口 FeatureStore.retrieve_online_documents_v2 还支持query_image_bytes图像检索与combine_with_text多模态融合weighted_sum/concatenate/average三种融合策略这些参数最终由存储层按各自能力消费。过滤器翻译MilvusFilterTranslator检索时传入的filtersComparisonFilter/CompoundFilter由MilvusFilterTranslatormilvus.py 第 149-194 行翻译为 Milvus 布尔表达式字符串比较操作符映射eq → 、ne → !、gt/gte/lt/lte → ///in/nin要求值为列表翻译为key in [...]/key not in [...]复合过滤器按and/or组合子句并加括号字段名须匹配[a-zA-Z_][a-zA-Z0-9_]*正则否则报错字符串值通过_milvus_escape_string转义反斜杠、单双引号、换行、回车数值与布尔值直接原样输出保证数值比较是真正的数值语义而非字典序。关于数值字段过滤的重要注意点源码中有一个值得注意的告警逻辑milvus.py 第 751-770 行当过滤器包含数值比较gt/gte/lt/lte但 Collection 的数值字段是以VARCHAR存储时Milvus 会执行字典序比较导致9 100为 True 这类错误结果。日志会提示在online_store配置中设置enable_openai_compatible_store: true然后 teardown 并重新 apply 特征仓库以原生数值类型重建 Collection。这一点对生产环境的数据建模决策非常关键。生命周期管理update、teardown 与版本化plan方法返回空列表表示 Milvus 在线存储不生成基础设施变更计划对应功能矩阵中的「generate a plan of infrastructure changes: no」updatemilvus.py 第 641-659 行为保留的 FeatureView 创建 Collection并删除已废弃表的所有版本 Collectionteardownmilvus.py 第 666-675 行与_drop_all_version_collectionsmilvus.py 第 967-984 行会同时删除基础 Collection 与全部_v{N}版本兄弟 Collection避免用户在仓库中反复开关版本化开关后遗留孤儿 Collection。上述版本化行为均有单元测试覆盖test_milvus_versioning.py 验证了_table_id在版本化开/关、版本号、版本标签projection.version_tag优先级高于version_number等场景下的命名规则以及 teardown/update 只删除目标 FeatureView 的版本集合、不影响无关 Collection。功能矩阵官方文档 docs/reference/online-stores/milvus.md 给出了 Milvus 在线存储的功能支持矩阵摘录如下功能Milvus写入特征值到在线存储是从在线存储读取特征值是更新在线存储基础设施如表是拆除在线存储基础设施如表是生成基础设施变更计划否支持 on-demand 变换是Python SDK 可读是Java / Go 可读否支持无实体 FeatureView是支持并发写同一键是检索时支持 TTL是支持删除过期数据是按 FeatureView / FeatureService / 实体键共置collocated否向量相似度检索是从矩阵可以清晰看出Milvus 在线存储的强项是向量检索与通用读写能力Java/Go 客户端不可读、不生成基础设施计划、不支持数据共置布局这些是需要根据部署形态提前确认的边界条件。测试与验证仓库为 Milvus 在线存储提供了多层测试保障test_milvus_varchar_max_length.py验证默认值 65535、自定义值与越界校验并断言配置值会传播到每个 VARCHARFieldSchematest_milvus_versioning.py验证版本化命名与 teardown/update 清理行为universal/online_store/milvus.py集成测试的MilvusOnlineStoreCreator使用本地online_store.db文件配置IVF_FLAT索引与L2度量可作为快速上手的最小配置参考milvus_repo_configuration.py将milvus注册进AVAILABLE_ONLINE_STORES供测试框架动态发现。总结Feast 的 Milvus 在线存储模块通过MilvusOnlineStore把传统特征存储与向量检索统一到同一套 FeatureView 抽象之下日常的特征物化、按键读取走online_write_batch/online_read标准链路语义检索走retrieve_online_documents_v2的向量/关键词/混合三种模式。配置上需要重点把握embedding_dim、index_type、metric_type等向量相关参数以及enable_openai_compatible_store、varchar_max_length两个影响数据落库形态的开关部署上则要留意 milvus-lite 2.x 升级 3.x 的存储格式不兼容问题。若希望快速验证可直接运行 Milvus 教程 对应的示例仓库在本地用 Docker 拉起 Milvus 后体验完整的「定义特征 → 物化 → 向量检索」闭环。【免费下载链接】feastThe Open Source Feature Store for AI/ML项目地址: https://gitcode.com/GitHub_Trending/fe/feast创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表