OpenAI Embedding API 教程
OpenAI Embedding API 将文本转换为高维向量,是实现语义搜索、推荐系统和 RAG 检索增强生成的基础。本文介绍 Embedding 的原理、API 调用方法和实战应用。
什么是 Embedding?
Embedding(嵌入向量)将文本映射为固定维度的浮点数数组。语义相似的文本在向量空间中距离更近,可以用于:
- 语义搜索:用自然语言查找相关文档
- 文本分类:基于向量相似度进行分类
- 推荐系统:找到相似内容推荐给用户
- RAG:检索增强生成,给 AI 提供知识库上下文
- 聚类分析:将大量文本自动分组
可用模型
- text-embedding-3-small:1536 维,性价比最高,$0.02/MTok
- text-embedding-3-large:3072 维,精度更高,$0.13/MTok
- text-embedding-ada-002:1536 维,旧版模型,$0.10/MTok
基本调用
Python
from openai import OpenAI
client = OpenAI(
api_key="your-api-key",
base_url="https://claude4u.com/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 = [
"机器学习是人工智能的一个分支",
"深度学习使用神经网络处理数据",
"今天的天气很好,适合出门散步"
]
response = client.embeddings.create(
model="text-embedding-3-small",
input=texts
)
for i, data in enumerate(response.data):
print(f"文本 {i}: 向量维度 {len(data.embedding)}")
Node.js
import OpenAI from 'openai';
const client = new OpenAI({
apiKey: 'your-api-key',
baseURL: 'https://claude4u.com/v1'
});
const response = await client.embeddings.create({
model: 'text-embedding-3-small',
input: ['第一段文本', '第二段文本']
});
console.log(`共 ${response.data.length} 个向量`);
console.log(`维度: ${response.data[0].embedding.length}`);
计算文本相似度
import numpy as np
from openai import OpenAI
client = OpenAI(
api_key="your-api-key",
base_url="https://claude4u.com/v1"
)
def get_embedding(text):
response = client.embeddings.create(
model="text-embedding-3-small",
input=text
)
return response.data[0].embedding
def cosine_similarity(a, b):
a, b = np.array(a), np.array(b)
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# 计算相似度
texts = {
"query": "如何学习编程",
"doc1": "Python 是入门编程的最佳语言",
"doc2": "今天的股市行情如何",
"doc3": "编程入门教程推荐"
}
query_emb = get_embedding(texts["query"])
for key in ["doc1", "doc2", "doc3"]:
doc_emb = get_embedding(texts[key])
sim = cosine_similarity(query_emb, doc_emb)
print(f"{key}: {texts[key]} => 相似度: {sim:.4f}")
构建 RAG 检索系统
class SimpleRAG:
def __init__(self, client):
self.client = client
self.documents = []
self.embeddings = []
def add_documents(self, docs):
"""添加文档到知识库"""
response = self.client.embeddings.create(
model="text-embedding-3-small",
input=docs
)
self.documents.extend(docs)
self.embeddings.extend([d.embedding for d in response.data])
def search(self, query, top_k=3):
"""搜索最相关的文档"""
query_emb = self.client.embeddings.create(
model="text-embedding-3-small",
input=query
).data[0].embedding
similarities = [
cosine_similarity(query_emb, doc_emb)
for doc_emb in self.embeddings
]
top_indices = np.argsort(similarities)[-top_k:][::-1]
return [(self.documents[i], similarities[i]) for i in top_indices]
def ask(self, question):
"""RAG 问答"""
results = self.search(question)
context = "\n".join([doc for doc, _ in results])
response = self.client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": f"根据以下知识库内容回答问题:\n\n{context}"},
{"role": "user", "content": question}
]
)
return response.choices[0].message.content
# 使用示例
rag = SimpleRAG(client)
rag.add_documents([
"轻舟 AI 支持 OpenAI、Claude、Gemini 等多个模型的 API 中转",
"API Key 以 cr_ 为前缀,在管理后台创建",
"支持流式输出和 Function Calling"
])
answer = rag.ask("如何获取 API Key?")
print(answer)
提示:通过 claude4u.com 轻舟 AI 中转服务调用 Embedding API,与 Chat API 使用同一个 Key,无需额外配置。对于大规模 Embedding 任务,中转服务的多账户机制可以有效提升吞吐量。
优化建议
- 批量处理:一次请求最多传入 2048 个文本,减少网络开销
- 缓存向量:将生成的向量存入数据库,避免重复计算
- 降低维度:text-embedding-3 支持自定义维度,降维可节省存储空间
- 文本预处理:去除无意义的空白和特殊字符,提升向量质量
注意:Embedding 模型有输入长度限制(约 8191 token)。对于长文档,建议先分段切割(如按 500 字一段),分别生成向量后进行检索。
轻舟 AI