一、前言

1.1 什么是稠密检索?

稠密检索(Dense Retrieval),RAG 应用中的核心技术(你之前学习的 LangChain+Chroma 场景),指将查询和文档都编码为 稠密向量(每个向量维度都有有效数值,无零值),通过向量相似度(如余弦相似度)匹配相关文档。

1.2 对比稀疏检索(如 TF-IDF)

稀疏检索仅关注关键词的出现频率(大部分维度为 0),而稠密检索能捕捉语义信息(如 “苹果手机” 和 “iPhone” 的向量相似度高)。

二、实战

2.1 Python+Sentence-BERT

安装 sentence-transformers 和 numpy

# 安装依赖
pip install sentence-transformers numpy

实现代码

# 安装依赖
# pip install sentence-transformers numpy

from sentence_transformers import SentenceTransformer, util
import numpy as np

# 使用 SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2') 时
# ,模型会自动下载到本地(首次运行时),后续运行会直接读取本地缓存,无需重复下载。
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')  # 多语言版,支持中文
# 或用更优的中文模型:model = SentenceTransformer('BAAI/bge-base-zh-v1.5')

# 2. 编码文本(生成稠密向量)
texts = ["苹果手机", "iPhone", "苹果电脑", "华为手机"]
embeddings = model.encode(texts, normalize_embeddings=True)  # 归一化向量

# 3. 计算相似度(余弦相似度)
# 计算“苹果手机”与其他文本的相似度
query_embedding = embeddings[0]
similarities = util.cos_sim(query_embedding, embeddings)[0]

# 4. 输出结果
for i, text in enumerate(texts):
    print(f"“苹果手机” vs “{text}” 的相似度:{similarities[i]:.4f}")

输出

“苹果手机” vs “苹果手机” 的相似度:1.0000
“苹果手机” vs “iPhone” 的相似度:0.8012
“苹果手机” vs “苹果电脑” 的相似度:0.7669
“苹果手机” vs “华为手机” 的相似度:0.7858

解释

使用 SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2') 时,模型会自动下载到本地(首次运行时),后续运行会直接读取本地缓存,无需重复下载。

2.2 基于魔搭平台离线版本

实现代码

# 安装依赖
# pip install sentence-transformers numpy

from sentence_transformers import SentenceTransformer, util
import numpy as np

# 1. 加载中文语义编码器(适配中文的SBERT)
# 使用魔搭平台 https://www.modelscope.cn/models 下载嵌入模型
# /Users/你的用户名/.cache/modelscope/hub/models/BAAI/bge-base-zh-v1.5
model = SentenceTransformer('/Users/你的用户名/.cache/modelscope/hub/models/BAAI/bge-base-zh-v1.5')  # 多语言版,支持中文

# 2. 编码文本(生成稠密向量)
texts = ["苹果手机", "iPhone", "苹果电脑", "华为手机"]
embeddings = model.encode(texts, normalize_embeddings=True)  # 归一化向量

# 3. 计算相似度(余弦相似度)
# 计算“苹果手机”与其他文本的相似度
query_embedding = embeddings[0]
similarities = util.cos_sim(query_embedding, embeddings)[0]

# 4. 输出结果
for i, text in enumerate(texts):
    print(f"“苹果手机” vs “{text}” 的相似度:{similarities[i]:.4f}")

魔搭环境安装

官网 https://www.modelscope.cn/models

安装  modelscope

pip install modelscope

下载嵌入模型 bge-base-zh-v1.5 (https://www.modelscope.cn/models/BAAI/bge-base-zh-v1.5

modelscope download --model BAAI/bge-base-zh-v1.5

模型会存储在 /Users/你的用户名/.cache/modelscope/hub 路径下

输出

“苹果手机” vs “苹果手机” 的相似度:1.0000
“苹果手机” vs “iPhone” 的相似度:0.8226
“苹果手机” vs “苹果电脑” 的相似度:0.7943
“苹果手机” vs “华为手机” 的相似度:0.5933

2.3 Python+Ollama

安装Ollama 请参考 https://blog.csdn.net/tadexinnian/article/details/155744932?spm=1001.2014.3001.5501

安装依赖

# 安装依赖
pip install ollama numpy scikit-learn

实现代码

import ollama
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np


# 1. 生成目标文本的嵌入向量
texts = ["苹果手机", "iPhone", "苹果电脑", "华为手机"]

# 批量生成多个文本的嵌入
responses = ollama.embed(
  model="embeddinggemma",
  input=texts
)
# 提取嵌入向量(Ollama 返回的 embeddings 是二维列表,需转为 numpy 数组)
embeddings = np.array(responses["embeddings"])

# 3. 计算“苹果手机”与其他文本的相似度
query_emb = embeddings[0].reshape(1, -1)
similarities = cosine_similarity(query_emb, embeddings)[0]

# 4. 输出结果
for i, text in enumerate(texts):
    print(f"“苹果手机” vs “{text}” 的相似度:{similarities[i]:.4f}")

输出

“苹果手机” vs “苹果手机” 的相似度:1.0000
“苹果手机” vs “iPhone” 的相似度:0.8738
“苹果手机” vs “苹果电脑” 的相似度:0.8357
“苹果手机” vs “华为手机” 的相似度:0.7623

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