HEROZ Tech Blog

日本将棋連盟公認「将棋ウォーズ」や、AIを活用したシステム企画・開発を行う、AI企業HEROZの公式テックブログです。

Agentic RAGの前に整えるべきもの:実務RAGの入口を設計する Router RAG

はじめに

前回の記事では、Agentic RAGの有効性について、社内実験と最新研究の両面から検証しました。

その結果、Agentic RAGは確かに強力なアプローチである一方、エンタープライズ検索のようなユースケースでは、必ずしも複雑化に見合う効果が得られるとは限らない、ということが分かりました。

では、なぜ期待したほどの改善が得られないのでしょうか。

この問いをシステム全体で分解していくと、次のような気づきに至ります。

💡 結論

問題は後段(検索・生成)ではなく、
前段(問い合わせ処理)にある

実際の業務システムでは、ユーザは必ずしも検索に適した形で質問してくれるわけではありません。

  • 「こんにちは」
  • 「売上を集計して」
  • 「この機種のエラー原因は?」
  • 「操作方法を教えて」

これらはすべて“質問”ですが、必要な処理はまったく異なります。

しかし従来のRAGでは、これらを十分に区別せず、そのまま検索に流してしまう構造になりがちです。

本記事で扱うのは、機器ごとに分かれたマニュアルや社内ドキュメントを対象とする検索システムです。

このような文書群では、似た説明が複数の機種やカテゴリにまたがって存在するため、単純な検索では別機種の情報が混ざりやすくなります。そのため、機種名やカテゴリーといった分類情報を前提とした設計が重要になります。

前回のAgentic RAG検証から見えてきたこと

前回の記事では、高難度な質問への対応として、Agentic RAGのようなより高度な構成を検証しました。

techblog.heroz.jp

Agentic RAGは柔軟で強力な一方で、

  • 挙動が不安定になりやすい
  • コストやレイテンシが増えやすい

という特徴もあります。

そのため、すべての問い合わせに対していきなりAgenticな構成を適用するよりも、

まずは問い合わせを整理し、適切な処理に振り分ける

という前段の設計の方が重要になります。

実際、複雑な質問に対しては、検索戦略の動的制御やツール利用が有効に働くケースもあります。

一方で、エンタープライズ検索では、すべての質問に対してそのような複雑な処理が必要なわけではありませんでした。 コストやレイテンシが増える一方で、効果が限定的なケースも少なくありませんでした。

そこで後段については、よりシンプルな構成、具体的には ReRanking を中心とした Enhanced RAG に整理しました。

しかし、ここでより重要な問題に気づきます。

そもそも、すべての質問を同じ検索フローに流してよいのか?

実際の入力を見てみると、

  • 雑談
  • 計算依頼
  • 条件不足の質問
  • 単純に答えられる質問
  • 丁寧な検索が必要な質問

が混在しています。

この状態で後段だけを高度化しても、入力が整理されていなければ、期待した効果は出ません。

つまり、Agentic RAGの前に、問い合わせを正しく振り分ける仕組みが必要だった

この気づきから設計したのが、今回の Router RAG です。

実務で起きていた問題

雑談が検索に流れ、事故的な回答が出る

⚠️ 問題: 関係ないチャンクを拾い、“それっぽい誤回答”を生成することがある

単純な挨拶であっても、検索に流してしまうと、偶然ヒットしたチャンクをもとに文脈と無関係な“それっぽい回答”が生成されることがあります。

場合によっては、まったく関係ない業務情報を返してしまうなど、事故に近い挙動になることもあります。

metadata不足による誤検索

マニュアル検索では、似た説明が複数の機種にまたがって存在します。

このとき、機種などの条件が曖昧なまま検索すると、

  • A機種の質問に対してB機種の情報が混ざる

といったことが起きます。

これは単なるノイズではなく、誤情報そのものになります。

検索ではなく計算を求められる

ユーザは普通にこう言います。

  • 「売上を集計して」
  • 「平均を出して」

これは検索ではなく計算です。

RAGに流すと、断片的な情報を組み合わせてもっともらしい答えを返す危険があります。

ユーザは「無駄には待ちたくない」が「間違いは避けたい」

ユーザはできるだけ早く答えがほしい一方で、間違うくらいなら少し待ってもいいという期待も持っています。

つまり、

  • 簡単な質問はすぐ答える
  • 難しい質問は丁寧に扱う

という切り分けが必要になります。

検索に流してはいけない入力が混ざっている

つまり、RAGの問題は検索精度ではなく、 「入力の整理不足」にあると言えます。

Router RAGという考え方

こうした問題に対して導入したのが、Router RAGです。

ここでのポイントは、RAGを改善するのではなく、

「そもそも検索に流すべきか」を先に判断する

という設計に変えたことです。

図1:まず何をすべきかを決めてから、必要な処理に進む

Before / After

Before(従来のRAG)

すべての質問を検索に流してしまう

After(Router RAG)

質問に応じて処理を分離する

この違いは、構造として見るとより分かりやすくなります。

図2:すべて検索に流す構造から、適切に処理を分離する構造へ

PreRetrieveは「判断材料を集める」ためにある

Router RAGでは、質問を受けると最初に少量の検索を行います(top_k=4)。

これは最終回答のための検索ではなく、次に何をすべきかを判断するための材料集めです。

ここで得られたチャンクは、主に次の用途に使われます。

  • 🔍 ナレッジに関係するかの判定
  • ❓ 情報が足りているかの判定
  • ✏️ クエリ書き換えのヒント

つまり、PreRetrieveは「検索の前段」ではなく、Routerのための観測ステップです。

Classifierは「次の動き」を決める

PreRetrieveの結果をもとに、Classifierが次の処理を決めます。

ここで重要なのは、Classifierは回答を作らないことです。 やるのは一つだけで、次にどの経路に進めるかを決めることです。

Classifierの役割:次にどの処理に進むかを決める

  • 挨拶 → 雑談として処理
  • 意味が不足 → 確認質問
  • 集計・計算 → Code Interpreter
  • 条件不足(metadata) → 追加質問
  • すぐ答えられる → 即答
  • それ以外 → 詳細検索

(具体的なプロンプト設計については、本記事では詳細には触れませんが、 事前取得したチャンクやスコアを含めて一度に判断させる形にしています)

metadataとRouter Query Engine

ここで少しだけ、検索の前提となる仕組みを説明します。

今回のシステムでは、文書ごとに

  • 機種名
  • カテゴリー
  • 種類

といった分類情報をLLMで自動付与し、metadataとして保存しています。

検索時には、質問文からこれらの値を推定し、フィルタとして使います。

ここで重要なのが、必須の項目(required metadata)です。

例えば機種が必須の場合:

  • 「エラー原因は?」 → 機種が不明
  • → そのまま検索すると危険
  • → 先に聞き返す

この処理を担当しているのが Router Query Engine です。

fast と slow の分離

今回の設計では、処理を2つに分けています。

fast

  • PreRetrieveの結果を使って即答
  • 低レイテンシ

slow

  • クエリ変換
  • 再検索
  • ReRanking

重要なのは、これは単なる最適化ではなく、

ユーザの期待に合わせた分離

であることです。

  • 簡単な質問 → 待たせない
  • 難しい質問 → 無理に急がない

ノード構成

全体の処理の流れをまとめると、次のようになります。

図3:Router RAGの全体構成

