SlideShare a Scribd company logo
1 of 63
© 2023 NTT DATA Group Corporation
© 2023 NTT DATA Group Corporation
pgvectorを使ってChatGPTとPostgreSQLを連携し
てみよう!
2023/11/24 PostgreSQL Conference Japan 2023
株式会社NTTデータグループ 技術開発本部 石井愛弓
© 2023 NTT DATA Group GROUP Corporation 2
目次
• はじめに
• デモ
• システムの流れ・実装の解説
• pgvectorについて
• ベクトル類似度の計算の仕組み
• インデックスの仕組み/パフォーマンス向上
• さいごに
© 2023 NTT DATA Group GROUP Corporation 3
はじめに
© 2023 NTT DATA Group Corporation 4
ChatGPTのデータソースにPostgreSQLを使うことができる!
今年に入って、一気に活用の場が広がっているChatGPT。
こんなことも知っているの?と感心する一方、しれ~っと嘘をつかれることも。
通常、学習済みデータからしか回答しないので、学習していないこと・最新情報(2021年9月以降)は答えられない。
⇒回答の精度を上げるために、RAGという手法が注目されている
• RAG(Retrieval-Augmented Generation)
• LLM(大規模言語モデル)が学習済みでない外部データをLLMに与えて、生成する回答の質を上げる方法
外部データはベクトルデータベースで作成する必要がある。
PostgreSQLもpgvectorを使えば、外部データとして使うことができる!
© 2023 NTT DATA Group Corporation 5
RAGによって実現できること
オリジナルデータは、常に更新でき、公開情報でなくても(OpenAIのサーバには送信が必要)、データソースにできる。
• 社内のマニュアルをインプットして、チャットで回答する社内Botを作る
• 企業の商品データをインプットして、似た商品をリコメンドするチャットを作る
• 常に最新ニュースをインプットして、時事問題を作成する
• ユーザのチャット履歴を随時記録して、以後の回答に利用する
…などなど。
© 2023 NTT DATA Group Corporation 6
ChatGPTのデータソースにPostgreSQLを使う方法
1. chatgpt-retrieval-pluginを使う
• OpenAIが公開しているプラグイン
• 詳細は、以下スライド
• https://www.slideshare.net/nttdata-tech/postgresql-chatgpt-odc2023-nttdata
2. LangChainを使う
• https://www.langchain.com/
• 大規模言語モデル(LLM)を使ってアプリ開発を行うためのフレームワーク。
• 今回はこちらを紹介
© 2023 NTT DATA Group Corporation 7
LangChainの主なコンポーネント
• Models
• LLMs, Chat Models, Text Embedding Modelsから様々なモデルの切替、組み合わせが可能
• Prompts
• モデルに入力するプロンプトをテンプレート化して、生成できる
• Indexes
• ドキュメントローダ、テキストスプリッターなどを使って、外部データを使えるようにする
★今回主に利用するのはこちら
• Memory
• 会話の履歴を保存・利用する
• Chains
• LLMにプロンプト・モデル等を渡して、回答を取得する
• Agents
• ユーザの入力に応じて、実行するアクションを分岐する
• 例えば、最新情報の質問ならGoogle検索へ、プラグイン利用の場合はプラグインへ、など。
詳細は公式ドキュメントhttps://docs.langchain.com/docs/
© 2023 NTT DATA Group GROUP Corporation 8
デモ
© 2023 NTT DATA Group GROUP Corporation 9
今回のデモについて
• ChatGPTも知らない「私の家族の好きな食べ物」を答えてくれるアプリ。
• 事前準備として、好きな食べ物情報をベクトル化してPostgreSQLに入れておく。
• ChatGPTに、PostgreSQLからとってきた情報を参照して回答を返してもらう。
使用した主なコンポーネント
• Python 3.10
• PostgreSQL + pgvector
• OpenAI API
• LangChain
© 2023 NTT DATA Group Corporation 10
ちなみに、外部データなしだと、こうなります。
© 2023 NTT DATA Group Corporation 11
デモ:データ挿入編
© 2023 NTT DATA Group Corporation 12
デモ:回答取得編
© 2023 NTT DATA Group GROUP Corporation 13
システムの流れと実装
© 2023 NTT DATA Group Corporation 14
全体像
PostgreSQL
pgvector
オリジナルデータ
(TXT)
LangChain
OpenAI
Embeddings
API
読み込み&分割
②・⑤ベクトル化
③insert
①
④問い合わせ(自然言語)
ChatGPT
API
⑥
類似検索
⑦検索結果をもとにprompt合成
⑧prompt質問
⑨回答
① LangChainがテキストデータを読み込み、分割する
© 2023 NTT DATA Group Corporation 15
全体像
PostgreSQL
pgvector
オリジナルデータ
(TXT)
LangChain
OpenAI
Embeddings
API
読み込み&分割
②・⑤ベクトル化
③insert
①
④問い合わせ(自然言語)
ChatGPT
API
⑥
類似検索
⑦検索結果をもとにprompt合成
⑧prompt質問
⑨回答
②自然言語をベクトルに変換
私はPostgreSQLが好きです Open AI Embeddings API
text-embedding-ada-002モデル
[0.00058671045, -
0.004581401, .......]
文字数に関係なく
1536次元のベクトル
になる
© 2023 NTT DATA Group Corporation 16
Embedding models
2022年12月にリリースされた第二世代のtext-embedding-ada-002モデルをOpenAIも推奨。
ほぼすべてのユースケースで、他モデルより品質が高く、安く、使いやすいため。
LangChainの関数では、 text-embedding-ada-002が指定されている
• トークナイザとは
• 文章をトークンに分割するプログラム
モデル トークナイザ 最大入力
トークン数
出力する
ベクトルの次元
知識の
切れ目
text-embedding-ada-002 cl100k_base 8191 1536 Sep 2021
https://platform.openai.com/docs/guides/embeddings/what-are-embeddings
© 2023 NTT DATA Group Corporation 17
似ている単語は、近いベクトルになる。
実際は1536次元だが、2次元でイメージするなら以下のような感じ。
お菓子
チョコ
PostgreSQL
MySQL
データベース
デザート
ベクトル間の距離を計算することで、
単語の類似度を計算できるようになる。
© 2023 NTT DATA Group Corporation 18
全体像
PostgreSQL
pgvector
オリジナルデータ
(TXT)
LangChain
OpenAI
Embeddings
API
読み込み&分割
②・⑤ベクトル化
③insert
①
④問い合わせ(自然言語)
ChatGPT
API
⑥
類似検索
⑦検索結果をもとにprompt合成
⑧prompt質問
⑨回答
③LangChainがベクトルデータをPostgreSQLにinsertする
ここまでで準備完了!
© 2023 NTT DATA Group Corporation 19
データを入れるまでのソースコード
セパレーターは改行(デフォルト)
文字数1000にマージ。
オーバーラップなし。
OpenAIのAPIでembeddings
テーブルがないときは作成、データ
の挿入が行われる
© 2023 NTT DATA Group Corporation 20
from_documents
db = PGVector.from_documents(
embedding=embeddings, ←ベクトルデータ
documents=docs, ←原文
collection_name=“test”, ←コレクション名
connection_string=CONNECTION_STRING, ←接続文字列
pre_delete_collection=False, ←データ挿入前に既存のデータを削除するか?
distance_strategy=DistanceStrategy. COSINE ←距離の計算方法
ids=None ←ユーザ独自のidを付けられる
)
© 2023 NTT DATA Group Corporation 21
実際に発行されるINSERT
INSERT INTO langchain_pg_embedding
(collection_id, embedding, document, cmetadata, custom_id, uuid)
VALUES
('0effcd46-bfac-4363-83ed-c5a447349a7e'::uuid::UUID,
‘[-0.014597942336596845,0.0024809805856363864,(略)]’,
'長女はブロッコリーが好きです。長男はチョコが好きです。’,
{"source": "sample.txt"}’,
'c87e1582-81d6-11ee-bc52-0a5ea04d8ddb’,
'c7e45348-3d97-4024-a37d-13c27291ec25'::uuid::UUID)
〇pre_delete_collection=Trueの場合
DELETE FROM langchain_pg_collection WHERE langchain_pg_collection.uuid = '0a37f8bd-d054-44bf-
b460-1248f7915ce9'::uuid::UUID
© 2023 NTT DATA Group Corporation 22
PostgreSQLのテーブル
• データを初期化するときに自動で作成される
列名 型 説明
collection_id uuid コレクションid
embedding vector ベクトル化されたデータ
document varchar 元の自然言語データ
cmetadata json メタデータ
custom_id varchar ユーザが好きに決められるid
uuid uuid uuid
列名 型 説明
name varchar コレクション名。複数のデータセットを使い分けるときに使える。
cmetadata json メタデータ{“source”: “sample.txt”} など
uuid uuid uuid
langchain_pg_embedding
langchain_pg_collection
© 2023 NTT DATA Group Corporation 23
全体像
PostgreSQL
pgvector
オリジナルデータ
(TXT)
LangChain
OpenAI
Embeddings
API
読み込み&分割
②・⑤ベクトル化
③insert
①
④問い合わせ(自然言語)
ChatGPT
API
⑥
類似検索
⑦検索結果をもとにprompt合成
⑧prompt質問
⑨回答
④ユーザが自然言語で問い合わせをする
© 2023 NTT DATA Group Corporation 24
全体像
PostgreSQL
pgvector
オリジナルデータ
(TXT)
LangChain
OpenAI
Embeddings
API
読み込み&分割
②・⑤ベクトル化
③insert
①
④問い合わせ(自然言語)
ChatGPT
API
⑥
類似検索
⑦検索結果をもとにprompt合成
⑧prompt質問
⑨回答
⑤ユーザの問い合わせをベクトル化する
© 2023 NTT DATA Group Corporation 25
全体像
PostgreSQL
pgvector
オリジナルデータ
(TXT)
LangChain
OpenAI
Embeddings
API
読み込み&分割
②・⑤ベクトル化
③insert
①
④問い合わせ(自然言語)
ChatGPT
API
⑥
類似検索
⑦検索結果をもとにprompt合成
⑧prompt質問
⑨回答
⑥PostgreSQLからユーザの問い合わせと類似しているドキュメントを検索する
⇒pgvectorの関数を使ってベクトルの類似度を計算する。
※詳細は後スライドで。
© 2023 NTT DATA Group Corporation 26
全体像
PostgreSQL
pgvector
オリジナルデータ
(TXT)
LangChain
OpenAI
Embeddings
API
読み込み&分割
②・⑤ベクトル化
③insert
①
④問い合わせ(自然言語)
ChatGPT
API
⑥
類似検索
⑦検索結果をもとにprompt合成
⑧prompt質問
⑨回答
⑦PostgreSQLから検索した、類似度の高いドキュメントと、ユーザの元の問い合わせを合成して、
プロンプト(質問文)を作成する
© 2023 NTT DATA Group Corporation 27
プロンプトの作成
Use the following pieces of context to answer the question at
the end. If you don't know the answer, just say that you don't
know, don't try to make up an answer.
{context}
Question: {question}
プロンプトは、ChatGPTに投げる質問文。
ChatGPTにはDBの情報を加味して回答してほしいので、元の質問文にDBの情報を加えてからChatGPTに投げる。
参考情報つきの質問を送っているようなイメージ。
プロンプトの作成は、LangChainが実施してくれるので、明示的なプログラムは書かなくてもOK
裏では、このように合成してくれている。
←DBからとってきた文章:長女はブロッコリーが好きです。
←ユーザの元の質問:長女は何が好きですか?
←以下の文脈を使って、最後の質問に答えてね。
© 2023 NTT DATA Group Corporation 28
全体像
PostgreSQL
pgvector
オリジナルデータ
(TXT)
LangChain
OpenAI
Embeddings
API
読み込み&分割
②・⑤ベクトル化
③insert
①
④問い合わせ(自然言語)
ChatGPT
API
⑥
類似検索
⑦検索結果をもとにprompt合成
⑧prompt質問
⑨回答
⑧ChatGPTにプロンプトを渡す
© 2023 NTT DATA Group Corporation 29
Open AI 文章生成モデルについて
• LangChainのデフォルト:text-davinci-003
モデルファミリー 備考
新しいモデル
(2023)
gpt-4 (and gpt-4 turbo), gpt-3.5-
turbo
1ドル以上の課金で使用可能
従来モデル
アップデート版
(2023)
babbage-002, davinci-002 参考:
https://platform.openai.com/docs
/models/moderation
従来モデル
(2020~2022)
text-davinci-003, text-davinci-002,
davinci, curie, babbage, ada
参考:
https://platform.openai.com/docs
/models/gpt-3
© 2023 NTT DATA Group Corporation 30
全体像
PostgreSQL
pgvector
オリジナルデータ
(TXT)
LangChain
OpenAI
Embeddings
API
読み込み&分割
②・⑤ベクトル化
③insert
①
④問い合わせ(自然言語)
ChatGPT
API
⑥
類似検索
⑦検索結果をもとにprompt合成
⑧prompt質問
⑨回答
⑨ChatGPTがユーザに答えを返却する
© 2023 NTT DATA Group Corporation 31
データを取得するソースコード(サンプル)
© 2023 NTT DATA Group Corporation 32
補足:OpenAI のAPIの実行にはAPI keyが必要
OpenAIでアカウントを登録してログイン
API keyを発行して保存しておく
※Free trialが終わるとクレジット登録が必要になった。$0.0001 / 1K tokens
1トークンとは?
エンコーディングの種類によって異なる
今回は、 「text-embedding-ada-002」モデルを使用。
このモデルでは、「cl100k_base」のエンコーディングを使
用。
日本語の場合、頻出単語は1トークン、それ以外は
複数トークンとなる。
基本的に文章が長いほど、トークンも大きくなる。
「こんにちは」→ 1
「石井です」 →5
「今日もよろしくお願いします。」→13
ざっと1000万字で1ドル位?
© 2023 NTT DATA Group GROUP Corporation 33
pgvector
© 2023 NTT DATA Group Corporation 34
pgvector
https://github.com/pgvector/pgvector
PostgreSQLでベクトル類似性検索ができるようになる拡張機能
今年に入って、githubのスター数うなぎ上りの注目機能
引用:https://star-history.com/#pgvector/pgvector&Date
vector型を含むテーブルを作成し、データが保存できる
CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3));
→3次元のベクトル列を作成
Supabase、RDS(15.2以降)、Azure、AlloyDBなどでも対応済み
CREATE EXTENSION でインストール可能
© 2023 NTT DATA Group Corporation 35
pgvectorのバージョンについて
• 現在の最新バージョンはv0.5.1(2023年11月現在)
• v0.5.0が大きなリリースのため、v0.5.0以降の利用がオススメ
• HNSWインデックスのサポート
• ivfflatインデックス構築の並列化
• l1距離追加
• 距離関数のパフォーマンス向上
© 2023 NTT DATA Group Corporation 36
vector型
通常の列と同じようにデータのINSERT/UPDATE/DELETEできる
Insert vectors
Upsert vectors
Update vectors
Delete vectors
INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]');
INSERT INTO items (id, embedding) VALUES (1, '[1,2,3]'), (2, '[4,5,6]')
ON CONFLICT (id) DO UPDATE SET embedding = EXCLUDED.embedding;
UPDATE items SET embedding = '[1,2,3]' WHERE id = 1;
DELETE FROM items WHERE id = 1;
© 2023 NTT DATA Group Corporation 37
vector型
各ベクトルは4 * 次元数 + 8バイトのストレージを必要とする
次元数は最大16000まで。
ベクトルの要素は、32ビット浮動小数点数。
ただし、さらに精度が必要な場合は、double precision[]またはnumeric[]を使用することも可能。
この場合、チェック制約により、vector型の変換が可能であること、期待される次元数があることを確認する。
インデックスを作成するときは、式インデックスを利用する。(精度はvector同等に落ちる)
検索の例:
CREATE TABLE items (id bigserial PRIMARY KEY, embedding double precision[]);
ALTER TABLE items ADD CHECK (vector_dims(embedding::vector) = 3);
CREATE INDEX ON items USING hnsw ((embedding::vector(3)) vector_l2_ops);
SELECT * FROM items ORDER BY embedding::vector(3) <-> '[3,1,2]' LIMIT 5;
© 2023 NTT DATA Group Corporation 38
使える演算子
演算子 説明
+ 要素ごとの加算
- 要素ごとの減算
* 要素ごとの乗算
<-> ユークリッド距離
<#> 内積×-1
<=> コサイン距離
いずれも距離としてとらえる。
値が小さいほど、ベクトルが似ている。
© 2023 NTT DATA Group Corporation 39
使えるベクトル関数
関数 説明
cosine_distance(vector, vector)
→ double precision
コサイン距離
inner_product(vector, vector)
→ double precision
内積
l2_distance(vector, vector)
→ double precision
L2距離(ユークリッド距離)
l1_distance(vector, vector)
→ double precision
L1距離(マンハッタン距離)
vector_dims(vector)
→ integer
次元数
vector_norm(vector)
→ double precision
ユークリッドノルム
(ベクトルの大きさ)
© 2023 NTT DATA Group Corporation 40
使える集約関数
関数 説明
avg(vector)
→ vector
ベクトルの平均
sum(vector)
→ vector
ベクトルの合計
© 2023 NTT DATA Group GROUP Corporation 41
距離関数
© 2023 NTT DATA Group Corporation 42
ユークリッド距離とマンハッタン距離
SELECT * FROM items ORDER BY
embedding <-> '[3,1,2]' LIMIT 5;
→[3,1,2]とユークリッド距離が近いベクトルを順に5つ探す
SELECT * FROM items ORDER BY
l2_distance(embedding, '[3,1,2]’) LIMIT 5;
→[3,1,2]とユークリッド距離が近いベクトルを順に5つ探す
SELECT * FROM items ORDER BY
l1_distance(embedding, ‘[3,1,2]’) LIMIT 5;
→[3,1,2]とマンハッタン距離が近いベクトルを順に5つ探す
・
・
ユークリッド距離
x
y
(x1, y1)
(x2, y2)
マンハッタン距離
© 2023 NTT DATA Group Corporation 43
内積
内積も2つのベクトルの類似度を表すのに使える。
θ
Ԧ
𝑎 ⋅ 𝑏 = Ԧ
𝑎 𝑏 cos 𝜃
Ԧ
𝑎
𝑏
𝑎1, 𝑎2
𝑏1, 𝑏2
Ԧ
𝑎 ⋅ 𝑏 = 𝑎1𝑏1 + 𝑎2𝑏2
公式②より
ベクトルの大きさが同じなら、内積はなす角θが小さいほど大きくなる。
⇒ベクトルの向きが似ているほど、内積は大きくなる。
pgvectorの演算子<#>は、内積の値に-1を乗算して返却。
-1を掛けているのは、小さいほど似ている値に変換するため。
⇒ 似たベクトルを演算結果の昇順で取り出せる。
※Postgres only supports ASC order index scans on operators
(https://github.com/pgvector/pgvector)
cos 𝜃 =
Ԧ
𝑎 ⋅ 𝑏
Ԧ
𝑎 𝑏
公式①
公式②
ただし、なす角が同じでも、ベクトルの大きさによって値が異なる。
ベクトルの大きさの影響を受けないようにするために、、
⇒内積をベクトルの大きさで割って正規化。
⇒コサイン類似度
© 2023 NTT DATA Group Corporation 44
コサイン類似度とコサイン距離
コサイン類似度:cosθ なす角で決まる。向きが似ているか?を表す
・ 1
似てる
0
無関係
-1
正反対
θ
θ
コサイン類似度の値の範囲は-1~1
2つのベクトルが似ているほど、値が大きくなる。
pgvectorの <=>は、
1 – コサイン類似度=コサイン距離として取得することができる
コサイン距離は、小さいほど向きが似ていることを示す。
ユークリッド距離と比較して、
テキストや画像など高次元データに効果的で、
ドキュメント検索のユースケースでよく使用される。
LangChainではこれがデフォルト。
なお、OpenAI embeddingsの場合、ベクトルの長さは1に正規化
されているので、内積と同じ。
⇒この場合、内積のほうがよい。計算量が少ないので性能〇。
・
・
© 2023 NTT DATA Group GROUP Corporation 45
インデックス
© 2023 NTT DATA Group Corporation 46
pgvectorのインデックス:ivfflatとHNSW
• 最も近いベクトルはどれか?を探すためのアルゴリズム
• インデックスがない場合は、クエリと各ベクトルをすべて距離計算する必要があるので計算量が多い
• 高速に検索するため、近似最近傍検索のためのインデックスが利用可能
• 必ず最近傍であることは保証しない
• インデックス付与前と後で、クエリ結果が変わる可能性がある
1. ivfflat (Inverted File with Flat Compression)
• pgvectorに最初から実装されていたインデックス。
2. HNSW(Hierarchical Navigable Small World)
• ivfflatのみでは他のvector DBに比べ性能が低いという問題提起を受け、より高速化するために2023年9月にv0.5.0
で新しく実装されたインデックス。
© 2023 NTT DATA Group Corporation 47
ivfflat
• ivfflat(Inverted File with Flat Compression) あいぶいえふ ふらっと
• インデックス作成時に、データセット内の各ベクトルをクラスタに分割する
• 新しいベクトルが追加された場合は、最も重心が近いクラスタに割り当てる
• 最近傍を検索する際は、まず、最も近いクラスターを特定し、その中から最近傍を検索する
• 検索範囲が全体でなく一部となるため、パフォーマンス向上
・
・
・
・ ・
・
・
・
・
・・
・
・
・
・
・・
・ ・
・
★
・
・ ・
・ ・
・
・
★
★
© 2023 NTT DATA Group Corporation 48
ivfflatのクラスタの数について
• インデックス作成時に、クラスタ数(リスト数:lists)を指定する
• クラスタ数が多いほど…
• クラスタ内のデータ数が少なくなるので、より高速に検索できる。
• ただし、最も近いデータが、最も近いクラスタに入っておらず、取りこぼす可能性も高くなる(再現率が低くなる)
• トレードオフなので、アプリケーションに合わせて設定する
• 目安
• 100万レコード以下のとき→records/1000 からやってみる
• 100万レコードより多いとき→ sqrt(records) からやってみる
• クラスタ数は少なくとも10個以上が好ましい。
create index on documents using ivfflat (embedding vector_ip_ops) with (lists = 100);
内積
© 2023 NTT DATA Group Corporation 49
取りこぼしてしまう例
・
・
・
・ ・
・
・
・
・
・・
・
・
・
・
・
・ ・
・
★
・
・ ・
・ ・
・
・
★
★
▲
一番近い重心は、上のクラスタ。
しかし、最近傍は、上のクラスタではなく、右のクラスタにある
© 2023 NTT DATA Group Corporation 50
probesパラメータについて
• 取りこぼしを減らすために、最も近い重心を持つクラスタだけでなく、他にも近いクラスタの中も検索する
• デフォルト probes=1 →最も近い重心のクラスタのみ
• probesを増やすと、より多くのクラスタ内で検索するので、再現率が向上(取りこぼしにくい)
• 当然ながら、増やすほど速度は低下する。
• 目安:probes = sqrt(lists)
SET文でトランザクション内で設定可能:
例)
SET ivfflat.probes = 10;
© 2023 NTT DATA Group Corporation 51
ivfflatインデックス構築の進捗状況の表示
PostgreSQL12以降では、インデックス構築の進捗状況を確認可能
ivfflatのフェーズは以下。
1. initializing
2. performing k-means
3. assigning tuples
4. loading tuples
※上記クエリの%は、loading tuplesのフェーズのみ。
SELECT phase, round(100.0 * tuples_done / nullif(tuples_total, 0), 1) AS "%" FROM
pg_stat_progress_create_index;
© 2023 NTT DATA Group Corporation 52
ivfflatインデックスの注意点
• 最大2000次元までの列に付与可能
• データ(少なくとも数千レコード)が挿入されたあとでインデックスを追加すること。
• 実際のデータがない状態で作成するとクラスタの重心を適切に決めることができない。(ランダムになる)
• インデックス作成後に、データを追加・削除・更新しても、インデックスは更新されるが、クラスタの重心は更新されない。
• データの更新がある場合、定期的なREIDEXが推奨
• CONCURRENTLY オプションを使えばテーブルへの書き込みをロックせず再作成できる
© 2023 NTT DATA Group Corporation 53
HNSW
• HNSW(Hierarchical Navigable Small World)
• NSWの階層バージョン
NSWとは?
引用元:https://www.pinecone.io/learn/series/faiss/hnsw/
1. グラフを作っておく(作り方は後ほど)
2. entry pointからスタート
3. 自分からリンクされている要素の中で、一番クエリに近い要素に
移動する
4. 移動できなくなったら(自分が近くなったら)終了
© 2023 NTT DATA Group Corporation 54
NSWを階層化したのがHNSW
一番下の層には全ての要素、
上に上がるごとに、要素が絞られたグラフを作成。
一番上の層からスタートし、最初は大きく、
だんだん小さく近づいていく。
新幹線→急行→各停に乗り換えるイメージ。
階層化することで、少ない計算量で近づけるので、
高速になる。
引用元:https://www.pinecone.io/learn/series/faiss/hnsw/
© 2023 NTT DATA Group Corporation 55
HNSWの作り方①層を決定する
引用元:https://www.pinecone.io/learn/series/faiss/hnsw/
新しく要素を追加するとき、
例えば、
layer 2 = 12.5 %
layer 1 = 50%
layer 0 = 100% のように、
上の層ほど少なくなるような確率を用いて、
ランダムに層を決定する。
layer0はすべての要素が存在する。
要素があとからどんどん追加されていっても、
各層のバランスが崩れない。
(インデックス作成後にデータを追加しても問題なし)
© 2023 NTT DATA Group Corporation 56
HNSWの作り方②リンクを作成する
Mは、リンク数。
M=3なら、近い3つの要素とリンクを作成する
pgvectorのmは、各レイヤの最大リンク数。
引用元:https://www.pinecone.io/learn/series/faiss/hnsw/
© 2023 NTT DATA Group Corporation 57
HNSWのパラメータ
• M:リンク数
• デフォルト:16、範囲:2~100
• 少なすぎると、再現率が下がる。(最近傍を取りこぼすかも)
• 大きくなるほど、インデックス構築時間増、メモリ使用量増、検索時間増。
• ef_construction:インデックス構築中に何個の近傍をリストとして持つか
• デフォルト:64、範囲:4~1000
• 小さすぎると、再現率が下がる。ただしある点から増やしても再現性があがりにくくなる。
• 大きくすると、インデックス構築時間が長くなる
• ef_search:検索中に何個の近傍をリストとして持つか
• デフォルト:40、範囲:1~1000
• 小さいほど、高速
• 大きいほど、再現率があがる
© 2023 NTT DATA Group Corporation 58
HNSWインデックス構築の進捗状況の表示
PostgreSQL12以降では、インデックス構築の進捗状況を確認可能
HNSWのフェーズは以下。
1. initializing
2. loading tuples
SELECT phase, round(100.0 * blocks_done / nullif(blocks_total, 0), 1) AS "%" FROM
pg_stat_progress_create_index;
© 2023 NTT DATA Group Corporation 59
HNSWの特徴
• 最大2000次元までの列に付与可能
• ivfflatと比較して、、
• インデックス構築時間が長い&メモリ使用量が多いが、検索が高速
• テーブルにデータがなくてもインデックスを作成可能
© 2023 NTT DATA Group Corporation 60
検索時間について
引用:https://neon.tech/blog/pg-embedding-extension-for-vector-search
再現率99%を達成するとき、
ivfflat ( pgvector) は
HNSW( pg_embedding) の20倍の実行時間
ivfflatとHNSWは性能が大きく異なる
© 2023 NTT DATA Group Corporation 61
インデックスの比較
ivfflat HNSW
検索速度 △ 〇
正確さ △ 〇
メモリ使用量 〇 ×
インデックス構築速度 〇 ×
選び方:
• 検索速度を重視する場合は、HNSW。
• メモリ制限がある場合はivfflat。
参考:https://neon.tech/blog/pg-embedding-extension-for-vector-search
© 2023 NTT DATA Group Corporation 62
さいごに
• とても簡単な手順で、ChatGTPのデータソースにPostgreSQLを使うことができた
• ぜひ皆さんも、使ってみてください
記載されている会社名、商品名、又はサービス名は、
各社の登録商標又は商標です。

More Related Content

What's hot

速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)NTT DATA Technology & Innovation
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
祝!PostgreSQLレプリケーション10周年!徹底紹介!!祝!PostgreSQLレプリケーション10周年!徹底紹介!!
祝!PostgreSQLレプリケーション10周年!徹底紹介!!NTT DATA Technology & Innovation
 
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)NTT DATA Technology & Innovation
 
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)NTT DATA Technology & Innovation
 
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)NTT DATA Technology & Innovation
 
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)Hironobu Suzuki
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjugYahoo!デベロッパーネットワーク
 
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)NTT DATA Technology & Innovation
 
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)NTT DATA Technology & Innovation
 
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことAmazon Web Services Japan
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話Kumazaki Hiroki
 
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...NTT DATA Technology & Innovation
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法Tetsutaro Watanabe
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
Kongの概要と導入事例
Kongの概要と導入事例Kongの概要と導入事例
Kongの概要と導入事例briscola-tokyo
 

