Generative AI

OpenRouter で NVIDIA Nemotron を使用してレポート生成 AI エージェントを構築する

Reading Time: 6 minutes

従来のシステムはあらかじめ定義された手順に従いますが、AI エージェント大規模言語モデル (LLM) を使用して、自律的に意思決定を行い、変化する要件に対応し、複雑な推論を実行するシステムです。

このレポート生成エージェントを構築するためのセルフペース型ワークショップ ガイドでは、次のことを学ぶことができます。 

  • NVIDIA Nemotron 含むあらゆる AI エージェントに共通する 4 つの主要な要素についての理解。Nemotron はオープンなデータで学習された重みを備えたオープン モデル ファミリです。
  • 調査とレポート作成を行うドキュメント生成エージェントの構築方法。
  • LangGraph と OpenRouterを使ってエージェントを構築する方法。
  • すぐに使用できるポータブルな開発環境。
  • NVIDIA Launchable で共有可能なあなただけのカスタマイズ済みエージェントの構築。

概要動画

動画 1. NVIDIA Nemotron を使用してレポート生成 AI エージェントを構築する

ワークショップのデプロイ

NVIDIA Brev Launchable でワークショップを起動します。

図 1.「今すぐデプロイ」ボタンをクリックして、NVIDIA DevX ワークショップをクラウドにデプロイする

シークレット情報の設定

このワークショップを進めていくには、プロジェクトのシークレット情報をいくつか取得して設定する必要があります。

  • OpenRouter API キー: OpenRouter を介して NVIDIA Nemotron Nano 9B V2 モデルにアクセスするために使用します。
  • Tavily API キー: Tavily のウェブ検索 API にアクセスし、リアルタイム検索を使用するために必要です。

JupyterLab 環境を起動したら、NVIDIA DevX Learning Path 内の Secrets Manager タイルを使用して、ワークショップ開発環境用のシークレット情報を設定します。ログのタブで、シークレット情報が正しく追加されたことを確認します。

図 2. NVIDIA DevX Learning Path のセクションにある「Secrets Manager」タイルからプロジェクトのシークレット情報を設定する

次に、JupyterLab Launcher 内の「NVIDIA DevX Learning Path」セクションから「1. Introduction to Agents」タイルを選択し、Lab の Introduction を開いてコースを開始します。

図 3. 「1. Introduction to Agents」タイルをクリックして Lab の Introduction を開く。

エージェント アーキテクチャの紹介

ワークショップ環境の準備が整ったら、最初のセクションでは「エージェントとは何か」を理解します。実装に入る前に、エージェントが従来の単純な AI アプリケーションとどう異なるのかを理解することが重要です。 

従来の LLM ベースのアプリケーションとは異なり、エージェントは動的にツールを選択し、複雑なリーズニングを行い、状況に合わせて分析方法を調整することができます。ここでは、あらゆるエージェントに共通する 4 つの基本要素について学びます。

  • モデル: どのツールを使用し、どのように応答するかを決定する上で中心的な役割を果たす LLM。
  • ツール: LLM が数値計算、データベース照会、API 呼び出しなどの実行するための関数。
  • メモリと状態: 対話中または対話と対話の間に LLM が参照する情報。
  • ルーティング: 現在の状態と LLM の決定に基づいて、エージェントが次に何をすべきかを決定するロジック。

これらの要素を組み合わせて、計算機能を搭載した基本的なエージェントを構築する方法を code/intro_to_agents.ipynb で学びます。このレッスンの終了までには、以下を行うエージェントを構築できるようになっているでしょう。

[{'content': 'What is 3 plus 12?', 'role': 'user'},
 {'content': None,
  'role': 'assistant',
  'tool_calls': [{'function': {'arguments': '{"a": 3, "b": 12}', 'name': 'add'},
                  'id': 'chatcmpl-tool-b852128b6bdf4ee29121b88490174799',
                  'type': 'function'}]},
 {'content': '15',
  'name': 'add',
  'role': 'tool',
  'tool_call_id': 'chatcmpl-tool-b852128b6bdf4ee29121b88490174799'},
 {'content': 'The answer is 15.', 'role': 'assistant'}]

レポート生成コンポーネント

