はじめに
FDUA(金融データ活用推進協会)主催の「第4回金融データ活用チャレンジ」に参加しました。今回のデータチャレンジは、生成AIをバディ(相棒)として活用し、データに基づいた価値ある提案書を作成することがテーマで、そのプロセスとアウトプットの質を競います。
その取り組みの中で、データチャレンジ協賛企業であるDataRobot様のトライアルアカウントをお借りして、LLM Gateway と Agent Templateを用いて、複数のAIエージェントが連携し、財務分析から経営提案書作成までを自動化する、マルチエージェントAIアプリを構築しました。
本記事では、システム構成や実装のポイントを中心に解説しますので、これからDataRobot様のAgent Templateを使ってみたい方や、生成AIを業務プロセスに組み込む際の設計イメージを掴みたい方の参考になれたら嬉しいです。
まずは Agent Template をローカルで動かす
DataRobot の Agent Template をローカルで起動し、最小限のチャットUI(Chainlit)まで動かします。OSはwindows11です。
1. リポジトリを取得して移動
ローカルで起動するアプリを構築するためにAgentTemplateをgit cloneして、datarobot-agent-applicationに移動します。
git clone https://github.com/datarobot-community/datarobot-agent-application.git
cd datarobot-agent-application
2. Python 仮想環境を作成して有効化
python -m venv venv
venv\Scripts\activate
3. .envをコピーして編集
.env.templateを.envとしてcopyします。
copy .env.template .env
.envを開きます。以下のコマンドで.envがnotepadで開きます。
notepad .env
.env ファイルの以下の設定を変更します。
① DataRobot API トークンの設定
# 変更前
DATAROBOT_API_TOKEN=
# 変更後
DATAROBOT_API_TOKEN=YOUR_DATAROBOT_API_KEY
※ YOUR_DATAROBOT_API_KEY には、ご自身のDataRobotAPI キーを指定してください。
APIキーは GitHubなどにコミットしないよう取り扱いに細心の注意が必要です。
② DataRobot エンドポイントの変更(日本リージョン)
#変更前
DATAROBOT_ENDPOINT=https://app.datarobot.com/api/v2
#変更後
DATAROBOT_ENDPOINT=https://app.jp.datarobot.com/api/v2
③ LLM 機能の有効化(コメントアウト解除)
# 変更前
# INFRA_ENABLE_LLM=deployed_llm.py
# 変更後
INFRA_ENABLE_LLM=deployed_llm.py
④SESSION_SECRET_KEYを設定- 以下のコマンドを実行して、出力された文字列をSESSION_SECRET_KEYに指定します。
python -c "import os, binascii; print(binascii.hexlify(os.urandom(64)).decode('utf-8'))"
# 変更前
SESSION_SECRET_KEY=
# 変更後
SESSION_SECRET_KEY=出力された文字列
4. 必要なライブラリをインストールします
pip install datarobot datarobot-genai langchain langgraph langchain-litellm python-dotenv chainlit
5.lit.pyを作成します
lit.pyを作成します。
2026/1/26現在はagent/配下にlit.pyが存在しなかったので自分で作成します。以下の内容の最小限のチャットlit.pyを自作します。datarobot-agent-application/agent直下に保存してください。
lit.py(長いので折りたたんでます)
import os
import chainlit as cl
from dotenv import load_dotenv
from openai import AsyncOpenAI
load_dotenv()
DATAROBOT_API_TOKEN = os.getenv("DATAROBOT_API_TOKEN")
DATAROBOT_ENDPOINT = os.getenv("DATAROBOT_ENDPOINT", "https://app.jp.datarobot.com/api/v2")
LLM_GATEWAY_URL = f"{DATAROBOT_ENDPOINT}/genai/llmgw"
# DataRobot LLM Gateway へ接続(OpenAI互換)
client = AsyncOpenAI(base_url=LLM_GATEWAY_URL, api_key=DATAROBOT_API_TOKEN)
# 使うモデル(必要なら .env で上書き可)
MODEL = os.getenv("LLM_MODEL", "azure/gpt-5-2025-08-07")
# 会話履歴の保持数(多すぎるとトークンが増えるので控えめ推奨)
MAX_TURNS = int(os.getenv("MAX_TURNS", "8")) # user+assistant のペア数
SYSTEM_PROMPT = os.getenv(
"SYSTEM_PROMPT",
"あなたは親切で簡潔なアシスタントです。日本語で回答してください。",
)
def _trim_history(messages: list[dict], max_turns: int) -> list[dict]:
"""system + 直近max_turnsペア分だけ残す"""
if not messages:
return messages
sys = messages[:1] if messages[0].get("role") == "system" else []
rest = messages[1:] if sys else messages
# 1 turn = user + assistant = 2 messages
keep = max_turns * 2
return sys + rest[-keep:]
@cl.on_chat_start
async def on_chat_start():
if not DATAROBOT_API_TOKEN:
await cl.Message(
content="DATAROBOT_API_TOKEN が未設定です。.env を確認してください。"
).send()
return
cl.user_session.set(
"messages",
[{"role": "system", "content": SYSTEM_PROMPT}],
)
await cl.Message(
content=(
"# DataRobot LLM Gateway のチャットUI\n\n"
"メッセージを送ってください。"
)
).send()
@cl.on_message
async def on_message(message: cl.Message):
user_text = (message.content or "").strip()
if not user_text:
await cl.Message(content="何か入力してください。").send()
return
messages = cl.user_session.get("messages") or [{"role": "system", "content": SYSTEM_PROMPT}]
messages.append({"role": "user", "content": user_text})
messages = _trim_history(messages, MAX_TURNS)
# まず空メッセージを出して、後でstreamで更新
msg = cl.Message(content="")
await msg.send()
try:
stream = await client.chat.completions.create(
model=MODEL,
messages=messages,
temperature=0.2,
stream=True,
)
answer = ""
async for chunk in stream:
delta = chunk.choices[0].delta.content if chunk.choices else None
if delta:
answer += delta
await msg.stream_token(delta)
# 会話履歴に保存
messages.append({"role": "assistant", "content": answer})
messages = _trim_history(messages, MAX_TURNS)
cl.user_session.set("messages", messages)
except Exception as e:
await msg.update(content=f"エラー: {type(e).__name__}: {e}")
6. 起動して動作確認
チャットが動くか確認します。以下のコマンドを実行すると
cd agent
chainlit run lit.py
以下の無骨なチャットUIが起動します。ちゃんとローカルhttp://localhost:8000/で動いてますね。

