📑

DifyとGradioで作るPDF処理ワークフローアプリケーション

2024/05/29に公開

DifyとGradioで作るPDF処理ワークフローアプリケーション

ターゲット読者: Python開発者、特にDifyやLangchainなどのツールに興味があり、PDF処理ワークフローを自動化したいと考えている人

今日のビジネスでは、請求書の処理、契約書の分析、レポートの生成など、さまざまな場面でPDF文書が使用されています。これらのPDF文書を手作業で処理することは、時間と労力がかかり、ミスが発生しやすいため、多くの企業が自動化ソリューションを求めています。

この記事では、Dify、Gradio、Langchainという3つの強力なツールを組み合わせて、PDF処理ワークフローを自動化するPythonアプリケーションを構築する方法を紹介します。

Open in Colab

https://x.com/gijigae/status/1796349290102874598

https://github.com/tregu148/difyForShare/blob/main/dify/jina_summarizer.yml

1. はじめに

Dify は、コードを書かずにAIアプリケーションを構築できるプラットフォームです。直感的なインターフェースを備えており、開発者は複雑なワークフローを簡単に定義し、APIを通じてアクセスできます。

Gradio は、機械学習モデル用のユーザーインターフェースを構築するためのオープンソースライブラリです。Pythonコードからわずか数行で、インタラクティブなウェブアプリケーションを作成できます。

Langchain は、大規模言語モデル(LLM)を使ったアプリケーション開発を簡素化するフレームワークです。ドキュメントの読み込み、テキストの分割、質問応答などの機能を提供しています。

これらのツールを組み合わせることで、PDF文書をアップロードし、DifyのAIワークフローで処理し、結果をGradioのユーザーインターフェースに表示するアプリケーションを構築できます。

2. Dify API:ワークフローの実行とAPIキーの管理

Dify APIと対話するには、ベースURL、APIキー、ワークフローIDが必要です。APIキーは、Difyプラットフォームで生成され、アプリケーションを認証するために使用されます。

import getpass

DIFY_BASE_URL = getpass.getpass("DIFY_BASE_URL:")
DIFY_API_KEY_MYWORKFLOW = getpass.getpass("DIFY_API_KEY_MYWORKFLOW: ")

Dify APIと対話するには、requests ライブラリを使用します。ワークフローを実行するには、次のようなPOSTリクエストを送信します。

リクエストエラー: 400 Client Error: BAD REQUEST for url: https://hogehoge.vm.elestio.app/v1/workflows/run

inputsの変数名とか値がおかしいかも? あなたが設定した変数名と一致させる必要があります。
このワークフローの場合url,knowledgeです。

import requests
import json
url = DIFY_BASE_URL + "/workflows/run"

headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {DIFY_API_KEY_MYWORKFLOW}"
}

data = {
    "inputs": {
        "knowledge":"""
        本作の悪役。千年以上前に生まれた最初の鬼。鬼達の絶対的支配者で、自身の血を人間に与え大量の鬼を作り出した。炭治郎の家族を殺し、禰󠄀豆子を鬼に変えた仇である。
鬼達を血に仕込んだ呪いで支配し、「あの方」と呼ばれ恐れられている。外見や攻撃は自由自在で、不死身の鬼を殺すことができる。性格は冷酷非情かつ支配的で、自らの意志に沿わない者は決して許さず、忠実に従っていた下弦の鬼達を些細なことで何ら躊躇なく惨殺したり、報告に来た猗窩座に理不尽な叱責を与えるなどしている。珠世からはその人物像を「いつも何かに怯えている臆病者」と皮肉られている。癇癪で暴力を振るったり、自分を棚に上げた言動をすることも多い。
        
        """,
    },
    "query": "",  # クエリ(オプション)
    "response_mode": "streaming",  # ストリーミング応答
    "user": "abc_123",  # ユーザーID
}

response = requests.post(url, headers=headers, json=data, stream=True)

response.raise_for_status()  # エラーチェック

response = requests.post(url, headers=headers, json=data, stream=True)
response.raise_for_status()

assistant_message = ""
outputs = {}

# APIレスポンスのチャンク処理
for chunk in response.iter_lines(delimiter=b"\n\n"):
    if chunk:
        chunk_data = chunk.decode("utf-8").strip()
        if chunk_data.startswith("data:"):
            json_data = chunk_data[6:]  # "data: "を取り除く
            if json_data:
                result = json.loads(json_data)
                if result.get("event") == "text_chunk":
                    answer = result.get("data", "").get("text", "")
                    assistant_message += str(answer)
                    print(str(answer), end="", flush=True)
                elif result.get("event") == "workflow_finished":
                    outputs = result.get('data', "")
                    print(assistant_message, outputs)

3. Gradio:ユーザーインターフェースの作成

Gradioを使用すると、Pythonコードからわずか数行でインタラクティブなユーザーインターフェースを作成できます。例えば、Google Colab上で実行すれば、そのままシェア可能なURLを発行できます。(一時的な)

import gradio as gr

def run_workflow(message):
    # Dify APIと対話してワークフローを実行する処理
    # ...
    yeild result, assistant_message,{}

iface = gr.Interface(
    fn=run_workflow,
    inputs=[gr.MultimodalTextbox(label="PDFファイルをアップロード", file_types=[".pdf"], interactive=True)],
    outputs=[
        gr.Textbox(label="生テキスト", show_copy_button=True, max_lines=5),
        gr.Markdown(),  # Markdown形式のテキストを表示
        gr.JSON()  # JSONデータを整形して表示
    ],
    title="PDF to Dify Workflow",
    description="PDFファイルを入力すると、Dify APIのワークフローによって処理された結果が表示されます。",
)

iface.queue().launch()  # アプリケーションを起動

このコードは、PDFファイルをアップロードするためのシンプルなインターフェースを作成します。アップロードされたファイルは、run_workflow 関数に渡され、Dify APIと対話してワークフローを実行します。結果は、テキストボックス、Markdown、JSONデータとして表示されます。

4. Langchain:PDFファイルの読み込みとテキスト抽出

LangchainのUnstructuredPDFLoader を使用すると、PDFファイルを読み込み、テキストデータを抽出できます。

from langchain_community.document_loaders import UnstructuredPDFLoader

loader = UnstructuredPDFLoader("path_to_file.pdf")
data = loader.load()
raw_text = data[0].page_content

抽出されたテキストデータは、Dify APIのワークフローへの入力として使用できます。

5. アプリケーションの実装

提供されたコードは、上記のすべての要素を組み合わせて、PDF処理ワークフローを自動化する完全なアプリケーションを作成します。

このアプリケーションは、PDFファイルを受け取り、Langchainを使用してテキストを抽出し、Dify APIのワークフローを実行して、結果をGradioのユーザーインターフェースに表示します。エラー処理と処理状況の表示も実装されており、ユーザーエクスペリエンスが向上しています。

6. まとめ

この記事では、Dify、Gradio、Langchainを組み合わせて、PDF処理ワークフローを自動化するPythonアプリケーションを構築する方法を紹介しました。これらのツールを組み合わせることで、開発者はAIを活用した強力なアプリケーションを構築し、反復的なタスクを自動化し、ビジネスプロセスを効率化できます。

Dify、Gradio、Langchainの詳細については、それぞれのドキュメントを参照してください。

https://zenn.dev/tregu0458/books/9793d4e2dbbcb0

Discussion