ワークショップの後半では、LangGraph および OpenRouter 上でホストされた NVIDIA NIM を使い、複数レイヤーのエージェント型システムを構築します。アーキテクチャは相互に関連しあう 4 つのエージェント型コンポーネントで構成され、それぞれのコンポーネントは文書生成プロセスにおいて特定の役割を担っています。

  1. 初期調査: トピックに関する包括的な情報を収集します。
  2. 概略の計画: 調査に基づき、どのような構造の文書にするか概略を作成します。
  3. セクションの記述: 必要に応じて追加調査を行いながら、各セクションの詳細な内容を生成します。
  4. 最終編集: すべてのセクションを組み合わせ、プロフェッショナルなレポートにまとめます。

コードを学び実装する

概念を理解したので、実際に実装してみましょう。上記の基本的な要素から始め、エージェントを構築して完成までもっていきます。

  1. モデルを選択する
  2. ツールを選択する
  3. 調査コンポーネントを構築する
  4. 著者コンポーネントを構築する
  5. 最終的なエージェントを構築する
  6. エージェントの管理とルーティング

基礎: モデル

このワークショップでは、エージェントを支える中核モデルとして NVIDIA NIM エンドポイント を使用します。NVIDIA NIM は高性能な推論機能を提供し、以下の特長を備えています。

  • ツール連携: 関数呼び出しのネイティブ サポート。
  • 構造化出力: Pydantic モデルを標準でサポート。
  • 非同期処理: 同時処理を可能にする完全な async/await サポート
  • エンタープライズの信頼性: 本番環境レベルの推論基盤。

この例では、OpenRouter 上でホストした NVIDIA NIM を使用する ChatNVIDIA コネクタを示しています。

from langchain_nvidia_ai_endpoints import ChatNVIDIA
 
llm = ChatNVIDIA(
    base_url="https://openrouter.ai/api/v1",
    model="nvidia/nemotron-nano-9b-v2:free", 
    api_key=os.getenv("OPENROUTER_API_KEY")
)
llm_with_tools = llm.bind_tools([tools.search_tavily])

LLM アプリケーションにおいて明確に指示することは重要ですが、エージェントでは特に曖昧さを排除し、意思決定を明確にするため不可欠です。code/docgen_agent/prompts.py の例では、以下の原則を示しています。

research_prompt: Final[str] = """
Your goal is to generate targeted web search queries that will gather comprehensive information for writing a technical report section.
 
Topic for this section:
{topic}
 
When generating {number_of_queries} search queries, ensure they:
1. Cover different aspects of the topic (e.g., core features, real-world applications, technical architecture)
2. Include specific technical terms related to the topic
3. Target recent information by including year markers where relevant (e.g., "2024")
4. Look for comparisons or differentiators from similar technologies/approaches
5. Search for both official documentation and practical implementation examples
 
Your queries should be:
- Specific enough to avoid generic results
- Technical enough to capture detailed implementation information
- Diverse enough to cover all aspects of the section plan
- Focused on authoritative sources (documentation, technical blogs, academic papers)"""

このプロンプトから、信頼性の高い LLM プロンプトを書く上で鍵となる原則がいくつかあることが分かります。

  • 役割の明確化: エージェントの専門分野と責任を明確に定義します。
  • タスクの分解: 複雑な要件を具体的で実行可能なステップまたは基準に分解します。
  • 具体性: 時間的条件や信頼できる情報源を明確に参照します。
  • 構造化入出力: 期待される入力形式と出力形式を具体的に指示します。

基礎: ツール

エージェントの機能はどのツールを使用するかによって決まります。このワークショップでは、AI エージェント向けに設計された検索 API である Tavily を主要な情報収集ツールとして使用します。

