Milvus向量数据库混合检索召回案例

在做知识库问答的时候,需要使用到Milvus向量召回,但是根据不同场景有时候需要以关键词召回优先,有时候需要语义优先,此时我们就需要使用到混合检索

目录

1、Milvus数据准备

2、连接Milvus向量库

3、对问题进行embedding

4、混合检索

一、Milvus数据准备

在我们入库的时候,对待检索的字段需要有两个内容

1、content原始内容,这个设置jieba分词,后续用来bm25(sparse稀疏算法)召回

2、dense_content,对原始文本做embeddings,后续将会使用dense(稠密算法)召回

二、Python连接Milvus向量库

python 复制代码
from pymilvus import (
    MilvusClient, Function, FunctionType
)

user = ""
password = ""
client = MilvusClient(
    uri="http://172.18.2.14:19530",
    db_name="llm_agent",
    token=f"{user}:{password}"
)

# 测试是否连接成功
res = client.list_collections()
print(res)

三、对问题进行embedding

在检索前先对问题进行embedding,这个是用来检索dense_content字段的

python 复制代码
import requests

api_key = "sk-xxxx"


def get_embedding(txt):
    url = "https://api.siliconflow.cn/v1/embeddings"
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }
    data = {
        "model": "BAAI/bge-m3",
        "input": txt
    }
    response = requests.post(url, headers=headers, json=data)
    # print(response.status_code)
    # print(response.json())
    return response.json()["data"][0]["embedding"]


if __name__ == '__main__':
    txt = "Silicon flow embedding online: fast, affordable, and high-quality embedding services. come try it out!"
    get_embedding(txt)

四、混合检索

首先构建检索条件,有两个,一个是bm25的查询,一个是稠密算法的查询:

python 复制代码
query_text = "How many points are deducted when a warning administrative penalty is imposed?"
query_dense_vector = get_embedding.get_embedding(query_text)

text_search = AnnSearchRequest(
    data=[query_dense_vector],
    anns_field="dense_content",
    param={},
    limit=50
)

# full-text search (sparse) bm25
request_2 = AnnSearchRequest(
    data=[query_text],
    anns_field="sparse_content",
    param={},
    limit=50
)
reqs = [text_search, request_2]

混合权重,这部分代表分数权重中,语义70%,bm25关键词30%

python 复制代码
ranker = Function(
    name="weight",
    input_field_names=[],  # Must be an empty list
    function_type=FunctionType.RERANK,
    params={
        "reranker": "weighted",
        "weights": [0.7, 0.3],
        "norm_score": True  # Optional
    }
)

完整代码如下:

python 复制代码
from pymilvus import AnnSearchRequest
from pymilvus import (
    MilvusClient, Function, FunctionType
)
from milvus_model import get_embedding

client = MilvusClient(
    uri="http://xxxxx:19530",
    db_name="xxxxxx"
)

query_text = "How many points are deducted when a warning administrative penalty is imposed?"
# 对问题进行向量
query_dense_vector = get_embedding.get_embedding(query_text)

text_search = AnnSearchRequest(
    data=[query_dense_vector],
    anns_field="dense_content",
    param={},
    limit=10
)

# full-text search (sparse) bm25
request_2 = AnnSearchRequest(
    data=[query_text],
    anns_field="sparse_content",
    param={},
    limit=10
)

reqs = [text_search, request_2]

# 语义70%,bm25关键词30%
ranker = Function(
    name="weight",
    input_field_names=[],  # Must be an empty list
    function_type=FunctionType.RERANK,
    params={
        "reranker": "weighted",
        "weights": [0.7, 0.3],
        "norm_score": True  # Optional
    }
)

res = client.hybrid_search(
    collection_name="xxxxxx",
    reqs=reqs,
    ranker=ranker,
    limit=10,
    output_fields=["id", "content"]
)
for hits in res:
    print("TopK results:")
    for hit in hits:
        print(hit)

最终输出结果,其中distance代表分数,分数越高说明匹配效果越好

相关推荐
龙骑士baby4 小时前
重建 AI 认知第 4 篇:Skill——提示词的系统化封装
ai·大模型·llm·prompt·skill
李可以量化4 小时前
量化之MiniQMT 实战:一键读取通达信自选股并实时监控涨跌幅(附完整可运行代码)
开发语言·python·量化·qmt·ptrade
虎妞05004 小时前
向量数据库选型指南:Milvus vs Chroma vs Weaviate
milvus·向量数据库·chroma·rag·weaviate
CTA量化套保4 小时前
一个账户跑多个期货策略:仓位与报单隔离思路
python·区块链
机汇五金_4 小时前
影响交换机箱体使用寿命的几个关键因素
运维·服务器·网络·python
子午4 小时前
基于DeepSeek的酒店客房管理系统~Python+DeepSeek智能问答+Vue3+Web网站系统
开发语言·前端·python
编程大师哥4 小时前
最高效的 IO 并发方案
linux·网络·python
Hello:CodeWorld4 小时前
Dify 从入门到实战:部署、模型对接与企业级 AI 应用开发全教程
人工智能·python·架构·ai编程
本地化文档5 小时前
black-docs-l10n
python·github·gitcode·sphinx
Dream_ksw5 小时前
Python 基础
开发语言·python