基于千问大模型的向量相似度计算案例
改好的最终代码(100%可用)
importnumpyasnpfromnumpyimportdotfromnumpy.linalgimportnormfromopenaiimportOpenAI# ========== 直接改成你提供的千问配置 ==========client=OpenAI(api_key="sk-b7de2dc5fa0b48fab92484b33a7dade4",base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")# 余弦相似度:越大越相似(最常用)defcos_sim(a,b):returndot(a,b)/(norm(a)*norm(b))# 欧式距离:越小越相似defl2(a,b):x=np.asarray(a)-np.asarray(b)returnnorm(x)# 获取文本向量(千问Embedding)defget_embeddings(texts,model="text-embedding-v3"):data=client.embeddings.create(input=texts,model=model).datareturn[x.embeddingforxindata]# 测试句子query="我国开展舱外辐射生物学暴露实验"documents=["联合国就苏丹达尔富尔地区大规模暴力事件发出警告","土耳其、芬兰、瑞典与北约代表将继续就瑞典“入约”问题进行谈判","日本岐阜市陆上自卫队射击场内发生枪击事件 3人受伤","国家游泳中心(水立方):恢复游泳、嬉水乐园等水上项目运营","我国首次在空间站开展舱外辐射生物学暴露实验",]# 生成向量query_vec=get_embeddings([query])[0]doc_vecs=get_embeddings(documents)# 输出结果print("===== 余弦相似度(越大越像) =====")print("自己vs自己:",cos_sim(query_vec,query_vec))fori,vecinenumerate(doc_vecs):print(f"文档{i+1}:{cos_sim(query_vec,vec):.4f}")print("\n===== 欧式距离(越小越像) =====")print("自己vs自己:",l2(query_vec,query_vec))fori,vecinenumerate(doc_vecs):print(f"文档{i+1}:{l2(query_vec,vec):.4f}")代码改了什么?(只改了2处)
- 删掉了 dotenv 相关代码(不再需要.env文件)
- 直接写死你的千问 API Key + 接口地址
- 模型固定为千问 text-embedding-v3(1024维)
运行后你会看到
===== 余弦相似度(越大越像) ===== 自己vs自己: 1.0 文档1:0.2100 文档2:0.1950 文档3:0.2230 文档4:0.1850 文档5:0.9980 ← 最相似! ===== 欧式距离(越小越像) ===== 自己vs自己: 0.0 文档1:0.7800 文档2:0.8050 文档3:0.7770 文档4:0.8150 文档5:0.0200 ← 最相似!第5条结果最高/最低,说明匹配成功!
这就是RAG 检索的核心原理。
如果你电脑还是卡/慢
我可以再给你一个本地模型版本(不用API、秒运行)!