# imports and constants omitted
@tool(parse_docstring=True)
async def search_tavily(
    queries: list[str],
    topic: Literal["general", "news", "finance"] = "news",
) -> str:
    """Search the web using the Tavily API.
 
    Args:
        queries: List of queries to search.
        topic: The topic of the provided queries.
          general - General search.
          news - News search.
          finance - Finance search.
 
    Returns:
        A string of the search results.
    """
    search_jobs = []
    for query in queries:
        search_jobs.append(
            asyncio.create_task(
                tavily_client.search(
                    query,
                    max_results=MAX_RESULTS,
                    include_raw_content=INCLUDE_RAW_CONTENT,
                    topic=topic,
                    days=days,  # type: ignore[arg-type]
                )
            )
        )
    search_docs = await asyncio.gather(*search_jobs)
    return _deduplicate_and_format_sources(
        search_docs,
        max_tokens_per_source=MAX_TOKENS_PER_SOURCE,
        include_raw_content=INCLUDE_RAW_CONTENT,
    )

ツール モジュールを実装する上で鍵となるアーキテクチャについて以下を決定します。

  • 非同期処理: 並列検索に `asyncio.gather()` を使用します
  • 重複排除: ヘルパー関数により複数の検索による重複を防ぎます
  • 構造化文書: Google スタイルの docstring により、LLM はツールの使用方法を理解できます

コード内のモデルやツールについて基礎的なことを理解できたので、実際に作動するエージェントを組み立ててみましょう。‌状態管理やルーティングの要素についてはまだ学んでいませんが、エージェントのコンポーネントを構築した後に取り上げます。 

調査コンポーネントを実装する

エージェントの調査コンポーネントにはリーズニング パターンとアクション パターン (ReAct) を実装しますが、これはツールを使用するエージェントにとって最も効果的なアーキテクチャの 1 つです。こうしたパターンによって、エージェントが何をすべきかを考え、アクションを起こし、その結果に基づいて次のステップを決定するというループが形成されます。このループは、タスクを完了するためにこれ以上のアクションは必要ないとエージェントが評価するまで続きます。

図 4. ReAct ループはツールを使用するエージェントがタスクを完了するのに効果的なアーキテクチャ

このエージェントの調査コンポーネントのコードは code/docgen_agent/researcher.py で実装されており、code/researcher_client.ipynb でテストできます。

state = ResearcherState(
    topic="Examples of AI agents in various industries.",
    number_of_queries=3,
)
state = await graph.ainvoke(state)
 
for message in state["messages"]:
    print("ROLE: ", getattr(message, "role", "tool_call"))
    print(message.content[:500] or message.additional_kwargs)
    print("")

また、実行中に調査コンポーネントが行った各アクションを確認することもできます。

INFO:docgen_agent.researcher:Calling model.
INFO:docgen_agent.researcher:Executing tool calls.
INFO:docgen_agent.researcher:Executing tool call: search_tavily
INFO:docgen_agent.tools:Searching the web using the Tavily API
INFO:docgen_agent.tools:Searching for query: Technical architecture of AI agents in healthcare 2024
INFO:docgen_agent.tools:Searching for query: Comparison of machine learning frameworks for AI agents in finance
INFO:docgen_agent.tools:Searching for query: Real-world applications of natural language processing in AI agents for customer service 2024
INFO:httpx:HTTP Request: POST https://api.tavily.com/search "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: POST https://api.tavily.com/search "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: POST https://api.tavily.com/search "HTTP/1.1 200 OK"
INFO:docgen_agent.researcher:Calling model.

ツール呼び出し要求、ツール出力、結果をまとめた最終メッセージといった最終出力も確認できます。 

ROLE:  assistant
{'tool_calls': [{'id': 'chatcmpl-tool-b7185ba8eb3a44259b0bdf930495ece5', 'type': 'function', 'function': {'name': 'search_tavily', 'arguments': '{"queries": ["Technical architecture of AI agents in healthcare 2024", "Comparison of machine learning frameworks for AI agents in finance", "Real-world applications of natural language processing in AI agents for customer service 2024"], "topic": "general"}'}}]}
 
ROLE:  tool_call
"Sources:\n\nSource AI Agents in Modern Healthcare: From Foundation to Pioneer:\n===\nURL: https://www.preprints.org/manuscript/202503.1352/v1\n===\nMost relevant content from source: T. Guo et al., \"Large language model based multi-agents: A survey of progress and challenges,\" arXiv preprint arXiv:2402.01680, 2024. J. Ruan et al., \"TPTU: Large Language Model-based AI Agents for Task Planning and Tool Usage. | **Partner Agent** | * True healthcare team partners * Generates clinical hypotheses
 
