Pinecone向量搜索中如何实现双词组合检索解决法规查询问题
在Pinecone中实现“法规编号+regulation”双词组合检索的解决方案
针对你遇到的部分法规编号查询时仅匹配regulation关键词的问题,完全可以通过以下几种方式在Pinecone中实现精准的双词组合检索:
1. 元数据过滤(最直接有效的方案)
在向Pinecone上传向量时,给每个法规片段添加结构化元数据,明确标记法规编号:
# 示例:上传法规片段时附带元数据 index.upsert([ ("reg_25_1", dense_vector, {"regulation_num": 25, "content_type": "regulation"}), ("reg_25_2", dense_vector, {"regulation_num": 25, "content_type": "regulation"}), # 其他法规片段同理 ])
查询时,先通过元数据过滤锁定目标编号的法规,再执行语义搜索:
query_vector = embedding_model.encode("What is regulation 25") results = index.query( vector=query_vector, filter={"regulation_num": 25}, # 精准过滤25号法规 top_k=4, include_metadata=True )
这种方式从结构化层面直接限定检索范围,彻底避免只匹配regulation关键词的问题。
2. 优化嵌入输入的关联度
将法规编号与内容绑定后再生成嵌入向量,让模型把编号和内容建立更强的语义关联:
- 嵌入单个片段时,输入格式改为:
"Regulation 25: [具体法规内容]",而非仅输入内容文本 - 查询时保持
"What is regulation 25"的格式,这样模型生成的查询向量会更贴近目标法规的嵌入向量,提升匹配精准度
3. 混合检索(语义+关键词双重匹配)
结合稠密语义向量和稀疏关键词向量做混合检索,同时兼顾语义理解和精准关键词匹配:
- 上传时,同时生成并上传稠密向量(语义)和稀疏向量(比如用BM25算法生成关键词权重)
- 查询时,同时传入查询的稠密向量和稀疏向量,Pinecone会自动融合两种检索结果:
# 生成查询的稠密和稀疏向量 query_dense = embedding_model.encode("What is regulation 25") query_sparse = bm25_encoder.encode("What is regulation 25") # 执行混合检索 results = index.query( vector=query_dense, sparse_vector=query_sparse, top_k=4, include_metadata=True )
这种方式能让regulation 25作为关键词组合被精准匹配,同时保留语义搜索的灵活性。
内容的提问来源于stack exchange,提问作者Mohamed Anser Ali
相关产品推荐
相关产品推荐

