文章目录
- [LangChain 嵌入向量详解](#LangChain 嵌入向量详解)
-
- [1. 什么是嵌入向量?](#1. 什么是嵌入向量?)
-
- [1.1 从文本到数字](#1.1 从文本到数字)
- [1.2 嵌入向量的特点](#1.2 嵌入向量的特点)
- [1.3 向量相似度示意](#1.3 向量相似度示意)
- [2. 为什么需要嵌入向量?](#2. 为什么需要嵌入向量?)
-
- [2.1 主要应用场景](#2.1 主要应用场景)
- [2.2 RAG 中的嵌入向量](#2.2 RAG 中的嵌入向量)
- [3. 代码解析](#3. 代码解析)
-
- [3.1 初始化嵌入模型](#3.1 初始化嵌入模型)
- [3.2 嵌入文档(多个文本)](#3.2 嵌入文档(多个文本))
- [3.3 降低向量维度](#3.3 降低向量维度)
- [4. 参数详解](#4. 参数详解)
-
- [4.1 OpenAIEmbeddings 参数](#4.1 OpenAIEmbeddings 参数)
- [4.2 常用嵌入模型对比](#4.2 常用嵌入模型对比)
- [5. 嵌入单个查询](#5. 嵌入单个查询)
-
- [5.1 embed_query 方法](#5.1 embed_query 方法)
- [5.2 embed_documents vs embed_query](#5.2 embed_documents vs embed_query)
- [6. 完整示例](#6. 完整示例)
- [7. 常见问题](#7. 常见问题)
-
- [Q1: 向量维度越大越好吗?](#Q1: 向量维度越大越好吗?)
- [Q2: 如何选择嵌入模型?](#Q2: 如何选择嵌入模型?)
- [Q3: 嵌入向量可以手动比较吗?](#Q3: 嵌入向量可以手动比较吗?)
- [Q4: 不同模型的向量能比较吗?](#Q4: 不同模型的向量能比较吗?)
LangChain 嵌入向量详解
本文介绍什么是嵌入向量(Embeddings),以及如何在 LangChain 中使用文本嵌入。
1. 什么是嵌入向量?
1.1 从文本到数字
计算机无法直接理解文本,但可以理解数字。嵌入向量是将文本转换为数字数组的技术:
复制代码
文本: "Hello world!"
↓
向量: [0.123, -0.456, 0.789, ..., 0.021] # 1536 维
1.2 嵌入向量的特点
| 特点 |
说明 |
| 语义相似性 |
语义相似的文本,向量距离更近 |
| 可计算性 |
可以用余弦相似度、欧氏距离等计算 |
| 维度固定 |
同一模型生成的向量维度相同 |
| 可Embedding模型 |
text-embedding-3-large 生成 3072 维向量 |
1.3 向量相似度示意
复制代码
"你好" → [0.1, 0.2, ...] ──┐
"Hello" → [0.9, 0.1, ...] ──┼── 距离远,语义不相关
│
"Hi" → [0.85, 0.15, ...] ─┘
2. 为什么需要嵌入向量?
2.1 主要应用场景
| 场景 |
说明 |
| 语义搜索 |
通过向量相似度搜索相关内容 |
| 文档检索 |
RAG(检索增强生成)的核心组件 |
| 文本分类 |
将文本分类到不同类别 |
| 聚类分析 |
按语义对文档进行聚类 |
| 去重检测 |
发现相似/重复内容 |
2.2 RAG 中的嵌入向量
复制代码
用户问题 → 嵌入向量 → 与文档向量匹配 → 检索最相关内容 → 输入 LLM 生成答案
3. 代码解析
3.1 初始化嵌入模型
python
复制代码
from langchain_openai import OpenAIEmbeddings
embeddings_model = OpenAIEmbeddings(
model="text-embedding-3-large", # 嵌入模型
openai_api_key="sk-xxxx", # API 密钥
openai_api_base="https://api.xxx.com/v1" # API 地址
)
3.2 嵌入文档(多个文本)
python
复制代码
# 同时嵌入多个文本
embeded_result = embeddings_model.embed_documents(["Hello world!", "Hey bro"])
# 返回结果是一个列表
len(embeded_result) # 2(两个文本)
len(embeded_result[0]) # 3072(text-embedding-3-large 的维度)
3.3 降低向量维度
python
复制代码
# 通过 dimensions 参数指定维度
embeddings_model = OpenAIEmbeddings(
model="text-embedding-3-large",
api_key="sk-xxxx",
base_url="https://api.xxx.com/v1",
dimensions=1024 # 指定为 1024 维(可节省存储空间)
)
embeded_result = embeddings_model.embed_documents(["Hello world!", "Hey bro"])
len(embeded_result[0]) # 1024
4. 参数详解
4.1 OpenAIEmbeddings 参数
| 参数 |
说明 |
默认值 |
model |
嵌入模型名称 |
text-embedding-3-small |
api_key / openai_api_key |
API 密钥 |
- |
base_url / openai_api_base |
API 地址 |
https://api.openai.com/v1 |
dimensions |
输出向量维度 |
模型原始维度 |
4.2 常用嵌入模型对比
| 模型 |
向量维度 |
说明 |
| text-embedding-3-large |
3072 |
最新、最大、最强 |
| text-embedding-3-small |
1536 |
性价比高 |
| text-embedding-ada-002 |
1536 |
早期模型 |
5. 嵌入单个查询
5.1 embed_query 方法
python
复制代码
# 嵌入单个查询文本(用于搜索/匹配)
query_vector = embeddings_model.embed_query("Hello world!")
len(query_vector) # 3072
5.2 embed_documents vs embed_query
| 方法 |
用途 |
输入 |
输出 |
embed_documents |
嵌入文档库 |
文本列表 |
向量列表 |
embed_query |
嵌入用户查询 |
单个文本 |
单个向量 |
6. 完整示例
python
复制代码
from langchain_openai import OpenAIEmbeddings
# 1. 初始化模型
embeddings_model = OpenAIEmbeddings(
model="text-embedding-3-large",
api_key="sk-xxxx",
base_url="https://api.xxx.com/v1",
dimensions=1024
)
# 2. 嵌入文档
docs = ["苹果是水果", "香蕉是水果", "汽车是交通工具"]
doc_vectors = embeddings_model.embed_documents(docs)
# 3. 嵌入用户查询
query = "什么水果是黄色的?"
query_vector = embeddings_model.embed_query(query)
# 4. 计算相似度(通常在向量数据库中自动完成)
# 这里可用余弦相似度进行比较
7. 常见问题
Q1: 向量维度越大越好吗?
不是。维度越大,精度越高,但存储和计算成本也增加。根据实际需求选择:
| 需求 |
推荐维度 |
| 存储优先 |
256-512 |
| 平衡 |
768-1024 |
| 精度优先 |
1536-3072 |
Q2: 如何选择嵌入模型?
- 优先使用最新的
text-embedding-3-large
- 如果成本敏感,可用
text-embedding-3-small
Q3: 嵌入向量可以手动比较吗?
可以,使用余弦相似度:
python
复制代码
import numpy as np
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
sim = cosine_similarity(doc_vectors[0], doc_vectors[1])
Q4: 不同模型的向量能比较吗?
不能。必须使用同一个模型生成的向量才能进行相似度比较。