Open8

Supabase, Prisma, pgvectorで画像のSemantic Searchを実現したいので試行錯誤してみる

RyotaRyota

現在個人開発している画像投稿アプリで画像のあいまい検索を実現したい。
DBはSupabase PostgreSQL、BEはNestjs(TypeScript)とPrismaで構築、画像の特徴ベクトル生成(embedding)はAmazon Bedrockを使用中。
半分備忘録として書き残していきます。

このスクラップで達成したいこと

  • pgvectorを使用したPrismaスキーマでDriftを発生させずにマイグレーションを完了させること
  • SupabaseのDatabase Functionに登録した特徴ベクトルを使用した検索メソッドを使用して画像のあいまい検索を実現する

すでに達成していること

  • postsテーブルに投稿がInsertされたらWebhookを発火し、Amazon Bedrockで画像の特徴ベクトルを生成しpostsテーブルのembeddingフィールドに格納すること
RyotaRyota

Prismaではpgvectorをまだサポートしていないらしく、無理やり使いたい場合はこんな感じでスキーマ定義する必要があるみたい

schema.prisma

generator client {
  provider        = "prisma-client-js"
  binaryTargets   = ["native", "linux-arm64-openssl-3.0.x"]
  previewFeatures = ["postgresqlExtensions"]
}

datasource db {
  provider   = "postgresql"
  url        = env("DATABASE_URL")
  directUrl  = env("DIRECT_URL")
  extensions = [pgvector(map:"vector", schema: "extensions")]
}

model Post {
  id          String                 @id @default(uuid())
  description String
  embedding   Unsupported("vector")? //←こんな感じ
  createdAt   DateTime               @default(now())
  updatedAt   DateTime               @updatedAt

  @@map("posts")
}

こちらを参照
https://github.com/prisma/prisma/issues/18442#issuecomment-1518982987

RyotaRyota

このスキーマで

npx prisma migrate dev --create-only

これを実行すると下記のようになって、publicスキーマをリセットさせようとしてくる。
一度だけこれをYesにしてみたことがあるが、各種権限回りもリセットしちゃうみたいで、SupabaseのDatabase Functionに登録した関数を実行しようとすると"public"スキーマへのアクセスが拒否されましたというエラーが発生するようになってしまうので、リセットしない方法を見つけたい。
あとDB全部消えるから毎回これ発生してたらサービスが成立しない。

Drift detected: Your database schema is not in sync with your migration history.

The following is a summary of the differences between the expected database schema given your migrations files, and the actual schema of the database.

It should be understood as the set of changes to get from the expected schema to the actual schema.

If you are running this the first time on an existing database, please make sure to read this documentation page:
https://www.prisma.io/docs/guides/database/developing-with-prisma-migrate/troubleshooting-development

[+] Added extensions
  - pgcrypto

[+] Added extensions
  - pgsodium

[+] Added extensions
  - supabase_vault

[+] Added extensions
  - vector

? We need to reset the "public" schema
Do you want to continue? All data will be lost. › (y/N)
RyotaRyota

schema.prismaにこいつを追記した上でnpx prisma migrate devするとDriftが発生する

generator client {
  provider        = "prisma-client-js"
  binaryTargets   = ["native", "linux-arm64-openssl-3.0.x"]
  previewFeatures = ["postgresqlExtensions"] // ←こいつ
}

記述しなければ発生しない