前提: 构建菜谱知识库 (参照例子)
向量数据库:Qdrant (混合搜索: 稠密向量 + 稀疏向量 + 融合算法)
大模型llm: deepseek
embedding模型: 智谱embedding-3 (官方文档)

搭建向量数据库:
1、创建集合

# 创建集合
await client.create_collection(
    collection_name=collection_name,
    vectors_config={
        # Dense vectors for semantic understanding of research concepts
        # "dense": models.VectorParams(size=384, distance=models.Distance.COSINE),
        "dense": models.VectorParams(size=512, distance=models.Distance.COSINE),
        # ColBERT multivectors for fine-grained text understanding
        # "colbert": models.VectorParams(
        #     size=128,
        #     distance=models.Distance.COSINE,
        #     multivector_config=models.MultiVectorConfig(
        #         comparator=models.MultiVectorComparator.MAX_SIM
        #     ),
        # ),
    },
    sparse_vectors_config={
        # Sparse vectors for exact technical term matching
        "sparse": models.SparseVectorParams(
            modifier=models.Modifier.IDF,
            index=models.SparseIndexParams(
                # full_scan_threshold=0, # 在达到此数值(不包括此数值)之前,比较期间 不会 使用倒排索引(但 仍会构建 索引)。
                on_disk=False, # 将倒排索引存储在磁盘上 (True) 还是内存中 (False,默认值)。
            )
        )
    },
)

2、上传数据

foods = [{...}...]
texts = [it["cooking_instructions"] for it in foods]

points = []
for i, text in enumerate(texts):

    denceResults = await get_embedding_zhipu(text, 512)

    points.append(
        models.PointStruct(
            id=i,
            vector={
                # "dense": models.Document(
                #     text=text,
                #     model="sentence-transformers/all-MiniLM-L6-v2",
                # ),
                "dense": denceResults[0],
                "sparse": models.Document(
                    text=text,
                    model="Qdrant/bm25",
                ),
            },
            payload=foods[i],
        )
    )

client.upload_points(
    collection_name=collection_name,
    points=points,
)

3、查询

async def rrf_search(query: str) -> list[models.ScoredPoint]:
    denceQuerys = await get_embedding_zhipu(query, 512)

    response = await client.query_points(
        collection_name=collection_name,
        prefetch=[
            models.Prefetch(
                query=denceQuerys[0],
                using="dense",
                limit=5,
            ),
            models.Prefetch(
                query=models.Document(
                    text=query,
                    model="Qdrant/bm25",
                ),
                using="sparse",
                limit=5,
            ),
        ],
        query=models.FusionQuery(fusion=models.Fusion.RRF),
        limit=5,
    )
    return response.points

搜索流程:
step1、用户输入: 有没有蔬菜类的汤羹,不包含肉类的,给我推荐一下
step2、根据用户输入去向量知识库进行查询,返回相近结果
step3、根据相近结果,用大模型llm再进行一次判断识别,获取较为合适的结果。

例子:
有没有蔬菜类的汤羹,不包含肉类的,给我推荐一下
请根据以下选项挑选出符合要求的选项,并根据对应选项内容进行回答,回答要自然得体,不要显示“符合要求”等相关字眼,不要有其他不符合要求的选项的说明。

  • 番茄豆腐汤 1.番茄切块,豆腐切小方块;2.热油炒番茄至出汁;3.加清水烧开,下豆腐煮5分钟;4.淋蛋液搅出蛋花;5.加盐调味,撒葱花淋香油即可。风味酸甜鲜香、豆腐嫩滑、汤汁清爽;低脂素食,适合减脂人群;适宜夏季开胃;适合老人、儿童及清淡饮食者。 0.5
  • 上汤娃娃菜 1.娃娃菜洗净纵向切条;2.热油爆香蒜末,加清水烧开;3.下皮蛋丁、咸鸭蛋丁煮出鲜味;4.下娃娃菜煮3分钟至软;5.加盐调味,撒枸杞出锅。风味汤鲜味美、娃娃菜软嫩、咸鲜适口;含蛋类,过敏者忌食;适宜四季,秋冬尤佳;适合老人、儿童及清淡饮食人群。 0.33333334
  • 冬瓜排骨汤 1.排骨冷水下锅加料酒焯水去浮沫;2.排骨加姜片、葱段和清水,大火烧开转小火炖40分钟;3.冬瓜去皮切块下锅再炖15分钟;4.加盐调味,撒枸杞即可。风味汤清味鲜、冬瓜软糯、排骨酥烂;清淡少油,适合老人儿童;适宜夏秋季节清热利水;适合体虚调养及家庭日常人群。 0.25
  • 鲫鱼豆腐汤 1.鲫鱼处理干净,两面划刀;2.热油下鲫鱼煎至两面金黄;3.加姜片、料酒和开水大火煮至汤白;4.下豆腐块煮10分钟;5.加盐、白胡椒粉调味,撒葱花香菜即可。风味汤白鲜浓、鱼肉嫩滑、豆腐软嫩;菜品分类:汤羹;含鱼类,过敏者忌食;适宜秋冬季节滋补;适合孕产妇、老人及病后调养人群。 0.2
  • 山药排骨汤 1.排骨冷水下锅加料酒焯水;2.排骨加姜片和清水大火烧开转小火炖40分钟;3.山药去皮切段,玉米切块下锅再炖20分钟;4.加盐调味,撒枸杞即可。风味汤清味鲜、山药软糯、排骨酥烂;温和滋补,适合大众;适宜秋冬春季;适合老人、儿童及脾胃虚弱者。 0.16666667

影响搜索召回率:
1、生成向量的维度尽量大于512, 实测384与512的搜索结果差别大,明显维度越大精度越高
2、文本描述内容组织最好包含一些关键字,精度越好

标签: none

添加新评论

icon_mrgreen.gificon_neutral.gificon_twisted.gificon_arrow.gificon_eek.gificon_smile.gificon_confused.gificon_cool.gificon_evil.gificon_biggrin.gificon_idea.gificon_redface.gificon_razz.gificon_rolleyes.gificon_wink.gificon_cry.gificon_surprised.gificon_lol.gificon_mad.gificon_sad.gificon_exclaim.gificon_question.gif