Movatterモバイル変換


[0]ホーム

URL:


SlideShare a Scribd company logo

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

0 likes5,389 views
N
NTT DATA Technology & Innovation

pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)2023年11月24日(金)NTTデータグループ技術開発本部石井 愛弓

1 of 63
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Most read
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Most read
45
46
47
48
49
50
51
52
53
54
55
Most read
56
57
58
59
60
61
62
63
© 2023 NTT DATA Group Corporation© 2023 NTT DATA Group Corporationpgvectorを使って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 4ChatGPTのデータソースにPostgreSQLを使うことができる!今年に入って、一気に活用の場が広がっているChatGPT。こんなことも知っているの?と感心する一方、しれ~っと嘘をつかれることも。通常、学習済みデータからしか回答しないので、学習していないこと・最新情報(2021年9月以降)は答えられない。⇒回答の精度を上げるために、RAGという手法が注目されている• RAG(Retrieval-Augmented Generation)• LLM(大規模言語モデル)が学習済みでない外部データをLLMに与えて、生成する回答の質を上げる方法外部データはベクトルデータベースで作成する必要がある。PostgreSQLもpgvectorを使えば、外部データとして使うことができる!
© 2023 NTT DATA Group Corporation 5RAGによって実現できることオリジナルデータは、常に更新でき、公開情報でなくても(OpenAIのサーバには送信が必要)、データソースにできる。• 社内のマニュアルをインプットして、チャットで回答する社内Botを作る• 企業の商品データをインプットして、似た商品をリコメンドするチャットを作る• 常に最新ニュースをインプットして、時事問題を作成する• ユーザのチャット履歴を随時記録して、以後の回答に利用する…などなど。
© 2023 NTT DATA Group Corporation 6ChatGPTのデータソースにPostgreSQLを使う方法1. chatgpt-retrieval-pluginを使う• OpenAIが公開しているプラグイン• 詳細は、以下スライド• https://www.slideshare.net/nttdata-tech/postgresql-chatgpt-odc2023-nttdata2. LangChainを使う• https://www.langchain.com/• 大規模言語モデル(LLM)を使ってアプリ開発を行うためのフレームワーク。• 今回はこちらを紹介
© 2023 NTT DATA Group Corporation 7LangChainの主なコンポーネント• 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全体像PostgreSQLpgvectorオリジナルデータ(TXT)LangChainOpenAIEmbeddingsAPI読み込み&分割②・⑤ベクトル化③insert①④問い合わせ(自然言語)ChatGPTAPI⑥類似検索⑦検索結果をもとにprompt合成⑧prompt質問⑨回答① LangChainがテキストデータを読み込み、分割する
© 2023 NTT DATA Group Corporation 15全体像PostgreSQLpgvectorオリジナルデータ(TXT)LangChainOpenAIEmbeddingsAPI読み込み&分割②・⑤ベクトル化③insert①④問い合わせ(自然言語)ChatGPTAPI⑥類似検索⑦検索結果をもとにprompt合成⑧prompt質問⑨回答②自然言語をベクトルに変換私はPostgreSQLが好きです Open AI Embeddings APItext-embedding-ada-002モデル[0.00058671045, -0.004581401, .......]文字数に関係なく1536次元のベクトルになる
© 2023 NTT DATA Group Corporation 16Embedding models2022年12月にリリースされた第二世代のtext-embedding-ada-002モデルをOpenAIも推奨。ほぼすべてのユースケースで、他モデルより品質が高く、安く、使いやすいため。LangChainの関数では、 text-embedding-ada-002が指定されている• トークナイザとは• 文章をトークンに分割するプログラムモデル トークナイザ 最大入力トークン数出力するベクトルの次元知識の切れ目text-embedding-ada-002 cl100k_base 8191 1536 Sep 2021https://platform.openai.com/docs/guides/embeddings/what-are-embeddings
© 2023 NTT DATA Group Corporation 17似ている単語は、近いベクトルになる。実際は1536次元だが、2次元でイメージするなら以下のような感じ。お菓子チョコPostgreSQLMySQLデータベースデザートベクトル間の距離を計算することで、単語の類似度を計算できるようになる。
© 2023 NTT DATA Group Corporation 18全体像PostgreSQLpgvectorオリジナルデータ(TXT)LangChainOpenAIEmbeddingsAPI読み込み&分割②・⑤ベクトル化③insert①④問い合わせ(自然言語)ChatGPTAPI⑥類似検索⑦検索結果をもとにprompt合成⑧prompt質問⑨回答③LangChainがベクトルデータをPostgreSQLにinsertするここまでで準備完了!
© 2023 NTT DATA Group Corporation 19データを入れるまでのソースコードセパレーターは改行(デフォルト)文字数1000にマージ。オーバーラップなし。OpenAIのAPIでembeddingsテーブルがないときは作成、データの挿入が行われる
© 2023 NTT DATA Group Corporation 20from_documentsdb = 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実際に発行されるINSERTINSERT 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 22PostgreSQLのテーブル• データを初期化するときに自動で作成される列名 型 説明collection_id uuid コレクションidembedding vector ベクトル化されたデータdocument varchar 元の自然言語データcmetadata json メタデータcustom_id varchar ユーザが好きに決められるiduuid uuid uuid列名 型 説明name varchar コレクション名。複数のデータセットを使い分けるときに使える。cmetadata json メタデータ{“source”: “sample.txt”} などuuid uuid uuidlangchain_pg_embeddinglangchain_pg_collection
© 2023 NTT DATA Group Corporation 23全体像PostgreSQLpgvectorオリジナルデータ(TXT)LangChainOpenAIEmbeddingsAPI読み込み&分割②・⑤ベクトル化③insert①④問い合わせ(自然言語)ChatGPTAPI⑥類似検索⑦検索結果をもとにprompt合成⑧prompt質問⑨回答④ユーザが自然言語で問い合わせをする
© 2023 NTT DATA Group Corporation 24全体像PostgreSQLpgvectorオリジナルデータ(TXT)LangChainOpenAIEmbeddingsAPI読み込み&分割②・⑤ベクトル化③insert①④問い合わせ(自然言語)ChatGPTAPI⑥類似検索⑦検索結果をもとにprompt合成⑧prompt質問⑨回答⑤ユーザの問い合わせをベクトル化する
© 2023 NTT DATA Group Corporation 25全体像PostgreSQLpgvectorオリジナルデータ(TXT)LangChainOpenAIEmbeddingsAPI読み込み&分割②・⑤ベクトル化③insert①④問い合わせ(自然言語)ChatGPTAPI⑥類似検索⑦検索結果をもとにprompt合成⑧prompt質問⑨回答⑥PostgreSQLからユーザの問い合わせと類似しているドキュメントを検索する⇒pgvectorの関数を使ってベクトルの類似度を計算する。※詳細は後スライドで。
© 2023 NTT DATA Group Corporation 26全体像PostgreSQLpgvectorオリジナルデータ(TXT)LangChainOpenAIEmbeddingsAPI読み込み&分割②・⑤ベクトル化③insert①④問い合わせ(自然言語)ChatGPTAPI⑥類似検索⑦検索結果をもとにprompt合成⑧prompt質問⑨回答⑦PostgreSQLから検索した、類似度の高いドキュメントと、ユーザの元の問い合わせを合成して、プロンプト(質問文)を作成する
© 2023 NTT DATA Group Corporation 27プロンプトの作成Use the following pieces of context to answer the question atthe end. If you don't know the answer, just say that you don'tknow, 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全体像PostgreSQLpgvectorオリジナルデータ(TXT)LangChainOpenAIEmbeddingsAPI読み込み&分割②・⑤ベクトル化③insert①④問い合わせ(自然言語)ChatGPTAPI⑥類似検索⑦検索結果をもとにprompt合成⑧prompt質問⑨回答⑧ChatGPTにプロンプトを渡す
© 2023 NTT DATA Group Corporation 29Open AI 文章生成モデルについて• LangChainのデフォルト:text-davinci-003モデルファミリー 備考新しいモデル(2023)gpt-4 (and gpt-4 turbo), gpt-3.5-turbo1ドル以上の課金で使用可能従来モデルアップデート版(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全体像PostgreSQLpgvectorオリジナルデータ(TXT)LangChainOpenAIEmbeddingsAPI読み込み&分割②・⑤ベクトル化③insert①④問い合わせ(自然言語)ChatGPTAPI⑥類似検索⑦検索結果をもとに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 tokens1トークンとは?エンコーディングの種類によって異なる今回は、 「text-embedding-ada-002」モデルを使用。このモデルでは、「cl100k_base」のエンコーディングを使用。日本語の場合、頻出単語は1トークン、それ以外は複数トークンとなる。基本的に文章が長いほど、トークンも大きくなる。「こんにちは」→ 1「石井です」 →5「今日もよろしくお願いします。」→13ざっと1000万字で1ドル位?
© 2023 NTT DATA Group GROUP Corporation 33pgvector
© 2023 NTT DATA Group Corporation 34pgvectorhttps://github.com/pgvector/pgvectorPostgreSQLでベクトル類似性検索ができるようになる拡張機能今年に入って、githubのスター数うなぎ上りの注目機能引用:https://star-history.com/#pgvector/pgvector&Datevector型を含むテーブルを作成し、データが保存できるCREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3));→3次元のベクトル列を作成Supabase、RDS(15.2以降)、Azure、AlloyDBなどでも対応済みCREATE EXTENSION でインストール可能
© 2023 NTT DATA Group Corporation 35pgvectorのバージョンについて• 現在の最新バージョンはv0.5.1(2023年11月現在)• v0.5.0が大きなリリースのため、v0.5.0以降の利用がオススメ• HNSWインデックスのサポート• ivfflatインデックス構築の並列化• l1距離追加• 距離関数のパフォーマンス向上
© 2023 NTT DATA Group Corporation 36vector型通常の列と同じようにデータのINSERT/UPDATE/DELETEできるInsert vectorsUpsert vectorsUpdate vectorsDelete vectorsINSERT 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 37vector型各ベクトルは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 precisionL2距離(ユークリッド距離)l1_distance(vector, vector)→ double precisionL1距離(マンハッタン距離)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 BYembedding <-> '[3,1,2]' LIMIT 5;→[3,1,2]とユークリッド距離が近いベクトルを順に5つ探すSELECT * FROM items ORDER BYl2_distance(embedding, '[3,1,2]’) LIMIT 5;→[3,1,2]とユークリッド距離が近いベクトルを順に5つ探すSELECT * FROM items ORDER BYl1_distance(embedding, ‘[3,1,2]’) LIMIT 5;→[3,1,2]とマンハッタン距離が近いベクトルを順に5つ探す・・ユークリッド距離xy(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~12つのベクトルが似ているほど、値が大きくなる。pgvectorの <=>は、1 – コサイン類似度=コサイン距離として取得することができるコサイン距離は、小さいほど向きが似ていることを示す。ユークリッド距離と比較して、テキストや画像など高次元データに効果的で、ドキュメント検索のユースケースでよく使用される。LangChainではこれがデフォルト。なお、OpenAI embeddingsの場合、ベクトルの長さは1に正規化されているので、内積と同じ。⇒この場合、内積のほうがよい。計算量が少ないので性能〇。・・
© 2023 NTT DATA Group GROUP Corporation 45インデックス
© 2023 NTT DATA Group Corporation 46pgvectorのインデックス: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 47ivfflat• ivfflat(Inverted File with Flat Compression) あいぶいえふ ふらっと• インデックス作成時に、データセット内の各ベクトルをクラスタに分割する• 新しいベクトルが追加された場合は、最も重心が近いクラスタに割り当てる• 最近傍を検索する際は、まず、最も近いクラスターを特定し、その中から最近傍を検索する• 検索範囲が全体でなく一部となるため、パフォーマンス向上・・・・ ・・・・・・・・・・・・・・ ・・★・・ ・・ ・・・★★
© 2023 NTT DATA Group Corporation 48ivfflatのクラスタの数について• インデックス作成時に、クラスタ数(リスト数: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 50probesパラメータについて• 取りこぼしを減らすために、最も近い重心を持つクラスタだけでなく、他にも近いクラスタの中も検索する• デフォルト probes=1 →最も近い重心のクラスタのみ• probesを増やすと、より多くのクラスタ内で検索するので、再現率が向上(取りこぼしにくい)• 当然ながら、増やすほど速度は低下する。• 目安:probes = sqrt(lists)SET文でトランザクション内で設定可能:例)SET ivfflat.probes = 10;
© 2023 NTT DATA Group Corporation 51ivfflatインデックス構築の進捗状況の表示PostgreSQL12以降では、インデックス構築の進捗状況を確認可能ivfflatのフェーズは以下。1. initializing2. performing k-means3. assigning tuples4. loading tuples※上記クエリの%は、loading tuplesのフェーズのみ。SELECT phase, round(100.0 * tuples_done / nullif(tuples_total, 0), 1) AS "%" FROMpg_stat_progress_create_index;
© 2023 NTT DATA Group Corporation 52ivfflatインデックスの注意点• 最大2000次元までの列に付与可能• データ(少なくとも数千レコード)が挿入されたあとでインデックスを追加すること。• 実際のデータがない状態で作成するとクラスタの重心を適切に決めることができない。(ランダムになる)• インデックス作成後に、データを追加・削除・更新しても、インデックスは更新されるが、クラスタの重心は更新されない。• データの更新がある場合、定期的なREIDEXが推奨• CONCURRENTLY オプションを使えばテーブルへの書き込みをロックせず再作成できる
© 2023 NTT DATA Group Corporation 53HNSW• 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 54NSWを階層化したのがHNSW一番下の層には全ての要素、上に上がるごとに、要素が絞られたグラフを作成。一番上の層からスタートし、最初は大きく、だんだん小さく近づいていく。新幹線→急行→各停に乗り換えるイメージ。階層化することで、少ない計算量で近づけるので、高速になる。引用元:https://www.pinecone.io/learn/series/faiss/hnsw/
© 2023 NTT DATA Group Corporation 55HNSWの作り方①層を決定する引用元:https://www.pinecone.io/learn/series/faiss/hnsw/新しく要素を追加するとき、例えば、layer 2 = 12.5 %layer 1 = 50%layer 0 = 100% のように、上の層ほど少なくなるような確率を用いて、ランダムに層を決定する。layer0はすべての要素が存在する。要素があとからどんどん追加されていっても、各層のバランスが崩れない。(インデックス作成後にデータを追加しても問題なし)
© 2023 NTT DATA Group Corporation 56HNSWの作り方②リンクを作成するMは、リンク数。M=3なら、近い3つの要素とリンクを作成するpgvectorのmは、各レイヤの最大リンク数。引用元:https://www.pinecone.io/learn/series/faiss/hnsw/
© 2023 NTT DATA Group Corporation 57HNSWのパラメータ• M:リンク数• デフォルト:16、範囲:2~100• 少なすぎると、再現率が下がる。(最近傍を取りこぼすかも)• 大きくなるほど、インデックス構築時間増、メモリ使用量増、検索時間増。• ef_construction:インデックス構築中に何個の近傍をリストとして持つか• デフォルト:64、範囲:4~1000• 小さすぎると、再現率が下がる。ただしある点から増やしても再現性があがりにくくなる。• 大きくすると、インデックス構築時間が長くなる• ef_search:検索中に何個の近傍をリストとして持つか• デフォルト:40、範囲:1~1000• 小さいほど、高速• 大きいほど、再現率があがる
© 2023 NTT DATA Group Corporation 58HNSWインデックス構築の進捗状況の表示PostgreSQL12以降では、インデックス構築の進捗状況を確認可能HNSWのフェーズは以下。1. initializing2. loading tuplesSELECT phase, round(100.0 * blocks_done / nullif(blocks_total, 0), 1) AS "%" FROMpg_stat_progress_create_index;
© 2023 NTT DATA Group Corporation 59HNSWの特徴• 最大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を使うことができた• ぜひ皆さんも、使ってみてください
記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。
Ad

Recommended

PDF
Phybbit Series A 事業計画書
Satoko Ohtsuki
 
PDF
Transformer メタサーベイ
cvpaper. challenge
 
PDF
ユーザーにうれしいチャットボットのUX 7原則 - 7 Principles to Design UX of Chatbots
Yoshiki Hayama
 
PDF
Classification of Hand Tools - PART 3
Pilita Santos
 
PDF
Knowledge Graph Generation from Wikipedia in the Age of ChatGPT: Knowledge ...
Heiko Paulheim
 
PDF
[DL輪読会]Scalable Training of Inference Networks for Gaussian-Process Models
Deep Learning JP
 
PPTX
【DL輪読会】時系列予測 Transfomers の精度向上手法
Deep Learning JP
 
PDF
[Oracle DBA & Developer Day 2016] しばちょう先生の特別講義!!ストレージ管理のベストプラクティス ~ASMからExada...
オラクルエンジニア通信
 
PPTX
分散システムについて語らせてくれ
Kumazaki Hiroki
 
PPTX
PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PPTX
Apache Avro vs Protocol Buffers
Seiya Mizuno
 
PPTX
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PPTX
世の中のPostgreSQLエンジニアのpsql設定(第34回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
NTT DATA OSS Professional Services
 
PDF
マイクロにしすぎた結果がこれだよ!
mosa siru
 
PDF
PostgreSQL: XID周回問題に潜む別の問題
NTT DATA OSS Professional Services
 
PPTX
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
NTT DATA Technology & Innovation
 
PDF
PostgreSQL 15の新機能を徹底解説
Masahiko Sawada
 
PPTX
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
ストリーム処理を支えるキューイングシステムの選び方
Yoshiyasu SAEKI
 
PDF
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
NTT DATA Technology & Innovation
 
PDF
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
 
PDF
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
NTT DATA Technology & Innovation
 
PDF
AWSではじめるMLOps
MariOhbuchi
 
PPTX
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
NTT DATA Technology & Innovation
 
PPTX
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
NTT DATA OSS Professional Services
 
PPTX
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
NTT DATA Technology & Innovation
 

More Related Content

What's hot(20)

PPTX
分散システムについて語らせてくれ
Kumazaki Hiroki
 
PPTX
PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PPTX
Apache Avro vs Protocol Buffers
Seiya Mizuno
 
PPTX
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PPTX
世の中のPostgreSQLエンジニアのpsql設定(第34回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
NTT DATA OSS Professional Services
 
PDF
マイクロにしすぎた結果がこれだよ!
mosa siru
 
PDF
PostgreSQL: XID周回問題に潜む別の問題
NTT DATA OSS Professional Services
 
PPTX
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
NTT DATA Technology & Innovation
 
PDF
PostgreSQL 15の新機能を徹底解説
Masahiko Sawada
 
PPTX
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
ストリーム処理を支えるキューイングシステムの選び方
Yoshiyasu SAEKI
 
PDF
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
NTT DATA Technology & Innovation
 
PDF
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
 
PDF
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
NTT DATA Technology & Innovation
 
PDF
AWSではじめるMLOps
MariOhbuchi
 
PPTX
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
NTT DATA Technology & Innovation
 
PPTX
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
NTT DATA Technology & Innovation
 
分散システムについて語らせてくれ
Kumazaki Hiroki
 
PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
Apache Avro vs Protocol Buffers
Seiya Mizuno
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
世の中のPostgreSQLエンジニアのpsql設定(第34回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
NTT DATA OSS Professional Services
 
マイクロにしすぎた結果がこれだよ!
mosa siru
 
PostgreSQL: XID周回問題に潜む別の問題
NTT DATA OSS Professional Services
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
NTT DATA Technology & Innovation
 
PostgreSQL 15の新機能を徹底解説
Masahiko Sawada
 
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
ストリーム処理を支えるキューイングシステムの選び方
Yoshiyasu SAEKI
 
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
NTT DATA Technology & Innovation
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
 
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
NTT DATA Technology & Innovation
 
AWSではじめるMLOps
MariOhbuchi
 
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
NTT DATA Technology & Innovation
 

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

PDF
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
NTT DATA OSS Professional Services
 
PPTX
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
NTT DATA Technology & Innovation
 
PDF
使ってみませんか?pg hint_plan
Masao Fujii
 
PPTX
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
NTT DATA Technology & Innovation
 
PDF
Data Scientists Love SQL Server
Tomoyuki Oota
 
PDF
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
NTT DATA Technology & Innovation
 
PDF
[D33] そのデータベース 5年後大丈夫ですか by Hiromu Goto
Insight Technology, Inc.
 
PDF
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(前編)
日本マイクロソフト株式会社
 
PDF
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
NTT DATA Technology & Innovation
 
PDF
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
NTT DATA Technology & Innovation
 
PDF
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
NTT DATA OSS Professional Services
 
PPTX
大量のデータ処理や分析に使えるOSS Apache Spark入門 - Open Source Conference2020 Online/Fukuoka...
NTT DATA Technology & Innovation
 
PDF
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
NTT DATA Technology & Innovation
 
PPTX
Attunityのソリューションと異種データベース・クラウド移行事例のご紹介
Insight Technology, Inc.
 
PPTX
Attunity社のソリューションの日本国内外適用事例及びロードマップ紹介[ATTUNITY & インサイトテクノロジー IoT / Big Data フ...
Insight Technology, Inc.
 
PDF
オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜
griddb
 
PDF
20190925_DBTS_PGStrom
Kohei KaiGai
 
PPTX
エンジニアのための Azure 基礎知識
Daiyu Hatakeyama
 
PPTX
Microsoft AI Solution Update / DLL community Update
Hirono Jumpei
 
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
NTT DATA OSS Professional Services
 
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
NTT DATA Technology & Innovation
 
使ってみませんか?pg hint_plan
Masao Fujii
 
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
NTT DATA Technology & Innovation
 
Data Scientists Love SQL Server
Tomoyuki Oota
 
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
NTT DATA Technology & Innovation
 
[D33] そのデータベース 5年後大丈夫ですか by Hiromu Goto
Insight Technology, Inc.
 
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(前編)
日本マイクロソフト株式会社
 
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
NTT DATA Technology & Innovation
 
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
NTT DATA Technology & Innovation
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
NTT DATA OSS Professional Services
 
大量のデータ処理や分析に使えるOSS Apache Spark入門 - Open Source Conference2020 Online/Fukuoka...
NTT DATA Technology & Innovation
 
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
NTT DATA Technology & Innovation
 
Attunityのソリューションと異種データベース・クラウド移行事例のご紹介
Insight Technology, Inc.
 
Attunity社のソリューションの日本国内外適用事例及びロードマップ紹介[ATTUNITY & インサイトテクノロジー IoT / Big Data フ...
Insight Technology, Inc.
 
オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜
griddb
 
20190925_DBTS_PGStrom
Kohei KaiGai
 
エンジニアのための Azure 基礎知識
Daiyu Hatakeyama
 
Microsoft AI Solution Update / DLL community Update
Hirono Jumpei
 
Ad

More from NTT DATA Technology & Innovation(20)

PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
PDF
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
2025年現在のNewSQL (最強DB講義 #36 発表資料)
NTT DATA Technology & Innovation
 
PDF
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
NTT DATA Technology & Innovation
 
PDF
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
NTT DATA Technology & Innovation
 
PDF
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
NTT DATA Technology & Innovation
 
PDF
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
NTT DATA Technology & Innovation
 
PDF
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
NTT DATA Technology & Innovation
 
PDF
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
NTT DATA Technology & Innovation
 
PDF
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
NTT DATA Technology & Innovation
 
PDF
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...
NTT DATA Technology & Innovation
 
PDF
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
 
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
 
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
NTT DATA Technology & Innovation
 
2025年現在のNewSQL (最強DB講義 #36 発表資料)
NTT DATA Technology & Innovation
 
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
NTT DATA Technology & Innovation
 
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
NTT DATA Technology & Innovation
 
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
NTT DATA Technology & Innovation
 
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
NTT DATA Technology & Innovation
 
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
NTT DATA Technology & Innovation
 
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
NTT DATA Technology & Innovation
 
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
NTT DATA Technology & Innovation
 
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
NTT DATA Technology & Innovation
 
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
NTT DATA Technology & Innovation
 
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...
NTT DATA Technology & Innovation
 
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
 
Ad

Recently uploaded(7)

PDF
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
PDF
20250711_日本IBM ミドルウエア・ユーザー研究会(JIMUC)総会_中村会長資料.pdf
ChikakoInami1
 
PDF
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
PDF
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
PDF
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
PDF
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
PDF
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
20250711_日本IBM ミドルウエア・ユーザー研究会(JIMUC)総会_中村会長資料.pdf
ChikakoInami1
 
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 

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

  • 1.© 2023 NTT DATA Group Corporation© 2023 NTT DATA Group Corporationpgvectorを使って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 4ChatGPTのデータソースにPostgreSQLを使うことができる!今年に入って、一気に活用の場が広がっているChatGPT。こんなことも知っているの?と感心する一方、しれ~っと嘘をつかれることも。通常、学習済みデータからしか回答しないので、学習していないこと・最新情報(2021年9月以降)は答えられない。⇒回答の精度を上げるために、RAGという手法が注目されている• RAG(Retrieval-Augmented Generation)• LLM(大規模言語モデル)が学習済みでない外部データをLLMに与えて、生成する回答の質を上げる方法外部データはベクトルデータベースで作成する必要がある。PostgreSQLもpgvectorを使えば、外部データとして使うことができる!
  • 5.© 2023 NTT DATA Group Corporation 5RAGによって実現できることオリジナルデータは、常に更新でき、公開情報でなくても(OpenAIのサーバには送信が必要)、データソースにできる。• 社内のマニュアルをインプットして、チャットで回答する社内Botを作る• 企業の商品データをインプットして、似た商品をリコメンドするチャットを作る• 常に最新ニュースをインプットして、時事問題を作成する• ユーザのチャット履歴を随時記録して、以後の回答に利用する…などなど。
  • 6.© 2023 NTT DATA Group Corporation 6ChatGPTのデータソースにPostgreSQLを使う方法1. chatgpt-retrieval-pluginを使う• OpenAIが公開しているプラグイン• 詳細は、以下スライド• https://www.slideshare.net/nttdata-tech/postgresql-chatgpt-odc2023-nttdata2. LangChainを使う• https://www.langchain.com/• 大規模言語モデル(LLM)を使ってアプリ開発を行うためのフレームワーク。• 今回はこちらを紹介
  • 7.© 2023 NTT DATA Group Corporation 7LangChainの主なコンポーネント• 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全体像PostgreSQLpgvectorオリジナルデータ(TXT)LangChainOpenAIEmbeddingsAPI読み込み&分割②・⑤ベクトル化③insert①④問い合わせ(自然言語)ChatGPTAPI⑥類似検索⑦検索結果をもとにprompt合成⑧prompt質問⑨回答① LangChainがテキストデータを読み込み、分割する
  • 15.© 2023 NTT DATA Group Corporation 15全体像PostgreSQLpgvectorオリジナルデータ(TXT)LangChainOpenAIEmbeddingsAPI読み込み&分割②・⑤ベクトル化③insert①④問い合わせ(自然言語)ChatGPTAPI⑥類似検索⑦検索結果をもとにprompt合成⑧prompt質問⑨回答②自然言語をベクトルに変換私はPostgreSQLが好きです Open AI Embeddings APItext-embedding-ada-002モデル[0.00058671045, -0.004581401, .......]文字数に関係なく1536次元のベクトルになる
  • 16.© 2023 NTT DATA Group Corporation 16Embedding models2022年12月にリリースされた第二世代のtext-embedding-ada-002モデルをOpenAIも推奨。ほぼすべてのユースケースで、他モデルより品質が高く、安く、使いやすいため。LangChainの関数では、 text-embedding-ada-002が指定されている• トークナイザとは• 文章をトークンに分割するプログラムモデル トークナイザ 最大入力トークン数出力するベクトルの次元知識の切れ目text-embedding-ada-002 cl100k_base 8191 1536 Sep 2021https://platform.openai.com/docs/guides/embeddings/what-are-embeddings
  • 17.© 2023 NTT DATA Group Corporation 17似ている単語は、近いベクトルになる。実際は1536次元だが、2次元でイメージするなら以下のような感じ。お菓子チョコPostgreSQLMySQLデータベースデザートベクトル間の距離を計算することで、単語の類似度を計算できるようになる。
  • 18.© 2023 NTT DATA Group Corporation 18全体像PostgreSQLpgvectorオリジナルデータ(TXT)LangChainOpenAIEmbeddingsAPI読み込み&分割②・⑤ベクトル化③insert①④問い合わせ(自然言語)ChatGPTAPI⑥類似検索⑦検索結果をもとにprompt合成⑧prompt質問⑨回答③LangChainがベクトルデータをPostgreSQLにinsertするここまでで準備完了!
  • 19.© 2023 NTT DATA Group Corporation 19データを入れるまでのソースコードセパレーターは改行(デフォルト)文字数1000にマージ。オーバーラップなし。OpenAIのAPIでembeddingsテーブルがないときは作成、データの挿入が行われる
  • 20.© 2023 NTT DATA Group Corporation 20from_documentsdb = 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実際に発行されるINSERTINSERT 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 22PostgreSQLのテーブル• データを初期化するときに自動で作成される列名 型 説明collection_id uuid コレクションidembedding vector ベクトル化されたデータdocument varchar 元の自然言語データcmetadata json メタデータcustom_id varchar ユーザが好きに決められるiduuid uuid uuid列名 型 説明name varchar コレクション名。複数のデータセットを使い分けるときに使える。cmetadata json メタデータ{“source”: “sample.txt”} などuuid uuid uuidlangchain_pg_embeddinglangchain_pg_collection
  • 23.© 2023 NTT DATA Group Corporation 23全体像PostgreSQLpgvectorオリジナルデータ(TXT)LangChainOpenAIEmbeddingsAPI読み込み&分割②・⑤ベクトル化③insert①④問い合わせ(自然言語)ChatGPTAPI⑥類似検索⑦検索結果をもとにprompt合成⑧prompt質問⑨回答④ユーザが自然言語で問い合わせをする
  • 24.© 2023 NTT DATA Group Corporation 24全体像PostgreSQLpgvectorオリジナルデータ(TXT)LangChainOpenAIEmbeddingsAPI読み込み&分割②・⑤ベクトル化③insert①④問い合わせ(自然言語)ChatGPTAPI⑥類似検索⑦検索結果をもとにprompt合成⑧prompt質問⑨回答⑤ユーザの問い合わせをベクトル化する
  • 25.© 2023 NTT DATA Group Corporation 25全体像PostgreSQLpgvectorオリジナルデータ(TXT)LangChainOpenAIEmbeddingsAPI読み込み&分割②・⑤ベクトル化③insert①④問い合わせ(自然言語)ChatGPTAPI⑥類似検索⑦検索結果をもとにprompt合成⑧prompt質問⑨回答⑥PostgreSQLからユーザの問い合わせと類似しているドキュメントを検索する⇒pgvectorの関数を使ってベクトルの類似度を計算する。※詳細は後スライドで。
  • 26.© 2023 NTT DATA Group Corporation 26全体像PostgreSQLpgvectorオリジナルデータ(TXT)LangChainOpenAIEmbeddingsAPI読み込み&分割②・⑤ベクトル化③insert①④問い合わせ(自然言語)ChatGPTAPI⑥類似検索⑦検索結果をもとにprompt合成⑧prompt質問⑨回答⑦PostgreSQLから検索した、類似度の高いドキュメントと、ユーザの元の問い合わせを合成して、プロンプト(質問文)を作成する
  • 27.© 2023 NTT DATA Group Corporation 27プロンプトの作成Use the following pieces of context to answer the question atthe end. If you don't know the answer, just say that you don'tknow, 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全体像PostgreSQLpgvectorオリジナルデータ(TXT)LangChainOpenAIEmbeddingsAPI読み込み&分割②・⑤ベクトル化③insert①④問い合わせ(自然言語)ChatGPTAPI⑥類似検索⑦検索結果をもとにprompt合成⑧prompt質問⑨回答⑧ChatGPTにプロンプトを渡す
  • 29.© 2023 NTT DATA Group Corporation 29Open AI 文章生成モデルについて• LangChainのデフォルト:text-davinci-003モデルファミリー 備考新しいモデル(2023)gpt-4 (and gpt-4 turbo), gpt-3.5-turbo1ドル以上の課金で使用可能従来モデルアップデート版(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全体像PostgreSQLpgvectorオリジナルデータ(TXT)LangChainOpenAIEmbeddingsAPI読み込み&分割②・⑤ベクトル化③insert①④問い合わせ(自然言語)ChatGPTAPI⑥類似検索⑦検索結果をもとに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 tokens1トークンとは?エンコーディングの種類によって異なる今回は、 「text-embedding-ada-002」モデルを使用。このモデルでは、「cl100k_base」のエンコーディングを使用。日本語の場合、頻出単語は1トークン、それ以外は複数トークンとなる。基本的に文章が長いほど、トークンも大きくなる。「こんにちは」→ 1「石井です」 →5「今日もよろしくお願いします。」→13ざっと1000万字で1ドル位?
  • 33.© 2023 NTT DATA Group GROUP Corporation 33pgvector
  • 34.© 2023 NTT DATA Group Corporation 34pgvectorhttps://github.com/pgvector/pgvectorPostgreSQLでベクトル類似性検索ができるようになる拡張機能今年に入って、githubのスター数うなぎ上りの注目機能引用:https://star-history.com/#pgvector/pgvector&Datevector型を含むテーブルを作成し、データが保存できる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 35pgvectorのバージョンについて• 現在の最新バージョンはv0.5.1(2023年11月現在)• v0.5.0が大きなリリースのため、v0.5.0以降の利用がオススメ• HNSWインデックスのサポート• ivfflatインデックス構築の並列化• l1距離追加• 距離関数のパフォーマンス向上
  • 36.© 2023 NTT DATA Group Corporation 36vector型通常の列と同じようにデータのINSERT/UPDATE/DELETEできるInsert vectorsUpsert vectorsUpdate vectorsDelete vectorsINSERT 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 37vector型各ベクトルは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 precisionL2距離(ユークリッド距離)l1_distance(vector, vector)→ double precisionL1距離(マンハッタン距離)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 BYembedding <-> '[3,1,2]' LIMIT 5;→[3,1,2]とユークリッド距離が近いベクトルを順に5つ探すSELECT * FROM items ORDER BYl2_distance(embedding, '[3,1,2]’) LIMIT 5;→[3,1,2]とユークリッド距離が近いベクトルを順に5つ探すSELECT * FROM items ORDER BYl1_distance(embedding, ‘[3,1,2]’) LIMIT 5;→[3,1,2]とマンハッタン距離が近いベクトルを順に5つ探す・・ユークリッド距離xy(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~12つのベクトルが似ているほど、値が大きくなる。pgvectorの <=>は、1 – コサイン類似度=コサイン距離として取得することができるコサイン距離は、小さいほど向きが似ていることを示す。ユークリッド距離と比較して、テキストや画像など高次元データに効果的で、ドキュメント検索のユースケースでよく使用される。LangChainではこれがデフォルト。なお、OpenAI embeddingsの場合、ベクトルの長さは1に正規化されているので、内積と同じ。⇒この場合、内積のほうがよい。計算量が少ないので性能〇。・・
  • 45.© 2023 NTT DATA Group GROUP Corporation 45インデックス
  • 46.© 2023 NTT DATA Group Corporation 46pgvectorのインデックス: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 47ivfflat• ivfflat(Inverted File with Flat Compression) あいぶいえふ ふらっと• インデックス作成時に、データセット内の各ベクトルをクラスタに分割する• 新しいベクトルが追加された場合は、最も重心が近いクラスタに割り当てる• 最近傍を検索する際は、まず、最も近いクラスターを特定し、その中から最近傍を検索する• 検索範囲が全体でなく一部となるため、パフォーマンス向上・・・・ ・・・・・・・・・・・・・・ ・・★・・ ・・ ・・・★★
  • 48.© 2023 NTT DATA Group Corporation 48ivfflatのクラスタの数について• インデックス作成時に、クラスタ数(リスト数: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 50probesパラメータについて• 取りこぼしを減らすために、最も近い重心を持つクラスタだけでなく、他にも近いクラスタの中も検索する• デフォルト probes=1 →最も近い重心のクラスタのみ• probesを増やすと、より多くのクラスタ内で検索するので、再現率が向上(取りこぼしにくい)• 当然ながら、増やすほど速度は低下する。• 目安:probes = sqrt(lists)SET文でトランザクション内で設定可能:例)SET ivfflat.probes = 10;
  • 51.© 2023 NTT DATA Group Corporation 51ivfflatインデックス構築の進捗状況の表示PostgreSQL12以降では、インデックス構築の進捗状況を確認可能ivfflatのフェーズは以下。1. initializing2. performing k-means3. assigning tuples4. loading tuples※上記クエリの%は、loading tuplesのフェーズのみ。SELECT phase, round(100.0 * tuples_done / nullif(tuples_total, 0), 1) AS "%" FROMpg_stat_progress_create_index;
  • 52.© 2023 NTT DATA Group Corporation 52ivfflatインデックスの注意点• 最大2000次元までの列に付与可能• データ(少なくとも数千レコード)が挿入されたあとでインデックスを追加すること。• 実際のデータがない状態で作成するとクラスタの重心を適切に決めることができない。(ランダムになる)• インデックス作成後に、データを追加・削除・更新しても、インデックスは更新されるが、クラスタの重心は更新されない。• データの更新がある場合、定期的なREIDEXが推奨• CONCURRENTLY オプションを使えばテーブルへの書き込みをロックせず再作成できる
  • 53.© 2023 NTT DATA Group Corporation 53HNSW• 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 54NSWを階層化したのがHNSW一番下の層には全ての要素、上に上がるごとに、要素が絞られたグラフを作成。一番上の層からスタートし、最初は大きく、だんだん小さく近づいていく。新幹線→急行→各停に乗り換えるイメージ。階層化することで、少ない計算量で近づけるので、高速になる。引用元:https://www.pinecone.io/learn/series/faiss/hnsw/
  • 55.© 2023 NTT DATA Group Corporation 55HNSWの作り方①層を決定する引用元: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 56HNSWの作り方②リンクを作成するMは、リンク数。M=3なら、近い3つの要素とリンクを作成するpgvectorのmは、各レイヤの最大リンク数。引用元:https://www.pinecone.io/learn/series/faiss/hnsw/
  • 57.© 2023 NTT DATA Group Corporation 57HNSWのパラメータ• M:リンク数• デフォルト:16、範囲:2~100• 少なすぎると、再現率が下がる。(最近傍を取りこぼすかも)• 大きくなるほど、インデックス構築時間増、メモリ使用量増、検索時間増。• ef_construction:インデックス構築中に何個の近傍をリストとして持つか• デフォルト:64、範囲:4~1000• 小さすぎると、再現率が下がる。ただしある点から増やしても再現性があがりにくくなる。• 大きくすると、インデックス構築時間が長くなる• ef_search:検索中に何個の近傍をリストとして持つか• デフォルト:40、範囲:1~1000• 小さいほど、高速• 大きいほど、再現率があがる
  • 58.© 2023 NTT DATA Group Corporation 58HNSWインデックス構築の進捗状況の表示PostgreSQL12以降では、インデックス構築の進捗状況を確認可能HNSWのフェーズは以下。1. initializing2. loading tuplesSELECT phase, round(100.0 * blocks_done / nullif(blocks_total, 0), 1) AS "%" FROMpg_stat_progress_create_index;
  • 59.© 2023 NTT DATA Group Corporation 59HNSWの特徴• 最大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を使うことができた• ぜひ皆さんも、使ってみてください

[8]ページ先頭

©2009-2025 Movatter.jp