試しにDataRobotについて尋ねてみるときちんと教えてくれました。

以上、DataRobot様のAgentTemplateで簡単にローカル起動するAIアプリを作成できました。
これからAgentTemplateを改造して、提案書作成を自動化するマルチエージェントAIアプリを構築します。
課題設定
データ活用チャレンジの概要
架空の企業の有価証券報告書や財務データなどを用いて将来の成長につながる戦略を提案します。評価のポイントは以下の通りです。
| 評価視点 | 内容 |
|---|---|
| 全体構成 | 過去分析と未来提案の論理的接続 |
| 地域性 | 商圏・人口動態・行政施策を踏まえた地域密着型提案 |
| 業界特性 | 官公庁/民間、元請/下請などの販路・商流理解 |
| 業界課題 | GX/DX、2024年問題、人材不足への対応 |
マルチエージェントの利点
企業の事業性評価は多角的な分析が必要です。財務分析、地域分析、業界動向分析、それらを統合した戦略提案、これらを単一のプロンプトで処理しようとすると、以下の問題が発生することが考えられます。
- コンテキストが長大になりLLMの性能が低下
- 各分析の専門性が薄まる
- 出力の構造化が困難
そこで、専門性を持った複数のエージェントが連携する構成を採用しました。
システム構成
全体アーキテクチャ
┌───────────────────────────────┐
│ UI: Chainlit │
└───────────────┬───────────────┘
▼
┌───────────────────────────────┐
│ DataRobot LLM Gateway │
│ (Azure OpenAI / other LLM IF) │
└───────────────┬───────────────┘
▼
Step0 📋 PDFやマーダウンの要約
▼
Step1 📊 過去財務分析
▼
Step2 🗺️ 地域特性分析
▼
Step3 🏗️ 販路・商流分析
▼
Step4 🌱 業界課題分析(GX/DX・人材)
▼
Step5 🚀 成長戦略策定
▼
Step6 📝 提案書作成(最終出力)
使用技術
| 技術要素 | 使用ツール | 役割 |
|---|---|---|
| LLM Gateway | DataRobot API | Azure OpenAI等への統一アクセス |
| Agent Framework | DataRobot Agent Template | エージェント管理 |
| Chat UI | Chainlit | インタラクティブなUI |
| PDF処理 | PyMuPDF (fitz) | 有価証券報告書の読み込み |
| 環境管理 | python-dotenv | APIキー等の管理 |
DataRobot LLM Gateway の活用
LLM Gatewayとは
DataRobotのLLM Gatewayは、複数のLLMプロバイダー(Azure OpenAI、OpenAI、Anthropic等)への統一的なアクセスを提供してくれます。
メリット:
- モデルの切り替えが容易
- 利用状況の一元管理
- 企業のセキュリティポリシーに準拠
接続設定はlit.pyと.envで行ってます。
マルチエージェントの実装
エージェント定義
各エージェントは特定の分析領域に特化したプロンプトを持ちます。
以下は過去財務分析を行うエージェント用のプロンプト例です。
AGENTS = [
{
"name": "📊 過去財務分析エージェント【Past】",
"section": "1. 過去3年間の財務・事業分析",
"model": "azure/gpt-4o-2024-08-06", # DataRobotで利用可能なモデル
"max_tokens": 16000,
"prompt": """あなたは建設業専門の財務アナリストです。
提供された財務データから、過去3年間の企業状況を詳細に分析してください。
【必須分析項目】
1. 収益性分析(売上高推移、利益率推移)
2. 安全性分析(自己資本比率、流動比率)
3. 効率性分析(総資本回転率、売上債権回転期間)
4. 成長性分析(受注高・受注残高の推移)
5. 建設業特有の指標(外注費比率、技術者一人当たり完成工事高)
【出力形式】
- 数値は具体的に記載
- 3年間のトレンドを明確に示す
- 後続の「未来提案」につながる示唆を最後に記載"""
},
# ... 他のエージェント定義
]
要約エージェントによる前処理
有価証券報告書は数万文字に及び、全量をプロンプトに含めると502エラーが返って来たので、要約エージェントで情報を圧縮することにしました。
SUMMARY_AGENT = {
"name": "📋 データ要約エージェント",
"model": "azure/gpt-4o-2024-08-06",
"max_tokens": 16000,
"prompt": """あなたは建設業専門のデータアナリストです。
提供された大量の企業情報から、事業性評価に必要な重要情報を抽出・要約してください。
【抽出すべき情報】
1. 会社基本情報(会社名、所在地、従業員数)
2. 財務情報(過去3年分の売上高、利益、資産)
3. 事業構造(官公庁/民間比率、元請/下請比率)
4. 地域情報(営業エリア、地域での位置づけ)
5. 経営課題・リスク情報
【出力形式】
- 8000〜10000文字程度に要約
- 数値は具体的に記載(単位も明記)"""
}
エージェント実行ロジック
各エージェントは直列で処理を行うようにしています。前段の結果を後続が必ず参照することで、「過去分析→環境分析→課題整理→将来提案」の一貫したストーリーを保つためです。
並列実行では得られにくい因果関係のつながったアウトプットを重視し、金融機関の事業性評価プロセスに近い思考フローを再現する狙いです。
async def run_agent(agent: dict, context: str, summary: str) -> str:
"""単一エージェントを実行"""
try:
response = await client.chat.completions.create(
model=agent["model"],
max_tokens=agent["max_tokens"],
messages=[
{"role": "system", "content": agent["prompt"]},
{"role": "user", "content": f"【企業情報要約】\n{summary}\n\n【追加コンテキスト】\n{context}"}
]
)
return response.choices[0].message.content or ""
except Exception as e:
return f"エラー: {str(e)}"
async def run_all_agents(user_input: str, extracted_text: str) -> str:
"""全エージェントを順次実行してレポートを生成"""
# Step 1: 要約エージェントで前処理
summary = await run_summary_agent(extracted_text)
# Step 2: 各分析エージェントを順次実行
full_report = f"# 建設業 事業性評価レポート\n\n"
full_report += f"**分析対象**: {user_input}\n"
full_report += f"**分析日時**: {datetime.now().strftime('%Y年%m月%d日 %H:%M')}\n\n"
full_report += "---\n\n"
accumulated_context = ""
for agent in AGENTS: # 試しに2000文字の要約
result = await run_agent(agent, accumulated_context, summary)
full_report += f"## {agent['section']}\n\n{result}\n\n---\n\n"
# 次のエージェントに渡すコンテキストを蓄積(要約して渡す)
accumulated_context += f"\n【{agent['name']}の分析結果要約】\n{result[:2000]}...\n"
return full_report
ChainlitによるUI構築
PDFやマークダウン、csvファイルといった必要なデータをGUI操作で行えるようにしました。
また使用するモデルもクリック操作で選択できるようにしています。
以下は2026/1/26現在のUIです。

