embeddings

阅读约 12 分钟

Embeddings

从文本和图像生成向量嵌入

原文链接:https://openrouter.ai/docs/api/reference/embeddings

Embeddings 是捕获语义含义的文本数值表示。它们将文本转换为向量(数字数组),可用于各种机器学习任务。OpenRouter 提供统一 API 来访问多个 providers 的 embedding 模型。

什么是 Embeddings?

Embeddings 将文本转换为高维向量,其中语义相似的文本在向量空间中靠得更近。例如,"cat" 和 "kitten" 将具有相似的 embeddings,而 "cat" 和 "airplane" 将相距甚远。

这些向量表示使机器能够理解文本片段之间的关系,使它们对许多 AI 应用程序至关重要。

常见用例

Embeddings 用于各种应用程序:

RAG (Retrieval-Augmented Generation):构建 RAG 系统,在生成答案之前从知识库中检索相关上下文。Embeddings 帮助找到最相关的文档以包含在 LLM 的上下文中。

语义搜索:将文档和查询转换为 embeddings,然后通过比较向量相似性找到最相关的文档。这比传统关键字匹配提供更准确的结果,因为它理解含义而不仅仅是匹配单词。

推荐系统:为项目(产品、文章、电影)和用户偏好生成 embeddings 以推荐相似项目。通过比较 embedding 向量,你可以找到语义相关但没有明显共同关键字的项目。

聚类和分类:通过分析 embedding 模式将相似文档分组或将文本分类到类别中。具有相似 embeddings 的文档可能属于相同主题或类别。

重复检测:通过比较 embedding 相似性来识别重复或近乎重复的内容。即使文本被改述或改写,这也能工作。

异常检测:通过识别远离数据集中典型模式的 embeddings 来检测异常或异常内容。

如何使用 Embeddings

基本请求

要生成 embeddings,请向 /embeddings 发送 POST 请求,包含你的文本输入和选择的模型:

import { OpenRouter } from '@openrouter/sdk';

const openRouter = new OpenRouter({
  apiKey: '{{API_KEY_REF}}',
});

const response = await openRouter.embeddings.generate({
  model: '{{MODEL}}',
  input: 'The quick brown fox jumps over the lazy dog',
});

console.log(response.data[0].embedding);

批处理

你可以通过传递字符串数组在单个请求中为多个文本生成 embeddings:

import { OpenRouter } from '@openrouter/sdk';

const openRouter = new OpenRouter({
  apiKey: '{{API_KEY_REF}}',
});

const response = await openRouter.embeddings.generate({
  model: '{{MODEL}}',
  input: [
    'Machine learning is a subset of artificial intelligence',
    'Deep learning uses neural networks with multiple layers',
    'Natural language processing enables computers to understand text'
  ],
});

// Process each embedding
response.data.forEach((item, index) => {
  console.log(`Embedding ${index}: ${item.embedding.length} dimensions`);
});

图像输入

某些 embedding 模型支持图像输入,支持捕获视觉内容以及文本的多模态 embeddings。这对于图像搜索、视觉相似性和跨模态检索任务很有用。

要发送图像,请在 multimodal 格式中包装你的输入,包含 content 数组和 image_url 对象。你还可以在单个输入块中组合文本和图像。

import requests

response = requests.post(
  "https://openrouter.ai/api/v1/embeddings",
  headers={
    "Authorization": f"Bearer {{API_KEY_REF}}",
    "Content-Type": "application/json"
  },
  json={
    "model": "{{MODEL}}",
    "input": [
      {
        "content": [
          {"type": "image_url", "image_url": {"url": "https://example.com/image.jpg"}}
        ]
      }
    ],
    "encoding_format": "float",
  }
)

data = response.json()
embedding = data["data"][0]["embedding"]
print(f"Embedding dimension: {len(embedding)}")

你还可以组合文本和图像在单个输入中生成联合 embedding。

可用模型

OpenRouter 提供对来自不同 providers 的各种 embedding 模型的访问。你可以在以下位置查看所有可用的 embedding 模型:

https://openrouter.ai/models?fmt=cards&output_modalities=embeddings

