生成嵌入向量
使用边缘函数生成文本嵌入向量
本指南将带您了解如何在边缘函数中使用其内置的AI推理API生成高质量的文本嵌入,无需依赖外部API。
构建边缘函数
让我们构建一个边缘函数,用于接收输入字符串并为其生成嵌入向量。边缘函数是服务器端的TypeScript HTTP端点,按需运行在靠近用户的边缘节点。
2
创建边缘函数
创建一个用于生成嵌入向量的边缘函数。我们将其命名为embed
(您可以使用任意名称)。
这将在./supabase/functions/embed
目录下创建一个名为index.ts
的TypeScript文件。
1supabase functions new embed
3
设置推理会话
让我们创建一个新的推理会话,该会话将在该函数的生命周期内使用。多个请求可以共享同一个推理会话。
目前Supabase边缘运行时仅支持gte-small
(https://huggingface.co/Supabase/gte-small)文本嵌入模型。
1const session = new Supabase.ai.Session('gte-small');
4
实现请求处理器
修改我们的请求处理器,从POST请求的JSON体中接收input
字符串。
然后通过调用session.run(input)
生成嵌入向量。
12345678910111213141516Deno.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
测试功能!
要测试边缘函数,首先启动本地函数服务器。
1supabase functions serve
然后在新终端中,使用cURL创建HTTP请求,并在JSON体中传入您的输入。
1234curl --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
获取此密钥。