清水理史の「イニシャルB」
生成AI連携でメールの自動要約なども、ワークフロー自動化ツール「n8n」を自宅サーバーで動かす
IFTTTやZapier代替として知られるツールがLangChainを追加
2023年11月20日 06:00
IFTTTやZapierの代替として利用されているワークフロー自動化作成ツール「n8n」に、ベータ版として、大規模言語モデル(LLM)と連携した機能を組み込める「LangChain」ノードが追加された。
従来のGmailやSlackなどのクラウド用ノードと組み合わせたうえで、GPT-3.5-Turboなどを使った処理を組み込むことができる。自宅サーバーで無料の自動化&LLM環境を試してみた。
セルフホストなら制限なしに無料で利用可能
「n8n」は、さまざまなクラウドサービスを組み合わせてワークフローを自動化するツールだ。同様のサービスは、IFTTTやZapierなどが有名だが、これらは有料、もしくは回数制限などがある無料プランとして提供されており、使い込むにはハードルがあった。
n8nも、クラウドサービスとして有料版が提供されているが、このほかセルフホスト可能なサスティナブルライセンス(コミュニティエディション)版も用意されており、フェアコードライセンスというかたちで提供されている。フェアコードライセンスは、基本的に無料で利用できるが、商業的に利益を得る場合は有料版を購入する必要があるという形態なので、個人的な仕事の効率化などの用途には、無料で利用できるようになっている。
このため、自分で用意したクラウド上のサーバーや自宅サーバー、もしくはNASなどで稼働させることで、さまざまなサービスと連携したワークフロー自動化環境を手に入れることができる。
連携可能なサービスも豊富で、GmailなどのGoogleのサービスやAWS、BOX、Discord、GitHub、Excel Online、OneDrive、Teams、Notion、PayPal、Salesforce、Slack、WordPress、Zoomなどと多彩で、以下のように本稿執筆時点では700を超える機能が用意されている。
▼n8nのインテグレーション
n8n Integrations
セルフホスト版の場合、外部サービスと連携させるには、外部アクセスを許可したり、サービス側でOAuth2の設定をしたりする必要があるなど、若干の手間はかかる。それでも、これが無料で使えるのは魅力的だ。
しかも、現在、ベータ版としてAI機能(LangChainノード)が提供されており、これを利用することでOpenAIのAPIなどを利用した大規模言語モデルをワークフローに組み込むことができるようになっている。
例えば、シンプルにチャットを実現したり、Gmailからカレンダーに予定を登録したり、Google Drive上のドキュメントに対してチャットをしたりと、さまざまな連携ができるのが特徴だ。
もちろん、現状、LangChainの全ての機能が利用できるわけではなく、以下のドキュメントで紹介されているノードのみとなるが、チャットや検索、履歴保持など、基本的な操作が可能となっている。
▼n8nで利用可能なLangChainの機能に関する説明
LangChain concepts in n8n
n8nをインストールする
というわけで、今回は自宅サーバーでAI対応のベータ版n8nを稼働させてみた。利用したのはProxmox上のコンテナとして動作するDebian 11(メモリ1GB、CPU2コア、ストレージ30GB)で、Dockerを利用してn8nを起動したが、Dockerが動けば他の環境を利用してもかまわない。
以下の公式ドキュメントで紹介されているコマンドで簡単に起動できるので、とりあえず試したいという場合は、次のコードを実行すればいいだろう。
▼n8nでLangChainを利用する方法の解説
Access LangChain in n8n
docker run -it --rm --name n8n -p 5678:5678 -v ~/.n8n:/home/node/.n8n docker.n8n.io/n8nio/n8n:ai-beta
ただ、今回は、HTTPS化したかったのと(外部サービスの連携で必須)、起動時のパラメーターをいくつか追加したかったので、docker composeで起動することにした。
「n8n」などのディレクトリを作成して、「docker-compose.yml」ファイルとして、以下の内容を保存する。そして、「docker compose up -d」で起動すればいい。
version: '3'
services:
n8n:
image: docker.n8n.io/n8nio/n8n:ai-beta
ports:
- 5678:5678
environment:
- N8N_HOST=n8n.example.com
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://n8n.example.com
- N8N_BLOCK_FILE_ACCESS_TO_N8N_FILES=false
- GENERIC_TIMEZONE=Asia/Tokyo
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./n8n:/home/node/.n8n
- ./Documents:/mnt/Documents
ポイントとしては、AI用のベータイメージである「image: docker.n8n.io/n8nio/n8n:ai-beta」を指定することが1つ。そのほか、外部サービスとの連携時に必要な「WEBHOOK_URL」を設定したり、「N8N_BLOCK_FILE_ACCESS_TO_N8N_FILES=false」としてローカルに保存されたファイルへのアクセスを許可したり、「volumes」でホスト上のディレクトリをマウントしていることとなる。
もちろんDNSやポート設定なども必要で、今回は、直接外部から自宅にアクセスせずにリバースプロキシ経由でアクセスするようにするために、すでに自宅サーバー上に構築済みのNginxのリバースプロキシも併用している。これにより、「https://n8n.example.com」宛てのアクセスを内部の「http://192.168.2.102:5678」に転送し、さらにLet’s EncryptでHTTPS化している。
HTTPS化しておかないと、OAuth2で外部サービスと連携させるときにリダイレクトできない場合があるので注意が必要だ。
なお、公式のGitHubで公開されているdocker composeのサンプル(以下のdocker/composeに格納されている)には、リバースプロキシとしてTraefikを利用する例も紹介されているので、こちらを利用して外部アクセスを実現するのも手だ(筆者は試していないので動作は不明だが.envに必要な情報さえ入れれば動作すると思われる)。
▼n8n公式GitHub
n8n-io/n8n(GitHub)
さらに、もう1点だけ補足しておく。
次で紹介するサンプルを動作させるには、Google側でのAPI設定が必要になる。OAuth2を使った認証と、Gmail APIにアクセスできるようにGoogle Cloud Platformの設定をしておく必要がある。英語だが、n8nのドキュメントで画面付きで手順が紹介されているので、こちらを参考に設定しておくといいだろう。
▼n8nでGoogleのOAuth2認証を利用する方法の説明
Google: OAuth2 single service
Gmailを要約するサンプルを作る
というわけで、ようやく本題に入ろう。
今回作成したのは、5つのノードで構成される簡単なサンプルだ。Gmailを監視して、新着メールが届いたら、本文の内容をOpenAIのGPT-3.5-Turboに送信して要約するというものになる。n8nの基本的な動作とLanChainノードの使い方を見るには適しているだろう。
STEP 1:[Gmail Trigger]を設定する
最初は、ワークフローのトリガーとなるノードを配置する。今回は、メールがトリガーなので、[Gmail Trigger]を配置し、[Credential to connect with]でGmailに接続する。前述したように、あらかじめOAuth2の設定をしておけば、ポップアップする画面でGmailアカウントとアクセス許可をすればいい。
また、トリガーが起動するタイミングを設定する。標準では[Every Minute]と1分おきに設定されているが、テスト用なのでそのまま利用する。最後にメール本文を全て取得するために[Simplify]をオフにしておく。
この状態で[Fetch Test Event]をクリックすると、トリガーがテスト実行され、新着メールを取得できるはずだ(新着メールがないと取得できないので注意)。
このようにn8nは、1つずつノードを実行し、出力される値を確認しながらフローを作成できるようになっている。これは分かりやすい。
STEP 2:[Summarization Chain]を設定する
次に、出力されたメールから本文を取り出して、要約するためのノードを配置する。[Advanced AI]カテゴリから[Summarization Chain]を配置し、[Add Option]から[Prompt]を追加して次のように設定する。
このプロンプトがAPI経由でGPT-3.5-Turboへと渡される。途中の「{{ $json.text }}」がメールの本文だ。
次のテキストの要約を簡潔に記述してください。
テキスト:
{{ $json.text }}
要約:
前の[Gmail Trigger]の実行に成功し、メールを受信できている場合は、左側の[INPUT]にメールの情報が表示されるので、ここから取得したい部分(今回は[text])を[Prompt]のテキストボックスにドラッグすると、「{{ $json.text }}」と自動的に変換されて入力される。段階的に実行しながら設定すれば、こうした些細なコードの記述も不要だ。
なお、STEP 1と同様に実行して試したいところだが、このノードにはまだ必要なノードが接続されていないので実行できない。そのまま次のステップに進もう。
STEP 3:[OpenAI Model]を配置する
[Summarization Chain]ノードには[Model]と[Document]という2つのコネクタがあるので、まずは[Model]にLLMのモデルを接続する。
「claude」や「PaLM」、さらにはローカルで動作する「Ollama」なども選べるが、今回は「OpenAI Model」を選択する。
STEP 4:[JSON Input Loader]を配置する
[Summarization Chain]のもう1つのコネクタとなる[Document]に[JSON Input Loader]を接続する。取得したメールは、JSON形式なので、これを読み込むためのノードだ。
配置後、[Pointers]を[/text]に設定しておく。これで、取得したメールからテキスト部分を取り出せる。
STEP 5:[Recursive Character Text]を配置する
最後に、[JSON Input Loader]の[Text Splitter]に[Recursive Character Text]ノードを接続する。
テキストスプリッターは、テキストを分割するためのノードだ。このノードを利用した場合、テキスト内の区切り文字や指定した長さで再帰的にテキストを分割する。分割する長さは、今回はメールなので[Chunk Size]を400トークン(400文字)ほど、[Chunk Overlap](前後関係を理解するために前後に重ねる文字数)を40ほどにしておいた。
以上で、ワークフローが完成したので、[Save]で保存後、スライドスイッチを[Inactive]から[active]に切り替えて実行しておく。これで1分おきにメールをチェックし、新着メールがあれば、それを要約してくれる。
今回は、結果をどこかに出力しているわけではないので、ワークフロー内で確認する。[All executions]から実行結果を開き、[Summarization Chain]を開くと、[Output]として要約されたテキストが表示されるはずだ。
フィルターを活用して要約するメールを選別したり、出力結果をGoogle Sheetsに出力したりと、いろいろな工夫をしてみるといいだろう。
自宅サーバーでの楽しみが広がる
以上、n8nのベータ版を利用して、ワークフローにAI(LLM)を組み込む例を紹介した。途中のn8nのインストールや外部アクセスの方法など、だいぶ端折っているが、このあたりこそ自宅サーバーで実行する楽しみなので、試行錯誤してみるといいだろう。
N100あたりのミニPCがかなり安いので、Proxmoxなどをインストールして自宅サーバーとして用意しておくと、こういった機能をさっと試せるのでおすすめだ。