嵌入模型
使用嵌入模型将文本转换为向量
嵌入模型
嵌入(Embeddings)是将文本转换为数值向量的技术,用于语义搜索、文本分类、推荐系统等场景。
什么是嵌入
嵌入将文本转换为固定长度的向量(一组数字),语义相似的文本会有相似的向量表示。
应用场景:
- 语义搜索和相似度计算
- 文档检索和问答系统
- 文本分类和聚类
- 推荐系统
基本用法
from openai import OpenAI
client = OpenAI(
api_key="your-api-key",
base_url="https://api.agicto.cn/v1"
)
response = client.embeddings.create(
model="text-embedding-3-small",
input="人工智能正在改变世界"
)
# 获取向量
embedding = response.data[0].embedding
print(f"向量维度: {len(embedding)}")
print(f"前5个值: {embedding[:5]}")
批量处理
一次请求处理多个文本:
texts = [
"人工智能正在改变世界",
"机器学习是AI的核心技术",
"深度学习推动了AI的发展"
]
response = client.embeddings.create(
model="text-embedding-3-small",
input=texts
)
# 获取所有向量
embeddings = [data.embedding for data in response.data]
print(f"处理了 {len(embeddings)} 个文本")
计算相似度
使用余弦相似度计算文本相似度:
import numpy as np
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# 获取两个文本的嵌入
response1 = client.embeddings.create(
model="text-embedding-3-small",
input="人工智能"
)
response2 = client.embeddings.create(
model="text-embedding-3-small",
input="机器学习"
)
emb1 = response1.data[0].embedding
emb2 = response2.data[0].embedding
similarity = cosine_similarity(emb1, emb2)
print(f"相似度: {similarity}")
语义搜索示例
# 文档库
documents = [
"Python 是一种高级编程语言",
"机器学习是人工智能的分支",
"深度学习使用神经网络",
"自然语言处理处理文本数据"
]
# 获取所有文档的嵌入
doc_response = client.embeddings.create(
model="text-embedding-3-small",
input=documents
)
doc_embeddings = [data.embedding for data in doc_response.data]
# 查询
query = "什么是AI?"
query_response = client.embeddings.create(
model="text-embedding-3-small",
input=query
)
query_embedding = query_response.data[0].embedding
# 计算相似度并排序
similarities = [
cosine_similarity(query_embedding, doc_emb)
for doc_emb in doc_embeddings
]
# 获取最相关的文档
top_idx = np.argmax(similarities)
print(f"最相关文档: {documents[top_idx]}")
print(f"相似度: {similarities[top_idx]}")
支持的嵌入模型
OpenAI
| 模型 | 维度 | 说明 |
|---|---|---|
| text-embedding-3-small | 1536 | 小型模型,性价比高 |
| text-embedding-3-large | 3072 | 大型模型,效果最好 |
| text-embedding-ada-002 | 1536 | 上一代模型 |
# 使用 OpenAI 嵌入模型
response = client.embeddings.create(
model="text-embedding-3-large",
input="文本内容"
)
Cohere
| 模型 | 维度 | 说明 |
|---|---|---|
| embed-english-v3.0 | 1024 | 英文嵌入模型 |
| embed-multilingual-v3.0 | 1024 | 多语言嵌入模型 |
| embed-english-light-v3.0 | 384 | 轻量英文模型 |
# 使用 Cohere 嵌入模型
response = client.embeddings.create(
model="embed-multilingual-v3.0",
input="文本内容"
)
Voyage AI
| 模型 | 维度 | 说明 |
|---|---|---|
| voyage-large-2 | 1536 | 大型模型 |
| voyage-code-2 | 1536 | 代码嵌入模型 |
| voyage-2 | 1024 | 通用模型 |
# 使用 Voyage AI 嵌入模型
response = client.embeddings.create(
model="voyage-large-2",
input="文本内容"
)
Jina AI
| 模型 | 维度 | 说明 |
|---|---|---|
| jina-embeddings-v2-base-en | 768 | 英文基础模型 |
| jina-embeddings-v2-base-zh | 768 | 中文基础模型 |
| jina-embeddings-v2-base-code | 768 | 代码嵌入模型 |
# 使用 Jina AI 嵌入模型
response = client.embeddings.create(
model="jina-embeddings-v2-base-zh",
input="文本内容"
)
模型选择建议
英文任务
- 高质量:text-embedding-3-large, voyage-large-2
- 性价比:text-embedding-3-small, embed-english-v3.0
中文任务
- 推荐:text-embedding-3-large, jina-embeddings-v2-base-zh
- 多语言:embed-multilingual-v3.0
代码任务
- 推荐:voyage-code-2, jina-embeddings-v2-base-code
最佳实践
- 批量处理 - 一次请求处理多个文本,提高效率
- 缓存向量 - 缓存已计算的向量,避免重复计算
- 选择合适维度 - 根据需求选择模型维度
- 归一化向量 - 计算相似度前归一化向量
- 分块处理 - 长文本分块处理,避免超过限制
# 分块处理长文本
def chunk_text(text, chunk_size=500):
words = text.split()
return [' '.join(words[i:i+chunk_size])
for i in range(0, len(words), chunk_size)]
long_text = "很长的文本..."
chunks = chunk_text(long_text)
# 获取所有分块的嵌入
response = client.embeddings.create(
model="text-embedding-3-small",
input=chunks
)
# 平均所有分块的向量
embeddings = [data.embedding for data in response.data]
avg_embedding = np.mean(embeddings, axis=0)
查看 模型总览 了解所有可用模型。