なお、確認質問に対するユーザの応答は、次のターンで会話履歴(history)として再度 Router 側に渡します。Router Query Engine はその履歴を見て、前のターンで不足していた項目が埋まったかを再評価します。

たとえば「どの機種ですか?」という確認質問に対して、次のターンで「A-120です」と返ってきた場合、その応答単体を新しい質問として扱うのではなく、直前の確認質問と合わせて metadata を補完する入力として解釈します。

設計上の知見

実装を進める中で感じたのは、

細かく調整するより、大まかに分けた方が安定する

という点です。

  • fast / slow の境界
  • rewriteの有無
  • rerankの強さ

こういった要素は、個別にチューニングすると全体のバランスが崩れやすくなります。

そのため今回は、

  • 雑談
  • 確認質問
  • 計算
  • 即答
  • 詳細検索

といった大きな分類を先に決める方針にしました。

おわりに

前回のAgentic RAGの検証を通じて見えてきたのは、

後段を強くする前に、前段を整える必要がある

ということでした。つまり、RAGを高度化する前に、

「入力を整える」

ことが重要だった、というのが今回の結論です。

Router RAGは、そのための仕組みです。

雑談は雑談として扱い、計算は計算に回し、条件が足りなければ確認し、必要なときだけ検索する。

こうした分離を行うことで、RAGは単なる検索付き生成から、実務で使えるシステムへと近づきます。

PDFの図表はRAGで扱えるのか?6つの方法で検証して分かった“現実的な最適解”

はじめに

PDFの資料をRAGで検索・要約できるようにしたい、というニーズは多くの現場で見られます。 しかし実際にやってみると、「図や表の情報がうまく扱えない」という壁にぶつかることが少なくありません。 実際に社内外のユースケースでも、この課題に直面するケースが増えてきました。

テキスト中心のRAGでは、図解やレイアウトに依存した情報はうまく検索できず、結果として不正確な回答や見当違いの要約が返ってくることがあります。 では、最近話題のマルチモーダルRAGや画像対応のEmbeddingを使えば、この問題は解決するのでしょうか?

実は筆者も約2年前、マルチモーダルRAGの黎明期に同様の検証を行っています。 techblog.heroz.jp

当時は画像・表・テキストを分離して扱い、それぞれを要約・構造化する必要があり、実装・精度の両面で課題が残る状態でした。 しかし現在では、マルチモーダルEmbeddingの進化により、ページ全体をそのままベクトル化できるようになり、アプローチ自体が大きく変わりつつあります。

本記事では、PDFに含まれる図表を対象に、6つの方法(テキスト抽出、OCR、マルチモーダルEmbeddingなど)を比較し、精度・コスト・処理時間の観点から検証を行いました。 その結果、必ずしも最新の手法が最適とは限らず、用途によってはより現実的な選択肢が見えてきました。

PDFの図表をRAGで扱いたいと考えている方に向けて、本記事ではその「実務的な最適解」を整理して紹介します。

マルチモーダルRAGの基本構成

マルチモーダルRAGとは、テキストだけでなく、画像や図表といった複数の形式(モダリティ)の情報を扱うRAGの仕組みです。

従来のRAGはテキストを前提としているため、PDFに含まれる図や表の情報をそのまま扱うことが難しいという課題がありました。 この課題に対して、マルチモーダルRAGではいくつかの設計パターンが提案されています。

マルチモーダルRAGのオプション

代表的には以下の3つに分類されます。

  • Option1:画像をそのまま扱う(マルチモーダルEmbedding)
  • Option2:画像をテキストに変換して扱う(OCR・要約)
  • Option3:画像とテキストを併用する(融合型)

今回のmode2はOption2、mode4系(mode4v / mode4c / mode4g)はOption1、mode3はOption3に対応する構成となっています。 本記事では、この分類に対応する形で6つの手法を比較します。

実験概要

目的

PDFに含まれる図表を含めて、RAGの検索および回答生成がどの程度可能かを検証する。 特に、マルチモーダルEmbeddingの実用性を確認する。

手法(6つのモード)

  • mode1:テキスト抽出のみ(テキストのみ・図表なし) → PDFからテキストのみ抽出し、図表は扱わない

  • mode2:LLMによるOCR(OCRテキスト化) → 各ページを画像として処理し、LLMでテキスト化して検索に利用する

  • mode3:OCR+画像併用(テキスト+画像) → OCRでテキスト化しつつ、回答生成時には画像も参照する

  • mode4v:画像Embedding(Voyage) → ページ全体を画像としてベクトル化し、そのまま検索に利用する

  • mode4c:画像Embedding(Cohere) → ページ全体を画像としてベクトル化し、そのまま検索に利用する

  • mode4g:画像Embedding(Gemini) → ページ全体を画像としてベクトル化し、そのまま検索に利用する

※ mode4v / mode4c / mode4gはそれぞれ異なるマルチモーダルEmbeddingモデル(Voyage / Cohere / Gemini Embedding 2)を使用しており、モデル間の差異も含めて比較している

データセット

本検証では、以下の3種類のデータセットを用いて評価を行いました。

  • データセットA: 某北欧家具メーカーの組み立てマニュアル(24問) 図解のみで構成されており、警告表示以外にテキストがほとんど含まれない資料です。 視覚情報のみから理解する必要があり、マルチモーダル性能を評価するための難易度の高いケースとなります。

  • データセットB: JDocQA(30問) チラシやパンフレットを中心とした、日本語のマルチモーダルQAデータセットです。 テキストと図表が混在する、実務に近い構成となっています。

  • データセットC: 家電製品のマニュアル資料(20問) 図とテキストが併記された一般的なマニュアル形式のデータです。 図の難易度は比較的低く、テキスト情報による補助が期待できるケースです。

評価指標

  • 精度:LLM(Claude 4.5 Sonnet)による5段階評価(1〜5の5点満点)
  • コスト:日本円によるAPI利用料金
  • 処理時間:平均応答時間(ミリ秒)

結果

データセットAにおける精度比較(図解のみのため難易度が高い)

データセットBにおける精度比較(テキストと図表が混在)

データセットCにおける精度比較(テキストによる補助があるケース)

各モデルにおけるmode別の平均精度

本記事で最も重要な結果は、コストと精度の関係として以下のように整理できます。

コストと精度の関係(モデル別)

図より、mode2は多くのケースで比較的低コストに一定の精度を確保できる、コストパフォーマンスの高い選択肢であることが分かります。 一方で、mode4系は高精度を狙える一方、モデルによってはコスト負担が大きくなる傾向があります。

また、mode3は全体としては中間的な位置づけですが、GPT-5.2のようにコストを抑えつつ精度を伸ばせているケースも見られ、モデルやデータセットによって有効性が変わる手法と考えられます。

結果のまとめ

モード 精度 コスト 特徴
mode1 (テキストのみ・図表なし) 図表は扱えない
mode2 (OCRテキスト化) 多くのケースでコスパが良い
mode3 (テキスト+画像) 中〜高 中〜高 モデルによって評価が分かれる
mode4系 (画像Embedding) 高精度だがコスト増

本検証の特徴は、精度だけでなくコストも含めて比較している点にあり、実務における意思決定に直接つながる結果となっています。 以降では、この観点も踏まえながら結果を考察します。

考察

精度は段階的に向上するが、頭打ちになる

結果として、全体傾向としては mode1 < mode2 < mode3 < mode4系 という関係が確認されました。 ただし、mode3は全体としては中間的な位置づけであり、モデルによっては有効なケースも見られました。

