欢迎光临
我们一直在努力

RAG 学习笔记(四):向量模型 Embeddings

文本切分好之后,要把每块文字转成向量才能存进向量数据库。这篇讲 Embedding 是什么、怎么用。


一、什么是 Embedding?

Embedding 就是把文字转换成一串数字(向量)。

比如:

  • “猫” → [0.12, -0.34, 0.56, …, 0.78](1536个数字)
  • “狗” → [0.11, -0.33, 0.55, …, 0.77]
  • “汽车” → [-0.5, 0.8, -0.2, …, 0.1]

关键特性:语义越相近的文字,向量距离也越近。

"猫"和"狗"都是动物,向量很接近;"汽车"是交通工具,向量离得远。这样我们就能用向量来衡量文字的相似度了。


二、为什么需要向量?

计算机不认识文字,只认识数字。你要算两段文字像不像,没法直接比。但转成向量之后,算两个向量的距离就很简单了——余弦相似度、欧氏距离,都是数学公式,一秒算完。

整个 RAG 流程里:

  • 存文档的时候:每块文本 → Embedding → 向量 → 存进数据库
  • 检索的时候:用户问题 → Embedding → 向量 → 在数据库里找最近邻

两边用同一个 Embedding 模型,向量空间才一致,检索才有意义。


三、OpenAI Embedding

最常用的就是 OpenAI 的 Embedding 模型:

from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(
model="text-embedding-ada-002",
openai_api_key="你的API Key",
)

# 把一段文字转成向量
vector = embeddings.embed_query("你好世界")

print(len(vector)) # 1536维
print(vector[:5]) # 前5个数字

特点:效果好、调用方便、按 token 收费。


四、本地开源 Embedding 模型

不想花钱调 OpenAI?可以用开源模型本地跑,比如 BGE、M3E:

from langchain_huggingface import HuggingFaceEmbeddings

embeddings = HuggingFaceEmbeddings(
model_name="BAAI/bge-small-zh-v1.5", # 中文效果好
)

vector = embeddings.embed_query("你好世界")
print(len(vector)) # 512维

特点:免费、本地运行、数据不出内网。缺点是需要自己的显卡或CPU跑,效果比OpenAI稍差一点。

中文场景推荐 BGE 系列,开源模型里中文效果算很好的。


五、相似度怎么算?

两个向量算相似度,最常用的是余弦相似度:

  • 方向完全一样 → 相似度 1
  • 方向垂直 → 相似度 0
  • 方向相反 → 相似度 -1

import numpy as np

def cosine_similarity(vec1, vec2):
dot = np.dot(vec1, vec2)
norm1 = np.linalg.norm(vec1)
norm2 = np.linalg.norm(vec2)
return dot / (norm1 * norm2)

向量数据库内部已经帮你算好了,你不用自己写。但理解原理有助于你理解为什么检索结果是这样的。


六、选 Embedding 模型的建议

场景推荐模型
中文为主、追求效果 OpenAI text-embedding-3-small
中文为主、免费本地跑 BAAI/bge-small-zh-v1.5
英文为主 OpenAI text-embedding-ada-002
多语言 multilingual-e5-large

注意:存文档和检索问题必须用同一个模型,换了模型向量空间就不一样了,检索全乱。


本篇小结

  • Embedding 就是把文字转成向量,语义相近的文字向量距离也近
  • RAG 流程里:文档要向量化存库,问题也要向量化检索
  • 常用模型:OpenAI Embedding(效果好)、BGE(开源免费中文好)
  • 相似度常用余弦相似度衡量
  • 存文档和检索必须用同一个 Embedding 模型
赞(0)
未经允许不得转载:171主机测评 » RAG 学习笔记(四):向量模型 Embeddings
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址