4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Dify×コラボフローで稟議書自動入力:添付ファイルからタイトル・内容・予算を自動抽出する

Last updated at Posted at 2025-12-03

はじめに

エイトレッドさんが最近リリースした「AI搭載ワークフロー」を見て、
これ、コラボフローでもDifyで再現できないかな?」と考えて検証した内容を紹介します。

実現方法

やりたいこと

  • コラボフローの申請画面で添付ファイル(Word/PowerPointなど)を読み込む
  • Difyに解析させて添付ファイルの中身からタイトル・内容・予算を抽出
  • 申請フォームに自動で反映する

今回、Difyに解析させる添付ファイルは稟議書を対象としました。
(理由はエイトレッドさんのYouTubeでも稟議書を解析していたからです…)

全体の流れ(プログラム目線)

  1. コラボフローAPIで添付ファイルを取得
  2. Dify APIでステップ1のファイルをアップロード
  3. Dify APIでチャットメッセージを送信
  4. 応答(JSON)をパースして、フォーム項目(タイトル/内容/予算)に反映

Dify側の設定

今回のアプリは、ファイルをアップロード → テキスト抽出 → LLMで解析 → 回答を返すという流れで構成しました。

ワークフロー構成

  1. 開始:入力としてファイル(sys.files)を受け取る
  2. テキスト抽出:アップロードされたファイルからテキストを抽出
  3. LLM:抽出したテキストから必要な情報をまとめて抜き出す
  4. 回答:LLMの出力(text)を返す

{F34DC55C-BAC0-4B4E-9D6C-A99C301E7C7F}.png

ちなみにLLMノードでは、以下のプロンプトを登録しました。
今回はシンプルに「JSON形式で返す」ことを明示しています。
※プロンプトに詳しい方なら、より高度な指示やバリデーションも登録可能だと思います

このファイルから稟議書のタイトル、内容、予算を抽出してください。
JSON形式で { "title": "", "content": "", "budget": "" } として返してください。

実装

1. コラボフローAPIを使用して添付ファイルを取得

Difyとは関係ない箇所になりますが、解析元のファイルを取得します。
注意点や詳細については以下の記事に記載しております。

const fileUrl = `${collaboflow.page.api_endpoint}/v1/files/${file_id}/download`;

const fileResponse = await fetch(fileUrl, {
  method: 'GET',
  credentials: 'include' // セッションCookieを送信
});

const blob = await fileResponse.blob();

2. Dify APIを使用して、ステップ1で取得したファイルをアップロード

コラボフロー上の添付ファイルをダウンロードした後、Dify上にアップロードします。
ちなみにDifyにアップロードしたファイルは一時的に保存され、数日後に自動削除されます。
Dify側で長期保存が必要な場合は、別途ストレージ管理を追加してください。

const uploadForm = new FormData();
uploadForm.append('file', blob, file_name);

const uploadResponse = await fetch('https://api.dify.ricoh.com/v1/files/upload', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${apiKey}`
  },
  body: uploadForm
});

const uploadData = await uploadResponse.json();
const difyFileId = uploadData.id;

3. Dify APIを使用して、チャットメッセージを送信

アップロード結果(ファイルID)をメッセージに含めて送信します。
以下のソースコードではqueryを指定していますが、おそらくDify側では使用されていないと思います。
※LLMノードのプロンプトでも同様の内容を登録しているため

しかし、APIリファレンスには /v1/chat-messages の query は必須 と記載されているため、
念のため空文字や未指定を避けて送信しています。

また、filesを使う場合は、upload_file_id と transfer_method: "local_file" を正しく指定しないと「invalid_param」エラーになるため注意してください。

const chatPayload = {
  inputs: {},
  query: "このファイルから稟議書のタイトル、内容、予算を抽出してください",
  response_mode: "blocking",
  conversation_id: "",
  user: userId,
  files: [
    {
      type: "document",
      transfer_method: "local_file",
      upload_file_id: difyFileId
    }
  ]
};

const response = await fetch('https://api.dify.ricoh.com/v1/chat-messages', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${apiKey}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(chatPayload)
});

4. ステップ3からの応答(JSON)をパースして、フォーム項目(タイトル/内容/予算)に反映

Difyからの応答をコラボフローの項目に反映します。

const data = await response.json();
const parsedAnswer = JSON.parse(data.answer);

// コラボフローの各項目に転記する
const titleField = document.getElementById('fidTitle');
const contentField = document.getElementById('fidContent');
const budgetField = document.getElementById('fidBudget');
if (titleField) titleField.value = parsedAnswer.title || '';
if (contentField) contentField.value = parsedAnswer.content || '';
if (budgetField) budgetField.value = parsedAnswer.budget || '';

今回はDifyのアプリタイプチャットフローだったため、必要な情報は data.answer に格納されていました。
一方、ワークフローの場合は data.outputs に格納されるため、アプリタイプによって応答形式が異なる点には注意が必要です

チャットフローの応答
{7C2236EE-FA66-4636-88BB-77C13800352A}.png

ワークフローの応答
{49330B3D-3BC7-48FE-A5FA-AA2CE8D56120}.png

実行結果

ネットから拾ってきた稟議書を添付し、「添付ファイル解析」ボタンを押すと…
無事、稟議書の内容がフォームに自動反映されました!

{A07966B2-A21A-42DB-8DCC-859C3B3D4486}.png

{FC6085CB-10D4-4E41-8F4A-993304F0894B}.png

さいごに

Dify×コラボフローの組み合わせで、入力の手間を大幅に削減できそう、ということがわかりました。
ただし、埋め込みチャットのやり取りをAPIでは取得できないため、精度改善には工夫が必要です。
また実運用する際はAPIキーの管理もきちんとしなくちゃと思っています。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?