これは、必要な情報の取得(retrieval)はすでに十分に行われており、その後の回答生成(generation)が性能を支配している可能性を示唆しています。

この傾向は近年の研究とも一致しています。 例えば、VisRAG(ICLR 2025)では、PDFを画像のまま扱うRAGが従来手法より高い性能を示すことが報告されています。 https://openreview.net/forum?id=zG459X3Xge

マルチモーダルEmbedding間の差は小さい

マルチモーダルEmbedding間で大きな差は見られませんでした。

UniDoc-Bench(2025)でも、Embedding単体では性能差が出にくく、一定以上では改善幅が小さくなる傾向が見られました。 https://huggingface.co/papers/2510.03663

OCRベースの手法も依然として有効

mode2(OCR)でも一定の精度が出ている点は重要です。 文書理解においては、テキスト化による情報の正規化が依然として有効であることが分かります。

LLMの性能が最終的な精度を決める

画像を扱う手法では、最終的な精度は回答生成LLMの性能に強く依存しました。 特に図解中心のタスクではモデル間の差が顕著に現れました。

実務的な最適解

今回の結果から、用途別に以下のような選択が現実的な指針となります。

  • コスト重視:mode2(OCR)
  • 精度重視:mode4系(マルチモーダルEmbedding)
  • mode3(融合型):モデルやデータセットによって有効だが、コストやレイテンシも含めて個別に評価する必要がある

実務においては、まずmode2をベースラインとし、精度要件が高い場合にmode4系を検討するのが現実的な選択となります。

おわりに

本記事では、PDFに含まれる図表を対象に、RAGの6つの手法を比較し、その精度・コスト・処理時間について検証を行いました。

その結果、マルチモーダルEmbeddingはすでに実用レベルに達している一方で、必ずしも単体で最適解となるわけではなく、テキスト化(OCR)や画像の活用方法を含めた設計全体が重要であることが分かりました。

特に、最新の研究においてもテキストと画像を組み合わせた手法が有効であることが示されており、本検証の結果はそうした傾向とも一致しています。 一方で、実務においてはコストや処理時間の制約も無視できず、用途に応じたトレードオフ設計が求められます。

PDFの図表を含む情報活用は、今後ますます重要になる領域です。 マルチモーダルRAGは急速に進化を続けており、今後のモデル・アーキテクチャの発展によって、さらに実用性が高まっていくと考えられます。

引き続き、こうした技術動向を追いながら、実務で使える形に落とし込んでいきたいと思います。

Agentic RAGは本当に必要なのか? 〜RAGの社内実験と最新研究から考える

はじめに

2025年頃から「AIエージェント」というキーワードが急速に広まり、2026年に入ってからはその応用の一つである Agentic RAG も注目を集めています。

RAG (Retrieval-Augmented Generation) は、検索によって取得した文書を元にLLMが回答を生成するアーキテクチャで、エンタープライズ検索や社内ナレッジ検索などで広く利用されています。近年は、単純な検索+生成の構成から、ReRankingやSelf-RAGなど様々な改良手法が提案されており、RAGの設計も進化を続けています。

その延長線上にあるのが、LLMが検索やツール利用を動的に制御する Agentic RAG です。

従来のRAGは検索→回答生成という比較的シンプルなパイプラインですが、Agentic RAGではLLMが状況に応じて検索や推論を繰り返しながら回答を構築します。

RAGの種類

このような構造により、より複雑な問題に対応できる可能性がある一方で、

  • 本当に精度は向上するのか
  • 追加されるコストや複雑さに見合うのか

といった疑問もあります。

そこで今回は、社内でいくつかのRAG手法を比較する簡単な実験を行いました。また、2026年に発表された最新の研究論文も合わせて紹介し、Agentic RAGの現状を整理してみたいと思います。

Agentic RAGを試してみた

実験設定

まず、複数のRAGアーキテクチャを比較する簡単な実験を行いました。

実験は社内の実験プラットフォーム上に構築したRAG環境を用いて実施しました。評価には 弊社製品の関連文書から構成されたQA評価セット を使用しています。内容としては、製品ドキュメントを対象とした典型的なエンタープライズ検索に近いタスクです。

評価方法は LLM-as-judge による自動評価を採用しました。回答生成および評価には Claude 4.5 Sonnet を使用しています。

今回比較した手法は以下の5種類です。

Naive RAG

最もシンプルなRAGです。

検索で取得したチャンクをそのままコンテキストとしてLLMに渡し、回答を生成します。今回は検索結果の上位4チャンクを使用しました。

RAGのベースラインとして広く使われている構成です。

RAG + ReRanking

検索で取得したチャンクを 再ランキング (ReRanking) によって選別する構成です。

今回は

  1. 検索で10チャンク取得
  2. ReRankerで重要度を評価
  3. 上位4チャンクをLLMへ入力

という手順を採用しました。

RAGの精度改善手法として比較的よく使われる構成です。

ReAct

ReAct (Reasoning and Acting) は、LLMが推論とツール利用を交互に行うエージェント型のアプローチです。

RAGをツールとしてLLMに与え、必要に応じて検索を行いながら回答を生成します。

論文 https://arxiv.org/abs/2210.03629

Adaptive RAG

Adaptive RAGは、回答の信頼性を高めるために 複数段階の検索や検証を行うRAG構成です。

検索結果の確認や再検索を行いながら回答を生成するため、より複雑なワークフローになります。Agentic RAGの代表的な構成の一つとして研究されています。

論文 https://arxiv.org/abs/2403.14403

LangGraphの実装例 https://docs.langchain.com/oss/python/langgraph/agentic-rag

Deep Agent

LangChainで公開されている Deep Agent も比較対象として評価しました。ツールを利用しながら複数ステップの推論を行う、より汎用的なエージェント型アーキテクチャです。

https://github.com/langchain-ai/deepagents

実験結果

各手法の評価結果をまとめたものが次の表です。

Agentic RAGの実験結果

結果を見ると、評価スコアには大きな差は見られませんでした

一方で、Agentic RAGに分類される手法では

  • LLM呼び出し回数
  • トークン消費量
  • レイテンシ

が増加する傾向が見られました。

今回の設定では、Naive RAGやReRanking付きRAGでも十分に高い性能が得られるという結果になりました。

もちろんこの結果だけで一般的な結論を出すことはできませんが、少なくとも今回のようなエンタープライズ検索に近いタスクでは、Agentic RAGの明確な優位性は確認できませんでした。

論文紹介①

Is Agentic RAG worth it?

ちょうど実験を行っていたタイミングで、興味深い論文が公開されました。

Is Agentic RAG worth it? https://arxiv.org/abs/2601.07711

この論文では、従来のRAGとAgentic RAGを複数のタスクで比較し、その費用対効果を分析しています。

論文の主な結論は次の通りです。

  • Agentic RAGは推論能力自体は高い
  • しかし精度改善は限定的
  • 一方で 計算コストとレイテンシは増加する

その結果、実運用の観点では Enhanced RAG(ReRankingなどを組み合わせたRAG)でも十分な場合が多いと述べられています。

今回の社内実験の結果も、少なくとも方向性としてはこの論文の結果と一致するものでした。

論文紹介②

A-RAG: Scaling Agentic Retrieval-Augmented Generation via Hierarchical Retrieval Interfaces

一方で、Agentic RAGの可能性を示す研究も発表されています。

A-RAG: Scaling Agentic Retrieval-Augmented Generation via Hierarchical Retrieval Interfaces https://arxiv.org/abs/2602.03442

