从Java转行大模型应用,Naive RAG向量嵌入(Embedding)
·
一、向量嵌入(Embedding)核心基础
1. 什么是向量 / 向量定义
在 RAG 中,向量(Embedding Vector) 是把文本、图片、语音等非结构化数据,转换成固定长度、低维度、计算机可计算的数值数组。
简单理解:
- 文本:
"人工智能"→ 向量:[0.12, -0.34, 0.56, ..., 0.78] - 长度:通常 768/1024/1536 维(由模型决定)
- 特征:语义相近的文本,向量空间距离更近
2. 向量化的意义(为什么要做 Embedding)
Naive RAG 的核心是检索 + 生成,而检索必须依赖向量,向量化的核心价值:
- 把人类语言 → 计算机可理解的数字
- 保留语义信息(不是简单文字匹配,而是理解含义)
- 支持高效相似度计算(快速找到最相关的内容)
- 支撑海量数据检索(毫秒级匹配百万 / 千万级文档)
一句话总结:没有向量嵌入,就没有 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_url 和 api_key。
五、向量化模型本地部署(离线可用)
适用场景
- 隐私数据(不能上传云端)
- 无网环境
- 低成本、高并发
本地部署步骤
-
下载开源模型(HuggingFace)常用中文模型:
shibing624/text2vec-base-chineseBAAI/bge-small-zh-v1.5(精度高,推荐)
-
本地加载代码
from sentence_transformers import SentenceTransformer
# 本地加载(自动下载/读取本地模型)
model = SentenceTransformer(
"BAAI/bge-small-zh-v1.5",
device="cpu" # 有显卡可填 cuda
)
# 向量化
text = "这是本地向量化"
vec = model.encode(text)
print(vec)
- 模型保存到本地
model.save("./local-embedding-model")
- 从本地加载
model = SentenceTransformer("./local-embedding-model")
六、Naive RAG 中向量嵌入的完整流程
- 文档切分:把长文本切成小块
- 向量化:用 Embedding 模型把文本块转成向量
- 入库:向量存入向量数据库(Chroma/Pinecone/ES)
- 用户查询向量化:把问题也转成向量
- 相似度检索:计算查询向量与库中向量的距离
- 召回相关文本:送入 LLM 生成答案
总结
- 向量 = 文本的语义数字表示,是 RAG 的基础
- 向量化 = 让计算机理解文本含义
- 相似度算法:余弦相似度是 RAG 标配
- 实践:可本地运行、可 API 调用、可本地部署
- Naive RAG 核心链路:文本→向量→检索→生成
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)