What's hot (20)

速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
祝!PostgreSQLレプリケーション10周年!徹底紹介!!祝!PostgreSQLレプリケーション10周年!徹底紹介!!
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
 
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
 
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
 
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
 
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
 
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
 
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
 
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
 
Vacuum徹底解説
Vacuum徹底解説Vacuum徹底解説
Vacuum徹底解説
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
Kongの概要と導入事例
Kongの概要と導入事例Kongの概要と導入事例
Kongの概要と導入事例
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
 

Similar to pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)

ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)NTT DATA Technology & Innovation
 
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイントPostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイントNTT DATA OSS Professional Services
 
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...NTT DATA Technology & Innovation
 
使ってみませんか?pg hint_plan
使ってみませんか?pg hint_plan使ってみませんか?pg hint_plan
使ってみませんか?pg hint_planMasao Fujii
 
Data Scientists Love SQL Server
Data Scientists Love SQL ServerData Scientists Love SQL Server
Data Scientists Love SQL ServerTomoyuki Oota
 
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)NTT DATA Technology & Innovation
 
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)NTT DATA Technology & Innovation
 
[D33] そのデータベース 5年後大丈夫ですか by Hiromu Goto
[D33] そのデータベース 5年後大丈夫ですか by Hiromu Goto[D33] そのデータベース 5年後大丈夫ですか by Hiromu Goto
[D33] そのデータベース 5年後大丈夫ですか by Hiromu GotoInsight Technology, Inc.
 
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(前編)
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(前編)【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(前編)
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(前編)日本マイクロソフト株式会社
 
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...NTT DATA Technology & Innovation
 
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)NTT DATA Technology & Innovation
 