この研究では、Agentic RAGが十分に性能を発揮できない原因の一つとして、検索インターフェースの設計を指摘しています。

従来のRAGでは、

  • 一度の検索で固定数のチャンクを取得する
  • その結果をそのままLLMに渡す

という比較的単純な構造になっています。

A-RAGではこれを拡張し、

  • キーワード検索
  • セマンティック検索
  • 文書単位の取得
  • チャンク単位の取得

といった複数の検索インターフェースをLLMに提供します。

これにより、LLMが状況に応じて検索戦略を選択できるようになり、より複雑な情報探索や multi-hop reasoning が可能になるとしています。

つまり、

  • 現在のAgentic RAGがうまく機能しないのは
  • アーキテクチャがまだ発展途上である可能性がある

という立場の研究と言えます。

おわりに

今回は、社内で行った簡単な比較実験と、2026年に公開された2本の論文を紹介しました。

今回の実験では、少なくともエンタープライズ検索に近いタスクにおいては、Agentic RAGの明確な優位性は確認できませんでした。一方で、研究コミュニティではAgentic RAGの改良に関する研究も活発に進んでいます。

Agentic RAGについては、研究や実装の方向性によって評価が変わる可能性もあり、まだ議論の続いているテーマと言えそうです。

今後の研究や実装の動向も追いながら、引き続き最良のサービスを提供できるよう、今後の研究や実装の動向も追っていきます。

クロスプラットフォーム開発の現在地:なぜ私はReact NativeからFlutterへ移行するのか (2025年版)

はじめに

こんにちは。クロスプラットフォーム開発の選定に頭を悩ませているエンジニアです。 「一度書けばどこでも動く(Write Once, Run Anywhere)」——これは我々エンジニアにとって永遠の夢ですが、現実はそれほど甘くありません。

今回、「Webアプリの資産を活かしたネイティブアプリ開発」を目指してReact Nativeに取り組みましたが、特にデスクトップ(Windows)対応において想像以上の「茨の道」を経験しました。その結果、Flutterへの移行を決断するに至った経緯と、その技術的な裏付けを共有したいと思います。

クロスプラットフォームフレームワークの概況

まず、現在利用可能な主要なクロスプラットフォーム技術を整理します。モバイルだけでなくデスクトップ(Windows/macOS)も視野に入れると、選択肢は以下のように絞られます。

フレームワーク 言語 主幹企業 特徴 今回の評価
React Native JS / TS Meta / Microsoft Web技術(React)を使用。OS標準のUIを描画。 Web資産流用は魅力的だが、デスクトップ対応に難あり。
Flutter Dart Google 独自の描画エンジン(Skia/Impeller)を使用。全OSで均一なUI。 今回の採用候補。安定性とパフォーマンスが高い。
.NET MAUI C# Microsoft Xamarinの後継。Windowsとの親和性は最強だが、モバイル開発体験は好みが分かれる。 Windows特化ならありだが、モバイル含めると学習コスト高。
Electron JS / TS OpenJS Fdn. Web技術そのもの(Chromium)で動作。 デスクトップ専用のため、モバイル対応不可。
Unity C# Unity ゲームエンジン ゲーム専用。一般的なUIアプリには不向き。

当初、Web(React)の知見を最大限活かせる React Native が最適解だと考え、プロジェクトをスタートしました。

(余談)Expo vs React Native CLI の落とし穴

開始当初、私は「Expoは開発用で、最終的に純粋なネイティブコードにはならない」という古い認識を持っていました。そのため、あえて難易度の高い React Native CLI を選択しました。 しかし、調査を進めると現在の Expo は prebuild 機能により、完全にネイティブなプロジェクトを生成できることが判明しました。CLIを選んでしまったことで、Windowsのビルド環境(Visual Studioのソリューションファイル)を自力で管理する羽目になり、これが後の苦戦の伏線となりました。

React Native での挑戦と「構造的限界」

React Nativeでの開発を始めてすぐに、「Webのように書けるが、Webではない」 という現実に直面しました。特にWindows対応において、以下の構造的な壁にぶつかりました。

エコシステムの分断

React Nativeは「一枚岩」ではありません。

  • React: Webの本家ライブラリ(npmでインストール)。
  • React Native (Core): モバイル(iOS/Android)向け。主幹は Meta
  • React Native for Windows / macOS: デスクトップ向け。主幹は Microsoft
    • ここがポイント: コア(Meta)とは別リポジトリで開発されており、コアの最新版への追従が遅れがちです。
  • React Native CLI: 開発ツール。主幹は コミュニティ(Callstack社など)
  • Expo: 開発ツールチェーン。主幹は 650 Industries (Expo)

この開発主体の違いにより、Coreの最新機能にWindows版が追従できていない「周回遅れ」の状態が頻発します。

Windows対応の辛すぎる現実

特に苦戦したのがWindows版です。「React Native for Windows」導入時に以下の問題が多発しました。

  1. UWPの制約と署名のコスト: Windows版は歴史的にUWP(サンドボックス環境)ベースです。このため、プロトタイプを社内に配ろうとしても、UWPはデジタル署名が必須となります。有償の証明書(年間数万円〜)を購入しないとインストールすらままならない現実は、プロトタイプ開発において大きな足枷でした。また、UWPゆえにファイルアクセス権限やWin32 APIへのアクセスが非常に制限されていて、回避策の検討にも苦労します。
  2. ライブラリ品質のばらつき: react-native-* 系のライブラリは、iOS/Androidには対応していても、Windowsは未対応かビルド不能であることが多々あります。
  3. Hermesエンジンのクラッシュ: Windows版のJSエンジン「Hermes」が、国際化機能(Intl)を呼ぶだけでクラッシュするバグに遭遇しました。プラットフォーム固有の地雷を踏むたびに開発がストップしました。
  4. アーキテクチャの過渡期: React Nativeは現在、旧アーキテクチャ(Bridge)から新アーキテクチャFabric / TurboModules)への移行期です。しかし、Windows版はこの対応が完了しておらず、ライブラリによっては「モバイルは新アーキテクチャ必須だが、Windowsは未対応」という板挟み状態になります。

結果として、「Reactのコードは共通化できても、ネイティブ周りのトラブルシューティング工数が倍増する」 という本末転倒な状態に陥りました。

なぜ Flutter なのか? 技術的な優位性

「純粋なクロスプラットフォームアプリ」を作るという目的に立ち返ったとき、Flutterアーキテクチャが持つ合理性が際立ちます。

インタープリター」vs「ネイティブコード」

性能面で決定的な違いがあります。

  • React Native: リリースビルドであっても、JavaScriptコードはバイトコード化され、アプリ内のJSエンジン(VM)上で実行されます。つまり、ネイティブコードとの間には常に変換のオーバーヘッドが存在します。
  • Flutter: リリースモードでは AOT (Ahead-Of-Time) コンパイル され、そのプラットフォームの完全なネイティブ機械語(マシンコード) になります。C++で書いたアプリと同等にCPUが直接実行するため、起動速度も処理速度も圧倒的です。

配布の容易さ(.exe vs MSIX)

FlutterのWindows版は、標準的なWin32アプリ(.exe)としてビルドされます。署名なしでも(警告は出ますが)zipで固めて配布し、ダブルクリックで即起動できます。この「普通のWindowsアプリ」が作れる手軽さは、React Native (UWP/MSIX) との大きな差です。

