Skip to content

hmatsu47/dbdev-langchain-test

Repository files navigation

dbdev-langchain-test

「第 41 回 PostgreSQL アンカンファレンス @ オンライン」発表用のサンプルです。

dbdev より、embedding_search を試してみます。

Supabase プロジェクト

SQL Editor で実行します。

dbdev 準備

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";

pgvector 有効化

create extension if not exists vector;

embedding_search 有効化

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ストアドファンクションを手動で削除してから有効化する。

URL と anon key を確認

API Setting で確認しておきます。

OpenAI API key を取得

OpenAI の API key を発行し、確認します。

サンプル Web API

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 冊の紹介ページから引用しました。

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published