AI 与向量

使用Hugging Face生成图片描述

通过Supabase边缘函数调用Hugging Face推理API,访问超过10万个机器学习模型。


我们可以将 Hugging Face 与 Supabase Storage数据库 Webhooks 结合使用,为上传到存储桶的任何图片自动生成描述。

关于 Hugging Face

Hugging Face 是机器学习社区的协作平台。

Huggingface.js 提供了便捷的方式来调用超过 100,000 个机器学习模型,使您可以轻松地将 AI 功能集成到 Supabase 边缘函数中。

设置步骤

  • 打开您的 Supabase 项目仪表盘或创建新项目
  • 创建名为 images 的新存储桶
  • 从远程数据库生成 TypeScript 类型
  • 创建名为 image_caption 的新数据库表
    • 创建 uuid 类型的 id 列,引用 storage.objects.id
    • 创建 text 类型的 caption
  • 重新生成 TypeScript 类型以包含新的 image_caption
  • 将函数部署到 Supabase:supabase functions deploy huggingface-image-captioning
  • Supabase 仪表盘中创建数据库 Webhook,当 storage.objects 表添加记录时触发 huggingface-image-captioning 函数

生成 TypeScript 类型

要为 storage 和 public 模式生成 types.ts 文件,请在终端运行以下命令:

1
supabase gen types typescript --project-id=your-project-ref --schema=storage,public > supabase/functions/huggingface-image-captioning/types.ts

代码实现

完整代码请查看 GitHub

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import { serve } from 'https://deno.land/std@0.168.0/http/server.ts'import { HfInference } from 'https://esm.sh/@huggingface/inference@2.3.2'import { createClient } from 'jsr:@supabase/supabase-js@2'import { Database } from './types.ts'console.log('来自 `huggingface-image-captioning` 函数的问候!')const hf = new HfInference(Deno.env.get('HUGGINGFACE_ACCESS_TOKEN'))type SoRecord = Database['storage']['Tables']['objects']['Row']interface WebhookPayload { type: 'INSERT' | 'UPDATE' | 'DELETE' table: string record: SoRecord schema: 'public' old_record: null | SoRecord}serve(async (req) => { const payload: WebhookPayload = await req.json() const soRecord = payload.record const supabaseAdminClient = createClient<Database>( // Supabase API URL - 部署时默认导出的环境变量 Deno.env.get('SUPABASE_URL') ?? '', // Supabase API 服务角色密钥 - 部署时默认导出的环境变量 Deno.env.get('SUPABASE_SERVICE_ROLE_KEY') ?? '' ) // 从存储构建图片URL const { data, error } = await supabaseAdminClient.storage .from(soRecord.bucket_id!) .createSignedUrl(soRecord.path_tokens!.join('/'), 60) if (error) throw error const { signedUrl } = data // 使用Huggingface进行图片描述生成 const imgDesc = await hf.imageToText({ data: await (await fetch(signedUrl)).blob(), model: 'nlpconnect/vit-gpt2-image-captioning', }) // 将图片描述存储到数据库表 await supabaseAdminClient .from('image_caption') .insert({ id: soRecord.id!, caption: imgDesc.generated_text }) .throwOnError() return new Response('ok')})