AI 与向量

生成嵌入向量

使用边缘函数生成文本嵌入向量


本指南将带您了解如何在边缘函数中使用其内置的AI推理API生成高质量的文本嵌入,无需依赖外部API。

构建边缘函数

让我们构建一个边缘函数,用于接收输入字符串并为其生成嵌入向量。边缘函数是服务器端的TypeScript HTTP端点,按需运行在靠近用户的边缘节点。

1

本地设置Supabase

确保已安装最新版本的Supabase CLI

在应用根目录初始化Supabase并启动本地开发环境。

1
2
supabase initsupabase start
2

创建边缘函数

创建一个用于生成嵌入向量的边缘函数。我们将其命名为embed(您可以使用任意名称)。

这将在./supabase/functions/embed目录下创建一个名为index.ts的TypeScript文件。

1
supabase functions new embed
3

设置推理会话

让我们创建一个新的推理会话,该会话将在该函数的生命周期内使用。多个请求可以共享同一个推理会话。

目前Supabase边缘运行时仅支持gte-small(https://huggingface.co/Supabase/gte-small)文本嵌入模型。

1
const session = new Supabase.ai.Session('gte-small');
4

实现请求处理器

修改我们的请求处理器,从POST请求的JSON体中接收input字符串。

然后通过调用session.run(input)生成嵌入向量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Deno.serve(async (req) => { // 从JSON体中提取输入字符串 const { input } = await req.json(); // 根据用户输入生成嵌入向量 const embedding = await session.run(input, { mean_pool: true, normalize: true, }); // 返回嵌入向量 return new Response( JSON.stringify({ embedding }), { headers: { 'Content-Type': 'application/json' } } );});

注意我们传递给session.run()的两个选项:

  • mean_pool: 第一个选项将pooling设置为mean。池化指的是如何将token级别的嵌入表示压缩成反映整个句子含义的单个句子嵌入。平均池化是句子嵌入最常用的池化类型。
  • normalize: 第二个选项表示对嵌入向量进行归一化,使其可用于点积等距离度量。归一化向量意味着其长度(幅度)为1,也称为单位向量。通过将每个元素除以向量的长度(幅度)来实现归一化,这保持了其方向但将其长度变为1。
5

测试功能!

要测试边缘函数,首先启动本地函数服务器。

1
supabase functions serve

然后在新终端中,使用cURL创建HTTP请求,并在JSON体中传入您的输入。

1
2
3
4
curl --request POST 'http://localhost:54321/functions/v1/embed' \ --header 'Authorization: Bearer ANON_KEY' \ --header 'Content-Type: application/json' \ --data '{ "input": "hello world" }'

请确保将ANON_KEY替换为您项目的匿名密钥。您可以通过运行supabase status获取此密钥。

后续步骤