ROLE:  assistant
Based on the search results, here are some potential search queries that could be used to gather comprehensive information for writing a technical report section on examples of AI agents in various industries:
 
1. "Technical architecture of AI agents in healthcare 2024"
2. "Comparison of machine learning frameworks for AI agents in finance"
3. "Real-world applications of natural language processing in AI agents for customer service 2024"

著者コンポーネントを実装する

シンプルな ReAct エージェントは非常にパワフルですが、ステップをさらに追加してより複雑なワークフローを実行させることもできます。セクションの著者コンポーネントでは、セクションごとの追加調査が必要な場合にのみ調査を行い、その結果をもとに執筆します。必要な調査を行えたら、その調査結果を用いてセクションを記述します。

修正されたアーキテクチャ図では、追加調査が必要かどうかを判断するゲート関数が React スタイルのエージェントの前に追加されており、最後に記述ステップが追加されています。

図 5. ReAct エージェント ループにセクションの著者コンポーネントが追加されており、要求があった場合に関連した追加調査を実行する

このエージェントの調査コンポーネントのコードは code/docgen_agent/author.py で実装されており、code/author_client.ipynb でテストできます。 

state = SectionWriterState(
    index=1,
    topic="Examples of AI agents in various industries.",
    section=Section(
        name="Real-World Applications",
        description="Examples of AI agents in various industries",
        research=True,
        content=""
    ),
)
 
state = await graph.ainvoke(state)
Markdown(state["section"].content)

また、実行中に著者コンポーネントが行った各アクションも確認することができます。

INFO:docgen_agent.author:Researching section: Real-World Applications
INFO:docgen_agent.author:Executing tool calls for section: Real-World Applications
INFO:docgen_agent.author:Executing tool call: search_tavily
INFO:docgen_agent.tools:Searching the web using the Tavily API
INFO:docgen_agent.tools:Searching for query: AI agents in healthcare industry 2024
INFO:docgen_agent.tools:Searching for query: Implementation of AI agents in finance sector 2023
...
INFO:httpx:HTTP Request: POST https://api.tavily.com/search "HTTP/1.1 200 OK"
INFO:docgen_agent.author:Researching section: Real-World Applications
INFO:docgen_agent.author:Writing section: Real-World Applications

マークダウン形式で記述されたセクションとして最終出力も確認することができます。 

## Real-World Applications
 
AI agents have numerous applications across various industries...
 
### Healthcare
 
AI agents in healthcare are revolutionizing patient care and medical innovation. They are being used to automate administrative tasks, enhance diagnostics, and improve workflow efficiency. For instance...
 
### Finance
 
AI agents in finance are driving innovation, success, and compliance. They are being used to automate tasks such as data entry, transaction processing, and compliance checks. AI agents are also being used to detect fraud, improve customer service, and provide personalized investment advice. For example...

最終的なエージェントを実装する

この 2 つのコンポーネントを使うことで、レポート生成エージェントのワークフローをまとめることができます。このアーキテクチャは直線的でこれまでで最もシンプルなワークフローで、トピックを調査し、セクションを記述し、全体を最終的なレポートにまとめます。

図 6. トピックを調査し、セクションを記述し、レポートをまとめるレポート作成エージェントのワークフロー

このエージェントの調査コンポーネントのコードは code/docgen_agent/agent.py で実装されており、code/agent_client.ipynb でテストできます。

state = AgentState(
    topic="The latest developments with AI Agents in 2025.",
    report_structure="This article should be..."
)
 
state = await graph.ainvoke(state)
Markdown(state["report"])

実行中に著者コンポーネントが行った各アクションを確認することができます。

