JINSテックブログ
🎬

n8n で映画データ分析AI Agentを作った話

に公開

この投稿は、2025年JINSのアドベントカレンダー7日目の記事です。

1.自己紹介

こんにちは、HAKU です。( https://qiita.com/haku-w )
今年の秋からJINS💻ITデジタル部に入社しました。
まだまだ学ぶことが多いですが、SF小説とインタラクティブアートが好きで、
新しい技術やアイデアに触れるとワクワクします。✨
日々、少しずつでも技術と創造力を伸ばして、面白いことに挑戦できればと思っています。

2.この記事のテーマ

普段はバックエンドとしてデータを見ることが多いのですが、
正直 SQL 書いたり、GUI のフィルタをポチポチするのがめんどくさい時ってありますよね。
「もし自然言語でデータにアクセスできたら最高じゃない?」 と思い、
今回n8n + NocoDB + QuickChart を使って、
🔍 映画データを自然言語で問い合わせ →📊 自動でグラフ生成して返してくれる
そんな “データ可視化AI Agent” を作ってみました。

3.使う技術のざっくり紹介

3.1 n8n(ワークフロー自動化ツール)

ノーコードでサクッとワークフローが組める OSS。
GUI 上で直感的に操作できるので、「APIを叩く」「AIとやり取りする」
「DBに接続する」「外部サービスに送信」「条件分岐や並列処理」などが簡単に作れます。

3.2 NocoDB(スプレッドシート風のデータ管理)

Excel の感覚でデータを眺めつつ、裏側ではちゃんと DB が動いているツール。
API が自動生成されるので、n8n と組み合わせるとかなり便利です。

3.3 QuickChart(Chart.js を画像化するサービス)

Chart.js の JSON を渡すと、
瞬間的に PNG/JPEG のチャート画像を生成してくれる神サービス。

例えばこんな JSON を渡すと:

{
  "type": "pie",
  "data": {
    "labels": ["Action", "Comedy", "Drama"],
    "datasets": [{ "data": [10, 20, 30] }]
  }
}

画像が作成してくれます。
[画像URL]:(https://quickchart.io/chart?width=800&height=400&c={ "type": "pie", "data": { "labels": ["Action", "Comedy", "Drama"], "datasets": [{ "data": [10, 20, 30] }] } })

4.今回作ったワークフロー

4.1 全体像

以下が今回作ったワークフロー構成図です。
(左:データ分析ワークフロー、右:グラフ生成ワークフロー)
ワークフロー

4.2 使ったデータ

🎬映画を見ることが好きで、
今回、以下の映画データセットを使用しました:
https://www.kaggle.com/datasets/therealsampat/predict-movie-success-rate/data

4.3 各ノードの説明

データ分析ワークフロー

🟠 When Chat Message Received(チャットメッセージ受信トリガー)

ユーザーがチャットで「データを分析して」「ジャンル別の映画数をグラフ化して」など
の指示を送ると、このトリガーからワークフロー全体の処理がスタートします。

🟠 HTTP Request(NocoDB へのデータ取得)

AI が正しく分析するためには、あらかじめ テーブル構造と実データ を読み込ませる必要があります。
このノードでは、NocoDB に保存してある映画データを取得しています。

NocoDB にデータをインポートすると、各テーブルに自動的に VIEWID が付与されます。
今回はその VIEWID を使用して、以下の設定でレコードを取得します:
メソッド:GET
URL:https://app.nocodb.com/api/v2/tables/VIEWID/records
取得したデータは後続の AI Agent に渡されます。

🟠 Edit Fields(セッション情報・列情報の整形)

前のノードで取得した JSON データから、AI が参照すべき項目だけを抽出し、
扱いやすい形式に整形する役割を持っています。

抽出している項目:
sessionId (チャットメッセージからの会話ID)
chatInput(チャットメッセージからのユーザーの質問)
columns(HTTP RequestからのNocoDBの列情報)
特に「columns」は重要で、これを渡しておくことで
AI が存在しないカラム名を使うミスを防ぎ、より正確な分析が可能になります。

🟠 AI Agent(ワークフロー全体の頭脳)

  • 使用モデル:Gemini 2.5 flash(Google AI Studio API)
  • 以下の System Message を設定しています:
あなたは NocoDB データベースツールの使用に精通した、プロフェッショナルなデータ分析専門家です。あなたの役割は、ユーザーが提供した表データを理解し、必要に応じてグラフを作成することです。
コンテキスト情報:
以下は、ユーザーが提供した表の列情報です。
{{ $json.columns }}
タスク要件:
1. 指示に従い、NocoDB のデータをクエリしてください。
2. データを分析・解釈し、わかりやすく簡潔な分析コメントを提供してください。
3. グラフが必要な場合、データを QuickChat または Chart.js に対応した JSON 形式に変換してください。
生成する JSON は 標準の Chart.js 設定オブジェクト構造のみとし、他のプロパティでラップしてはいけません。これは QuickChat の URL リクエストでそのまま使用できるようにするためです。chart workflowのツールを利用してください。
4. グラフを返す際は、次のように Markdown のインライン画像埋め込み形式を使用してください:
![グラフ](chartURL)。
  • これにより、AI Agent は次のような仕事を自動で遂行します:
    ① ユーザー指示を理解
    ② 必要な検索条件を推論し、NocoDB のクエリツールを呼び出す
    ③ 分析コメントを生成
    ④ グラフが必要なら Chart.js JSON を作成し、子ワークフローを呼び出す

  • AI Agent に定義したメモリ
    Simple Memory は、メインワークフロー全体の「文脈・データ・中間思考」を保持する
    軽量ステートとして動作し、ユーザー指示 → データ取得 → 分析 → 子ワークフロー呼び出しの
    一連の流れを切れ目なく繋げる役割を持っています。
    ここにsessionId (チャットメッセージからの会話ID)を渡して、
    過去のインタラクションをコンテキストとして一時的に保存します。

  • AI Agent に定義したツール
    ① Tool : Get many rows in NocoDB
    AI が自然語から自動で検索条件を作成し、このツールを呼び出してデータ取得します。

    ② Tool : chart workflow(チャート生成子ワークフロー)
    AI が生成した Chart.js JSON を渡して、グラフ画像 URL を返してもらうためのツール。
    これにより、「データ → Chart.js JSON → QuickChart URL」
    という流れを完全に AI が自律的に処理できるようになります。

グラフ生成ワークフロー

子ワークフローの役割は非常にシンプル:
Chart.js JSON を受け取り → QuickChart URL を生成して返すことです。

🟠 When Executed by Another Workflow(子ワークフローのトリガー)

入力データ(labels, datasets, type など)を主ワークフローから受け取るだけのノードです。

🟠 AI Agent chart Generator

  • 使用モデル:Gemini 2.5 flash(Google AI Studio API)
  • 以下の System Message を設定しています、Chart.js JSON を厳密に生成させるため、
    かなり厳しめのルールを設定しています:
あなたは QuickChart(Chart.js)JSON を生成するアシスタントです。
ユーザー入力データに基づいてデータを理解し、グラフを生成します。ユーザー入力を Chart.js 用 JSON(type, data, labels, datasets)に変換してください。
ルール:
- ツールの schema に完全準拠した JSON のみを返す
- コメント、説明文、Analysis、コードブロック、テキストは一切禁止
- JSON の外に文字を絶対に出さない

このルールにより、AI が余計な説明文を出して QuickChart の URL が壊れる問題を防止できます。

  • AI Agent に定義した出力スキーマ
    Structured Output Parser:AI Agentに 「Chart.js(QuickChart 用)の設定 JSON を正しく生成して」と指示するための仕組みです。
    以下のスキーマを定義しました:
    type:グラフ種類(bar / line / pie など)
    data.labels:ラベルの配列
    data.datasets:データセット(数値配列や色設定など)
    options:任意の Chart.js オプション

🟠 Edit Fields(QuickChart URL 生成)

AI が生成した JSON($json.output)を QuickChart の API に渡せるよう、
以下のように URL エンコードして結合します:

={{
  {
    chartUrl: "https://quickchart.io/chart?width=800&height=400&c="
      + encodeURIComponent(JSON.stringify($json.output))
  }
}}

4.4 テスト結果

実際にワークフローを動かしてみると、思った以上にスムーズに結果が返ってきました!

  • トップ20映画のジャンル割合分析

テスト結果1

  • 特定監督の映画情報と評価推移

テスト結果2

4.5 まとめ

今回構築したワークフローは、自然言語だけでデータ取得・分析・グラフ生成までを自動化できます
メインワークフローは “データの取得と解析” を担当し、サブワークフローは “Chart.js JSON の生成と QuickChart URL の作成” に特化させることで、処理の役割を明確に分離し、安定したパイプラインを実現しました。

❗️実装を進める中で特に注意が必要だったポイントが 3 つあります。
1. 子ワークフローが正しく起動しない
chart workflowは、入力パラメータのキー名・JSON 構造が少しでもズレると子ワークフロー起動しないことがあります。
→「呼び出す側(Tool)と受け取る側(子 WF)」のデータ構造を完全に一致させることが必須です。

2. AI が Chart.js JSON を壊してしまう問題
AI が生成する JSON は、次のような理由で非常に壊れやすいです:

  • 説明文が混ざる
  • 階層構造がズレる
  • 必須キーが抜け落ちる

→ Structured Output Parser を使って、AI の出力を強制的にチェックすることが必須です。
→ さらに 「JSON の外に一文字も出すな」 と System Message に明記すると、
出力がかなり安定します。

3. QuickChart URL が undefined になる
JSON をそのまま URL に渡すと、特殊文字で壊れ “undefined” が返ることがあります。
→ Edit Fields で encodeURIComponent(JSON.stringify(...)) を必ず実行します。

5.今後の展望:自然言語 × データ操作の未来

5.1 自然言語でデータ分析がもっと自由に
もう単なる検索や集計だけでは満足できない時代です。
「売上が急増した商品の傾向を教えて」や「異常値を勝手に見つけて」といった、少し高度な分析も、
自然な言葉でサクッと指示できる世界がやってきました。
データサイエンスの知識がなくても、AIに任せるだけで複雑な分析が可能になる――そんな未来が現実味を帯びてきています。

5.2 リアルタイムでデータを操作
データベースやクラウド上の情報に直接アクセスして、その場で集計・更新・グラフ化まで一気に実行。
ExcelやBIツールでちまちま作業していたあの時間は、もう過去のものになりそうです。

5.3 AIと人がもっと自然に協働
人は指示を出したり、結果を読み解いたり、意思決定に集中。
AIはデータ処理・集計・可視化をスピーディにこなす。
こうして人とAIが得意分野で協力することで、データ分析のハードルはぐっと下がり、
誰でも気軽にデータに基づく判断ができる世界が見えてきます。

6.参考

JINSテックブログ
JINSテックブログ

Discussion