本記事は全2回の第1回です。第2回は以下のリンクよりどうぞ。
WordPress のデータを使って簡単な RAG を実装する(2) – もばらぶエンジニアブログ
(追記)成果物
WordPress plugin にして、簡単に使えるようにしました。
mobalab/wp-rag: A WordPress plugin for building RAG
やりたい事・背景
WordPress の投稿データを使って RAG を実装するというのが今回の記事の目的です。
なぜそのような事をやりたいと思ったのかについても書きます。
知り合いにフリーのコンサルタントがいるのですが、彼は WordPress で出来たウェブサイトを持っていて、そこには彼のお客様限定で公開されている有料記事が大量にあります。記事の内容としては彼の専門分野に関するレポートやその分野のニュースの解説などが主なものです。
彼はお客様から様々な質問を受けるのですが、大半の質問は
- 過去に同じ質問があるので、その回答をそのまま提示する
- 有料記事の情報をそのまま提示する
- いくつかの有料記事の情報を組み合わせて整理して回答する
という形で回答可能なので、この部分を自動化できないかと相談を受けました(実際にはもっと大雑把な相談でしたが)。RAG で実現できそうだと思ったので、まずは試してみる事にしました。
RAG の説明
基本的な構成
そもそも RAG とは何かについては、多くの情報がありますので、検索して一番上に出てきたページをまずは貼っておきます。(内容も分かりやすかったです。)
こちらのページにあるとおり、RAG の処理とは
- 検索フェーズ
- 生成フェーズ
の2つに分けられます。
検索フェーズ
ユーザーが入力した質問文に関連する情報を検索します。具体的な実装例としては
- キーワード検索(Elasticsearch, Amazon OpenSearch 等の全文検索エンジン)
- ベクトル検索(Qdrant, pinecone 等のベクトルデータベース)
があります。また、それらを組み合わせたり、他の情報によって検索結果をフィルターしたり、というのもよく行われます。
全文検索エンジンは今となっては一般的な技術ですので詳細は説明しませんが、ベクトル検索については少し説明が必要と思われます。
ベクトルデータベースとは、その名の通りベクトルを保存するデータベースで、あるベクトルに類似したベクトルを検索して返す事が出来ます。(言葉で説明すると難しいので、詳しくは検索してください。)
RAG においてベクトルデータベースがどのように使われるかについて、少し細かく見てみます。ベクトル検索を用いた場合の検索フェーズの処理は、以下の通りに分解されます。
- (事前処理)検索対象の文章をベクトルに変換してベクトルデータベースに保存しておく
- (検索フェーズ)ユーザーからの質問文を1と同じ要領でベクトルに変換する
- (検索フェーズ)2で変換されたベクトルに類似するものをベクトルデータベースから検索
ここの1と2にある「文章をベクトルに変換する」処理の事を埋め込み、embedding と言い、最近では大規模言語モデル(LLM)を使って行う事が多いです。(それ以外の方法もあります。)埋め込みに関しては以下のようなページが参考になるかもしれません。
まとめると、ベクトル検索の場合には以下の2つの構成要素が関わってきます。
- 文章をベクトルに変換する言語モデル
- ベクトルを保存、検索出来るベクトルデータベース
生成フェーズ
このフェーズではその名の通り、生成 AI を使って回答を生成します。生成 AI に対しては、
- 検索フェーズの検索結果
- 質問文
の2つを入力として渡します。
後者の質問文だけを生成 AI に渡した場合は、生成 AI を普通に使っているのと変わりません。例えば、ChatGPT に普通に質問したのと同じ答が返ってきます。一方、基本的には非公開情報である検索フェーズの検索結果も渡す事で、生成 AI が非公開情報も(語弊はあるかもしれませんが)「学習」した上で回答を返してくるというのが、RAG のコンセプトです。
今回の実装の構成要素
今回の実装で必要となる構成要素毎に説明していきます。なお、今回は検索フェーズではベクトル検索を使います。
埋め込みモデル
「検索フェーズ」の項で説明したとおり、一般的なベクトル検索を使った RAG の場合は、文章をベクトルに変換するための言語モデルが必要です。今回は、HaggingFace の Sentence Transformers を使います。
ただ、埋め込みモデルの選択肢は沢山ありすぎて正直どれを使ったら良いのか迷うところです。オープンソースのものもあれば、OpenAI のように企業が提供している有料のものもあります。この辺りは、いずれ別の記事でまとめられればと思います。
ベクトルデータベース
ベクトルデータベースは、オープンソースのものもあれば、商用サービスもありますが、今回は PostgreSQL の拡張機能である pgvector を使います。ベクトルデータベースも色々ありますが、pgvector 以外もいくつか挙げておきます。
- 他の形式のデータベースにベクトル検索の機能を持たせたもの
- Elasticsearch
- Amazon OpenSearch Service
- Redis
- ベクトル検索に特化したもの
- Pinecone
- Qdrant
生成 AI
最後に生成フェーズで使う LLM です。これも色々選択肢がありますが、今回はオープンソースの Llama 3.1 を使います。ご存知の通りそれ以外にも沢山ありますが、ここでは触れません。
WordPress
WordPress の記事データをまずは取得する必要がありますが、今回はとりあえず WordPress の API を使った簡単なスクリプトで、記事を全てダウンロードして使う事にします。
本格的なシステムにするのであれば、WordPress の記事が追加・更新された時にベクトルデータベースを更新するような WordPress のプラグインを実装するか、定期的にバッチで WordPress の更新情報を取りに行くようにする等の対応が必要だと思います。
まとめ
今回、RAG の簡単な説明、及びWordPress に溜まっている記事を外部情報として使って簡単な RAG を実装する場合の構成要素と実装の方向性を示しました。
次回は、簡単な実装例を示す予定です。