langchain-embedding_search を使って Supabase を Vector Store として使う
先日(2023/4/24)の 第 41 回 PostgreSQL アンカンファレンス @ オンライン で話したネタです。
PostgreSQL パッケージマネージャー dbdev を使って Supabase に langchain-embedding_search を導入し、Supabase を Vector Store として使ってみます。
dbdev とは?
PostgreSQL の拡張機能や SQL 集を管理するパッケージマネージャーとして Supabase が提供するものです。
Supabase のブログ記事 には以下のような記述があります。
- (2023/4/14 現在)パブリックプレビュー中
- PostgreSQL において、JavaScript にとっての
npm
や Python にとってのpip
、Rust にとってのcargo
の役割を目指している - バージョニング・名前空間の管理機能を持つ
langchain-embedding_search とは?
Supabase の DB(PostgreSQL)を Vector Store として使うためのパッケージです。
Vector Store は、
- ベクトル化した文書を保存し
- LLM(大規模言語モデル)のプロンプトに文脈を与える際に関連文書を検索・抽出する
目的で使うデータストアです。
langchain-embedding_search では、拡張機能 pgvector を用いて、
- ベクトル型の列を持つ
documents
テーブル - コサイン類似度を使って関連文書を検索する
match_documents
ストアドファンクション
を Supabase プロジェクト上に生成します。
使ってみる
Supabase プロジェクト作成
新規のプロジェクトを作成するか、既存プロジェクトの環境を最新にして、最新の拡張機能が使える状態にします。
dbdev 有効化
「SQL Editor」 でこちらのページに書かれている SQL 文をそのまま実行します。
pgvector 有効化
同じく 「SQL Editor」 で次の SQL 文を実行します。
create extension if not exists vector;
langchain-embedding_search インストール・有効化
さらに 「SQL Editor」 で次の SQL 文を実行します。
select dbdev.install('langchain-embedding_search');
create extension "langchain-embedding_search"
version '1.0.0';
-
documents
テーブル -
match_documents
ストアドファンクション
が生成されます。
Supabase プロジェクトの URL と匿名(anon)キーを確認
「API Settings」 で 「Project URL」 と 「Project API keys」 の anon
・public
キーを確認しておきます。
OpenAI API キーを発行・確認
OpenAI API keys からキーを発行し確認しておきます。
サンプルコードを取得
こちらの GitHub リポジトリ にサンプルコードを用意しておきました。
手元に clone 後npm install
します。
その後、clone したディレクトリ直下に.env
ファイルを作成し、Supabase のプロジェクト URL / 匿名キーと OpenAI の API キーを記述します。
VITE_SUPABASE_URL=【SupabaseのプロジェクトURL】
VITE_SUPABASE_ANON_KEY=【Supabaseのプロジェクトanon key】
VITE_OPENAI_KEY=【OpenAIのAPI key】
起動
npm run dev
で起動します。
テストデータ投入
curl -X POST -H 'Content-Type: application/json; charset=UTF-8' http://localhost:【起動ポート番号】 -d '{"contents":【ドキュメント配列】, "metadata":【メタデータ配列】}'
で投入できます。 -d @【投入するファイルのパス】
も可能です。
こちらのテストデータ をcurl
で投入します。
% curl -X POST -H 'Content-Type: application/json; charset=UTF-8' http://localhost:3699 -d @./test-data.json
{"message":"OK"}%
検索
curl http://localhost:【起動ポート番号】/【検索キーワード】/【結果の最大数】
で検索が可能です。
実際に検索してみます。
% curl http://localhost:3699/初心者/2 | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 966 100 966 0 0 841 0 0:00:01 0:00:01 --:--:-- 845
[
{
"pageContent": "本書はデータベース初心者およびPostgreSQL初心者向けの入門書です。データベースとは何か?からPostgreSQLのインストール、SQLの実行、トランザクションについて、レプリケーション、バックアップまでを解説しています。",
"metadata": {
"title": "データベース初心者のためのPostgreSQL教室",
"author": [
"目黒 聖"
]
}
},
{
"pageContent": "本書は,データベース初学者を対象にPostgreSQLを使って,データベース操作の基本から運用までを学ぶための本です。付属DVD収録のファイルを利用することで,自宅のWindowsパソコンやMacで実際にデータの検索や更新などを行いながら,PostgreSQLによるリレーショナルデータベースの操作をマスターすることができます。",
"metadata": {
"title": "これからはじめる PostgreSQL入門",
"author": [
"高塚 遙",
"桑村 潤"
]
}
}
]
% curl http://localhost:3699/辛い/1 | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 914 100 914 0 0 444 0 0:00:02 0:00:02 --:--:-- 445
[
{
"pageContent": "「データベースがよく落ちる」「前任者が残したテーブル,SQLが読み解けない」「RDBMSを入れ替えたら予期せぬバグが」――MySQLやPostgreSQLといったRDBMS(リレーショナルデータベース管理システム)を使った業務システム,Webサービスを設計・運用していると,こういった問題によく直面するのではないでしょうか。本書はRDB(リレーショナルデータベース)の間違った使い方(=アンチパターン)を紹介しながら,アンチパターンを生まないためのノウハウを解説します。それぞれの章では,問題解決に必要なRDBやSQLの基礎知識も押さえるので,最近RDBMSを触り始めた新人の方にもお勧めです。",
"metadata": {
"title": "失敗から学ぶ RDBの正しい歩き方",
"author": [
"曽根壮大"
]
}
}
]
まあまあそれっぽい検索結果が出ていますね。
注意
- Node.js v16 では動きません。
fetch
を(試験的に)サポートする Node.js v18 以降で実行してください。 - 全体的に入力値チェックなどは実装していません。
参考
LangChain JS/TS Docs Supabase
LangChain Python Docs SupabaseVectorStore
app.ts
)全体
サンプルコード(
その他
文書ベクトルと全文検索を併用する langchain-hybrid_search もあります。
Discussion