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