FFI による高速な連携と安定性

React Nativeが複雑なブリッジを介するのに対し、Flutter (Dart) は FFI を使って C/C++ (Win32 API) を直接呼び出せます。OS機能へのアクセスが高速で、かつGoogleが公式プラグインを整備しているため、「Windowsだけ動かない」という事態が起きにくい構造になっています。

Googleによる中央集権的な品質管理

Flutterは言語(Dart)もフレームワーク本体も Google が主幹です。 さらに、ファイルシステム、HTTP通信、画像選択といった主要なプラグインGoogle(またはFlutterチーム)が公式にメンテナンスしています。 「Windowsだけ動かない」という事態が構造的に起きにくく、Windows版もStable(安定版)として本体に含まれています。

AI時代における「言語の壁」の崩壊

移行に際して唯一の懸念は「Dart」という馴染みのない言語でした。しかし、実際に触れてみると2つの発見がありました。

  1. AIコーディングとの相性: Dartは静的型付け言語です。AIにコードを書かせた際、型定義が間違っていればコンパイルエラーになるため、JavaScriptよりも「AIの嘘」に気づきやすいです。
  2. 「書く」のはAI、「読む」のは人間: 新しい言語をゼロから「書く」のは大変です。しかし、AIに生成させたコードを「読んでレビューする」のは、JavaやTypeScriptに近いDartなら難しくありません。

「AIに書いてもらい、人間は型安全な環境でレビューする」 ——このスタイルが確立できる今、言語のマイナーさはもはや障壁ではなくなりました。

おわりに

Web資産の流用やOS標準UIへのこだわりがあるなら React Native も選択肢ですが、デスクトップを含む真のクロスプラットフォーム展開と、ネイティブアプリとしての純粋な性能・配布のしやすさを求めるなら、2025年現在は Flutter が最適解であると判断しました。
今後は今回の知見を活かして、Flutterでクロスプラットフォームのネイティブアプリを量産できるようにしていきたいと思います。

Google Workspaceのセキュリティ管理を効率化!情報漏洩リスクを未然に防ぐチェックソリューションを開発

昨今、クラウドサービスの普及に伴い、情報漏洩のリスクは高まっています。特にGoogle Workspaceを利用する企業において、アクセス権の設定ミスやGoogleグループの意図しない公開設定による機密情報漏洩の事故が後を絶ちません。

この記事では、情報システム部門の管理者・担当者の皆様が直面するこれらの課題を解決するため、弊社が開発したGoogle Workspaceセキュリティ管理効率化チェックソリューションをご紹介します。

💡 導入:なぜ今、このソリューションが必要なのか?

🚨 繰り返される「設定ミス」による情報漏洩事故

昨今、Googleドライブの「リンクを知っている全員」設定や、Googleグループの「外部閲覧可能」設定ミスによる重大な情報漏洩事故が多発しています。機密情報や個人情報が意図せずインターネット上に公開され、企業は甚大なダメージを負います。

図1:Google Driveの共有設定画面
事例としてGoogle Formを誤って編集者権限で外部公開しアンケート回答者(顧客)の情報が漏れてしまう、社外秘資料を誤ってファイル/フォルダごと全公開で共有してしまうなどのケースが考えられる。

図2:グループの設定画面
「会話を閲覧できるユーザー」を「組織全体」や「ウェブ上のすべてのユーザー」にしてしまうと、意図しないメンバーにメールのやり取りが見えてしまう。

😩 情シス担当者の「目視チェック」という限界
  • 課題の明確化:
    • 「全ファイル」「全共有ドライブ」「全Googleグループ」の設定を目視でチェックするのは、時間的にも工数的にも非現実的です。
    • 特に組織が拡大したり、異動・退職が増えたりすると、設定の抜け漏れリスクは加速度的に増大します。
  • ターゲットへの訴求:
    • Google Workspaceの上位エディション(Enterpriseなど)では高度な監査機能がありますが、予算の都合で契約できない企業は、手作業のチェックに頼らざるを得ない状況です。

✨ 開発背景と目的:私たちが解決したかったこと

🛠️ 開発のきっかけ

深刻な情報漏洩事故を目の当たりにし、「この問題を情シス担当者の目視と精神論に頼っていてはいけない」という強い危機感を持ちました。

そこで、「安価に」「効率的に」「現状のリスクを網羅的に」把握できるソリューションの必要性を痛感し、自社で開発に着手しました。

🎯 ソリューションの目的

Google Workspaceのコアな情報漏洩リスクを自動検知し、情報システム部の管理者・担当者のチェック負荷を劇的に軽減すること。

⚙️ ソリューションが解決する具体的な課題と機能紹介

私たちは、特にリスクが高い以下の3つのポイントに焦点を当て、機能に落とし込みました。

課題(リスク) 開発機能 ソリューションが解決できること
Googleドライブで「リンクを知っている全員」公開の機密ファイルがある アクセス権:「リンクを知っている全員」のファイルを一括把握 意図しない全公開ファイルを即座に特定し、権限を「制限付き」に戻すなどの対策を可能にします。
共有ドライブの権限が複雑化し、誰が何にアクセスできるか不明 共有ドライブの権限一覧表示 共有ドライブごとのメンバーと権限を一覧で確認でき、権限の棚卸しと適正化を効率化します。
Googleグループの設定ミスで、社内会話が意図しない三者(外部または不要な内部メンバー)から閲覧可能になっている Googleグループの会話閲覧状態を可視化 グループの「投稿の閲覧権限」が、本来アクセスすべきでないユーザー(外部・内部問わず)に広く公開されていないかを確認し、社内メールの会話の閲覧制限を適正化します。

図3:製品のメイン画面
図の公開ファイル一覧画面では、すべての公開ファイルのリンク、パス、所有者などを確認できる。

🌟 導入のメリット:情シス担当者の未来
  • 時間とコストの節約:
    高度な監査機能を上位エディションに頼る必要がなく、手動チェックにかかっていた膨大な時間を削減できます。
  • 確実性の向上:
    目視による見落としがなくなり、情報漏洩リスクを組織全体で確実に低減できます。
  • リスクの事前検知:
    事故が起きてから動くのではなく、日々のチェックで「危ない設定」を未然に把握し、予防的なセキュリティ体制を構築できます。

🤝 まとめ

💡 こんな企業におすすめです
  • Google Workspaceを利用しているが、Enterpriseなどの上位エディション契約が難しい企業。
  • 情報システム部のリソースが限られており、セキュリティ管理を効率化したい企業。
  • Googleドライブやグループの設定ミスによる情報漏洩リスクを真剣に防ぎたい企業。
📩 ご興味ある企業/導入したい企業は弊社にお問合せください

本チェックソリューションは、お客様のGoogle Workspace環境に合わせて導入が可能です。

デモンストレーションのご依頼や、ソリューションの詳細に関するご質問は、弊社のウェブサイトの問い合わせフォームまでお気軽にご連絡ください。

[お問い合わせフォームへのリンク] heroz.co.jp

n8nを使って業務自動化してみた

はじめに

本記事では、n8nの実際の活用例を紹介したいと思います。

筆者は、情シス部門に所属しており、 HEROZに入社してまだ1年も立っていないため、AI技術に関してはまだまだ素人なのです。そのため、社内でよく飛び交うAI関係の専門用語についていけていなかったため、 業務効率化も兼ねて、n8nというAI系のツールを使い、問い合わせ窓口の内容を自動集計するプログラムを試作してみました。

