なぜ専用ベクトルDBではなくPostgreSQL?実践者が明かすRAGシステム構築の真実

なぜ専用ベクトルDBではなくPostgreSQL?実践者が明かすRAGシステム構築の真実 AI

最近、RedditでRAGシステムの構築に関する興味深い投稿を見つけました。

投稿者は数ヶ月かけて本格的なRAGシステムを開発しています。
そして、その過程で得た知見を共有してくれました。

この記事では、その投稿内容とコメントでの議論を参考にします。
そして、実践的なRAGシステム構築のポイントを解説していきます。

なぜ既存のRAGシステムでは不十分なのか

多くのRAGシステムは、文書解析が甘い。
投稿者も同じ不満を持っていました。

単純にテキストを抽出するだけでは、ユーザーの期待に応えられません。
特に問題となるのは以下の点です。

まず、文書内の図表や画像が無視されてしまう。
テキストだけで「グラフがあります」と説明されても、実際のグラフを見たいですよね。

次に、チャンキングが機械的すぎる問題があります。
文脈を無視して固定長で分割すると、意味のまとまりが壊れてしまうのです。

さらに、精度と速度のトレードオフも悩ましい。
精度を重視すると速度が犠牲になります。

逆に速度を優先すると、回答の質が下がってしまう。

ベクトルデータベースの選択:PostgreSQLが最適だった理由

投稿者は複数のベクトルデータベースを検証しました。

Qdrant、Milvus、ChromaDB、Pinecone。
しかし最終的にPostgreSQL用のVectorChordを選択しています。

その理由は明確でした。
まず速度が圧倒的に速い。
バイナリ量子化と組み合わせると、数百万の文書を500ミリ秒以下で検索できるそうです。

次にBM25によるハイブリッド検索のサポート。
これによりキーワード検索とベクトル検索を組み合わせられます。
結果として、より正確な検索が可能になりました。

そして、既存のPostgreSQLインフラを活用できる点も大きい。
新しいデータベースを追加する必要がありません。

だから運用の複雑さを抑えられるのです。

文書解析の要:LlamaParse

文書解析にはLlamaParseを採用しています。

投稿者はAzureやGoogle、AWSの文書解析サービスと比較しました。
その結果、LlamaParseが最も優れていたとのこと。

LlamaParseの利点は次のとおりです:

  • 使いやすさ
  • カスタマイズ性の高さ
  • 価格の予測可能性
  • 高品質なOCR機能

重要なのは、テキストだけでなく画像や表も抽出できること。
抽出した画像はオブジェクトストレージに保存します。
そして、必要に応じてストリーミングで返すのです。

これによって、文書内のグラフや図表を実際に表示できるようになりました。

エージェント型チャンキングの威力

チャンキング手法として、エージェント型チャンキングを採用しています。

LLMを使って各チャンクを処理するため、コストは高くなります。
でも精度を最優先に考えた結果、この選択になったそうです。

各チャンクの処理プロセスは次のとおりです。

まず、前後のチャンクも含めてLLMに渡します。
これにより一貫性のあるチャンクを生成できる。
さらに、チャンクの要約と関連する質問も生成させます。

処理速度は確かに遅くなります。
しかし、強力なキューイングシステムで並列処理することで対応しています。

安価で高速な手法では得られない精度が実現できるとのことです。

リランキングと検索精度

PostgreSQLから取得したデータは、Cohereのリランキング機能で再評価します。
上位6件を取得し、最も関連性の高いものを選択する仕組みです。

埋め込みモデルはCohere embed-v4を使用。
複数の言語でテストした結果、最も良好な結果が得られたそうです。

アラビア語、デンマーク語、英語で検証済みとのこと。

エバリュエーションの重要性

コメント欄で言及されていた書籍「Enterprise RAG」。
この本では、RAGシステムにはエバリュエーション(評価テスト)が不可欠だと説明されています。

エバリュエーションは、ユニットテストのRAG版と考えると分かりやすい。
事前に質問と期待される回答を用意します。
そしてシステムの出力と比較するのです。

投稿者も多数のエバリュエーションを作成しています。
これによりシステムの精度を継続的に検証しているそうです。

技術スタックの詳細

フロントエンドの構成:

  • Vue.js 3
  • TypeScript
  • Tailwind CSS 4

バックエンドの構成:

  • PHP 8.4とLaravel 12(メイン)
  • Rust(tiktoken用)
  • Python(FastAPI、インジェストとチャンキング用)

興味深いのは、WebSocketsではなくSSEを採用した点です。
チャットボットには全二重通信は不要。

だからSSEの方がシンプルに実装できます。
実際、多くの最新チャットボットがSSEを使用しているそうです。

サーバーはAMD EPYC 7502Pを搭載。
2TB NVMe、256GB RAMという強力な構成です。
これを2台用意し、災害復旧にも備えています。

実装上の課題と解決策

コメントでは様々な質問や議論がありました。

構造化データ(CSVやExcel)の扱いについて質問がありました。
また、2000ページにも及ぶマニュアルを扱う場合の工夫も議論されています。

大規模文書の場合、次のようなアプローチが紹介されていました。
初回検索で30ページ程度を取得します。
その後、Qwenの軽量リランカーで1-5ページまで絞り込むのです。

チャットメモリについては、Redisを使用。
直近5件の会話を保持しています。

速度を重視した選択とのことです。

今後の展望

投稿者はGraphRAGの実装を検討中です。
「Essential GraphRAG」という書籍を参考に実験を進めているそうです。

また、ローカルモデル(Qwen)の導入も計画中。
ユーザーがローカルモデルと外部モデルを選択できるようにする予定だそうです。

まとめ

この投稿から学べることは多い。

RAGシステムの構築は、単なる技術の組み合わせではありません。
精度と速度のバランスを取る必要があります。
そして何より、ユーザーの期待に応えることが重要です。

特に印象的だったのは、精度を最優先にした設計思想。
コストや処理時間が増えても構わない。
正確な回答を提供することを重視しています。

画像のストリーミング対応も革新的です。
文書内の図表を実際に表示する。
これによって、より豊かな情報提供が可能になりました。

RAGシステムの構築を検討している方は、この投稿者のアプローチを参考にしてみてください。
完璧なシステムではないかもしれません。

でも、実践的な知見が詰まっています。

タイトルとURLをコピーしました