0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Deep Research API × FastMCP で社内文書検索

Posted at

Deep Research API × FastMCP で社内文書検索

2025-06-26 に公開された Deep Research API を、社内ドキュメント検索ボットをユースケースとして動作確認までやってみた。
デジタル庁が公開する 『デジタル社会推進標準ガイドライン』(PDF 全 62 ファイル)を OpenAI Vector Store へ直接アップロードし、
FastMCP + ngrok で Model Context Protocol (MCP) サーバーを公開。
Web 検索を使わず、Vector Storeから回答を生成できることを確認したので、環境構築〜軽い実行結果までを共有します。
詳細な精度検証はまた今度。


目次

  1. Deep Research API とは?
  2. 今回の実験シナリオ
  3. ライブラリのアップデート
  4. データ準備 & Vector Store 投入
  5. FastMCP サーバーを ngrok で公開
  6. Deep Research API から MCP ツール連携
  7. 実行例・結果
  8. 感想
  9. 参考リンク

1. Deep Research API とは?

  • モデル名: o3-deep-research-2025-06-26

  • 概要: 外部ツール(Web Search、Retrieval、MCP など)を呼び出し“deep research(深層調査)”を自律実行する LLM。

  • 今回のポイント: Web 検索ではなく MCP サーバー経由で Vector Store を叩く

  • 想定ユースケース:社内文書チャットボットなど


2. 今回の実験シナリオ

とりあえず性能は置いといて、一旦web検索なしでPDFから回答できれば良しとする。
従来のReActとの精度比較はいつかやる。

# 内容
1 デジタル庁 『デジタル社会推進標準ガイドライン』 PDF(全 62 ファイル)を収集
2 OpenAI Vector Store に直接アップロードし、ID を控える
3 FastMCPをローカル起動 → ngrok で https 公開
4 Deep Research API に MCP エンドポイントを渡して質問
5 Web 検索なしで PDF からのみ回答できるか検証

ngrok の設定に自分は少々ハマりましたが、データ収集を除けばトータル1~2時間くらいほどで動作確認できるかと思います。


3. ライブラリのアップデート

以下公式から

$pip install --upgrade openai

※とはいえ、他にuvicornとかのインストールも必要だと思うが、簡単なコードなので後々でもOK。

4. データ準備 & Vector Store 投入

4‑1. データ準備(PDF収集)

ユースケースは社内文書チャットボットだが、そんなデータは手元にあるわけないので、インターネット上に公開されているデジタル・ガバメント推進標準ガイドラインを利用した。
以下のようなPDFが大体60個くらいあるのでそれを元データとして使う。
これをweb検索からではなく、自前のベクトルストアから回答させるのが目標。
標準ガイドライン.png

4‑2. Vector Store へアップロード

  1. OpenAI > Vector Stores の右上「Create」ボタンから新規ベクトルストアを作成
  2. PDF をドラッグ & ドロップ → 自動でチャンク分割 & Embedding 生成
  3. Vector Store ID(例 vs_...)をメモしておく

langchainでテキスト分割&エンベディングとかもなしにGUI操作だけで完結、便利。すごいね。


5. FastMCP サーバーを ngrok で公開

5‑1. FastMCP 起動

公式cookbookのBuilding a Deep Research MCP Serverを参考にFastMCPサーバーを起動する。
公式が起動用のpythonファイルmain.pyを公開しているのでそれをコピペでOK。
大事なのはVECTOR_STORE_IDOPENAI_API_KEY を環境変数またはスクリプト内に設定すること。以下冒頭部分だけ抜粋。

# main.py(冒頭抜粋)
import logging
from typing import Dict, List, Any
from fastmcp import FastMCP
from openai import OpenAI

# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# OpenAI configuration
OPENAI_API_KEY = "sk-..."  #ここに自分のAPIキーを設定
VECTOR_STORE_ID = "vs_..." #ここにベクトルストアIDを設定

# --- 以下は公式 cookbook のサンプルを参照 ---

起動成功したら以下のようなログがでるはず。

INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

5‑2. ngrok で外部公開

ここがミソ。MCPサーバー立てただけだと、それをdeep researchが検索することはできないので、ngrokで外部公開する。
ngrokにSign upすると最初のページでインストール方法を教えてくれる。
また同時にトークンが発行されるのでトークンを控えておく。

以下powershell上で実行。
(自分はMCPサーバーをwslで立てたが、その場合でもngrokの設定はpowershell上でやっても大丈夫)

#powershellで実行
#chocoでngrokをインストール
choco install ngrok -y

#ngrokからauthtokenを取得して代入
ngrok config add-authtoken <ここに発行されたトークンを代入>
ngrok http 8000

以下のようなログが出たらOK

Forwarding  https://XXX.ngrok-free.app  ->  http://localhost:8000

この URLの末尾に /sse を付与したものを Deep Research API に渡せばOK。
上の例だとhttps://XXX.ngrok-free.app/sseとなる。
ちなみにこのアドレスはngrok http 8000を唱えるたびに変わるのでそこだけ注意。


6. Deep Research API から MCP ツール連携

