rag菜谱知识库
前提: 构建菜谱知识库 (参照例子)
向量数据库: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、文本描述内容组织最好包含一些关键字,精度越好