実際に提案書を作ってみます
有価証券報告書と財務データのcsvをアップロードすると読み込みます。
読み込み完了後に、「社名 分析」とチャットに入力すると提案書の作成開始です。
step0で要約して
生成される提案書の例
提案書はマークダウンで作成されますが、pandocを使用してワードファイルに変換します。
pandocはオープンソースのドキュメント変換ツールで以下の利点があります。
| 利点 | 説明 |
|---|---|
| コマンドライン実行 | プログラムから簡単に呼び出せる(subprocess) |
| 高品質な変換 | 表、見出し、リストなどの構造を正確に変換 |
| 日本語対応 | UTF-8完全対応、日本語文書も問題なし |
| カスタマイズ可能 | テンプレート(reference.docx)で書式統一可能 |
| 依存関係が少ない | 単体で動作、Pythonライブラリ不要 |
| 高速 | Haskell製で大量文書も高速処理 |
最初からワードで作成するとあまりにも文字文字していたので、表等もあった方が見やすいのでこの処理にしました。
■マークダウンの提案書例
# 事業性評価 提案書
**対象企業:** 茨城あずま建設株式会社
**評価日:** 2026年01月26日
**使用モデル:** Azure GPT-5 (`azure/gpt-5-2025-08-07`)
**作成:** 建設業特化型AIマルチエージェント分析システム
---
# 茨城あずま建設株式会社 向け 成長加速・資金戦略 提案書
## エグゼクティブサマリー
- 現状評価:完成工事高は増加(2023年6,738→2025年10,547百万円)、受注残5,903百万円と案件パイプは堅調。一方で資材・労務費高騰の影響により、2025年は粗利率13.5%、営業利益率3.0%と収益性が一服、営業キャッシュフローは3期連続で小幅マイナス。
- 主要な成長機会
- 公共インフラ更新・防災減災、上下水・道路・橋梁の維持補修需要の継続
- ZEB/省エネ改修×補助金活用を核としたGXパッケージの拡販(民間・公共改修)
- ERP刷新×CDE(共通データ環境)で原価・工程をデータ連携し粗利率回復
- 金融機関としての支援方針:運転資金の安定化(短期偏重の是正・コミットメントライン・ABL)、DX/GX投資のグリーン/SLローンでの低コスト調達、補助金申請・専門家伴走、発注者・協力会社のビジネスマッチング、承継/M&A活用による供給力強化まで一体支援。
---
## 1. 貴社の強みと成長ポテンシャル
- 受注・施工基盤の強さ:完成工事高は3期連続増加、受注残5,903百万円、ブック・トゥ・ビル1.05とパイプラインに蓋然性。官民バランス(公共土木×民間建築)により景気変動耐性を確保。
- 財務耐久性の改善:自己資本比率は10.0%→14.6%へ着実に上昇、純資産も増加。今後は資金調達ストラクチャーの最適化で更なる安定化が可能。
- DX先行:ICT施工、BIM/CIM、遠隔臨場、AI配筋検査、ERP刷新計画等により、原価・工程管理の高度化余地が大きい。AZUMAテクノロジーセンター開設で社内教育・標準化の拠点を保有。
- GXの技術シーズ:ZEB提案力、TCFD対応、低炭素コンクリート(AZUMA-ECO Cret)試験施工など環境配慮技術を装備。改修市場の拡大トレンドに適合。
- 事業ポートフォリオ:公共土木・公共建築に加え、民間(物流・工場・医療・研究)と不動産賃貸のストック収益を持つ。東京支店を活かした首都圏の短工期改修も機会。
---
## 2. 事業環境の評価
- 地域機会(茨城・北関東)
- 防災・減災、国土強靭化の継続枠で河川・堤防・道路・橋梁・上下水の老朽更新が持続。
- 水戸駅周辺の再編、公共施設の長寿命化・ZEB化、学校・医療福祉の改修増加。
- 県南~県東の物流・工場新設、つくばのラボ・クリーンルーム需要、港湾背後地の倉庫整備。
- マクロ動向
- 人口は緩やかな減少、世帯の小規模化により新築偏重から改修・維持の比重が上昇。
- 2024年問題により週休2日・工程適正化が新常態化、プレハブ化・ユニット化・DXへの期待が高い。
- GXは総合評価加点の重要項目に。ZEB/CASBEE、LCA/EPD、再エネ・蓄電のパッケージ需要が拡大。
---
## 3. 成長に向けた課題と対応策
| 課題領域 | 現状評価 | 推奨施策 | 期待効果 |
|---------|---------|---------|---------|
| GX対応 | ZEB提案・低炭素コンクリートの実装は進むが、定量KPI・パッケージ化は道半ば。再エネ・蓄電の内製度は限定的。 | 1) ZEB改修の標準パッケージ化(断熱・空調・照明・BEMS・補助申請一体) 2) ECO Cret適用件数KPI化、EPD材優先調達 3) 屋根置きPV+蓄電+EMSの設計・施工体制構築(パートナー提携) 4) CASBEE評価員・エネ管理士の計画的育成 | ・GX関連売上 年10億円規模の柱化 ・総合評価加点強化 ・案件粗利率+2.0pt(2027目安) ・CO2削減(Scope1・2に加えScope3一部可視化) |
| DX推進 | ERP刷新計画中。BIM/CIM、ICT建機、遠隔臨場は導入済だが、CDE未整備でデータ連携が部分最適。営業CFは3期連続マイナス。 | 1) CDE導入とERP双方向連携 2) 工種別歩掛DBと原価差異アラート 3) 出来高・部分請求の徹底、請求前倒し・前受金比率向上 4) ダッシュボードで工程遵守率・週休二日達成率を常時監視 | ・粗利率+2.0pt(2027) ・営業CF年+300百万円転換 ・工期短縮2〜3% ・週休二日達成率80% |
| 人材確保 | 平均年齢40.5歳、男性育休取得率65%と先進的。一方、女性管理職5.2%、外国人材活用・多能工化は余地。賃金差異72.5%に改善余地。 | 1) 多能工育成(ICT測量・配筋検査・出来高計測のクロススキル) 2) 女性・若手の職長育成プログラム、現場DXで力作業依存低減 3) 特定技能/技能実習からの定着化、寮・多言語安全教育整備 4) ジョブ型評価で賃金差異の構造要因を可視化・改善 | ・生産性(技術者一人当たり完成工事高)+10〜20% ・女性管理職比率10%(3年) ・有休取得・離職率の改善 ・安全KPI改善(休業災害度数率低下) |
DataRobotを使うメリット
以下の4点がすぐに思いつきました。
| メリット | 内容 |
|---|---|
| 統一API | OpenAI互換APIで複数LLMに接続可能 |
| 企業利用 | セキュリティ・ガバナンスに配慮した設計 |
| 拡張性 | Agent Templateで素早くプロトタイプ構築 |
| 運用管理 | 利用状況の一元管理、コスト可視化 |
統一API:LLM Gatewayを通じて、Azure OpenAI、Amazon Bedrock、Google Vertex AIなど複数のLLMプロバイダーにOpenAI互換のAPIで接続できます。本システムでもazure/gpt-5-2025-08-07やbedrock/anthropic.claude-sonnet-4など、モデルを簡単に切り替えて比較検証できました。
企業利用:金融機関での利用を想定すると、データの取り扱いやアクセス管理が重要です。DataRobotはエンタープライズ向けのセキュリティ基準を満たしており、安心して業務データを扱えます。
拡張性:Agent Templateを活用することで、マルチエージェントシステムを素早く構築できます。今回のようなプロトタイプ開発から本番デプロイまでスムーズに移行可能です。
運用管理:複数のLLMを利用する場合、どのモデルがどれだけ使われているか、コストはいくらかを把握することが重要です。DataRobotでは利用状況を一元管理でき、運用フェーズでの管理負荷を軽減できます。
今後の改善点
-
LangGraphの活用
LangGraphはノード間で結果を自動的にメッセージとして引き継ぐらしいので、
今回設定したlit.pyのように手動でコンテキストを構築する必要はありません。 -
中間で生成されたアウトプットの修正
中間で生成されたアウトプットを人が見て判断して、内容を修正後に
後続処理に渡せるようにしたいです。 -
MCPツールによる外部情報連携
Web検索やデータベース連携により、地域の公共事業計画や
最新の補助金情報をリアルタイムで取得できるようにしたいです。 -
プロンプトの外部ファイル化
プロンプトをYAML等で管理し、コード変更なしで
調整・A/Bテストできるようにしたいです。 -
予測AIとの連携
DataRobot様と言えば、何といっても予測AIの精度が高いことです。
予測AIと生成AIを連携させられるようにアイデアを考えます。
まとめ
いったんはDataRobot様のLLM GatewayとAgent Templateを活用することで、複数のAIエージェントが連携する提案書を自動作成するアプリができました。今後の改善点で挙げたことを意識して、より実用的なシステムへと発展させていきたいと思います。
金融機関における事業性評価の効率化・高度化に向けて、AIエージェントの可能性を感じるプロジェクトでした。コンペの終了は2026年2月11日と、まだ残り期間はありますが、このような機会とツールを提供いただいたFDUA様、DataRobot様に感謝申し上げます。ありがとうございました。
おまけ
DataRobot様のLLM Gatewayを利用できる、DATAROBOTLLM関数をエクセルVBAで作成しました。引数は2つあり、第1引数はプロンプト、第2引数は使用するモデルとしました。
画像のようにセルA1をプロンプトに、azure/gpt-5-2025-08-07をモデルに指定します。
また、以下のように簡単にモデルを変えてアウトプットを比較できます。

