本页目录
Vercel AI SDK 提供了一种非常简单的嵌入创建方式。
嵌入用于在高维空间中表示词语、图像或数据。
需要判断两个事物有多相似时,嵌入非常有用。
因此,嵌入成为搜索、分类等任务的强大基础能力。
创建嵌入
滚动式代码讲解
第一步是获取嵌入模型。这里使用 OpenAI 的模型。
我们要为 dog、cat、car 和 bike 几个词创建嵌入,因此先把它们放进数组。
接着使用 AI SDK 的 embedMany 这个 AI SDK 函数,并传入模型和值。
import { openai } from "@ai-sdk/openai";const model = openai.embedding("text-embedding-3-small",);
把结果记录出来,看看创建了什么。
可以看到,结果是一组包含大量数字的数组。这些数组就是向量,每个向量代表多维空间中的一个位置。
根据模型不同,数组可能包含数千个数字。这些数字构成的向量,代表 LLM 对该词含义的理解。
想继续深入: 加入“面向真正工程师的 AI 编码”候补名单
创建向量数据库
现在可以把向量及其代表的值一起存入向量数据库。
const vectorDatabase = embeddings.map((embedding, index) => ({value: values[index],embedding,}),);
这是一个极其简单的向量数据库:一组向量列表,每个向量附带它所代表的值。
在真实项目中,可以使用 Postgres,并安装类似 pgvector 的扩展来查询向量。
搜索相似嵌入
现在使用这个向量数据库,搜索与某个查询词最相似的条目。
还需要为查询词再创建一个嵌入。
为此,可以使用 AI SDK 的 embed AI SDK 函数。
import { embed } from "ai";const searchTerm = await embed({model,value: "Canine",});
我们来搜索与“Canine”最相似的词。
现在已经得到所需的全部向量。这就是执行相似度搜索需要的所有信息,无需再次查询 LLM。
接下来计算查询词与数据库中每个向量之间的余弦相似度。
滚动式代码讲解
幸运的是,AI SDK 提供了一个 cosineSimilarity 函数。
遍历数据库中的每个条目,计算它与查询词的相似度。
然后按相似度排序。
import { cosineSimilarity } from "ai";const entries = vectorDatabase.map((entry) => {return {value: entry.value,similarity: cosineSimilarity(entry.embedding,searchTerm.embedding,),};});
记录结果后可以看到,相似度是 0 到 1 之间的数字,并精确到许多小数位。
[{ "value": "Dog", "similarity": 0.8918085834539862 },{ "value": "Cat", "similarity": 0.5911997598415127 },{ "value": "Car", "similarity": 0.5564415138726317 },{ "value": "Bike", "similarity": 0.5002829969392777 }]
可以看到 Dog 排在最前面,因为它与 Canine.
这套相对简单的配置可以支持搜索、分类等各种实用功能。
AI SDK 提供了 embed, embedMany和 cosineSimilarity 函数,以及查询嵌入模型的能力,非常方便。