04 Embedding 入门
Embedding 入门
一、Embedding 是什么?
把一段文字转成一个数字向量(一长串浮点数),例如:
"今天天气很好" → [0.12, -0.34, 0.56, ..., 0.08] # 通常几百~几千维 "外面阳光明媚" → [0.11, -0.31, 0.58, ..., 0.09] # 意思相近,向量也接近 "Python 怎么读文件" → [-0.45, 0.22, -0.11, ..., 0.33] # 完全不同的话题要点
| 概念 | 说明 |
|---|---|
| 向量 | 一串有序数字,可理解为文字在「语义空间」里的坐标 |
| 维度 | 向量长度,如 768、1024、1536,由模型决定 |
| 语义相近 | 意思越像,向量越接近 |
| 与 Chat 的区别 | Chat 输出文字;Embedding 输出数字,不做对话 |
二、为什么 Agent 需要 Embedding ?
Embedding 是「在海量文本里,按语义找最相关片段」;Agent 需要它,Agent 要在大量外部资料里找上下文,离不开它。
RAG(检索增强生成) 的大致流程
和 RAG 的关系
Embedding → 文本变向量,能算语义相似度 ↓ 向量检索 → 从大量文档中找出 Top-K 最相关片段 ↓ RAG → 检索到的片段 + 用户问题 → 交给 LLM 生成答案 ↓ Agent → 把 RAG 当作一种能力,嵌入 ReAct 工具循环里所以:Agent 要做知识检索 → 检索靠语义相似度 → 相似度靠 Embedding
三、怎么衡量语义相似度?—— 余弦相似度
两个向量越接近,余弦相似度越高:
| 相似度 | 含义 |
|---|---|
| 接近 1.0 | 非常相似 |
| 接近 0 | 几乎无关 |
| 负数 | 语义相反(较少见) |
公式(本课用纯 Python 实现,不装 numpy):
cosine_similarity(A, B) = (A·B) / (|A| × |B|) dot = sum(a * b for a, b in zip(vec_a, vec_b)) # 点积 norm_a = math.sqrt(sum(a * a for a in vec_a)) # vec_a 每个元素平方再求和,再开根号 → 向量长度 norm_b = math.sqrt(sum(b * b for b in vec_b)) # vec_b 的长度zip 把两个列表按位置配对
vec_a = [1, 2, 3] vec_b = [4, 5, 6] list(zip(vec_a, vec_b)) # [(1, 4), (2, 5), (3, 6)]即:点积 ÷ 两个向量长度的乘积。
四、Embedding API 怎么调?
和 Chat API 同属 OpenAI SDK,但走的是 embeddings 接口:
client=OpenAI(api_key=embedding_api_key,base_url=embedding_base_url)response=client.embeddings.create(model="你的-embedding-模型名",input="今天天气很好",# 也可以传 list,一次嵌入多句)vector=response.data[0].embedding# list[float],这就是向量print(len(vector))# 打印维度,如 1024响应结构:
response ├── data[0] │ ├── embedding ← 你要的向量 [0.12, -0.34, ...] │ └── index ← 在 input 列表中的位置 ├── model ← 实际使用的模型 └── usage └── total_tokens五、重要:Embedding 和 Chat 往往是两套服务
# Chat 配置 LLM_API_KEY=你的密钥 LLM_BASE_URL=https://api.deepseek.com LLM_MODEL=deepseek-chat # Embedding 配置 EMBEDDING_API_KEY=你的embedding密钥 EMBEDDING_BASE_URL=https://api.siliconflow.cn/v1 EMBEDDING_MODEL=BAAI/bge-large-zh-v1.5