实用示例:语义搜索

以下是使用 embeddings 构建语义搜索系统的完整示例:

import { OpenRouter } from '@openrouter/sdk';

const openRouter = new OpenRouter({
  apiKey: '{{API_KEY_REF}}',
});

const documents = [
  "The cat sat on the mat",
  "Dogs are loyal companions",
  "Python is a programming language",
  "Machine learning models require training data",
  "The weather is sunny today"
];

function cosineSimilarity(a: number[], b: number[]): number {
  const dotProduct = a.reduce((sum, val, i) => sum + val * b[i], 0);
  const magnitudeA = Math.sqrt(a.reduce((sum, val) => sum + val * val, 0));
  const magnitudeB = Math.sqrt(b.reduce((sum, val) => sum + val * val, 0));
  return dotProduct / (magnitudeA * magnitudeB);
}

async function semanticSearch(query: string, documents: string[]) {
  const response = await openRouter.embeddings.generate({
    model: '{{MODEL}}',
    input: [query, ...documents],
  });

  const queryEmbedding = response.data[0].embedding;
  const docEmbeddings = response.data.slice(1);

  const results = documents.map((doc, i) => ({
    document: doc,
    similarity: cosineSimilarity(
      queryEmbedding as number[],
      docEmbeddings[i].embedding as number[]
    ),
  }));

  results.sort((a, b) => b.similarity - a.similarity);
  return results;
}

const results = await semanticSearch("pets and animals", documents);
console.log("Search results:");
results.forEach((result, i) => {
  console.log(`${i + 1}. ${result.document} (similarity: ${result.similarity.toFixed(4)})`);
});

最佳实践

选择正确的模型:不同的 embedding 模型有不同的优势。较小的模型(如 qwen/qwen3-embedding-0.6b 或 openai/text-embedding-3-small)更快、更便宜,而较大的模型(如 openai/text-embedding-3-large)提供更好的质量。测试多个模型以找到最适合你用例的模型。

批处理你的请求:处理多个文本时,在单个请求中发送它们,而不是进行单独的 API 调用。这减少了延迟和成本。

缓存 Embeddings:相同文本的 embeddings 是确定性的(它们不会改变)。将 embeddings 存储在数据库或向量存储中以避免重复生成。

规范化比较:比较 embeddings 时,使用余弦相似性而不是欧几里得距离。余弦相似性是尺度不变的,对高维向量效果更好。

考虑上下文长度:每个模型都有最大输入长度(上下文窗口)。较长的文本可能需要分块或截断。在处理长文档之前检查模型的规格。

使用适当的分块:对于长文档,将它们分成有意义的块(段落、章节)而不是任意字符限制。这保留了语义连贯性。

Provider 路由

你可以使用 provider 参数控制哪些 providers 服务你的 embedding 请求。这对于:

  • 确保特定 providers 的数据隐私
  • 针对成本或延迟进行优化
  • 使用 provider 特定功能

错误处理

你可能遇到的常见错误:

400 Bad Request:输入格式无效或缺少必需参数。检查你的 inputmodel 参数格式是否正确。

401 Unauthorized:API key 无效或缺失。验证你的 API key 正确并包含在 Authorization header 中。

402 Payment Required:积分不足。在你的 OpenRouter 账户中添加积分。

404 Not Found:指定的模型不存在或不可用于 embeddings。检查模型名称并验证它是一个 embedding 模型。

429 Too Many Requests:超过速率限制。实施指数退避和重试逻辑。

529 Provider Overloaded:provider 暂时过载。启用 allow_fallbacks: true 以自动使用备份 providers。

限制

  • 无流式传输:与 chat completions 不同,embeddings 作为完整响应返回。不支持流式传输。
  • Token 限制:每个模型都有最大输入长度。超过此限制的文本将被截断或拒绝。
  • 确定性输出:相同输入文本的 embeddings 将始终相同(无 temperature 或随机性)。
  • 语言支持:某些模型针对特定语言进行了优化。检查模型文档以了解语言能力。
© 2026 OpenRouter.help
查看官方英文原件