RAG Food Project
一、创建项目环境
python3 -m venv venv_food
source venv_food/bin/activate
pip install faiss-cpu pymilvus sentence-transformers
如需 GPU 版 faiss,可用 faiss-gpu 替换 faiss-cpu,但一般 faiss-cpu 兼容性更好。
模型下载
from modelscope import snapshot_downloadmodel_dir = snapshot_download('Qwen/Qwen3-Embedding-0.6B')
安装Docker
Ubuntu安装Docker_sudo apt update && sudo apt install -y ca-certific-CSDN博客
二、在 Docker 中运行 Milvus (Linux)
安装 Milvus
curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.shbash standalone_embed.sh start
停止和删除 Milvus
bash standalone_embed.sh stopbash standalone_embed.sh delete
你可以按以下步骤升级最新版本的 Milvus
bash standalone_embed.sh upgrade
查看单个容器详细信息
docker port milvus-standalone
Milvus 服务端口 19530 已经在本机开放,可以直接用 http://localhost:19530 进行连接。
三、运行项目代码
from faiss import clone_index
from pymilvus import MilvusClient,DataType
from sentence_transformers import SentenceTransformer# -------------------------- 连接数据库 --------------------------
client = MilvusClient("http://localhost:19530")# --------------------------设计表结构--------------------------
schema = MilvusClient.create_schema(auto_id=False)schema.add_field(field_name="id",datatype=DataType.INT64,is_primary=True)
schema.add_field(field_name="text1",datatype=DataType.VARCHAR,max_length=8000)
schema.add_field(field_name="text2",datatype=DataType.VARCHAR,max_length=8000)
schema.add_field(field_name="vector",datatype=DataType.FLOAT_VECTOR,dim=1024)# -------------------------- 创建搜索参数 --------------------------
index_params = MilvusClient.prepare_index_params()
index_params.add_index(field_name="vector",metric_type="COSINE",index_type="IVF_FLAT",index_name="vector_index",params={ "nlist": 128 }
)# -------------------------- 创建表 --------------------------
if client.has_collection(collection_name="food_test"):client.drop_collection(collection_name="food_test")
client.create_collection(collection_name="food_test",schema=schema,index_params=index_params)# -------------------------- 知识(数据库)--------------------------
text1 = ["西班牙金枪鱼沙拉","红烧滩羊肉","香草布里欧修吐司"]
text2 = [ " ".join(["鸡蛋进水煮,七成熟捞出(依个人喜好),同时备其他菜", "生菜撕片,圣女果开半,黄瓜滚刀,红柿椒切丝,紫洋葱切丝,鸡蛋四均分", "金枪鱼去水", "撒黑胡椒,红酒醋和少许橄榄油", "拌匀,拍照,开动"])," ".join(["滩羊肉在姜水里焯3分钟,姜水里加点料酒去腥", "再将羊肉反过来焯水2分钟", "把羊肉切2/3手掌大小,羊肉煮熟后会缩水,所以可以稍微大一点的", "热油里放入花椒、桂皮、香叶、生姜爆炒30秒,放入切好的羊肉翻炒3分钟左右,把羊肉里面的油煸炒出来,再加入老抽上色,把所有羊肉都上色后加入乱泉水,以漠过羊肉上面为准", "锅里水烧开后,换成砂锅中火慢炖40分钟", "分次吃", "超级软糯", "加点萝卜进去炖起来,解油腻"]),"香草糖\n500克优质白砂糖+5根香草荚\n香草荚剖开,刮出香草籽,切成小段,和白砂糖混合在一起,摇匀,密封保存就做好啦。\n各种甜点都能用,自己做真的是物美价廉,使用也超方便,遍布香草籽,做出来的甜品高级感又提升不少。\n用的是宜家买的大号玻璃密封罐\n\n没有香草糖的同学可以用香草精代替哦"]# -------------------------- embedding 模型 --------------------------
model = SentenceTransformer("/root/.cache/modelscope/hub/models/Qwen/Qwen3-Embedding-0.6B",device="cuda:0")# -------------------------- 向量化 --------------------------
text1_emb = model.encode(text1)
print("")insert_data = []for i in range(len(text1_emb)):insert_data.append({"id":i,"text1":text1[i],"text2":text2[i],"vector":text1_emb[i]})r = client.insert(collection_name="food_test",data=insert_data)# 加载 collection
client.load_collection(collection_name="food_test")while True:input_text = input("请输入:")input_emb = model.encode([input_text])search_res = client.search(collection_name="food_test",data=input_emb,limit=1,output_fields=["text1","text2"])distance = search_res[0][0]["distance"]t1 = search_res[0][0]["entity"]["text1"]t2 = search_res[0][0]["entity"]["text2"]if distance < 0.6:print("不知道")else:print(f"查找到的最相似的菜名:{t1}")print(f"相似度为:{distance}")print(f"制作过程:{t2}")print("*"*40)
其中:
model = SentenceTransformer("moka-ai/m3e-base", device="cuda:0")
如无 GPU,可改为 device="cpu"。