嵌入模型

使用嵌入模型将文本转换为向量

嵌入模型

嵌入(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-small1536小型模型,性价比高
text-embedding-3-large3072大型模型,效果最好
text-embedding-ada-0021536上一代模型
# 使用 OpenAI 嵌入模型
response = client.embeddings.create(
    model="text-embedding-3-large",
    input="文本内容"
)

Cohere

模型维度说明
embed-english-v3.01024英文嵌入模型
embed-multilingual-v3.01024多语言嵌入模型
embed-english-light-v3.0384轻量英文模型
# 使用 Cohere 嵌入模型
response = client.embeddings.create(
    model="embed-multilingual-v3.0",
    input="文本内容"
)

Voyage AI

模型维度说明
voyage-large-21536大型模型
voyage-code-21536代码嵌入模型
voyage-21024通用模型
# 使用 Voyage AI 嵌入模型
response = client.embeddings.create(
    model="voyage-large-2",
    input="文本内容"
)

Jina AI

模型维度说明
jina-embeddings-v2-base-en768英文基础模型
jina-embeddings-v2-base-zh768中文基础模型
jina-embeddings-v2-base-code768代码嵌入模型
# 使用 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

最佳实践

  1. 批量处理 - 一次请求处理多个文本,提高效率
  2. 缓存向量 - 缓存已计算的向量,避免重复计算
  3. 选择合适维度 - 根据需求选择模型维度
  4. 归一化向量 - 计算相似度前归一化向量
  5. 分块处理 - 长文本分块处理,避免超过限制
# 分块处理长文本
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)

查看 模型总览 了解所有可用模型。

嵌入模型 | Agicto Docs