🔥

MCP + DB > RAG?

に公開

RAGの限界性

  • RAG、つまり検索強化生成(Retrieval-Augmented Generation)は、現在の大規模言語モデル分野における注目の方向性です。これは情報検索技術と生成モデルを組み合わせ、大規模モデルの知識の正確性、文脈理解、最新情報の活用などの課題を解決します。

  • でも追加の知識をRAGを通じて導入するだけで、モデルがそれらの知識関連の質問に完璧に対応できると考えています。しかし実際と想像にはギャップがあり、実際に試してみると、RAGの精度はそれほど良くないことに気づくかもしれません。

  • RAG自体の技術的原理から見ると、現在以下の問題が存在します:

    • 検索精度の不足:まず、RAGの最も核心的な部分は、知識を「ベクトル」に変換し、「ベクトルデータベース」に導入し、ユーザーの入力情報も「ベクトル」に変換してから、ベクトルデータベースから類似の「ベクトル」をマッチングさせ、最後に大規模モデルが検索された内容を要約するというものです。
    • このプロセスから、大規模モデルは単に要約の役割を果たすだけであり、検索された情報の精度は大部分がベクトルの類似度マッチングに依存していることがわかります。検索結果には無関係なコンテンツが含まれる(低精度)または重要な情報が欠落する(低リコール率)可能性があります。
    • 生成コンテンツの不完全さ:RAGは文書の切片を処理するため、切片の局所性によりドキュメント全体の情報を見ることができません。そのため、「XXXを列挙する」「XXXを要約する」などの質問に対する回答は一般的に不完全です。
    • 大局的視点の欠如:RAGは質問に答えるために必要な切片の数を判断できず、文書間のつながりも判断できません。例えば、法的条文において、新しい解釈が古い解釈を覆す可能性がありますが、RAGはどちらが最新かを判断できません。
    • 複数回の検索能力の弱さ:RAGは複数回、複数クエリの検索を実行する能力が不足しており、これは推論タスクには不可欠です。
  • 最近ではGraphRAGKAGなどの新しい技術がこれらの問題をある程度解決できますが、まだ成熟しておらず、現在のRAG技術は私たちの期待する効果には遠く及びません。

  • 以下では、MCP + データベースを通じて構造化データの検索精度を向上させる新しいソリューションを紹介します。これは基本的にtext to SQLの効果を実現でき、実際の検索効果はRAGよりもはるかに優れています。例えば、次のような学生リスト情報があります:

MCPを使用したデータベースの呼び出し

MongoDB

ここで選択したデータベースはMongoDBです:人気のあるオープンソースのドキュメント指向データベースです。MongoDBはドキュメント型データモデルを使用し、データはJSON形式で保存されます。

なぜMongoDBを選び、sqliteのようなリレーショナルデータベースを選ばなかったのでしょうか。主な理由は、リレーショナルデータベースではテーブル構造が固定されており、新しいフィールドを追加したりテーブル構造を変更したりする場合、多くの場合、複雑な移行作業が必要になるからです。一方、MongoDBのドキュメント型データモデルでは、同じコレクション内に異なる構造のドキュメントを保存することができ、アプリケーションは必要に応じて柔軟にフィールドを追加または変更でき、厳格なテーブル構造を事前に定義する必要がありません。これは、私たちが構築したい継続的に補完される構造化知識ベースのシナリオにとって非常に友好的です。

VsCode + Cline

いくつかのMCPをサポートするクライアントをテストした結果、ClineのMCP互換性はかなり良好だと思います。また、オープンソースで無料だし、Cherry Studioのようなクライアントと比較すると、Clineの使用は初心者ユーザーにとってはやや難しいかもしれません。なぜなら、本質的にはVsCodeベースのAIコーディング支援プラグインだからです。

Clineの中でmcp-mongo-serverを配置

次に、MongoDBをサポートするMCP Serverを見つける必要があります。自分で開発しようと思っていましたが、簡単に検索してみると、すでにいくつか存在していることがわかりました:

