三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

04 Embedding 入门

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(检索增强生成) 的大致流程

你的文档

切成小段

每段转成向量
存入向量库

用户提问

问题也转成向量

找最相似的文档段

把文档段塞进 Prompt

模型基于真实资料回答

和 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
← 返回列表