TodayAI

GuidesRAG

用 Vercel AI SDK 生成 Embeddings

按 AI SDK Core Embeddings:用 embed / embedMany 生成向量,再用 cosineSimilarity 比较相似度。

基于 Vercel AI SDK 整理 · 官方资料 ↗

Embeddings 把文本映射到向量空间,相近含义更靠近。AI SDK 提供 embed(单条)与 embedMany(批量),并可用 cosineSimilarity 算相似度。

这是自建 RAG 索引的常见前置步骤。

嵌入单条文本

官方 embed

typescript
import { embed } from 'ai';

const { embedding } = await embed({
  model: 'openai/text-embedding-3-small',
  value: 'sunny day at the beach',
});

embedding 是 number[]。也可从结果里读 usage.tokens 观察计费相关用量。

批量嵌入多条文本

准备 RAG 语料时通常一次嵌很多 chunk。embedMany 返回的 embeddings 顺序与输入 values 一致。

官方 embedMany

typescript
import { embedMany } from 'ai';

const { embeddings } = await embedMany({
  model: 'openai/text-embedding-3-small',
  values: [
    'sunny day at the beach',
    'rainy afternoon in the city',
    'snowy night in the mountains',
  ],
});

计算相似度

官方 cosineSimilarity

typescript
import { cosineSimilarity, embedMany } from 'ai';

const { embeddings } = await embedMany({
  model: 'openai/text-embedding-3-small',
  values: ['sunny day at the beach', 'rainy afternoon in the city'],
});

console.log(
  `cosine similarity: ${cosineSimilarity(embeddings[0], embeddings[1])}`,
);

Provider 选项与重试

可用 providerOptions 传厂商特定参数(如 OpenAI dimensions)。embedMany 支持 maxParallelCalls;两者都支持 maxRetries、abortSignal 与自定义 headers。

降低维度示例

typescript
import { embed } from 'ai';

const { embedding } = await embed({
  model: 'openai/text-embedding-3-small',
  value: 'sunny day at the beach',
  providerOptions: {
    openai: {
      dimensions: 512,
    },
  },
});

容易踩的坑

相似度结果反直觉

确认比较的是同一模型、同一维度设置下的向量;不要混用不同 embedding 模型。

批量顺序错乱

官方保证 embeddings 与 values 同序;检查你后处理时是否重排。

请求超时

使用 abortSignal / 调高超时,或降低 maxParallelCalls 避免打满限流。

官方资料

Vercel AI SDK

Embeddings