https://github.com/modelcontextprotocol/servers?tab=readme-ov-file
ここでは、mcp-mongo-serverを使用することにします:

https://github.com/kiliczsh/mcp-mongo-server

次に、ClineでMCP Serverを設定していきます。まず上部ツールバーのMCP Serverアイコンをクリックすると、ここにはMCP Serverのリストが組み込まれており、ワンクリックでインストールすることもできます:

しかし、検索してみたところ、私たちが選択したMCP Serverはこの内蔵リストにはありませんでした。そのため、手動で設定することにします。実際、手動設定も非常に簡単です。installedタブをクリックし、下部にあるConfigure MCP Serversをクリックすると、JSONファイルが開きます。これがClineがMCP設定を保存する場所で、中には空のオブジェクトしかありません:

各MCP Serverはこの設定の書き方を提供しています。例えば、私たちが選んだmcp-mongo-serverの場合、ここでClaude Desktopでの使用について説明されていますが、実際にはMCPをサポートする任意のクライアントでこのように設定できます:

設定は複雑に見えますが、実際には3種類の異なる設定方法が提供されており、各設定には2つの重要なパラメータしか含まれていません:

command:コマンドラインで実行するコマンドを指定します。この例では、すべての設定がnpxコマンド(つまりNode.js環境)を使用しています。
args:配列で、commandに渡すパラメータを含みます。
これら3つの設定の意味はそれぞれ:

mongodb:mcp-mongo-server npmパッケージを実行し、指定されたMongoDBの接続文字列を使用します。デフォルトは読み書きモードです。
mongodb-readonly:同様にmcp-mongo-server npmパッケージを実行し、同じMongoDBの接続文字列を使用しますが、--read-onlyパラメータが追加されています。つまりこの設定は読み取り専用モードで実行されます。
mongodb-github:npmパッケージではなく、GitHubのkiliczsh/mcp-mongo-serverリポジトリからパッケージを取得して実行し、同じMongoDBの接続文字列を使用し、読み取り専用モードも設定されています。
ここでは最もシンプルな設定を直接使用します。ローカルのmongoは通常ユーザー名とパスワードを設定していないので、クライアントで直接このデータベースの接続アドレスを確認できます:

{
    "mongodb": {
      "command": "npx",
      "args": [
        "mcp-mongo-server",
        "mongodb://localhost:27017/studentManagement?authSource=admin"
      ]
    }
}

この設定をClineのMCP設定ファイルに貼り付けると、左側のmongodbの緑色のライトが点灯し、設定が成功したことを示しています:

次に効果をテスト​​してみましょう:

学生数に関する質問をしてみます。現在、学生は合計何名いますか?:

そしてMCPはデータベースから正確に結果を検索し、回答を提供しました。

現在の限界

MCP技術はまだ爆発的に広がり始めたばかりで、多くの技術がまだ成熟していないため、現在のこのソリューションにはいくつかの制限があります:

AIに大量のデータを検索させないでください。この方法はRAGとは異なり、必要な少量のコンテンツだけを毎回検索するのではなく、実際にSQLを実行します。どれだけのデータが必要かによって、それだけのデータを検索します。一度に検索するデータ量が多すぎると、大量のトークンを消費し、MCPクライアントがフリーズすることさえあります。
多くのMCPクライアントは、MCPツールとの通信を実現するために多くのシステムプロンプトに依存しているため、一度MCPを使用すると、トークンの消費量は必ず大幅に増加します。
しかし、将来には期待できます。以前から、Function Call + Text2SQLを使用した類似の機能がありましたが、開発コストと復元精度の問題により、普及しませんでした。

今日私たちが一緒に学んだMCP + データベースの方法は、開発コストを本当に下げ、コードさえ必要とせず、非常に高い精度を持っています。将来的には非常に人気のある検索方法になると確信しています。インテリジェントカスタマーサービス、倉庫管理、情報管理などの構造化データ検索シナリオでは、従来のRAG方式に取って代わるでしょう。

Acrosstudioテックブログ

Discussion