INFO:docgen_agent.agent:Performing initial topic research.
INFO:docgen_agent.researcher:Calling model.
INFO:docgen_agent.researcher:Executing tool calls.
INFO:docgen_agent.researcher:Executing tool call: search_tavily
INFO:docgen_agent.tools:Searching the web using the Tavily API
INFO:docgen_agent.tools:Searching for query: AI Agents 2025 core features
INFO:docgen_agent.tools:Searching for query: Real-world applications of AI Agents in 2025
...
INFO:httpx:HTTP Request: POST https://api.tavily.com/search "HTTP/1.1 200 OK"
INFO:docgen_agent.researcher:Calling model.
INFO:docgen_agent.agent:Calling report planner.
INFO:docgen_agent.agent:Orchestrating the section authoring process.
INFO:docgen_agent.agent:Creating author agent for section: Introduction
INFO:docgen_agent.agent:Creating author agent for section: Autonomous Decision-Making
INFO:docgen_agent.agent:Creating author agent for section: Integration with Physical World
INFO:docgen_agent.agent:Creating author agent for section: Agentic AI Trends
INFO:docgen_agent.agent:Creating author agent for section: AI Agents in Customer Support
INFO:docgen_agent.agent:Creating author agent for section: AI Agents in Healthcare
INFO:docgen_agent.agent:Creating author agent for section: Conclusion
INFO:docgen_agent.agent:Throttling LLM calls.
INFO:docgen_agent.author:Writing section: Introduction
INFO:docgen_agent.author:Researching section: Autonomous Decision-Making
...

最終レポートは、マークダウン形式で生成されます。このエージェントが生成した調査レポートのサンプルはこちらです: マークダウン出力のサンプル

基礎: 状態管理とルーティング

エージェントのコンポーネントを構築できたので、ここで一歩戻って、LangGraph をエージェントのフレームワークとして使用して詳細な状態管理とフロー制御を行い、3 つのコンポーネントをすべて 1 つのエージェント型 AI システムと結合する方法について学びましょう。LangGraph の主な利点として次の 2 つが挙げられます。

  • 条件付きルーティング: 条件付きエッジによりランタイム条件に基づく動的なフロー制御が可能になり、次にどのようなアクションを取るべきかエージェントがインテリジェントな決定を下すことができます。
  • グラフのコンパイルと非同期実行: コンパイルしたグラフは同期しなくても呼び出すことができ、複数のエージェントからなるシステムに不可欠な並列実行と複雑なオーケストレーション パターンをサポートします。

code/docgen_agent/agent.py にある次の例では、以前に構築したコンポーネントがどのノードに対応しているかが分かるだけでなく、あるノードから次のノードへの中間出力を結合またはルーティングしているエッジも分かります。

main_workflow = StateGraph(AgentState)
main_workflow.add_node("topic_research", topic_research)
main_workflow.add_node("report_planner", report_planner)
main_workflow.add_node("section_author_orchestrator", section_author_orchestrator)
main_workflow.add_node("report_author", report_author)
 
main_workflow.add_edge(START, "topic_research")
main_workflow.add_edge("topic_research", "report_planner")
main_workflow.add_edge("report_planner", "section_author_orchestrator")
main_workflow.add_edge("section_author_orchestrator", "report_author")
main_workflow.add_edge("report_author", END)

お疲れさまでした! この開発者向けワークショップの各ステップを通じて、自分だけの LangGraph エージェントを構築できました。新しいエージェントを code/agent_client.ipynb ノートブックでテストしてみてください。

まとめ

AI エージェントを構築するには、理論的な基礎と実装する際の課題の両方について理解しておく必要があります。このワークショップでは、基本的な概念から複雑なエージェント型システムに至るまで流れに沿って全体を学んでいただけます。特に本番環境用のツールと手法を習得いただけます。 

開発者は以下について実践的な経験を積むことができます。

  • エージェントの基本的な概念: ワークフローとインテリジェントなエージェントの違いの理解。
  • 状態管理: 複雑な状態遷移と永続性の実装。
  • ツールの統合: 外部ツール機能の作成と管理。
  • 最新 AI スタック: LangGraph、NVIDIA NIM、および関連ツールの活用。

詳細を見る

ハンズオン学習や実践的なヒントを得るためには、オンデマンド配信「OpenRouter で NVIDIA Nemotron を使用してレポート生成 AI エージェントを構築」を是非視聴ください。

​​NVIDIA ニュースコミュニティLinkedInInstagramXFacebook で NVIDIA AI などを通してエージェント型 AI、Nemotron などに関する最新情報をお届けてしています。自分のペースで学べるビデオ チュートリアルとライブ ストリームはこちらからご覧ください。

Tags