Supabase-jsでのDB操作と、Postgre functionの実行

SupabaseのJS SDKの使い方を調べた結果を共有します。データの取得は、SQLのfromとselectを組み合わせて行います。全てのデータを取得する場合はfromでテーブル名を指定し、selectを呼び出します。特定のカラムだけ取得する場合は、selectの第一引数にカラム名を指定します。また、SupabaseのSDKからPostgreSQLの関数を呼び出すこともできます。関数の実行結果はrpc()メソッドで取得できます。ベクトル検索を行う場合は、配列の長さに注意する必要があります。詳細は公式ドキュメントを参照してください。

広告ここから
広告ここまで

目次

    Supabaseを触り始めたので、JS SDKの使い方などを調べてみました。

    データの取得は、fromselectを使う

    SQLをメソッドチェーン的に組み上げるイメージで、SDKを使う様子です。

    全てのデータを取得する

    全てのデータを取得する場合は、fromでテーブル名を指定してから、selectを引数なしで呼び出します。

     await client.from('documents').select()

    特定のカラムだけ取り出す

    SELECT embedding idのようなクエリを書きたい場合は、selectの第一引数に書きます。

     await client.from('documents').select("embedding, id")

    Postgre functionをSDKから呼び出す

    LangChainのサンプルで作った関数を動かしてみます。

    -- Create a function to search for documents
    create function match_documents (
      query_embedding vector(1536),
      match_count int DEFAULT null,
      filter jsonb DEFAULT '{}'
    ) returns table (
      id bigint,
      content text,
      metadata jsonb,
      embedding jsonb,
      similarity float
    )
    language plpgsql

    rpc()の第一引数で呼び出す関数を、第二引数で渡すパラメータを指定します。

        const targetVectorString = [0.0055157384,-0.009889425,0.016879791,-0.008615596,-0.030847976,0.00419171, ...] // 長さ1536の配列を、OpenAIやClaudeのEmbedding APIで生成しておく
        const privateKey = c.env.SUPABASE_PRIVATE_KEY;
        const url = c.env.SUPABASE_URL;
        const client = createClient(url, privateKey);
        const data = await client.rpc("match_documents", {
            query_embedding: targetVectorString
        })
        console.log(data)

    実行すると、関数の実行結果が取得できます。

    {
      error: null,
      data: [
        {
          id: 3,
          content: "What's this?",
          metadata: [Object],
          embedding: [Array],
          similarity: 1
        },
        {
          id: 1,
          content: 'Hello world',
          metadata: [Object],
          embedding: [Array],
          similarity: 0.796101617580761
        },
        {
          id: 2,
          content: 'Bye bye',
          metadata: [Object],
          embedding: [Array],
          similarity: 0.789771054955852
        }
      ],
      count: null,
      status: 200,
      statusText: 'OK'
    }

    ベクトル検索系については、Dimensions(配列)の長さが足りないとエラーになるのでご注意ください。

    {
      "error": {
        "code": "22000",
        "details": null,
        "hint": null,
        "message": "different vector dimensions 1536 and 6"
      },
      "data": null,
      "count": null,
      "status": 400,
      "statusText": "Bad Request"
    }

    参考

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark