Supabaseでrandomにレコードを取得できるようにする

最近はRAGやAIエージェントの開発を試行錯誤しており、Supabaseを使用してランダムにデータを取得するAPIを実装中。また、Supabaseを使用してランダムにデータを取得する方法を模索し、SQLのViewを利用した構築方法を採用。SupabaseではViewを使って簡単にデータを取得することが可能で、初心者でも扱いやすい。これからもSupabaseやPostgreSQLを使いながら実験を続ける予定。

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

目次

    最近自分用のRAGや、記事作成を支援するAIエージェントを作る方法を試行錯誤しています。試行錯誤する中で、「この機能って、別の使い方にできそうでは?」と感じたことがあったので、簡単に整理しました。

    やったこと

    Supabaseに保存しているレコードを、ランダムにX件取得できるようにしました。この機能を利用して、「過去の記事をランダムに表示する」仕組みに使えるAPIを実装しています。

    とれたデータのイメージは、こんな感じです。

    {
      "id": "4304:13",
      "content": "# AWS Budgetsで予算組んでみたり、CLIやSDKで参照してみたりする (part 13)\n### AWS SDKでみる\n\nもちろんSDKもあります。\n\nNode.jsだと以下のようになります。\n\n```\nconst aws = require('aws-sdk')\nvar budgets = new aws.Budgets({apiVersion: '2016-10-20'})\n\nvar params = {\n  AccountId: 'YOUR_AWS_ACCOUNT_ID', /* required */\n  MaxResults: 1\n}\nbudgets.describeBudgets(params, function(err, data) {\n  if (err) console.log(err, err.stack); // an error occurred\n  else     console.log(data);           // successful response\n})\n\n```\n\n<https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Budgets.html#describeBudgets-property>\n\n### 使い所\n\n* kintoneあたりの業務管理ツールと連携させる\n* CloudFormationスタックを立ち上げる際に自動で予算を設定するようにする\n* 複数クライアントをまとめているAWSアカウントで、クライアント別に予算状況を見れるようにする\n* シェル芸のネタにする\n\nCLI / SDK使って頑張るところと言われるとこんなところかなぁと思います。\n\n今回は「触ってみた」なので、このへんで。",
      "metadata": {
        "url": "https://wp-kyoto.net/aws-budgets-trial/",
        "title": "AWS Budgetsで予算組んでみたり、CLIやSDKで参照してみたりする",
        "post_id": "4304",
        "language": "Japanese"
      }
    }

    もともとやろうとしていたこと

    自分のサイトや記事を取り込んだRAGの構築を進めています。その際の手順や記録も記事にしていますので、Supabaseを使ったRAGの作り方については、こちらの記事もご覧ください。

    LangChainのベクターストアとしてSupabaseを試してみた:
    https://wp-kyoto.net/try-supabase-to-store-the-embedding-data-from-langchain-and-openai

    データベースのテーブルは、このようなSQLで作成したものを使っています。

    create table documents (
      id bigserial primary key,
      content text, -- corresponds to Document.pageContent
      metadata jsonb, -- corresponds to Document.metadata
      embedding vector(1536) -- 1536 works for OpenAI embeddings, change if needed
    );
    

    参考: https://supabase.com/docs/guides/ai/langchain

    Viewを作る

    Supabaseを通じて実行するSQLで、ランダムにデータを取得するための関数やクエリはない・・・らしいということが、検索してわかりました。

    Supabaseでランダムなデータを取得する方法
    https://weev.media/article/698

    この記事を参考に、ランダムにデータを取得できるViewを作成することにしました。

    CREATE VIEW random_documents AS SELECT id,content,metadata FROM documents ORDER BY random();

    ベクトル検索用のテーブルですが、ベクトルデータを使う必要はないかなーと思ったので、SELECTで取得するリソースを明示的に指定しています。もし全て取得したい場合は、SELECT *にするとよさそうです。

    CREATE VIEW random_documents AS SELECT * FROM documents ORDER BY random();

    ランダムにデータを取得する処理を、Node.jsで書く

    SQLのViewを作成したので、あとはSupabaseのJS SDKでクエリを実行する処理を書きます。SupabaseでViewを使う場合、from()に作成したViewの名前を追加します。

     const supabaseClient = createClient(...)
     const result = await supabaseClient.from('random_documents').select("id,content,metadata").limit(10)
     console.log(result.data[0])

    これを実行すると、このようにランダムな記事データが取得できます。

    {
      "id": "4304:13",
      "content": "# AWS Budgetsで予算組んでみたり、CLIやSDKで参照してみたりする (part 13)\n### AWS SDKでみる\n\nもちろんSDKもあります。\n\nNode.jsだと以下のようになります。\n\n```\nconst aws = require('aws-sdk')\nvar budgets = new aws.Budgets({apiVersion: '2016-10-20'})\n\nvar params = {\n  AccountId: 'YOUR_AWS_ACCOUNT_ID', /* required */\n  MaxResults: 1\n}\nbudgets.describeBudgets(params, function(err, data) {\n  if (err) console.log(err, err.stack); // an error occurred\n  else     console.log(data);           // successful response\n})\n\n```\n\n<https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Budgets.html#describeBudgets-property>\n\n### 使い所\n\n* kintoneあたりの業務管理ツールと連携させる\n* CloudFormationスタックを立ち上げる際に自動で予算を設定するようにする\n* 複数クライアントをまとめているAWSアカウントで、クライアント別に予算状況を見れるようにする\n* シェル芸のネタにする\n\nCLI / SDK使って頑張るところと言われるとこんなところかなぁと思います。\n\n今回は「触ってみた」なので、このへんで。",
      "metadata": {
        "url": "https://wp-kyoto.net/aws-budgets-trial/",
        "title": "AWS Budgetsで予算組んでみたり、CLIやSDKで参照してみたりする",
        "post_id": "4304",
        "language": "Japanese"
      }
    }

    まとめ

    Supabaseでは、Viewを使って独自の条件で検索・取得したデータを取得することができます。SQLEditorを使うことで、ダッシュボードから簡単に設定を行うことができますし、JSなどのSDKからも、作成したViewを簡単にりようすることができました。

    PostgreSQLやSupabaseはほぼほぼ手探りで触っているのですが、なんとなくでも動かせる感じが初心者にも助かるので、もうしばらく試行錯誤してみようと思います。

    参考記事

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