以下も公式cookbookのBuilding a Deep Research MCP Serverから抜粋.
重要なのはserver_urlに先ほど得たhttps://XXX.ngrok-free.app/sseを設定すること。

また、今回はweb検索なしで回答させたいのでtoolsの
"type": "web_search_preview"はコメントアウトした。

以下抜粋

response = client.responses.create(
  model="o3-deep-research-2025-06-26",
  input=[
    {
      "role": "developer",
      "content": [
        {
          "type": "input_text",
          "text": system_message,
        }
      ]
    },
    {
      "role": "user",
      "content": [
        {
          "type": "input_text",
          "text": user_query,
        }
      ]
    }
  ],
  reasoning={
    "summary": "auto"
  },
  tools=[
    # {
    #   "type": "web_search_preview" #今回は検索なしのため
    # },
    { # ADD MCP TOOL SUPPORT
      "type": "mcp",
      "server_label": "internal_file_lookup",
      "server_url": "https://XXX.ngrok-free.app/sse", # ここにngrokで得たserver urlを設定。
      "require_approval": "never"
    }
  ]
)

ここまで来たらあとは実行するだけ。
user_queryに質問文を、system_messageに指示文を書いておく。
公式cookbookそのままだたと、system_messageがヘルスケアに関するものになっているので、今回は以下のように変更した。

system_message = """
あなたは、デジタル庁「デジタル社会推進標準ガイドライン」等の公的ドキュメントを対象に、構造化されたデータ重視のレポートを作成する専門リサーチャーです。ユーザーからの質問に対し、以下の方針で回答してください。

【必須事項】
- データや根拠に基づく具体的な知見を重視し、数値・傾向・統計・定量的な成果(例:コスト削減効果、導入件数、制度の変遷など)を積極的に盛り込むこと
- 必要に応じて、表やグラフ化が適した内容は「この部分は棒グラフ等で可視化できる」などと明示すること
- 信頼性・最新性の高い情報を優先し、出典(デジタル庁公式資料、法令、ガイドライン等)を必ずインライン引用すること
- 内部ファイル検索ツール(MCP)を活用し、関連する内部データも積極的に参照すること。同じファイルを複数回fetchしないこと
- 回答内に引用元メタデータ(ファイル名・章・ページ等)を明記すること
- 日本語で推論し、日本語で回答すること

【禁止事項・注意点】
- 一般論や曖昧な表現は避け、必ず根拠やデータに基づく分析・解説を行うこと
- 各セクションは、政策立案や業務改善に役立つよう、論理的かつ実務的な観点でまとめること

あなたの役割は、非専門家でも理解できるよう、正確かつ引用付きでガイドライン等の内容を要約・分析し、ユーザーの意思決定や業務に資する情報を提供することです。
"""

7. 実行例・結果

それでは実行してみる。
質問は以下の通り

本ガイドラインをレポートとしてまとめてください。
また、付随して本ガイドラインの問題点や改善点、今後の展望についても考察してください。

以下実行結果、md形式で出力されるのでとても見やすい。
(詳細はopenaiのダッシュボードから確認可能)

ただ長いので、最後のまとめだけ抜粋。

#print(response.output[-1].content[0].text)の結果

# デジタル・ガバメント推進標準ガイドラインの概要と考察
(省略)
**まとめとして**、  
デジタル・ガバメント推進標準ガイドラインは日本の行政DXを牽引する重要な枠組みであり、
データに裏付けられた効果検証志向やプロジェクト管理手法の標準化によって一定の成果を上げてきました。
一方で、運用定着やさらなる簡素化、技術革新への追従といった課題も残されています。
しかしガイドライン自体に改善サイクルが内包され、デジタル庁を中心とした**継続的学習組織**としての政府の姿勢が打ち出されている点は大きな強みです[pdf1]。
今後、デジタル社会の実現に向けて本ガイドラインがどのように進化し、現場で活用され、新たな行政サービス創出につながっていくか、定量的な成果指標のトラッキングも含め注視されます。
行政サービスの向上と業務効率化という二兎を追う挑戦において、本ガイドラインが**羅針盤**の役割を果たし続けることが期待されています
 [pdf2] [pdf3]

うーん、こりゃすごい。この手軽さでいきなりここまで回答してくれるのはありがたい。
[pdf1]の所には参照したベクトルストアのPDFのFileIDが示されており、どの文献を見て回答したかが分かるようになっている。
また、ダッシュボードでログを見ればわかるが、Deep Research が search → fetch → answer を自動で繰り返し、レポートを生成しているようだ。


8. 感想

自分も社内文書やらを対象に

  • ベクトルDB作って
  • チャンキングしてデータ投入して
  • エージェント設計して

やらなんやらをReAct等用いながらやっていたが
このお手軽さでいきなりここまで回答できるのはすごい。

自分なんかが下手にごちゃごちゃエージェント設計するより
もう全部これで良いのでは?感がある。

とはいえそれもちょっと悔しいので次は精度比較してみようかな。
一旦今回の目的は「MCPサーバー使って独自データを検索させて回答させる」動作確認までなのでこれでよいとする。

ありがとうございました。


9. 参考リンク


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?