大量のデータ処理や分析に使えるOSS Apache Spark入門 - Open Source Conference2020 Online/Fukuoka...
大量のデータ処理や分析に使えるOSS Apache Spark入門 - Open Source Conference2020 Online/Fukuoka...大量のデータ処理や分析に使えるOSS Apache Spark入門 - Open Source Conference2020 Online/Fukuoka...
大量のデータ処理や分析に使えるOSS Apache Spark入門 - Open Source Conference2020 Online/Fukuoka...NTT DATA Technology & Innovation
 
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)NTT DATA Technology & Innovation
 
Attunityのソリューションと異種データベース・クラウド移行事例のご紹介
Attunityのソリューションと異種データベース・クラウド移行事例のご紹介Attunityのソリューションと異種データベース・クラウド移行事例のご紹介
Attunityのソリューションと異種データベース・クラウド移行事例のご紹介Insight Technology, Inc.
 
Attunity社のソリューションの日本国内外適用事例及びロードマップ紹介[ATTUNITY & インサイトテクノロジー IoT / Big Data フ...
Attunity社のソリューションの日本国内外適用事例及びロードマップ紹介[ATTUNITY & インサイトテクノロジー IoT / Big Data フ...Attunity社のソリューションの日本国内外適用事例及びロードマップ紹介[ATTUNITY & インサイトテクノロジー IoT / Big Data フ...
Attunity社のソリューションの日本国内外適用事例及びロードマップ紹介[ATTUNITY & インサイトテクノロジー IoT / Big Data フ...Insight Technology, Inc.
 
オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜
オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜
オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜griddb
 
20190925_DBTS_PGStrom
20190925_DBTS_PGStrom20190925_DBTS_PGStrom
20190925_DBTS_PGStromKohei KaiGai
 
エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識Daiyu Hatakeyama
 
Microsoft AI Solution Update / DLL community Update
Microsoft AI Solution Update / DLL community UpdateMicrosoft AI Solution Update / DLL community Update
Microsoft AI Solution Update / DLL community UpdateHirono Jumpei
 
ML Ops NYC 19 & Strata Data Conference 2019 NewYork 注目セッションまとめ
ML Ops NYC 19 & Strata Data Conference 2019 NewYork 注目セッションまとめML Ops NYC 19 & Strata Data Conference 2019 NewYork 注目セッションまとめ
ML Ops NYC 19 & Strata Data Conference 2019 NewYork 注目セッションまとめTetsutaro Watanabe
 

Similar to pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料) (20)

ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
 
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイントPostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
 
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
 
使ってみませんか?pg hint_plan
使ってみませんか?pg hint_plan使ってみませんか?pg hint_plan
使ってみませんか?pg hint_plan
 
Data Scientists Love SQL Server
Data Scientists Love SQL ServerData Scientists Love SQL Server
Data Scientists Love SQL Server
 
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
 
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
 
[D33] そのデータベース 5年後大丈夫ですか by Hiromu Goto
[D33] そのデータベース 5年後大丈夫ですか by Hiromu Goto[D33] そのデータベース 5年後大丈夫ですか by Hiromu Goto
[D33] そのデータベース 5年後大丈夫ですか by Hiromu Goto
 
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(前編)
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(前編)【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(前編)
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(前編)
 
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
 
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
 
大量のデータ処理や分析に使えるOSS Apache Spark入門 - Open Source Conference2020 Online/Fukuoka...
大量のデータ処理や分析に使えるOSS Apache Spark入門 - Open Source Conference2020 Online/Fukuoka...大量のデータ処理や分析に使えるOSS Apache Spark入門 - Open Source Conference2020 Online/Fukuoka...
大量のデータ処理や分析に使えるOSS Apache Spark入門 - Open Source Conference2020 Online/Fukuoka...
 
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
 
Attunityのソリューションと異種データベース・クラウド移行事例のご紹介
Attunityのソリューションと異種データベース・クラウド移行事例のご紹介Attunityのソリューションと異種データベース・クラウド移行事例のご紹介
Attunityのソリューションと異種データベース・クラウド移行事例のご紹介
 
Attunity社のソリューションの日本国内外適用事例及びロードマップ紹介[ATTUNITY & インサイトテクノロジー IoT / Big Data フ...
Attunity社のソリューションの日本国内外適用事例及びロードマップ紹介[ATTUNITY & インサイトテクノロジー IoT / Big Data フ...Attunity社のソリューションの日本国内外適用事例及びロードマップ紹介[ATTUNITY & インサイトテクノロジー IoT / Big Data フ...
Attunity社のソリューションの日本国内外適用事例及びロードマップ紹介[ATTUNITY & インサイトテクノロジー IoT / Big Data フ...
 
オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜
オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜
オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜
 
20190925_DBTS_PGStrom
20190925_DBTS_PGStrom20190925_DBTS_PGStrom
20190925_DBTS_PGStrom
 
エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識
 
Microsoft AI Solution Update / DLL community Update
Microsoft AI Solution Update / DLL community UpdateMicrosoft AI Solution Update / DLL community Update
Microsoft AI Solution Update / DLL community Update
 
ML Ops NYC 19 & Strata Data Conference 2019 NewYork 注目セッションまとめ
ML Ops NYC 19 & Strata Data Conference 2019 NewYork 注目セッションまとめML Ops NYC 19 & Strata Data Conference 2019 NewYork 注目セッションまとめ
ML Ops NYC 19 & Strata Data Conference 2019 NewYork 注目セッションまとめ
 

More from NTT DATA Technology & Innovation

COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)
COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)
COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方NTT DATA Technology & Innovation
 
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...NTT DATA Technology & Innovation
 
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)NTT DATA Technology & Innovation
 
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)NTT DATA Technology & Innovation
 
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)NTT DATA Technology & Innovation
 
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...NTT DATA Technology & Innovation
 
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)NTT DATA Technology & Innovation
 
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)NTT DATA Technology & Innovation
 
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...NTT DATA Technology & Innovation
 
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)NTT DATA Technology & Innovation
 
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)NTT DATA Technology & Innovation
 
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
PGCon 2023 参加報告(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
PGCon 2023 参加報告(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)PGCon 2023 参加報告(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
PGCon 2023 参加報告(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
どうする計画駆動型スクラム(スクラムフェス大阪2023 発表資料)
どうする計画駆動型スクラム(スクラムフェス大阪2023 発表資料)どうする計画駆動型スクラム(スクラムフェス大阪2023 発表資料)
どうする計画駆動型スクラム(スクラムフェス大阪2023 発表資料)NTT DATA Technology & Innovation
 
YugabyteDBの拡張機能(YugabyteDB Meetup #2 発表資料)
YugabyteDBの拡張機能(YugabyteDB Meetup #2 発表資料)YugabyteDBの拡張機能(YugabyteDB Meetup #2 発表資料)
YugabyteDBの拡張機能(YugabyteDB Meetup #2 発表資料)NTT DATA Technology & Innovation
 
PGOを用いたPostgreSQL on Kubernetes入門(Open Source Conference 2023 Online/Hokkaido...
PGOを用いたPostgreSQL on Kubernetes入門(Open Source Conference 2023 Online/Hokkaido...PGOを用いたPostgreSQL on Kubernetes入門(Open Source Conference 2023 Online/Hokkaido...
PGOを用いたPostgreSQL on Kubernetes入門(Open Source Conference 2023 Online/Hokkaido...NTT DATA Technology & Innovation
 
GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)
GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)
GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)NTT DATA Technology & Innovation
 
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
明日から始める! ソフトウェアのグリーン化(GSF MeetUp Tokyo 発表資料)
明日から始める! ソフトウェアのグリーン化(GSF MeetUp Tokyo 発表資料)明日から始める! ソフトウェアのグリーン化(GSF MeetUp Tokyo 発表資料)
明日から始める! ソフトウェアのグリーン化(GSF MeetUp Tokyo 発表資料)NTT DATA Technology & Innovation
 

More from NTT DATA Technology & Innovation (20)

COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)
COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)
COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方
 
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...
 
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)
 
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
 
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
 
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
 
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
 
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
 
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...
 
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
 
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)
 
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
PGCon 2023 参加報告(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
PGCon 2023 参加報告(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)PGCon 2023 参加報告(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
PGCon 2023 参加報告(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
どうする計画駆動型スクラム(スクラムフェス大阪2023 発表資料)
どうする計画駆動型スクラム(スクラムフェス大阪2023 発表資料)どうする計画駆動型スクラム(スクラムフェス大阪2023 発表資料)
どうする計画駆動型スクラム(スクラムフェス大阪2023 発表資料)
 
YugabyteDBの拡張機能(YugabyteDB Meetup #2 発表資料)
YugabyteDBの拡張機能(YugabyteDB Meetup #2 発表資料)YugabyteDBの拡張機能(YugabyteDB Meetup #2 発表資料)
YugabyteDBの拡張機能(YugabyteDB Meetup #2 発表資料)
 
PGOを用いたPostgreSQL on Kubernetes入門(Open Source Conference 2023 Online/Hokkaido...
PGOを用いたPostgreSQL on Kubernetes入門(Open Source Conference 2023 Online/Hokkaido...PGOを用いたPostgreSQL on Kubernetes入門(Open Source Conference 2023 Online/Hokkaido...
PGOを用いたPostgreSQL on Kubernetes入門(Open Source Conference 2023 Online/Hokkaido...
 
GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)
GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)
GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)
 
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
明日から始める! ソフトウェアのグリーン化(GSF MeetUp Tokyo 発表資料)
明日から始める! ソフトウェアのグリーン化(GSF MeetUp Tokyo 発表資料)明日から始める! ソフトウェアのグリーン化(GSF MeetUp Tokyo 発表資料)
明日から始める! ソフトウェアのグリーン化(GSF MeetUp Tokyo 発表資料)
 

Recently uploaded

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 

Recently uploaded (9)

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 

pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)

  • 1. © 2023 NTT DATA Group Corporation © 2023 NTT DATA Group Corporation pgvectorを使ってChatGPTとPostgreSQLを連携し てみよう! 2023/11/24 PostgreSQL Conference Japan 2023 株式会社NTTデータグループ 技術開発本部 石井愛弓
  • 2. © 2023 NTT DATA Group GROUP Corporation 2 目次 • はじめに • デモ • システムの流れ・実装の解説 • pgvectorについて • ベクトル類似度の計算の仕組み • インデックスの仕組み/パフォーマンス向上 • さいごに
  • 3. © 2023 NTT DATA Group GROUP Corporation 3 はじめに
  • 4. © 2023 NTT DATA Group Corporation 4 ChatGPTのデータソースにPostgreSQLを使うことができる! 今年に入って、一気に活用の場が広がっているChatGPT。 こんなことも知っているの?と感心する一方、しれ~っと嘘をつかれることも。 通常、学習済みデータからしか回答しないので、学習していないこと・最新情報(2021年9月以降)は答えられない。 ⇒回答の精度を上げるために、RAGという手法が注目されている • RAG(Retrieval-Augmented Generation) • LLM(大規模言語モデル)が学習済みでない外部データをLLMに与えて、生成する回答の質を上げる方法 外部データはベクトルデータベースで作成する必要がある。 PostgreSQLもpgvectorを使えば、外部データとして使うことができる!
  • 5. © 2023 NTT DATA Group Corporation 5 RAGによって実現できること オリジナルデータは、常に更新でき、公開情報でなくても(OpenAIのサーバには送信が必要)、データソースにできる。 • 社内のマニュアルをインプットして、チャットで回答する社内Botを作る • 企業の商品データをインプットして、似た商品をリコメンドするチャットを作る • 常に最新ニュースをインプットして、時事問題を作成する • ユーザのチャット履歴を随時記録して、以後の回答に利用する …などなど。
  • 6. © 2023 NTT DATA Group Corporation 6 ChatGPTのデータソースにPostgreSQLを使う方法 1. chatgpt-retrieval-pluginを使う • OpenAIが公開しているプラグイン • 詳細は、以下スライド • https://www.slideshare.net/nttdata-tech/postgresql-chatgpt-odc2023-nttdata 2. LangChainを使う • https://www.langchain.com/ • 大規模言語モデル(LLM)を使ってアプリ開発を行うためのフレームワーク。 • 今回はこちらを紹介
  • 7. © 2023 NTT DATA Group Corporation 7 LangChainの主なコンポーネント • Models • LLMs, Chat Models, Text Embedding Modelsから様々なモデルの切替、組み合わせが可能 • Prompts • モデルに入力するプロンプトをテンプレート化して、生成できる • Indexes • ドキュメントローダ、テキストスプリッターなどを使って、外部データを使えるようにする ★今回主に利用するのはこちら • Memory • 会話の履歴を保存・利用する • Chains • LLMにプロンプト・モデル等を渡して、回答を取得する • Agents • ユーザの入力に応じて、実行するアクションを分岐する • 例えば、最新情報の質問ならGoogle検索へ、プラグイン利用の場合はプラグインへ、など。 詳細は公式ドキュメントhttps://docs.langchain.com/docs/
  • 8. © 2023 NTT DATA Group GROUP Corporation 8 デモ
  • 9. © 2023 NTT DATA Group GROUP Corporation 9 今回のデモについて • ChatGPTも知らない「私の家族の好きな食べ物」を答えてくれるアプリ。 • 事前準備として、好きな食べ物情報をベクトル化してPostgreSQLに入れておく。 • ChatGPTに、PostgreSQLからとってきた情報を参照して回答を返してもらう。 使用した主なコンポーネント • Python 3.10 • PostgreSQL + pgvector • OpenAI API • LangChain
  • 10. © 2023 NTT DATA Group Corporation 10 ちなみに、外部データなしだと、こうなります。
  • 11. © 2023 NTT DATA Group Corporation 11 デモ:データ挿入編
  • 12. © 2023 NTT DATA Group Corporation 12 デモ:回答取得編
  • 13. © 2023 NTT DATA Group GROUP Corporation 13 システムの流れと実装
  • 14. © 2023 NTT DATA Group Corporation 14 全体像 PostgreSQL pgvector オリジナルデータ (TXT) LangChain OpenAI Embeddings API 読み込み&分割 ②・⑤ベクトル化 ③insert ① ④問い合わせ(自然言語) ChatGPT API ⑥ 類似検索 ⑦検索結果をもとにprompt合成 ⑧prompt質問 ⑨回答 ① LangChainがテキストデータを読み込み、分割する
  • 15. © 2023 NTT DATA Group Corporation 15 全体像 PostgreSQL pgvector オリジナルデータ (TXT) LangChain OpenAI Embeddings API 読み込み&分割 ②・⑤ベクトル化 ③insert ① ④問い合わせ(自然言語) ChatGPT API ⑥ 類似検索 ⑦検索結果をもとにprompt合成 ⑧prompt質問 ⑨回答 ②自然言語をベクトルに変換 私はPostgreSQLが好きです Open AI Embeddings API text-embedding-ada-002モデル [0.00058671045, - 0.004581401, .......] 文字数に関係なく 1536次元のベクトル になる
  • 16. © 2023 NTT DATA Group Corporation 16 Embedding models 2022年12月にリリースされた第二世代のtext-embedding-ada-002モデルをOpenAIも推奨。 ほぼすべてのユースケースで、他モデルより品質が高く、安く、使いやすいため。 LangChainの関数では、 text-embedding-ada-002が指定されている • トークナイザとは • 文章をトークンに分割するプログラム モデル トークナイザ 最大入力 トークン数 出力する ベクトルの次元 知識の 切れ目 text-embedding-ada-002 cl100k_base 8191 1536 Sep 2021 https://platform.openai.com/docs/guides/embeddings/what-are-embeddings
  • 17. © 2023 NTT DATA Group Corporation 17 似ている単語は、近いベクトルになる。 実際は1536次元だが、2次元でイメージするなら以下のような感じ。 お菓子 チョコ PostgreSQL MySQL データベース デザート ベクトル間の距離を計算することで、 単語の類似度を計算できるようになる。
  • 18. © 2023 NTT DATA Group Corporation 18 全体像 PostgreSQL pgvector オリジナルデータ (TXT) LangChain OpenAI Embeddings API 読み込み&分割 ②・⑤ベクトル化 ③insert ① ④問い合わせ(自然言語) ChatGPT API ⑥ 類似検索 ⑦検索結果をもとにprompt合成 ⑧prompt質問 ⑨回答 ③LangChainがベクトルデータをPostgreSQLにinsertする ここまでで準備完了!
  • 19. © 2023 NTT DATA Group Corporation 19 データを入れるまでのソースコード セパレーターは改行(デフォルト) 文字数1000にマージ。 オーバーラップなし。 OpenAIのAPIでembeddings テーブルがないときは作成、データ の挿入が行われる
  • 20. © 2023 NTT DATA Group Corporation 20 from_documents db = PGVector.from_documents( embedding=embeddings, ←ベクトルデータ documents=docs, ←原文 collection_name=“test”, ←コレクション名 connection_string=CONNECTION_STRING, ←接続文字列 pre_delete_collection=False, ←データ挿入前に既存のデータを削除するか? distance_strategy=DistanceStrategy. COSINE ←距離の計算方法 ids=None ←ユーザ独自のidを付けられる )
  • 21. © 2023 NTT DATA Group Corporation 21 実際に発行されるINSERT INSERT INTO langchain_pg_embedding (collection_id, embedding, document, cmetadata, custom_id, uuid) VALUES ('0effcd46-bfac-4363-83ed-c5a447349a7e'::uuid::UUID, ‘[-0.014597942336596845,0.0024809805856363864,(略)]’, '長女はブロッコリーが好きです。長男はチョコが好きです。’, {"source": "sample.txt"}’, 'c87e1582-81d6-11ee-bc52-0a5ea04d8ddb’, 'c7e45348-3d97-4024-a37d-13c27291ec25'::uuid::UUID) 〇pre_delete_collection=Trueの場合 DELETE FROM langchain_pg_collection WHERE langchain_pg_collection.uuid = '0a37f8bd-d054-44bf- b460-1248f7915ce9'::uuid::UUID
  • 22. © 2023 NTT DATA Group Corporation 22 PostgreSQLのテーブル • データを初期化するときに自動で作成される 列名 型 説明 collection_id uuid コレクションid embedding vector ベクトル化されたデータ document varchar 元の自然言語データ cmetadata json メタデータ custom_id varchar ユーザが好きに決められるid uuid uuid uuid 列名 型 説明 name varchar コレクション名。複数のデータセットを使い分けるときに使える。 cmetadata json メタデータ{“source”: “sample.txt”} など uuid uuid uuid langchain_pg_embedding langchain_pg_collection
  • 23. © 2023 NTT DATA Group Corporation 23 全体像 PostgreSQL pgvector オリジナルデータ (TXT) LangChain OpenAI Embeddings API 読み込み&分割 ②・⑤ベクトル化 ③insert ① ④問い合わせ(自然言語) ChatGPT API ⑥ 類似検索 ⑦検索結果をもとにprompt合成 ⑧prompt質問 ⑨回答 ④ユーザが自然言語で問い合わせをする
  • 24. © 2023 NTT DATA Group Corporation 24 全体像 PostgreSQL pgvector オリジナルデータ (TXT) LangChain OpenAI Embeddings API 読み込み&分割 ②・⑤ベクトル化 ③insert ① ④問い合わせ(自然言語) ChatGPT API ⑥ 類似検索 ⑦検索結果をもとにprompt合成 ⑧prompt質問 ⑨回答 ⑤ユーザの問い合わせをベクトル化する
  • 25. © 2023 NTT DATA Group Corporation 25 全体像 PostgreSQL pgvector オリジナルデータ (TXT) LangChain OpenAI Embeddings API 読み込み&分割 ②・⑤ベクトル化 ③insert ① ④問い合わせ(自然言語) ChatGPT API ⑥ 類似検索 ⑦検索結果をもとにprompt合成 ⑧prompt質問 ⑨回答 ⑥PostgreSQLからユーザの問い合わせと類似しているドキュメントを検索する ⇒pgvectorの関数を使ってベクトルの類似度を計算する。 ※詳細は後スライドで。
  • 26. © 2023 NTT DATA Group Corporation 26 全体像 PostgreSQL pgvector オリジナルデータ (TXT) LangChain OpenAI Embeddings API 読み込み&分割 ②・⑤ベクトル化 ③insert ① ④問い合わせ(自然言語) ChatGPT API ⑥ 類似検索 ⑦検索結果をもとにprompt合成 ⑧prompt質問 ⑨回答 ⑦PostgreSQLから検索した、類似度の高いドキュメントと、ユーザの元の問い合わせを合成して、 プロンプト(質問文)を作成する
  • 27. © 2023 NTT DATA Group Corporation 27 プロンプトの作成 Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer. {context} Question: {question} プロンプトは、ChatGPTに投げる質問文。 ChatGPTにはDBの情報を加味して回答してほしいので、元の質問文にDBの情報を加えてからChatGPTに投げる。 参考情報つきの質問を送っているようなイメージ。 プロンプトの作成は、LangChainが実施してくれるので、明示的なプログラムは書かなくてもOK 裏では、このように合成してくれている。 ←DBからとってきた文章:長女はブロッコリーが好きです。 ←ユーザの元の質問:長女は何が好きですか? ←以下の文脈を使って、最後の質問に答えてね。
  • 28. © 2023 NTT DATA Group Corporation 28 全体像 PostgreSQL pgvector オリジナルデータ (TXT) LangChain OpenAI Embeddings API 読み込み&分割 ②・⑤ベクトル化 ③insert ① ④問い合わせ(自然言語) ChatGPT API ⑥ 類似検索 ⑦検索結果をもとにprompt合成 ⑧prompt質問 ⑨回答 ⑧ChatGPTにプロンプトを渡す
  • 29. © 2023 NTT DATA Group Corporation 29 Open AI 文章生成モデルについて • LangChainのデフォルト:text-davinci-003 モデルファミリー 備考 新しいモデル (2023) gpt-4 (and gpt-4 turbo), gpt-3.5- turbo 1ドル以上の課金で使用可能 従来モデル アップデート版 (2023) babbage-002, davinci-002 参考: https://platform.openai.com/docs /models/moderation 従来モデル (2020~2022) text-davinci-003, text-davinci-002, davinci, curie, babbage, ada 参考: https://platform.openai.com/docs /models/gpt-3
  • 30. © 2023 NTT DATA Group Corporation 30 全体像 PostgreSQL pgvector オリジナルデータ (TXT) LangChain OpenAI Embeddings API 読み込み&分割 ②・⑤ベクトル化 ③insert ① ④問い合わせ(自然言語) ChatGPT API ⑥ 類似検索 ⑦検索結果をもとにprompt合成 ⑧prompt質問 ⑨回答 ⑨ChatGPTがユーザに答えを返却する
  • 31. © 2023 NTT DATA Group Corporation 31 データを取得するソースコード(サンプル)
  • 32. © 2023 NTT DATA Group Corporation 32 補足:OpenAI のAPIの実行にはAPI keyが必要 OpenAIでアカウントを登録してログイン API keyを発行して保存しておく ※Free trialが終わるとクレジット登録が必要になった。$0.0001 / 1K tokens 1トークンとは? エンコーディングの種類によって異なる 今回は、 「text-embedding-ada-002」モデルを使用。 このモデルでは、「cl100k_base」のエンコーディングを使 用。 日本語の場合、頻出単語は1トークン、それ以外は 複数トークンとなる。 基本的に文章が長いほど、トークンも大きくなる。 「こんにちは」→ 1 「石井です」 →5 「今日もよろしくお願いします。」→13 ざっと1000万字で1ドル位?
  • 33. © 2023 NTT DATA Group GROUP Corporation 33 pgvector
  • 34. © 2023 NTT DATA Group Corporation 34 pgvector https://github.com/pgvector/pgvector PostgreSQLでベクトル類似性検索ができるようになる拡張機能 今年に入って、githubのスター数うなぎ上りの注目機能 引用:https://star-history.com/#pgvector/pgvector&Date vector型を含むテーブルを作成し、データが保存できる CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3)); →3次元のベクトル列を作成 Supabase、RDS(15.2以降)、Azure、AlloyDBなどでも対応済み CREATE EXTENSION でインストール可能
  • 35. © 2023 NTT DATA Group Corporation 35 pgvectorのバージョンについて • 現在の最新バージョンはv0.5.1(2023年11月現在) • v0.5.0が大きなリリースのため、v0.5.0以降の利用がオススメ • HNSWインデックスのサポート • ivfflatインデックス構築の並列化 • l1距離追加 • 距離関数のパフォーマンス向上
  • 36. © 2023 NTT DATA Group Corporation 36 vector型 通常の列と同じようにデータのINSERT/UPDATE/DELETEできる Insert vectors Upsert vectors Update vectors Delete vectors INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]'); INSERT INTO items (id, embedding) VALUES (1, '[1,2,3]'), (2, '[4,5,6]') ON CONFLICT (id) DO UPDATE SET embedding = EXCLUDED.embedding; UPDATE items SET embedding = '[1,2,3]' WHERE id = 1; DELETE FROM items WHERE id = 1;
  • 37. © 2023 NTT DATA Group Corporation 37 vector型 各ベクトルは4 * 次元数 + 8バイトのストレージを必要とする 次元数は最大16000まで。 ベクトルの要素は、32ビット浮動小数点数。 ただし、さらに精度が必要な場合は、double precision[]またはnumeric[]を使用することも可能。 この場合、チェック制約により、vector型の変換が可能であること、期待される次元数があることを確認する。 インデックスを作成するときは、式インデックスを利用する。(精度はvector同等に落ちる) 検索の例: CREATE TABLE items (id bigserial PRIMARY KEY, embedding double precision[]); ALTER TABLE items ADD CHECK (vector_dims(embedding::vector) = 3); CREATE INDEX ON items USING hnsw ((embedding::vector(3)) vector_l2_ops); SELECT * FROM items ORDER BY embedding::vector(3) <-> '[3,1,2]' LIMIT 5;
  • 38. © 2023 NTT DATA Group Corporation 38 使える演算子 演算子 説明 + 要素ごとの加算 - 要素ごとの減算 * 要素ごとの乗算 <-> ユークリッド距離 <#> 内積×-1 <=> コサイン距離 いずれも距離としてとらえる。 値が小さいほど、ベクトルが似ている。
  • 39. © 2023 NTT DATA Group Corporation 39 使えるベクトル関数 関数 説明 cosine_distance(vector, vector) → double precision コサイン距離 inner_product(vector, vector) → double precision 内積 l2_distance(vector, vector) → double precision L2距離(ユークリッド距離) l1_distance(vector, vector) → double precision L1距離(マンハッタン距離) vector_dims(vector) → integer 次元数 vector_norm(vector) → double precision ユークリッドノルム (ベクトルの大きさ)
  • 40. © 2023 NTT DATA Group Corporation 40 使える集約関数 関数 説明 avg(vector) → vector ベクトルの平均 sum(vector) → vector ベクトルの合計
  • 41. © 2023 NTT DATA Group GROUP Corporation 41 距離関数
  • 42. © 2023 NTT DATA Group Corporation 42 ユークリッド距離とマンハッタン距離 SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5; →[3,1,2]とユークリッド距離が近いベクトルを順に5つ探す SELECT * FROM items ORDER BY l2_distance(embedding, '[3,1,2]’) LIMIT 5; →[3,1,2]とユークリッド距離が近いベクトルを順に5つ探す SELECT * FROM items ORDER BY l1_distance(embedding, ‘[3,1,2]’) LIMIT 5; →[3,1,2]とマンハッタン距離が近いベクトルを順に5つ探す ・ ・ ユークリッド距離 x y (x1, y1) (x2, y2) マンハッタン距離
  • 43. © 2023 NTT DATA Group Corporation 43 内積 内積も2つのベクトルの類似度を表すのに使える。 θ Ԧ 𝑎 ⋅ 𝑏 = Ԧ 𝑎 𝑏 cos 𝜃 Ԧ 𝑎 𝑏 𝑎1, 𝑎2 𝑏1, 𝑏2 Ԧ 𝑎 ⋅ 𝑏 = 𝑎1𝑏1 + 𝑎2𝑏2 公式②より ベクトルの大きさが同じなら、内積はなす角θが小さいほど大きくなる。 ⇒ベクトルの向きが似ているほど、内積は大きくなる。 pgvectorの演算子<#>は、内積の値に-1を乗算して返却。 -1を掛けているのは、小さいほど似ている値に変換するため。 ⇒ 似たベクトルを演算結果の昇順で取り出せる。 ※Postgres only supports ASC order index scans on operators (https://github.com/pgvector/pgvector) cos 𝜃 = Ԧ 𝑎 ⋅ 𝑏 Ԧ 𝑎 𝑏 公式① 公式② ただし、なす角が同じでも、ベクトルの大きさによって値が異なる。 ベクトルの大きさの影響を受けないようにするために、、 ⇒内積をベクトルの大きさで割って正規化。 ⇒コサイン類似度
  • 44. © 2023 NTT DATA Group Corporation 44 コサイン類似度とコサイン距離 コサイン類似度:cosθ なす角で決まる。向きが似ているか?を表す ・ 1 似てる 0 無関係 -1 正反対 θ θ コサイン類似度の値の範囲は-1~1 2つのベクトルが似ているほど、値が大きくなる。 pgvectorの <=>は、 1 – コサイン類似度=コサイン距離として取得することができる コサイン距離は、小さいほど向きが似ていることを示す。 ユークリッド距離と比較して、 テキストや画像など高次元データに効果的で、 ドキュメント検索のユースケースでよく使用される。 LangChainではこれがデフォルト。 なお、OpenAI embeddingsの場合、ベクトルの長さは1に正規化 されているので、内積と同じ。 ⇒この場合、内積のほうがよい。計算量が少ないので性能〇。 ・ ・
  • 45. © 2023 NTT DATA Group GROUP Corporation 45 インデックス
  • 46. © 2023 NTT DATA Group Corporation 46 pgvectorのインデックス:ivfflatとHNSW • 最も近いベクトルはどれか?を探すためのアルゴリズム • インデックスがない場合は、クエリと各ベクトルをすべて距離計算する必要があるので計算量が多い • 高速に検索するため、近似最近傍検索のためのインデックスが利用可能 • 必ず最近傍であることは保証しない • インデックス付与前と後で、クエリ結果が変わる可能性がある 1. ivfflat (Inverted File with Flat Compression) • pgvectorに最初から実装されていたインデックス。 2. HNSW(Hierarchical Navigable Small World) • ivfflatのみでは他のvector DBに比べ性能が低いという問題提起を受け、より高速化するために2023年9月にv0.5.0 で新しく実装されたインデックス。
  • 47. © 2023 NTT DATA Group Corporation 47 ivfflat • ivfflat(Inverted File with Flat Compression) あいぶいえふ ふらっと • インデックス作成時に、データセット内の各ベクトルをクラスタに分割する • 新しいベクトルが追加された場合は、最も重心が近いクラスタに割り当てる • 最近傍を検索する際は、まず、最も近いクラスターを特定し、その中から最近傍を検索する • 検索範囲が全体でなく一部となるため、パフォーマンス向上 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・・ ・ ・ ・ ・ ・・ ・ ・ ・ ★ ・ ・ ・ ・ ・ ・ ・ ★ ★
  • 48. © 2023 NTT DATA Group Corporation 48 ivfflatのクラスタの数について • インデックス作成時に、クラスタ数(リスト数:lists)を指定する • クラスタ数が多いほど… • クラスタ内のデータ数が少なくなるので、より高速に検索できる。 • ただし、最も近いデータが、最も近いクラスタに入っておらず、取りこぼす可能性も高くなる(再現率が低くなる) • トレードオフなので、アプリケーションに合わせて設定する • 目安 • 100万レコード以下のとき→records/1000 からやってみる • 100万レコードより多いとき→ sqrt(records) からやってみる • クラスタ数は少なくとも10個以上が好ましい。 create index on documents using ivfflat (embedding vector_ip_ops) with (lists = 100); 内積
  • 49. © 2023 NTT DATA Group Corporation 49 取りこぼしてしまう例 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・・ ・ ・ ・ ・ ・ ・ ・ ・ ★ ・ ・ ・ ・ ・ ・ ・ ★ ★ ▲ 一番近い重心は、上のクラスタ。 しかし、最近傍は、上のクラスタではなく、右のクラスタにある
  • 50. © 2023 NTT DATA Group Corporation 50 probesパラメータについて • 取りこぼしを減らすために、最も近い重心を持つクラスタだけでなく、他にも近いクラスタの中も検索する • デフォルト probes=1 →最も近い重心のクラスタのみ • probesを増やすと、より多くのクラスタ内で検索するので、再現率が向上(取りこぼしにくい) • 当然ながら、増やすほど速度は低下する。 • 目安:probes = sqrt(lists) SET文でトランザクション内で設定可能: 例) SET ivfflat.probes = 10;
  • 51. © 2023 NTT DATA Group Corporation 51 ivfflatインデックス構築の進捗状況の表示 PostgreSQL12以降では、インデックス構築の進捗状況を確認可能 ivfflatのフェーズは以下。 1. initializing 2. performing k-means 3. assigning tuples 4. loading tuples ※上記クエリの%は、loading tuplesのフェーズのみ。 SELECT phase, round(100.0 * tuples_done / nullif(tuples_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;
  • 52. © 2023 NTT DATA Group Corporation 52 ivfflatインデックスの注意点 • 最大2000次元までの列に付与可能 • データ(少なくとも数千レコード)が挿入されたあとでインデックスを追加すること。 • 実際のデータがない状態で作成するとクラスタの重心を適切に決めることができない。(ランダムになる) • インデックス作成後に、データを追加・削除・更新しても、インデックスは更新されるが、クラスタの重心は更新されない。 • データの更新がある場合、定期的なREIDEXが推奨 • CONCURRENTLY オプションを使えばテーブルへの書き込みをロックせず再作成できる
  • 53. © 2023 NTT DATA Group Corporation 53 HNSW • HNSW(Hierarchical Navigable Small World) • NSWの階層バージョン NSWとは? 引用元:https://www.pinecone.io/learn/series/faiss/hnsw/ 1. グラフを作っておく(作り方は後ほど) 2. entry pointからスタート 3. 自分からリンクされている要素の中で、一番クエリに近い要素に 移動する 4. 移動できなくなったら(自分が近くなったら)終了
  • 54. © 2023 NTT DATA Group Corporation 54 NSWを階層化したのがHNSW 一番下の層には全ての要素、 上に上がるごとに、要素が絞られたグラフを作成。 一番上の層からスタートし、最初は大きく、 だんだん小さく近づいていく。 新幹線→急行→各停に乗り換えるイメージ。 階層化することで、少ない計算量で近づけるので、 高速になる。 引用元:https://www.pinecone.io/learn/series/faiss/hnsw/
  • 55. © 2023 NTT DATA Group Corporation 55 HNSWの作り方①層を決定する 引用元:https://www.pinecone.io/learn/series/faiss/hnsw/ 新しく要素を追加するとき、 例えば、 layer 2 = 12.5 % layer 1 = 50% layer 0 = 100% のように、 上の層ほど少なくなるような確率を用いて、 ランダムに層を決定する。 layer0はすべての要素が存在する。 要素があとからどんどん追加されていっても、 各層のバランスが崩れない。 (インデックス作成後にデータを追加しても問題なし)
  • 56. © 2023 NTT DATA Group Corporation 56 HNSWの作り方②リンクを作成する Mは、リンク数。 M=3なら、近い3つの要素とリンクを作成する pgvectorのmは、各レイヤの最大リンク数。 引用元:https://www.pinecone.io/learn/series/faiss/hnsw/
  • 57. © 2023 NTT DATA Group Corporation 57 HNSWのパラメータ • M:リンク数 • デフォルト:16、範囲:2~100 • 少なすぎると、再現率が下がる。(最近傍を取りこぼすかも) • 大きくなるほど、インデックス構築時間増、メモリ使用量増、検索時間増。 • ef_construction:インデックス構築中に何個の近傍をリストとして持つか • デフォルト:64、範囲:4~1000 • 小さすぎると、再現率が下がる。ただしある点から増やしても再現性があがりにくくなる。 • 大きくすると、インデックス構築時間が長くなる • ef_search:検索中に何個の近傍をリストとして持つか • デフォルト:40、範囲:1~1000 • 小さいほど、高速 • 大きいほど、再現率があがる
  • 58. © 2023 NTT DATA Group Corporation 58 HNSWインデックス構築の進捗状況の表示 PostgreSQL12以降では、インデックス構築の進捗状況を確認可能 HNSWのフェーズは以下。 1. initializing 2. loading tuples SELECT phase, round(100.0 * blocks_done / nullif(blocks_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;
  • 59. © 2023 NTT DATA Group Corporation 59 HNSWの特徴 • 最大2000次元までの列に付与可能 • ivfflatと比較して、、 • インデックス構築時間が長い&メモリ使用量が多いが、検索が高速 • テーブルにデータがなくてもインデックスを作成可能
  • 60. © 2023 NTT DATA Group Corporation 60 検索時間について 引用:https://neon.tech/blog/pg-embedding-extension-for-vector-search 再現率99%を達成するとき、 ivfflat ( pgvector) は HNSW( pg_embedding) の20倍の実行時間 ivfflatとHNSWは性能が大きく異なる
  • 61. © 2023 NTT DATA Group Corporation 61 インデックスの比較 ivfflat HNSW 検索速度 △ 〇 正確さ △ 〇 メモリ使用量 〇 × インデックス構築速度 〇 × 選び方: • 検索速度を重視する場合は、HNSW。 • メモリ制限がある場合はivfflat。 参考:https://neon.tech/blog/pg-embedding-extension-for-vector-search
  • 62. © 2023 NTT DATA Group Corporation 62 さいごに • とても簡単な手順で、ChatGTPのデータソースにPostgreSQLを使うことができた • ぜひ皆さんも、使ってみてください