n8nについて

n8nとは、簡単に言えば、LLM+ワークフローを使った自動化ができるツールです。
幅広いSaaS(Slack, Notion, Google, X, AWS, Azureなど)と連携することができます。
パワーポイントの図形を使うような形でAIを使ったプログラムを作成できるので、特に、プログラミングはあまりできないけど、日々の作業をAIを使って自動化したいような方におすすめです。

n8nの使い方

n8nでは、ノードと呼ばれるブロックをつなぎ合わせることでワークフロー=プログラムを作成することができます。 パワポの図形作成のように感覚で作れてしまうのがとても魅力的です。

例えば、Slack上でOpenAIとチャットするためのワークフローを作成する場合は下図のようになります。

n8nのワークフローの例
n8nのワークフローの例

上図では、Slackにメッセージが投稿されると下記の処理が実行され、 Slack上でChatGPTのようにAIとやり取りすることができるようになります。

処理の流れ:

  1. あらかじめ、Slackボットとn8nを連携する。(Webhook URLの登録など)
  2. Slackにメッセージを投稿する。
  3. Slackからメッセージがn8nに通知される。
    • トリガーノード(Slackノード)にWebhook通知が行き、n8nのワークフローが実行される。
  4. Slackの通知がAIに渡される:
    • 次のノード(AI Agentノード)にメッセージが渡され、AIがツール(ネット検索ツール等)と自動的に連携し、応答を返す。
  5. Slackに生成されたメッセージが返される:
    • Slackノードに結果が渡され、AI Agentノードで生成されたメッセージがSlackにDMとして返す。

上記のように、シンプルな機能であれば簡単に実装できる上、各種サービスと簡単に連携できるのでとても便利です。

ノードは設定画面から設定を行うことができるため、Slackアカウントの認証情報、通知元のSlackチャンネル、LLMのプロンプトの設定などができます。 また、AI Agentノードは様々なツール(Gmail、データベース、Web検索ノードなど)をつなげることで機能を拡張できるので、様々なサービスと簡単に連携することができます。(ただし、各種SNS等の契約は別途行う必要があります。)

n8nの設定画面(LLMノード)
n8nの設定画面(LLMノード)

連携できるツールの一例
連携できるツールの一例

n8nを採用した理由

今回、n8nを採用する上で考慮した要件は下記の通りです:

  1. 社内の業務自動化で活用できそうなこと。(ローコードであると非エンジニアでも使えるのでなおよい)
  2. 特に、API連携ができ、LLMが使えること。(AI AgentやRAGの機能があるとなおよい)
  3. 運用費用があまりかからないこと。(まずは、LLMを使った自動化が実用的なのかを検証したいため)

上記の結果、Difyも触ったりしたのですが、さほど違いを感じず、 最終的に社内で活用できるかわからなかったのでオープンソースのn8nを採用しました。 (使い方が似ているので、実用性が出てきた段階でDifyに切り替えることもできそうです)

n8nの構築について

n8nは構築はDockerのイメージがあるのでローカルで動かす場合は、とても簡単です。

# https://github.com/n8n-io/n8nを抜粋
docker volume create n8n_data
docker run -it --rm --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n


ただ、社内で共有したかったこともあり、今回はAWS上で構築しました。 ランニングコストは最低限にしたかったので、最終的に下記のスペックで構築しました。

  • 実行環境:ECS on EC2
  • EC2インスタンス:t3.small
  • ボリューム:EBS sc1(125 GB)

ECS on EC2を採用した理由は、価格の安いEBSを採用したかったためです。(今回の場合、EBSとEFSを比較すると20倍ぐらいの価格の差がありました)

構築はTerraformで行いました。 詳細は長くなるので割愛しますが、本構築のポイントとしては下記の点があります。

  1. AWSのFargateがEBSに対応していないため、ESC on EC2+REX-Rayプラグインの構成で構築。
    • REX-rayを使うことで、Fargate+EBSのような構成が可能になる。
    • ECS on EC2は専用に作られたEC2-optimized版があったのでこちらの最新版を採用した。
    • IAMポリシーはAmazonEC2ContainerServiceforEC2Roleec2:AttachVolumeなどのEBS関連の権限を付与した。
    • ECS on EC2は構築ミスをすると、コンテナが起動されず、AWS上にあまりログが出力されないため、原因の調査が難しい。 (メモリが枯渇して新しいコンテナが起動できない、REX-Rayのインストールに失敗してecs.serviceが起動しない等の現象に遭遇)
  2. WebhookのURLがlocalhostとなっていたため、WEBHOOK_URLの環境変数を設定。

上記は、いずれもドキュメントがあまり充実していないこともあり、原因を探すのにとても苦労しました。(実は以降の問い合わせ集計自動化プログラムの作成より苦戦しています。。。)

問い合わせ集計自動化

情シスでは、1年の振り返りとして、問い合わせ窓口に来る内容を分析して次のアクションを計画するのですが、今回、その作業を自動化するプログラムをn8nで作成してみました。 問い合わせ件数は数百件に上るため、LLMで自動化できれば時間短縮になりますし、 業務効率化のひらめきに繋がるアドバイスをくれるかもしれないと思い作成しました。

実際に完成したものがこちらです:

問い合わせ窓口集計のワークフロー
問い合わせ窓口集計のワークフロー

…とても長いですね。当初はもっとシンプルだったのですが、精度を上げるため、色々試行錯誤した結果、今回の形に行きつきました。

細かい説明は割愛しますが、ポイントだけ説明したいと思います。

処理の流れ

大きく分けて2つの処理を行っています。

  1. 黄色い部分:Slackから問い合わせチャンネルの内容を収集してGoogleスプレッドシートに保存する。(また、Googleスプレッドシートには、あらかじめ式が埋め込まれており、集計結果を自動的に算出するよう用意されている。)
  2. 青い部分:文章を「概要」、「ユーザ毎の問い合わせ件数の上位」、「月毎の問い合わせ件数の上位」、「よく出てくるキーワード」、「その他(気づき)」の章に分けて、複数のLLMに生成してもらう。

2では、下図のように文章を担当ごとに分割して、順番にLLMで生成する方式を採用しました。

文章の生成方法:文章を担当ごとに分割して生成する

下記は2章目の「月別の問い合わせ件数」を担当しているLLMのプロンプトの例です。

プロンプト:
    --- システムメッセージ ---
    あなたは、データ分析が得意なAIエージェントです。
    現在、AIエージェントの回答を繋げていっており、最終的に下記の内容を出力していきます。
    あなたは、あなたの担当された箇所について回答し、文を完成してください。

    《最終的に出力する内容》
    # help-情シス問い合わせ受付の分析結果

    ## 概要
    ["AI Agent E"の回答]

    ## ユーザ別の問い合わせ件数
    ["AI Agent A"の回答]

    ## 月別の問い合わせ件数
    ["AI Agent B"の回答]

    ## キーワード
    ["AI Agent C"の回答]

    ## その他
    ["AI Agent D"の回答]

    --- ユーザー入力 ---

    【問い合わせの履歴】
    {{ $json.conversationPerMonth }}  ←スプレッドシートで計算された集計結果

    【問い合わせの統計】
    ユーザ別:
    {{ $json.userSummary }}             ←スプレッドシートで計算された集計結果

    月別:
    {{ $json.monthlySummary }}          ←スプレッドシートで計算された集計結果

    【質問】
    あなたはAI Agent Bです。月別の問い合わせ件数をランキングで表示してください。
    また、その月に多かった問い合わせの内容の一例を含めてください。
    出力は「## 月別の問い合わせ件数」から始めてください。

    # help-情シス問い合わせ受付の分析結果

    ## ユーザ別の問い合わせ件数
    {{ $json.outputUserSummary }}       ←「ユーザ別の問い合わせ件数」を担当するLLMの出力結果

    ## 月別の問い合わせ件数
    [あなたの回答]

