2026/4/6 10:53:40
网站建设
项目流程
江西东乡网站建设,昆明网站建设技术研发中心,国家企业公示信息查询系统,学做网站好做吗一篇文章搞明白两大类型的多向量混合检索
唠点做电商搜索常踩的坑#xff1a;复杂描述下的召回率偏低问题。
可能不少人都遇到过这个情况#xff0c;用户发了张裙子照片#xff0c;还特意备注 “北方、冬天、妈妈穿”#xff0c;检索结果却匹配到一条花色、版型相似但明显…一篇文章搞明白两大类型的多向量混合检索唠点做电商搜索常踩的坑复杂描述下的召回率偏低问题。可能不少人都遇到过这个情况用户发了张裙子照片还特意备注 “北方、冬天、妈妈穿”检索结果却匹配到一条花色、版型相似但明显为夏季穿着的沙滩裙与需求完全不符。医疗、法律领域做检索时也经常出现类似问题医生搜索 “2 型糖尿病 儿童患者 病例” 系统却召回一堆 1 型糖尿病的资料语义相近但与需求牛头不对马嘴法律场景更典型用户明确查询 “XX 场景下的连带责任” 相关法条和案例系统却返回大量 “XX 场景补充责任” 的文书虽然就两字之差实际法律含义却相去甚远。问题看似各不相同但本质其实都一样**单靠一种维度的信息也就是单向量检索根本应付不了复杂场景的需求**电商搜索需要的是图片 文字描述的多模态检索能力医疗、法律场景则需要把语义理解和关键词精准匹配 结合起来。**要解决这类问题就需要引入多向量混合检索。**其核心在于整合文本语义、关键词及不同模态信息在多维度上并行检索后对结果进行 rerank使检索结果更贴合实际需求。那么多向量混合检索到底是什么该怎么用以下是技术解读以及手把手应用实践。01多向量混合检索的两种核心类型多向量混合检索本质就是整合不同搜索方法或跨模态的embedding信息主要分为两类稀疏 - 稠密向量搜索稠密向量擅长捕捉语义关系稀疏向量适合精准的关键词匹配。两者结合后既能理解整体概念又能匹配精确术语弥补了单一方法的不足让复杂查询的结果更优。以下是稀疏 - 稠密向量混合检索的示范https://milvus.io/docs/hybrid_search_with_milvus.md多模态向量搜索milvus目前支持跨文本、图像、音频等多种数据类型搜索能把不同形式的信息整合为连贯的搜索体验。比如电商搜索中用户输入文本查询照片系统可以同时匹配产品的文字描述和实物图像让结果更准、更丰富。02Milvus/Zilliz Cloud 的核心支持能力要落地多向量混合检索Milvus 和 Zilliz Cloud 提供了全方位的技术支持灵活的Schema定义能在Collection Schema中定义多个向量字段支持整数主键INT64、字符串VARCHAR、稠密向量DENSE_VECTOR、稀疏向量SPARSE_FLOAT_VECTOR等多种数据类型还能开启全文搜索分析器enable_analyzer。多样化索引与度量提供自动索引AUTOINDEX、稀疏倒排索引SPARSE_INVERTED_INDEX等类型支持内积IP、BM25 等度量方式适配不同类型向量的搜索需求。内置全文搜索集成 BM25 算法能自动从文本字段生成稀疏向量不用用户手动计算简化数据准备流程。完善的重排序机制支持 RRFRanker 等多种策略支持对多个ANN搜索结果集进行合并与重新排序高效输出最优结果。严谨的搜索流程明确规定了搜索请求实例创建、集合加载、参数配置等步骤保障混合搜索的稳定性和准确性。凭借上述能力多向量混合检索可以落地到多种实际场景社交媒体内容检索比如搜索同时包含特定文本描述和图像的推文要求文本和图像都满足语义匹配。电商产品搜索用户输入文本查询后系统同时关联产品的文字描述语义 关键词和产品图像实现多维度精准匹配。复杂信息查询针对有多维度介绍的对象比如多字段商品说明、文档摘要整合多个字段的向量进行全面检索避免遗漏关键信息。03示例下面以 产品文本 图像的检索场景为例详细拆解多向量混合搜索的实现步骤。这里默认每个产品都有文字描述和图片能支持三种搜索方式语义文本搜索根据文本的实际含义找产品。比如搜 适合夏天穿的宽松上衣能找到夏季透气款 oversizeT 恤这种意思相近的描述不用严格匹配关键词。这需要把文本转换成稠密向量常用 BERT、Transformers 这类模型或者 OpenAI 的服务来生成。全文搜索根据关键词精准匹配。比如搜 “纯棉 白色”能直接定位到描述里包含这两个词的产品。这需要把文本转换成稀疏向量可以用 BM25 算法或者 BGE-M3、SPLADE 这类专门生成稀疏向量的模型。多模态图像搜索用文字描述找对应的产品图片。比如搜 “红色带花纹的连衣裙”能直接找到符合这个描述的裙子图片。这需要把图片转换成稠密向量常用 CLIP 这类模型来生成。接下来我们会结合产品的文字描述和图片信息一步步讲清楚怎么把这三种搜索结合起来实现多模态混合搜索。核心是先学会怎么存储这些多类型的向量数据再用合适的方法给搜索结果排序。1创建具有多个向量字段的集合要实现混合搜索首先得建一个能容纳多种向量的 collection。建这个collection分三步定义 Collection Schema、配置索引参数和创建 Collection。**这里先重点说第一步 ——**定义Collection Schema。因为要支持三种搜索模板里得有对应不同向量的字段具体包括这 5 个id每个产品的唯一编号类似身份证号用整数类型INT64存储作为区分不同产品的主键。text用于存储产品的文字描述比如 “红色纯棉连衣裙长度及膝”用字符串类型VARCHAR最长能存 1000 字节。enable_analyzer选项设置为True开启文本分析功能方便后面做全文搜索时自动提取关键词。text_dense用于存储文本的稠密向量对应语义文本搜索用浮点向量类型FLOAT_VECTOR维度是 768这个数字由生成向量的模型决定比如 BERT 模型生成的向量通常是 768 维。text_sparse用于存储文本的稀疏向量”对应全文搜索用稀疏浮点向量类型SPARSE_FLOAT_VECTOR。image_dense存产品图片的 稠密向量对应多模态图像搜索用浮点向量类型FLOAT_VECTOR维度是 512比如 CLIP 模型生成的图像向量常为 512 维。另外因为我们要用系统自带的 BM25 算法来自动生成文本的稀疏向量所以在定义这个Schema时还需要加上 Milvus 的内置函数支持。from pymilvus import ( MilvusClient, DataType, Function, FunctionType ) client MilvusClient( urihttp://localhost:19530, tokenroot:Milvus ) # Init schema with auto_id disabled schema client.create_schema(auto_idFalse) # Add fields to schema schema.add_field(field_nameid, datatypeDataType.INT64, is_primaryTrue, descriptionproduct id) schema.add_field(field_nametext, datatypeDataType.VARCHAR, max_length1000, enable_analyzerTrue, descriptionraw text of product description) schema.add_field(field_nametext_dense, datatypeDataType.FLOAT_VECTOR, dim768, descriptiontext dense embedding) schema.add_field(field_nametext_sparse, datatypeDataType.SPARSE_FLOAT_VECTOR, descriptiontext sparse embedding auto-generated by the built-in BM25 function) schema.add_field(field_nameimage_dense, datatypeDataType.FLOAT_VECTOR, dim512, descriptionimage dense embedding) # Add function to schema bm25_function Function( nametext_bm25_emb, input_field_names[text], output_field_names[text_sparse], function_typeFunctionType.BM25, ) schema.add_function(bm25_function) 定义好 Collection Schema 后接下来要给各个向量字段建索引。简单说索引就像给数据建了个快速查找目录能大幅提升后续搜索的速度和效率。同时还得明确用什么方法判断两个向量 “像不像”也就是相似度类型。在这个示例里三个向量字段的索引配置是这样的text_dense_index文本稠密向量的索引zilliz cloud中可以用 AUTOINDEX。这种索引不用手动调参数系统会根据数据特点自动优化适合处理文本的语义向量。判断相似度用 内积IP—— 两个向量的内积值越大说明它们代表的文本语义越接近。开源milvus里则内置了默认参数。text_sparse_index文本稀疏向量的索引用 稀疏倒排索引SPARSE_INVERTED_INDEX。这种索引专门为关键词类的稀疏向量设计能快速定位包含特定关键词的文本。判断相似度用 BM25 算法 —— 这是全文搜索里常用的方法能根据关键词出现的频率、位置等算出文本和查询的匹配度。image_dense_index图像稠密向量的索引和文本稠密向量一样用AUTOINDEX搭配内积IP 判断相似度。因为图像的视觉特征向量和文本的语义向量类似都是通过稠密向量表达整体特征所以用相同的索引和相似度计算方式更合适。# Prepare index parameters index_params client.prepare_index_params() # Add indexes index_params.add_index( field_nametext_dense, index_nametext_dense_index, index_typeAUTOINDEX, metric_typeIP ) index_params.add_index( field_nametext_sparse, index_nametext_sparse_index, index_typeSPARSE_INVERTED_INDEX, metric_typeBM25, params{inverted_index_algo: DAAT_MAXSCORE}, # or DAAT_WAND or TAAT_NAIVE ) /include include targetzilliz index_params.add_index( field_nametext_sparse, index_nametext_sparse_index, index_typeAUTOINDEX, metric_typeBM25 ) /include index_params.add_index( field_nameimage_dense, index_nameimage_dense_index, index_typeAUTOINDEX, metric_typeIP ) 定义好 Collection Schema 、创建好向量字段索引之后第三步就是创建 Collection此处我们创建一个名为demo的 Collection。client.create_collection( collection_namemy_collection, schemaschema, index_paramsindex_params )2插入数据接下来我们要把产品的各种信息按照前面定义的结构存到名为 my_collection的集合里。这里有个关键点除了系统能自动生成的内容其他字段都得按规定格式填不能出错。具体来说每个产品要填这些信息id、text、text_dense、image_dense。另外有两个需要注意的点生成这些稠密向量时文本和图像可以用同一个模型也可以用不同的模型。比如这个例子里text_dense 是 768 维image_dense 是 512 维明显是用了不同的模型比如文本用 BERT图像用 CLIP。这就意味着后面做搜索时查文本就得用生成 text_dense 的模型来生成查询向量查图像就得用生成 image_dense 的模型不然格式对不上搜不准。至于 text_sparse文本的稀疏向量用来做关键词匹配的因为我们用了系统自带的 BM25 算法它会自动从 text 字段里提取关键词生成稀疏向量所以不用我们手动填。但如果不想用 BM25就得自己提前算好稀疏向量。import random # Generate example vectors def generate_dense_vector(dim): return [random.random() for _ in range(dim)] data[ { id: 0, text: Red cotton t-shirt with round neck, text_dense: generate_dense_vector(768), image_dense: generate_dense_vector(512) }, { id: 1, text: Wireless noise-cancelling over-ear headphones, text_dense: generate_dense_vector(768), image_dense: generate_dense_vector(512) }, { id: 2, text: Stainless steel water bottle, 500ml, text_dense: generate_dense_vector(768), image_dense: generate_dense_vector(512) } ] res client.insert( collection_namemy_collection, datadata )3执行混合搜索步骤 1创建多个 AnnSearchRequest 实例混合搜索的实现需要在 hybrid_search () 函数中创建多个 AnnSearchRequest 实例 来实现—— 每个实例对应一个向量字段的基础 ANN 搜索请求。因此执行混合搜索前必须为每个要用到的向量字段单独创建 AnnSearchRequest。此外还可通过在 AnnSearchRequest 中配置 expr 参数为混合搜索设置过滤条件例如限定价格范围、地区等。需要注意的是混合搜索中每个 AnnSearchRequest 仅支持传入一条查询数据。为了演示不同向量字段的搜索功能我们将基于一个示例查询构建三个 AnnSearchRequest过程中会使用预先计算好的稠密向量。这三个请求分别对应以下向量字段text_dense用于语义文本搜索、text_sparse用于全文搜索或关键词匹配、image_dense用于多模态文本到图像的搜索。from pymilvus import AnnSearchRequest query_text white headphones, quiet and comfortable query_dense_vector generate_dense_vector(768) query_multimodal_vector generate_dense_vector(512) # text semantic search (dense) search_param_1 { data: [query_dense_vector], anns_field: text_dense, param: {nprobe: 10}, limit: 2 } request_1 AnnSearchRequest(**search_param_1) # full-text search (sparse) search_param_2 { data: [query_text], anns_field: text_sparse, param: {drop_ratio_search: 0.2}, limit: 2 } request_2 AnnSearchRequest(**search_param_2) # text-to-image search (multimodal) search_param_3 { data: [query_multimodal_vector], anns_field: image_dense, param: {nprobe: 10}, limit: 2 } request_3 AnnSearchRequest(**search_param_3) reqs [request_1, request_2, request_3]由于参数limit设置为2每个AnnSearchRequest返回 2 个搜索结果。在这个例子中创建了 3 个AnnSearchRequest实例总共产生6个搜索结果。步骤 2配置重排序策略为了合并和重新排序 ANN 搜索结果集选择合适的重排序策略至关重要。提供多种重排序策略。在这个例子中由于没有特别强调特定的搜索查询我们将采用 RRFRanker 策略。ranker Function( namerrf, input_field_names[], # Must be an empty list function_typeFunctionType.RERANK, params{ reranker: rrf, k: 100 # Optional } ) 步骤 3执行混合搜索在启动混合搜索之前请确保已加载 Collection。如果 Collection 中的任何向量字段缺少索引或未加载到内存中则在执行混合搜索方法时将发生错误。res client.hybrid_search( collection_namemy_collection, reqsreqs, rankerranker, limit2 ) for hits in res: print(TopK results:) for hit in hits: print(hit)4以下是输出内容[[id: 1, distance: 0.006047376897186041, entity: {}, id: 2, distance: 0.006422005593776703, entity: {}]]在为混合搜索指定了limit2参数的情况下 将对从三次搜索中获得的六个结果进行重新排序。最终它们将只返回最相似的前两个结果。如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线互联网企业工作十余年里指导过不少同行后辈。帮助很多人得到了学习和成长。我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限很多互联网行业朋友无法获得正确的资料得到学习提升故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。第一阶段10天初阶应用该阶段让大家对大模型 AI有一个最前沿的认识对大模型 AI 的理解超过 95% 的人可以在相关讨论时发表高级、不跟风、又接地气的见解别人只会和 AI 聊天而你能调教 AI并能用代码将大模型和业务衔接。大模型 AI 能干什么大模型是怎样获得「智能」的用好 AI 的核心心法大模型应用业务架构大模型应用技术架构代码示例向 GPT-3.5 灌入新知识提示工程的意义和核心思想Prompt 典型构成指令调优方法论思维链和思维树Prompt 攻击和防范…第二阶段30天高阶应用该阶段我们正式进入大模型 AI 进阶实战学习学会构造私有知识库扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架抓住最新的技术进展适合 Python 和 JavaScript 程序员。为什么要做 RAG搭建一个简单的 ChatPDF检索的基础概念什么是向量表示Embeddings向量数据库与向量检索基于向量检索的 RAG搭建 RAG 系统的扩展知识混合检索与 RAG-Fusion 简介向量模型本地部署…第三阶段30天模型训练恭喜你如果学到这里你基本可以找到一份大模型 AI相关的工作自己也能训练 GPT 了通过微调训练自己的垂直大模型能独立训练开源多模态大模型掌握更多技术方案。到此为止大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗为什么要做 RAG什么是模型什么是模型训练求解器 损失函数简介小实验2手写一个简单的神经网络并训练它什么是训练/预训练/微调/轻量化微调Transformer结构简介轻量化微调实验数据集的构建…第四阶段20天商业闭环对全球大模型从性能、吞吐量、成本等方面有一定的认知可以在云端和本地等多种环境下部署大模型找到适合自己的项目/创业方向做一名被 AI 武装的产品经理。硬件选型带你了解全球大模型使用国产大模型服务搭建 OpenAI 代理热身基于阿里云 PAI 部署 Stable Diffusion在本地计算机运行大模型大模型的私有化部署基于 vLLM 部署大模型案例如何优雅地在阿里云私有部署开源大模型部署一套开源 LLM 项目内容安全互联网信息服务算法备案…学习是一个过程只要学习就会有挑战。天道酬勤你越努力就会成为越优秀的自己。如果你能在15天内完成所有的任务那你堪称天才。然而如果你能完成 60-70% 的内容你就已经开始具备成为一名大模型 AI 的正确特征了。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】