一、向量嵌入(Embedding)核心基础

1. 什么是向量 / 向量定义

在 RAG 中,向量(Embedding Vector) 是把文本、图片、语音等非结构化数据,转换成固定长度、低维度、计算机可计算的数值数组

简单理解:

  • 文本:"人工智能" → 向量:[0.12, -0.34, 0.56, ..., 0.78]
  • 长度:通常 768/1024/1536 维(由模型决定)
  • 特征:语义相近的文本,向量空间距离更近

2. 向量化的意义(为什么要做 Embedding)

Naive RAG 的核心是检索 + 生成,而检索必须依赖向量,向量化的核心价值:

  1. 把人类语言 → 计算机可理解的数字
  2. 保留语义信息(不是简单文字匹配,而是理解含义)
  3. 支持高效相似度计算(快速找到最相关的内容)
  4. 支撑海量数据检索(毫秒级匹配百万 / 千万级文档)

一句话总结:没有向量嵌入,就没有 RAG 检索


二、向量相似度算法(检索核心)

相似度算法用于计算两个向量的接近程度,决定 RAG 检索精度。

1. 余弦相似度 / 余弦距离(最常用!RAG 首选)

定义

计算两个向量的夹角,忽略向量长度,只关注方向(语义)

公式

cosine(A,B)=∣∣A∣∣×∣∣B∣∣A⋅B​

特点

  • 范围:[-1, 1],值越接近 1 越相似
  • 优点:不受文本长度影响,专门适合文本语义匹配
  • 适用:RAG 检索、语义搜索、问答匹配

2. 欧式距离 / L2 距离

定义

计算向量空间中两点的直线距离

公式

L2(A,B)=∑i=1n​(Ai​−Bi​)2​

特点

  • 值越小越相似
  • 缺点:受向量长度 / 模长影响大
  • 适用:推荐系统、图像特征匹配,不推荐用于文本 RAG

3. 算法对比总结(必背)

表格

算法 适用场景 RAG 推荐度 核心特点
余弦相似度 文本语义检索 ⭐⭐⭐⭐⭐ 忽略长度,专注语义
欧式距离 L2 图像、数值数据 受长度影响,文本效果差

三、向量化实践(代码可直接运行)

环境准备

pip install numpy sentence-transformers scikit-learn

完整实践代码:文本向量化 + 相似度计算

from sentence_transformers import SentenceTransformer
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

# ===================== 1. 加载向量化模型 =====================
model = SentenceTransformer('all-MiniLM-L6-v2')  # 轻量通用模型

# ===================== 2. 定义文本 =====================
texts = [
    "人工智能是计算机科学的分支",
    "AI 研究如何让机器模拟人类智能",
    "今天天气很好适合出门散步"
]

# ===================== 3. 文本向量化(核心步骤) =====================
embeddings = model.encode(texts)

# 查看向量信息
print("向量维度:", embeddings.shape)  # (3, 384) → 3个文本,每个384维
print("第一个文本向量:\n", embeddings[0][:10])  # 打印前10位

# ===================== 4. 计算余弦相似度 =====================
sim_matrix = cosine_similarity([embeddings[0]], embeddings[1:])
print("\n相似度结果:")
print(f"文本1 vs 文本2:{sim_matrix[0][0]:.4f}")  # 语义相近 → 高分
print(f"文本1 vs 文本3:{sim_matrix[0][1]:.4f}")  # 无关 → 低分

输出结果示例

向量维度: (3, 384)
第一个文本向量:
 [-0.0123  0.0456 -0.0789 ...]

相似度结果:
文本1 vs 文本2:0.8215
文本1 vs 文本3:0.0543

四、向量模型 API 调用(云端调用,无需本地部署)

适合:快速开发、不想配置环境、追求稳定

1. 调用 OpenAI Embedding API

from openai import OpenAI

client = OpenAI(api_key="你的API_KEY")

def get_embedding(text):
    response = client.embeddings.create(
        input=text,
        model="text-embedding-3-small"  # 轻量便宜
    )
    return response.data[0].embedding

# 使用
vec = get_embedding("RAG 是检索增强生成")
print("向量长度:", len(vec))

2. 调用 阿里云 / 百度千帆 / 腾讯云 向量 API

国内厂商完全兼容,格式几乎一致,只需要更换 base_urlapi_key


五、向量化模型本地部署(离线可用)

适用场景

  • 隐私数据(不能上传云端)
  • 无网环境
  • 低成本、高并发

本地部署步骤

  1. 下载开源模型(HuggingFace)常用中文模型:

    • shibing624/text2vec-base-chinese
    • BAAI/bge-small-zh-v1.5(精度高,推荐)
  2. 本地加载代码

from sentence_transformers import SentenceTransformer

# 本地加载(自动下载/读取本地模型)
model = SentenceTransformer(
    "BAAI/bge-small-zh-v1.5",
    device="cpu"  # 有显卡可填 cuda
)

# 向量化
text = "这是本地向量化"
vec = model.encode(text)
print(vec)
  1. 模型保存到本地
model.save("./local-embedding-model")
  1. 从本地加载
model = SentenceTransformer("./local-embedding-model")

六、Naive RAG 中向量嵌入的完整流程

  1. 文档切分:把长文本切成小块
  2. 向量化:用 Embedding 模型把文本块转成向量
  3. 入库:向量存入向量数据库(Chroma/Pinecone/ES)
  4. 用户查询向量化:把问题也转成向量
  5. 相似度检索:计算查询向量与库中向量的距离
  6. 召回相关文本:送入 LLM 生成答案

总结

  1. 向量 = 文本的语义数字表示,是 RAG 的基础
  2. 向量化 = 让计算机理解文本含义
  3. 相似度算法:余弦相似度是 RAG 标配
  4. 实践:可本地运行、可 API 调用、可本地部署
  5. Naive RAG 核心链路:文本→向量→检索→生成

 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