IntraIntel.ai - Multi-LLM Agent Coding Challenge について
CliniSearchは、医療に関する質問に答えるPython製のマルチLLMエージェントです。ウェブ検索とPubMedの結果を個別にまとめ、クエリの調整やスニペットの要約、出典リンクの提示にも対応します。
主な機能
- 01ウェブとPubMedの検索
- 02クエリの調整(任意)
- 03スニペットの要約(任意)
- 04検索元ごとの回答生成
- 05結果への出典リンク付与
活用シーン
- 01医療情報のウェブ検索とPubMedの結果を比較
- 02検索した出典スニペットに基づく回答の生成
MCP 対応
エージェントは独自のHTTPベースJSONプロトコルで、ウェブ検索とPubMedのツールサーバーに問い合わせます。サーバーは回答の生成に使う構造化検索結果を返します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
CliniSearch - 医療検索向けマルチLLMエージェント
このプロジェクトは、医療に関する質問に回答するために設計された、Python 製のマルチLLMエージェントシステムを実装しています。独自の Model Context Protocol(MCP)を活用し、情報検索(Web 検索と PubMed 検索)を行う個別のツールサーバーと連携します。中核となるエージェントは、Hugging Face Inference API から利用できる複数の無料 LLM を統括し、検索クエリの調整、コンテキストのスニペットの要約、検索拡張生成(RAG)による最終回答の統合などのタスクを実行します。このシステムは、Web 検索と PubMed から取得したコンテキストに基づいて、それぞれ個別に回答を統合し、元の資料へのリンクを含めて提示するように設計されています。
動画デモへのリンク
https://youtu.be/JvFvCYFYpzU?si=Vho8MM5Dy7YQk53E
システムアーキテクチャ
Hugging Face API の無料プランで使用する2つのLLMモデル:distillbart と mistral instruct
中核となるアプローチと設計
このシステムは、複数のステップで構成されるエージェント型 RAG パイプラインに従います。
- ユーザー入力: エージェントはユーザーから医療に関する質問を受け取ります。
- (任意)クエリの調整(LLM1): ユーザーの質問を最初の LLM(例:
mistralai/Mistral-7B-Instruct-v0.3)に渡し、重要な医療用語に焦点を当てた、より簡潔で効果的な検索クエリを生成できます。 - 情報検索(MCP ツール):
- 調整された(または元の)検索クエリを、一方または両方の MCP ツールサーバーに送信します。
- Web 検索 MCP サーバー:
duckduckgo-searchを使用して一般の Web を検索します。 - PubMed MCP サーバー:
BioPythonの Entrez ユーティリティを使用して PubMed データベースを検索します。
- Web 検索 MCP サーバー:
- これらのサーバーは、構造化された検索結果(タイトル、スニペット、URL/ID)を返します。
- 調整された(または元の)検索クエリを、一方または両方の MCP ツールサーバーに送信します。
- コンテキストの処理:
- (任意)スニペットの要約(LLM2): 検索結果ごとに、スニペットが長い場合は、専用の要約用 LLM(例:
sshleifer/distilbart-cnn-6-6)に渡して、より簡潔な内容にできます。 - コンテキストの整形: 各ソース(Web 検索、PubMed)のスニペット(要約済みまたは元の内容)を、個別に構造化されたコンテキスト文字列に整形します。コンテキスト内の各項目にはラベル(例:「項目 1」)を付け、タイトル、内容、参照先(URL または PubMed ID)を含めます。
- (任意)スニペットの要約(LLM2): 検索結果ごとに、スニペットが長い場合は、専用の要約用 LLM(例:
- 回答の統合(LLM3 - RAG):
- 各情報ソース(Web 検索、PubMed)について、エージェントは高性能な指示調整済み LLM(例:
mistralai/Mistral-7B-Instruct-v0.3)を個別に呼び出します。 - この LLM へのプロンプトには、次の内容を含めます。
- 元のユーザーの質問。
- その特定のソースから取得した整形済みコンテキスト。
- 提供されたコンテキストのみに基づいて回答し、可能であれば項目番号を引用するよう指示する内容。
- この LLM は、そのソースに対する回答を統合して生成します。
- 各情報ソース(Web 検索、PubMed)について、エージェントは高性能な指示調整済み LLM(例:
- 出力: システムは、元の質問に続いて、Web 検索から得られた統合回答(ソースへのリンク付き)、次に PubMed から得られた統合回答(ソースへのリンク付き)を提示します。
主要なテクノロジー:
- Python 3.9+ と、並行処理のための
asyncio。 - FastAPI と Uvicorn: 非同期 MCP ツールサーバーの構築に使用します。
httpx: エージェントから MCP サーバーおよび Hugging Face API への非同期 HTTP リクエストに使用します。- Hugging Face Inference API: 調整、要約、統合に無料の LLM を利用します。
duckduckgo-search: API キー不要の Web 検索に使用します。BioPython: NCBI の PubMed データベースの検索に使用します。python-dotenv: API キーと環境変数の管理に使用します。
Model Context Protocol(MCP)の定義
このプロジェクトで使用する MCP は、メインエージェントとツールサーバー間の通信に使用する、シンプルな HTTP ベースの JSON プロトコルです。
- MCP サーバーへのリクエスト:
- エンドポイント:
POST /execute - JSON ボディ:
{"query": "user's search query string"}
- エンドポイント:
- MCP サーバーからのレスポンス:
- JSON ボディ(成功時):
{ "source": "server_name_string (e.g., WebSearchServer, PubMedServer)", "status": "success", "results": [ { "title": "string", "snippet": "string", "url": "string_url_if_web_search", // or missing "id": "string_pubmed_id_if_pubmed" // or missing } // ... more results ] } - JSON ボディ(エラー時):
{ "source": "server_name_string", "status": "error", "error_message": "string_describing_the_error" }
- JSON ボディ(成功時):
セットアップ手順
-
クローン/ダウンロード:
- プロジェクトファイルを取得し、
intra_intel_multi_llm_challengeという名前のディレクトリに配置します。
- プロジェクトファイルを取得し、
-
Python 仮想環境の作成と有効化:
- プロジェクトのルートディレクトリ(
intra_intel_multi_llm_challenge)に移動します。 - 環境を作成します:
python -m venv venv - 有効化します:
- macOS/Linux の場合:
source venv/bin/activate - Windows の場合:
venv\Scripts\activate
- macOS/Linux の場合:
- プロジェクトのルートディレクトリ(
-
依存関係のインストール:
pip install -r requirements.txt -
環境変数の設定:
- プロジェクトのルートで、
.env.exampleファイルを.envという名前の新しいファイルにコピーします。 .envファイルを開き、必要な情報を入力します:# .env HF_API_TOKEN="your_huggingface_api_token_here" NCBI_EMAIL="[email protected]"HF_API_TOKEN: Hugging Face アカウント設定(https://huggingface.co/settings/tokens)から取得します。read権限を持つトークンで十分です。NCBI_EMAIL: Entrez 経由で NCBI の PubMed データベースにプログラムから適切にアクセスするためのメールアドレスを指定します。このプロジェクトでは、事前にこのメールアドレスを NCBI に登録する必要はありません。
- プロジェクトのルートで、
-
ゲート付きモデルの利用規約への同意(Mistral では必須):
- デフォルトで使用されるテキスト生成 LLM は
mistralai/Mistral-7B-Instruct-v0.3です。これはゲート付きモデルです。 - Hugging Face のウェブサイトでアカウントにログインします。
- モデルカードのページに移動します:https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.3
- このモデルへのアクセス権を得るため、ライセンス条項を確認して同意します。これにより、
HF_API_TOKENを使ってモデルを利用できるようになります。この手順を省略すると、このモデルへの API 呼び出しは失敗します。
- デフォルトで使用されるテキスト生成 LLM は
システムの実行
メインエージェントが MCP サーバーにクエリを送信する前に、MCP サーバーを起動しておく必要があります。
-
ターミナル 1:Web Search MCP Server を起動します:
- プロジェクトのルート(
intra_intel_multi_llm_challenge)に移動します。 - 仮想環境が有効になっていることを確認します。
- 次を実行します:
python -m uvicorn mcp_servers.web_search_server:app --reload --port 8001 - Uvicorn が実行中であることを示すメッセージが表示されるまで待ちます(例:
Uvicorn running on http://0.0.0.0:8001)。
- プロジェクトのルート(
-
ターミナル 2:PubMed MCP Server を起動します(ボーナス機能用):
- プロジェクトのルートに移動します。
- 仮想環境が有効になっていることを確認します。
- 次を実行します:
python -m uvicorn mcp_servers.pubmed_search_server:app --reload --port 8002 - Uvicorn の起動確認メッセージが表示されるまで待ちます。
-
ターミナル 3:メインエージェントを実行します:
- プロジェクトのルートに移動します。
- 仮想環境が有効になっていることを確認します。
- 次を実行します:
python agent/main_agent.py - エージェントは、あらかじめ定義された5つの医学的な質問を処理します。各質問について、次の処理を行います:
- 必要に応じて、LLM1 を使用してクエリを改善します。
- Web Search MCP サーバーにクエリを送信します。
- 必要に応じて、LLM2 を使用してウェブ検索のスニペットを要約します。
- LLM3 を使用して、ウェブ検索のコンテキストに基づく回答を作成します。
- ウェブ検索に基づく回答とそのソースリンクを出力します。
- PubMed MCP サーバーにクエリを送信します(例では、デフォルトで
use_pubmed_for_this_questionがTrueに設定されています)。 - 必要に応じて、LLM2 を使用して PubMed のスニペットを要約します。
- LLM3 を使用して、PubMed のコンテキストに基づく回答を作成します。
- PubMed に基づく回答とそのソースリンクを出力します。
- Hugging Face API のレート制限に配慮するため、各質問の処理の間に一時停止します。
Hugging Face API でのモデル読み込みに関する注意: Inference API 経由で初めて LLM を呼び出すときは、Hugging Face によるモデルの読み込みが必要になる場合があり、20~90秒(Mistral-7B のような大規模モデルではさらに長くなることがあります)かかることがあります。2回目以降の呼び出しは通常、より速くなります。このスクリプトにはタイムアウトが設定されており、モデル読み込みメッセージへの対応も試みます。
カスタマイズとデバッグ
- LLM の選択: Hugging Face の無料 Inference API で、より適切に動作するモデルや、より安定して利用できるモデルが見つかった場合は、
agent/main_agent.pyのVERIFIED_INSTRUCT_MODEL_IDとSUMMARIZATION_MODEL_IDを変更できます(必ず最初にモデルのカードページにあるウィジェットで確認してください!)。 - 機能の切り替え:
agent/main_agent.pyのif __name__ == "__main__":ブロックで、main_agent_workflowに渡されるrefine_queriesとsummarize_snippetsのブール値フラグを変更すると、これらのステップを有効または無効にしてパイプラインをテストできます。呼び出しごとにuse_pubmed_for_this_questionを変更することもできます。 - 詳細なログ出力: 詳細なデバッグ情報(API ペイロード、完全なコンテキストなど)を表示するには:
agent/main_agent.pyを開きます。LOG_LEVEL = logging.INFOをLOG_LEVEL = logging.DEBUGに変更します。- 保存してエージェントを再実行します。
依存関係
主な依存関係は requirements.txt に記載されています:
fastapi:MCP サーバーの構築に使用します。uvicorn[standard]:FastAPI 用の ASGI サーバーです。httpx:非同期 HTTP リクエストの送信に使用します。duckduckgo-search:ウェブ検索機能に使用します。biopython:NCBI Entrez 経由で PubMed にクエリを送信するために使用します。python-dotenv:環境変数の管理に使用します。
この README では、プロジェクトの理解、セットアップ、実行に必要な情報を網羅しています。
医学的な質問の出力例のスクリーンショット
ウェブ検索
Pubmed 検索
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。