top of page

自動化ツール n8n と Langfuse の連携

  • 執筆者の写真: KAMON Nobuchika
    KAMON Nobuchika
  • 1 日前
  • 読了時間: 4分

n8nとは何か

n8nは「nodemation」の略称で、ドラッグ&ドロップ操作や各ノードの設定によってワークフローを作成できる自動化ツールです。300以上の組み込みノードを提供しており、Slack、Gmail、Notion、カレンダー、Webhookなど、様々なサービスとの連携が可能です。コードを書くことなく複雑な自動化フローを構築できる一方で、JavaScript や最近はPython を使用したコードの実行をフローに埋め込むことなどにも対応しています。


Dify との違いは何?

両方とも基本的にOSSベースのノーコードツールと位置付けてよいと思いますが、Difyは「生成AIアプリを作る」ツール、n8nは「生成AIを含むシステムを繋いで業務を処理する」ツールという違いがあると思います。特に実際のオフィスワークにおいては、生成AIをはじめとして JIRA やCRM, mail, Slack などと連携することが求められるケースも多く、n8n はそのようなケースで非常に有用であると考えられます。またコードを書くこともできるので、痒いところに手が届くところも人気の理由です。


ちなみに n8n は Dify よりも歴史が長く、その分で安定しているという意見もある一方で、現在利用者や人気という点ではほぼ互角に見えます (ただし日本ではローカライズが早かった Dify の方が採用が多いように思われます)


Github starsの推移、n8nの歴史は長いが スター数は近い
Github starsの推移、n8nの歴史は長いが スター数は近い

n8n と Langfuse 連携の価値


そんな n8n と Langfuse を連携させる理由の一つは、もちろんTraceを取得することによる処理の可視化です。レイテンシーやコスト、システムの中でどのような処理が行われているかを可視化することは運用上で大きな意味を持ちます。またLLM as a judge などの評価にも利用することも可能となります。

もう一つの価値はプロンプト管理です。n8n の生成AIアプリケーションのノードの中にプロンプトをハードコードしても使い回しや世代管理などをすることができず、管理も煩雑になり、生産的ではありません。以降では、実際の設定方法について記載していきます。



n8n サンプル構成概要


今回の説明には、サンプルとして下図のシンプルなフローを用います。


[構成環境]

Version 1.99.1 OSS

Self-hosted on CloudRun + CloudSQL (PostgreSQL),


[サンプルフロー]

n8n フロー
n8n フロー

チャットでの入力を受け、このフローは以下の動作をします。


  1. Code ノードがプロンプトを Langfuse から取得

  2. そのプロンプトを AI Agentノードの System prompt に入れ、チャットに入力された内容が user prompt として入れられる

  3. その情報が Langchain ノード (Langfuse LLM) に入り、そこから今回はVertexAIのModelを呼び出す (これは OpenAI でも Bedrock でも何でも同じです)


ひとつずつコードと設定を見てみましょう。


  1. Codeノード コードサンプル

const { Langfuse } = require("langfuse");
const langfuseClient = new Langfuse();

return langfuseClient.getPrompt("wording").then(prompt => {
  const variables = $input.item.json.variables || {};
  const systemPrompt = prompt.compile(variables);
    
  return {
    json: {
      systemPrompt: systemPrompt,
      userMessage: $input.item.json.chatInput,
      langfusePrompt: prompt,
      promptVersion: prompt.version,
      promptName: "wording",
      sessionId: $input.item.json.sessionId
    }
  };
});

まず langfuse を読み込み、その後に wording という 名前のプロンプトを langfuseから取って、それを SystemPrompt に渡しているだけです。その後、各変数をセットしています。ちなみに Langfuse の host などは環境変数に入れておくなどする必要があり、langfuseパッケージもコンテナの中にモジュールをインストールしておく必要がありますのでご注意ください。また今回は特に使っておりませんが、prompt.compile に変数を渡してあげることで、 Langfuse の中のプロンプトに変数を渡してあげることもできます。


  1. AI Agentノード


このノードにはコードは書く必要はありません。Prompt の中に User messageを定義し、System Message として、1. Codeノードで取得した内容を反映させておきます。


前のノードを実行するとこの画像の左側ペインに変数がでるので、それをドラッグ&ドロップして設定するのが簡単
前のノードを実行するとこの画像の左側ペインに変数がでるので、それをドラッグ&ドロップして設定するのが簡単
  1. Langchain ノード コードサンプル


const { CallbackHandler } = require("langfuse-langchain");

const model = await this.getInputConnectionData("ai_languageModel", 0);

const inputData = $input.item.json;

const langfuseHandler = new CallbackHandler({
  sessionId: inputData.sessionId || `session_${Date.now()}`,
  userId: inputData.userId || "anonymous",
  tags: ["n8n", "ai-agent", "production"]
});

model.callbacks = model.callbacks || [];
model.callbacks.push(langfuseHandler);

return model;

まず langfuse-langchain パッケージから CallbackHandler クラスをインポートし、次にLLMモデルを取得します。この例ではGoogle Vertex Chat model かモデル名と 0 (最初の接続) を指定してとってきます。とってきたjson からデータを展開し、sessionIDやUserIDを入れております。ついでに n8n などのタグも設定しています。

そしてmodelに callback を追加して、model オブジェクトを AI Agent ノードに渡します。


以上で、やるべきことは終わりです。


Langfuse のTraceを見てみると以下のように記録されているはずです。Langchainを使ってるので、勝手にTokenなども取られています。


プロンプトには "言葉遣いは荒々しい野武士のようにしてください" と指定しており、それをそのままSystem promptとして指定してある。
プロンプトには "言葉遣いは荒々しい野武士のようにしてください" と指定しており、それをそのままSystem promptとして指定してある。

いかがでしたでしょうか。n8n は簡単に使えるツールですが、生成AIの利用もサポートされており、Langfuseとの組み合わせも実現可能です。ご興味あるかたは、ぜひ試してみてください。
















Comments


bottom of page