結果

上記で生成された結果は下記の通りです。(情報はぼかしています)

# ヘルプデスク問い合わせ受付の分析結果
## 概要
本期間中の問い合わせは、ネットワークやクラウド基盤の設定変更に加え、各種業務管理システムにおけるユーザーアカウントの新規発行や権限変更、及びセキュリティ・アクセス管理の依頼が多く寄せられています。問い合わせ内容は、システム運用やセキュリティポリシーの柔軟な運用、社内外の情報共有環境の整備に関連しており、急なトラブル対応から計画的なサービス変更の依頼まで多岐にわたっています。これにより、各システムの管理体制の見直しと、各部署間の連携強化が喫緊の課題として浮かび上がっています。
## ユーザ別の問い合わせ件数
1. Aさん:30件
 例:「顧客のコミュニケーションツール利用について、有料版への移行に関する問い合わせ」
2. Bさん:20件
 例:「人事管理システムの管理者権限の発行依頼や承認プロセスの設定変更」
3. Cさん:19件
 例:「ソースコード管理ツールへのアクセス許可依頼やグループ内のメンバー追加・削除依頼、及び社内システム連携に関する問い合わせ」
...
## 月別の問い合わせ件数
1. 2025/01:39件
 例:複数のシステムの新規グループ作成、アカウント発行、及びアクセス権限の付与依頼が突出しています。
2. 2024/08:31件
 例:PC交換に伴うデバイス承認、アカウントの追加、及び基本システム連携に関する問い合わせが中心でした。
3. 2024/10:30件
 例:コミュニケーションツール内のグループ・チャンネル作成、登録依頼、外部連携の設定依頼など、コミュニケーションおよびセキュリティ施策に関する要求が多く寄せられました。
...
## キーワード
1. アドレス管理
 ─ アドレス登録、変更、設定など、ネットワーク設定に関する問い合わせが頻出。
2. セキュリティ管理システム
 ─ セキュリティポリシー、アクセス許可設定、リスク管理など、通信制御や安全性確保に関する依頼。
3. 業務管理システム
 ─ アカウント新規発行、権限変更、連携トラブルなど、業務システムのユーザー管理関連の問い合わせが中心です。
...
## その他
・全体として、各種システムの運用・管理に伴う定型的な依頼(アカウント発行や権限変更)に加え、新規機能の導入やシステム連携に伴う急なトラブル対応も多く見受けられ、社内の業務プロセスや連携体制の改善が求められている状況です。
・特に、アドレス管理に関する依頼が散見されることから、新サービスの立ち上げや既存サービスの移行、セキュリティ強化の動きが活発であると判断できます。
・また、業務管理システムに関する依頼が多いことは、社内のユーザー管理プロセスが頻繁に行われていることを示唆しており、今後の運用体制の強化が課題となると考えられます。

→ チャット履歴はこちら ←
Automated with this workflow

結論から言うと、上記の内容は可もなく不可もなくな結果となってしまいました。 1週間程かけて制作していきましたが、一番苦労したのは、ハルシネーション(それっぽい嘘)でした。 生成結果を見ると、それっぽい結果になっているのですが、実際に内容を確認すると誤った情報が多々ありました。 特に、数字関係は壊滅的で、問い合わせ件数とそのランキングはほとんど誤っていました。 AIモデルの変更やRAGを採用してみましたが、うまくいかず、最終的には、Googleスプレッドシートで集計してLLMに渡すということを行い、数字は正確なものになりましたが、文章はまだ部分的に不正確な情報が含まれていることがあります。

また、対策を考えるいいアドバイスが得られるかもと期待していたのですが、 LLMに業界知識がないためか、調整不足で抽象的なアドバイスになってしまったのも特徴的で興味深かったです。

追記:社内のAIエンジニアに記事を確認してもらったところ、業界知識の問題ではなく、コンテキスト不足&出力の調整が足りない(期待値の粒度調整が明確でない)のでは?という意見をいただきました! コーディングアシストの時は割と雑な質問でも的確に回答してくれるので、その感覚とは異なるのだなと素人ながらに感じました。。。

改善策はまだまだあるのですが、1週間という制約を設定していたため、今回はここまでとしました。 まだまだ試したいことは多いので、時間ができ次第、色々検証していきたいです。

プログラムを作ってみた所感

LLMを使ってみての感想ですが、「未知の生物を手なずけている」そんな感覚でした。 普段行っているソフトウェア開発はパフォーマンス低下やバグの原因をなんとなく推測できるのですが、 LLMについては、何をしたらうまくいくのかの推論を立てにくく、やってみないとわからないことがとても多かったです。

普段は調べ物やコーディングのアシスト等で、LLM(HEROZ ASK)にお世話になっているのですが、 その精度とはだいぶかけ離れた印象の結果になったのが残念だったのと同時に面白かったです。 AIは万能ではなく、いかにお膳立てして使うかがポイントなのかもしれないなと学びになりました。

今回のケースでは、プロンプトが長すぎたこと(1年間の問い合わせをそのまま入力として渡していること)と汎用的なLLM(業界知識がなく、分析に長けていないLLM) プロンプトの調整不足が敗因な気がします。

おわりに

n8nを使ってLLMを使って色々思考錯誤したおかげで、最近のAI技術について解像度がかなり上がりました。 特に、AI関連の会議や勉強会で何を話しているのかわかるようになったのが一番うれしい成果でした!

また、n8n自体も色々可能性のあるツールだなと感じました。 現在は、n8n+Slackボットを使って、社内のマニュアル検索&ネット検索&音声入力できるAIボットを作るなど、自分がほしい機能を作って活用しています。 まだ業務理解が浅いので、他部署にヒアリングしていき活用事例を作っていきたいです。

手軽にLLMを連携できるので、LLMを活用した製品のプロトタイプの作成など、社内に実験の場としてn8nを提供していきたいとひそかに思っています。。。!

n8nを使ってみた

はじめに

n8nというオープンソースのワークフロー自動型のAIツールを使ってみました。
筆者は、情シス部門で働いているのですが、社内の業務効率化の問い合わせを受けることがあり、Google App Scriptをメインに業務自動化ツールを作成しています。ただ、入社したてだったということもあり、AIについて知識がなく、また、AIを使えばより高度な業務自動化を行えるのではないかと考えていたところ、Youtubeの技術解説動画でn8nを知り、試しに触ってみることにしました。

n8nについて

n8nとは、簡単に言えば、LLM+ワークフローを使った自動化ができるツールです。
幅広いSaaS(Slack, Notion, Google, X, AWS, Azureなど)と連携することができます。
パワーポイントの図形を使うような形でAIを使ったプログラムを作成できるので、特に、プログラミングはあまりできないけど、日々の作業をAIを使って自動化したいような方におすすめです。

