【論文解説 & 実装】Deep Researchは"拡散"する — Test-Time Diffusion で作る次世代リサーチエージェント
こんにちは。今回は、2025年7月に Google Cloud AI Research から発表された論文 "Deep Researcher with Test-Time Diffusion" (TTD-DR) の概念解説と、それを Google の Agent Development Kit (ADK) を使って実装してみたアプローチについて紹介します。

本記事のスライド資料
Deep Research の課題と "拡散" というアプローチ
最近、OpenAI の Deep Research など、Web検索を繰り返して深い調査を行う「リサーチエージェント」が注目されています。しかし、従来型の Deep Research(ReAct や単純な反復検索)には課題がありました。
- 直線的なプロセス: 「検索 → 執筆」の一方通行であることが多く、一度書かれた内容の方向修正が難しい。
- 情報の損失: 検索結果が増えるにつれ、初期の重要な文脈が薄れたり、逆に不要な情報が混ざったりする。
TTD-DR vs 従来型エージェント
TTD-DR は、この課題に対して Test-Time Diffusion(推論時の拡散プロセス) というアプローチを持ち込みました。
| 特徴 | 従来の Deep Research | TTD-DR (Test-Time Diffusion) |
|---|---|---|
| プロセス | 直列的 (Linear) 検索 → 要約 → 執筆 |
循環的 (Cyclic) ドラフト → 評価 → 検索 → 修正 |
| 情報の扱い | 追記型 (Append) 情報をどんどん足していく |
更新型 (Refine/Denoise) 不確かな情報を削ぎ落とし、確かな情報を埋める |
| 修正能力 | 低い 一度書いたハルシネーションが残りやすい |
高い 次のループで検索結果と照合され、自己訂正される |
つまり、「一度に書き上げる」のではなく、「ノイズだらけの彫刻を徐々に磨き上げる」アプローチです。

実装:Google ADK で TTD-DR を構築する
このアーキテクチャを実装するにあたり、Google の Agent Development Kit (ADK) を使用しました。ADK はステート管理が強力で、TTD-DR のようなループ構造を持つ複雑なワークフローを綺麗に記述できます。
以下は、私が作成しているプロジェクトのコードベース (ttd_dr/) からの抜粋解説です。
1. 全体の構造 (Root Agent)
全体は SequentialAgent で構成されています。「初期ドラフト作成」→「拡散ループ」→「最終仕上げ」という流れです。
# ttd_dr/agent.py
root_agent = SequentialAgent(
name="self_evolving_research_agent",
sub_agents=[
ParallelAgent(
name="initial_draft_and_research_plan_generator",
sub_agents=[
initial_draft_generator, # ここで「ノイズのある」初期ドラフトを作成
research_plan_generator,
],
),
diffusion_loop, # ここで純化(Denoise)を行う
final_report_generator,
],
)
2. 拡散ループ (Diffusion Loop)
ここが TTD-DR の心臓部です。LoopAgent を使い、情報の検索とドラフトの修正を繰り返します。
# ttd_dr/sub_agents/diffusion_loop/agent.py
backbone_loop_body = SequentialAgent(
name="backbone_loop_body",
sub_agents=[
search_query_generator, # 1. ドラフトの欠損を見つけて検索クエリを作る
answer_searcher, # 2. 実際に検索する
draft_denoiser, # 3. ドラフトを修正(Denoise)して上書きする
],
)
diffusion_loop = LoopAgent(
name="diffusion_loop",
sub_agents=[backbone_loop_body],
max_iterations=3, # 3回磨き上げる
)
3. 技術的な勘所:どうやって「純化」しているのか?
このループの中で特に重要なのが、「どうやって検索し、どうやって直すか」というロジックです。
A. 欠損の特定 (Search Query Generator)
ただ漠然と検索するのではなく、「現在のドラフト」を読み込んで、足りない部分だけを狙い撃ちします。
また、論文にある「Self-Evolution」の要素を取り入れ、複数のクエリ候補を作成してから統合(Cross-Over)する実装にしています。
# ttd_dr/sub_agents/diffusion_loop/sub_agents/search_query_generator.py
search_query_merger = Agent(
name="search_query_merger",
instruction="""
あなたは Self-Evolution プロセスの「Cross-Over」ステップを担当する Search-Query-Merger です。
...
各候補の焦点(rationale)を比較し、重複・不足を整理する。
互いに補完し合う観点を組み合わせて、最も網羅的で明確な1問を構成する。
...
""",
output_key="merged_search_query", # これを使って次の AnswerSearcher が検索する
)
B. ドラフトの修正 (Draft Denoiser)
ここが「拡散モデル」における Denoising Step です。
現在のドラフト (current_report_draft) と検索結果を受け取り、情報を統合して上書きします。
# ttd_dr/sub_agents/diffusion_loop/sub_agents/draft_denoiser.py
draft_denoiser = Agent(
name="draft_denoiser",
instruction="""
...
現在のドラフト {current_report_draft} と検索質問・回答履歴 {all_qa_pairs} を用いて、
以下の3点を行ってください:
- 新情報を適切な位置に統合し、内容を拡充する
- 不正確または重複した記述を削除する
- まだ不明な点がある場合は「未解決項目」として明示する
出力:修正版の完全なドラフトを Markdown 形式で返してください。
""",
output_key="current_report_draft", # ★ここで状態(ドラフト)を更新する
)
4. ADK の State 管理:Canvas としての役割
この実装で鍵となるのが、ADK の InvocationContext (State) です。
通常のエージェントフレームワークでは、前のエージェントの出力が次のエージェントの入力になる「バケツリレー」になりがちです。しかし、TTD-DR では**「同じドラフトを何度も書き直す」**必要があります。
ADK では、State を**共有ホワイトボード(Canvas)**のように扱えます。
-
Initial Generator:
state["current_report_draft"]に最初のラフを書く。 -
Query Generator:
state["current_report_draft"]を読むだけ。どこが弱いか分析する。 -
Denoiser:
state["current_report_draft"]を読み、修正版を書き込み(上書き)する。
この「変数は持ち回るが、更新するのは特定の役割だけ」という設計が、output_key を指定するだけで簡単に実装できる点が ADK の大きなメリットだと感じました。
まとめ
Test-Time Diffusion Deep Research (TTD-DR) は、LLM に「推敲」のプロセスを構造的に組み込むことで、長文リサーチの品質を劇的に向上させる可能性を秘めています。
- ワンショット生成からの脱却: いきなり完璧な答えを求めず、叩き台を直していく。
- 自己訂正ループ: 幻覚(ハルシネーション)を次週のループで検索結果と照合して消せる。
これからエージェント開発をする方にとって、この Draft-Refine Loop パターンは強力な武器になるはずです。
※なお、論文 (TTD-DR) では、今回紹介した「拡散ループ」以外にも、プロンプト自体を進化させるアルゴリズムなどの提案も含まれています。興味のある方はぜひ原論文も参照してみてください。
参考: Deep Researcher with Test-Time Diffusion (arXiv:2507.16075)
Discussion