Excelで使えるメリット
| メリット | 内容 |
|---|---|
| 既存業務との親和性 | 金融機関の業務はExcelが中心。新しいツール導入不要 |
| データ連携が容易 | セル参照でデータをそのままプロンプトに組み込める |
| モデル比較が簡単 | 同じプロンプトで複数モデルの出力を横並びで比較検証 |
| バッチ処理 | 複数行に関数を設定し、大量のプロンプトを一括実行 |
| 結果の保存・共有 | 出力結果がExcelファイルとして残り、チームで共有可能 |
| 後処理・分析 | Excel関数やピボットテーブルで出力結果を集計・分析 |
ユースケース例
| ユースケース | 内容 |
|---|---|
| 分析コメント一括生成 | 顧客リストの各企業に対して財務分析コメントを自動生成 |
| モデル比較検証 | 同じプロンプトで複数モデルの回答精度を横並び比較 |
| 議事録要約 | 顧客面談の議事録を一括で要約・ポイント抽出 |
| 稟議書下書き作成 | 財務データから融資稟議書のドラフトを自動生成 |
| 業界動向リサーチ | 取引先の業界ごとにトレンドや課題を整理 |
| 翻訳・多言語対応 | 海外取引先向け資料の翻訳や英文メール作成 |
| データクレンジング | 住所表記ゆれや企業名の正規化を自動処理 |
| FAQ回答生成 | 社内問い合わせに対する回答ドラフトを作成 |
| 契約書チェック | 契約条項のリスクポイントを抽出・一覧化 |
| アンケート分析 | 自由記述回答の分類・感情分析・要約 |
上表のように様々なユースケースが考えられますが、Excelで完結するため、特別な環境構築なしに利用可能です。
私の勤めている会社ではDataRobot様の予測AI機能のみ導入しており、生成AI機能はまだ利用できません。今回のデータチャレンジを通じて生成AI機能を十分にキャッチアップし、社内への導入提案につなげたいと考えています。