n8nの特徴としては下記が挙げられます:

  1. ノーコード、ローコード:
    • 簡単なものであればノーコードでプログラムを作成できる
    • 例えば、AIサービスのプロトタイプなどを作る際に便利
  2. インストールが簡単:
    • Dockerイメージがあるので、気軽に導入することができる
    • Dockerをインストールしてあれば、コマンド1つでサービスを起動することができる
  3. 情報漏洩の心配がない:
    • オフラインでも使用できるため、情報管理に厳しい会社でも安心して使える
    • Ollamaやローカルのデータベースなどと連携して使うこともできる
  4. 無料:

できること

n8nでできることとしては、下記のような例が挙げられます:

  1. PDFの自動解析
    • スキャンした領収書や見積書の内容をAIで自動解析してExcel
  2. メール返信の自動仕分け
    • 毎日送られてくる問い合わせメールをAIで解析し、回答を自動生成する
  3. 会議の内容の自動共有
    • 録画した会議の内容をAIで議事録化し、社内に自動共有するシステム

導入方法

とりあえず試しに触ってみたい方は、Dockerイメージが用意されているので、Dockerをインストールしている環境であれば、下記のコマンドを実行するだけで起動できます。

docker volume create n8n_data
docker run -it --rm --name n8n  -p 5678:5678 -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n

使い方

n8nでは、ノードと呼ばれるブロックをつなぎ合わせることでワークフロー(プログラム)を作成することができます。 パワポの図形作成のように感覚で作れてしまうのがとても魅力的です。

例えば、Slack上でOpenAIとチャットするためのワークフローを作成する場合は下図のような流れになります。

①ノードの選択

②ノードの配置

③ノード同士を接続する

④AI Agentにツールをつなげて機能を拡張する

n8nのワークフローの例
⑤1~4を繰り返して完成

n8nを使ってみた

情シスでは、1年の振り返りとして、問い合わせ窓口に来る内容を分析して次のアクションを計画するのですが、今回、その作業を自動化するプログラムをn8nで作成してみました。 問い合わせ件数は数百件に上るため、LLMで自動化できれば時間短縮になりますし、 業務効率化のひらめきに繋がるアドバイスをくれるかもしれないと思い作成しました。

ワークフローのおおまかな流れは下記の通りです:

  1. Slackから問い合わせチャンネルの内容を収集してGoogleスプレッドシートに保存する。
  2. 複数のLLMを組み合わせて、順番に「概要」、「ユーザ毎の問い合わせ件数の上位」、「月毎の問い合わせ件数の上位」、「よく出てくるキーワード」、「その他(気づき)」をそれぞれ生成し、最後に清書する。
  3. 結果をSlackに送信する。

問い合わせを自動分析するワークフロー

最終的な結果は下記の通りです(情報はぼかしています):

# ヘルプデスク問い合わせ受付の分析結果
## 概要
本期間中の問い合わせは、ネットワークやクラウド基盤の設定変更に加え、各種業務管理システムにおけるユーザーアカウントの新規発行や権限変更、及びセキュリティ・アクセス管理の依頼が多く寄せられています。問い合わせ内容は、システム運用やセキュリティポリシーの柔軟な運用、社内外の情報共有環境の整備に関連しており、急なトラブル対応から計画的なサービス変更の依頼まで多岐にわたっています。これにより、各システムの管理体制の見直しと、各部署間の連携強化が喫緊の課題として浮かび上がっています。
## ユーザ別の問い合わせ件数
1. Aさん:30件
 例:「顧客のコミュニケーションツール利用について、有料版への移行に関する問い合わせ」
2. Bさん:20件
 例:「人事管理システムの管理者権限の発行依頼や承認プロセスの設定変更」
3. Cさん:19件
 例:「ソースコード管理ツールへのアクセス許可依頼やグループ内のメンバー追加・削除依頼、及び社内システム連携に関する問い合わせ」
...
## 月別の問い合わせ件数
1. 2025/01:39件
 例:複数のシステムの新規グループ作成、アカウント発行、及びアクセス権限の付与依頼が突出しています。
2. 2024/08:31件
 例:PC交換に伴うデバイス承認、アカウントの追加、及び基本システム連携に関する問い合わせが中心でした。
3. 2024/10:30件
 例:コミュニケーションツール内のグループ・チャンネル作成、登録依頼、外部連携の設定依頼など、コミュニケーションおよびセキュリティ施策に関する要求が多く寄せられました。
...
## キーワード
1. アドレス管理
 ─ アドレス登録、変更、設定など、ネットワーク設定に関する問い合わせが頻出。
2. セキュリティ管理システム
 ─ セキュリティポリシー、アクセス許可設定、リスク管理など、通信制御や安全性確保に関する依頼。
3. 業務管理システム
 ─ アカウント新規発行、権限変更、連携トラブルなど、業務システムのユーザー管理関連の問い合わせが中心です。
...
## その他
・全体として、各種システムの運用・管理に伴う定型的な依頼(アカウント発行や権限変更)に加え、新規機能の導入やシステム連携に伴う急なトラブル対応も多く見受けられ、社内の業務プロセスや連携体制の改善が求められている状況です。
・特に、アドレス管理に関する依頼が散見されることから、新サービスの立ち上げや既存サービスの移行、セキュリティ強化の動きが活発であると判断できます。
・また、業務管理システムに関する依頼が多いことは、社内のユーザー管理プロセスが頻繁に行われていることを示唆しており、今後の運用体制の強化が課題となると考えられます。

→ チャット履歴はこちら ←
Automated with this workflow

具体的な実装は別記事にまとめたいと思いますので、詳細が気になる方はそちらをご覧ください。

n8nを使ってみた感想

n8nを使用してみた印象ですが、とても便利でまだまだ活用の余地があるなと感じました。

一番の特徴はコーディングをしなくてよいところでしょうか。 導入はコマンド一つででき、API連携が簡単、プログラムの実行もスケジューリングができるなど、手軽に業務の一連の流れを自動化できるところがとても便利だなと感じています。 また、バージョンアップのスピードも早く、MCPノードなどの新しい技術にも随時キャッチアップしており、流行の技術に手軽に触れられるのも良いところだと感じています。

反面、ドキュメントが英語のみ、かつ、充実していないので、まだまだ社内で活用するには課題が多いです。 そのため、保守性の観点から、現状はまだGoogle App Script等を使って業務自動化を行うことが多いです。

以下、n8nの特徴をまとめてみました。

長所

  • コーディングをあまりしなくてもよい。(アイディアの検証におすすめ)
  • SaaS連携が手軽にできる。(2025年現在では1047個のSaaSを含むツールに対応)
  • LLM、RAG、AI Agentなど、先進的な技術を使った自動化が行える。
  • JavascriptPythonのコードも埋め込めるため、複雑な実装できる。(ただし、使えるライブラリには制限がある)

短所

  • ドキュメントが英語、かつ、充実していないため、使える人が限られている。
  • 使用できるLLMの機能は少しラグがある。(Open Researchやsimilarity_score_thresholdを使ったRAG等、未実装の機能がある。)
  • 日本のSaaSとの連携は充実していない。(FreeeやKintoneなどとの連携はWebhookノードを使って手動で作りこむ必要がある。)

おわりに

実は、こちらの記事を書き始めたのが2025年の4月頃だったのですが、その後色々と立て込んでしまい、6か月経ってしまいました。。。 最近ではOpenAI BuilderなどLLMのメーカーからこういったツールが出てきており、ますます便利になっていく一方、 こういったオープンソースならではの強みがあって、n8nはまだまだ需要があるツールなのではないかと感じています。 色々自作するのが好きな方は一度触ってみてはいかがでしょうか?