「第 41 回 PostgreSQL アンカンファレンス @ オンライン」発表用のサンプルです。
dbdev より、embedding_search を試してみます。
SQL Editor で実行します。
create extension if not exists http with schema extensions;
create extension if not exists pg_tle;
select pgtle.uninstall_extension_if_exists('supabase-dbdev');
drop extension if exists "supabase-dbdev";
select
pgtle.install_extension(
'supabase-dbdev',
resp.contents ->> 'version',
'PostgreSQL package manager',
resp.contents ->> 'sql'
)
from http(
(
'GET',
'https://api.database.dev/rest/v1/'
|| 'package_versions?select=sql,version'
|| '&package_name=eq.supabase-dbdev'
|| '&order=version.desc'
|| '&limit=1',
array[
('apiKey', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InhtdXB0cHBsZnZpaWZyYndtbXR2Iiwicm9sZSI6ImFub24iLCJpYXQiOjE2ODAxMDczNzIsImV4cCI6MTk5NTY4MzM3Mn0.z2CN0mvO2No8wSi46Gw59DFGCTJrzM0AQKsu_5k134s')::http_header
],
null,
null
)
) x,
lateral (
select
((row_to_json(x) -> 'content') #>> '{}')::json -> 0
) resp(contents);
create extension "supabase-dbdev";
select dbdev.install('supabase-dbdev');
drop extension if exists "supabase-dbdev";
create extension "supabase-dbdev";
create extension if not exists vector;
select dbdev.install('langchain-embedding_search');
create extension "langchain-embedding_search"
version '1.0.0';
- ここで
documents
というテーブル(vector store)とmatch_documents
というストアドファンクションが生成される documents
テーブルは RLS 無効状態で生成されるので注意(それにあわせて、このサンプルでは anon key で Supabase に接続している)
langchain-embedding_search
バージョン 1.0.0 が対応するのはlangchainjs
バージョン0.0.87 まで。
ただし 2023/6/8 現在、langchain-embedding_search
バージョン 1.1.0 がうまく有効化できないので、langchainjs
バージョン 0.0.88 以降を使うには、引数filter
が追加された新しいmatch_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,
similarity float
)
language plpgsql
as $$
#variable_conflict use_column
begin
return query
select
id,
content,
metadata,
1 - (documents.embedding <=> query_embedding) as similarity
from documents
where metadata @> filter
order by documents.embedding <=> query_embedding
limit match_count;
end;
$$;
※このワークアラウンドで対応した場合、langchain-embedding_search
バージョン 1.1.0 が有効化できるようになったときは、このmatch_documents
ストアドファンクションを手動で削除してから有効化する。
API Setting で確認しておきます。
OpenAI の API key を発行し、確認します。
npm install
後、.env
に Supabase のプロジェクト URL / anon key と OpenAI の API key を記述してください。
VITE_SUPABASE_URL=【SupabaseのプロジェクトURL】
VITE_SUPABASE_ANON_KEY=【Supabaseのプロジェクトanon key】
VITE_OPENAI_KEY=【OpenAIのAPI key】
curl -X POST -H 'Content-Type: application/json; charset=UTF-8' http://localhost:【起動ポート番号】 -d '{"contents":【ドキュメント配列】, "metadata":【メタデータ配列】}'
- ドキュメント追加に限らず、全体的に入力値チェックなどは実装していないので注意(ドキュメント配列の要素数とメタデータ配列の要素数は一致させる)
curl http://localhost:【起動ポート番号】/【検索キーワード】/【結果の最大数】
- Node.js v16 では動きません。
fetch
を(試験的に)サポートする Node.js v18 以降で実行してください。 - 前述のとおり、全体的に入力値チェックなどは実装していません。
※ 日本 PostgreSQL ユーザ会に馴染みの深い方の著書 4 冊の紹介ページから引用しました。
- 失敗から学ぶ RDBの正しい歩き方
- [改訂3版]内部構造から学ぶPostgreSQL
- データベース初心者のためのPostgreSQL教室
- これからはじめる PostgreSQL入門