2.5K Views
May 23, 25
スライド概要
Dify Community (JP) は、LangGenius, Inc.社が提供するオープンソースのLLM(Large-Language-Model)アプリ開発プラットフォームをもっと上手に活用するためのユーザーコミュニティです。 DifyではRAGエンジン(Retrieval-Augmented Generationエンジン)を使用して、ChatBotのようなエージェントから複雑なAIワークフローまでさまざまなLLMアプリをノーコードで編成することができます。 このグループでは、Difyを支えるLLMやRAGなどの技術や、Difyの使い方の知見、またDifyを活用した業務や開発生産性の改善事例についてみなさまと議論していきます。
DifyのETL処理とDifyプラグイン Extract/Transform/Load リコーITソリューションズ株式会社 ITソリューション事業本部 AIストラテジーセンター 高田 忠礼 佐官 雄介
企業紹介:リコーITソリューションズ株式会社 2名とも本社勤務
リコーグループでのDifyへの取り組み リコー「Dify」 https://promo.digital.ricoh.com/ai/service/dify/
自己紹介 最近やっていること ● 散歩:体力を付けるため2017年頃から開始、休日に外出する時は10km目標 ● 中古CD収集:休日の散歩に無理矢理目的を持たせるために何となく収集を開始 (70~80年代のソウル/ファンク) ● 登山:年に数回天園ハイキングコース(鎌倉)に行くくらい ● ジョギング:膝を痛めたり足首を痛めたりしたので休止 ● ボルダリング:友人に誘われて行ってみたら1時間で前腕がパンパンに… 経歴 ● ● ● ● 複合機のソフトウェア開発(12年):PDFライブラリ(Java)、ICカード認証(C、Java) IoTシステム開発(6年) AIシステム開発(3年) Dify(6ヶ月目):リコーグループのDify案件の環境構築/ワークフロー開発/技術支援/運用・保守等
アジェンダ ● Inside Dify ~DifyのETL処理を読んでみた~ ● ETL処理を実行可能なDifyプラグイン ● Difyプラグインを実装してみた ● Difyプラグインに関する所感
Inside Dify ~DifyのETL処理を読んでみた~ ※Dify Community v1.4.0段階
ETL(Extract/Transform/Load)とは? データソースからデータを抽出(Extract)、変換(Transform)、読み込み/流し 込み(Load)するためのデータフローのこと。Dify内では以下の2つのファイル読 み込み処理をETLと呼称している。 ①ナレッジにテキストファイルをインポ ートする際のファイル読み込み処理 ②ワークフロー/チャットフローのテキス ト抽出ノードでのファイル読み込み処理
Difyの種別とETLタイプ Difyの種別 ETLタイプ 備考 Dify Cloud(SaaS版、ク ラウドサービス版) ・Unstructured ・LangGeniusがAWS(リー ジョン:アメリカ東部)で提 供しているクラウドサービス ・ETLタイプはUnstructured で固定 Dify Community(OSS版、 ・Dify コミュニティ版) ・Unstructured ・GitHubリポジトリで公開さ れているOSS(ライセンスに 追加条件あり) ・環境変数ETL_TYPEで切り 替えが可能、デフォルトは Dify(dify)
ETLタイプ:Unstructured ファイルの読み込み処理の一部にUnstucturedを利用するETLタイプ。追加で環境 変数を指定することでUnstructured.ioが提供しているUnstructured APIを利用す ることも可能で未指定の場合はライブラリとしてのUnstructuredが利用される。 [対応しているファイル形式(ナレッジ)] ※Dify Cloudの画面より抜粋 https://github.com/Unstructured-IO/unstructured
ETLタイプ:Dify ファイルの読み込み処理がファイル種別毎にそれぞれ別のライブラリを利用する ETLタイプ。Dify Communityをデフォルト(環境変数に手を入れない)で起動す るとこちらのタイプになる。 [対応しているファイル形式(ナレッジ)] ※Dify Communityの画面より抜粋
各ETLタイプで対応しているファイルの比較① テキストエディタ―で読めそうなファイル形式 ファイル種別(拡張子) Unstructured(利用するライブラリ) Dify(利用するライブラリ) TXT(.txt) 〇(なし) 〇(なし) CSV(.csv) 〇(pandas) 〇(pandas) HTML(.html/.htm) 〇(BeautifulSoup) 〇(BeautifulSoup) VTT(.vtt) △(webvtt-py、ナレッジではTXT扱い) △(webvtt-py、ナレッジではTXT扱い) Markdown(.md/.mdx) 〇(Unstructured) 〇(なし) Email(.eml) 〇(Unstructured) ×(TXT扱い) MSG(.msg) 〇(Unstructured) ×(TXT扱い) XML(.xml) 〇(Unstructured) ×(TXT扱い) 設定がUnstructuredでも必ずUnstructuredを利用してファイルを読み込むわけではない
各ETLタイプで対応しているファイルの比較② 構造が複雑なファイル形式 ファイル種別(拡張子) Unstructured(利用するライブラリ) Dify(利用するライブラリ) EPUB(.epub) 〇(Unstructured) 〇(Unstructured) Excel(.xls/.xlsx) 〇(openpyxl/pandas) 〇(openpyxl/pandas) PDF(.pdf) 〇(pypdfium2) ※Unstructuredを利用する実装 自体はあるが利用されていない 〇(pypdfium2) PowerPoint(.ppt) 〇(Unstructured、APIキー必須) × PowerPoint(.pptx) 〇(Unstructured) × Word(.doc) 〇(Unstructured) × Word(.docx) 〇(python-docx) 〇(python-docx) 設定がUnstructuredでも必ずUnstructuredを利用してファイルを読み込むわけではない 設定がDifyでもUnstructuredを利用するケースもある(.epubのみ)
ETL処理:PDFを読み込む 入力ファイル:厚生労働省が公開している「モデル就業規則.pdf」 ①ナレッジにテキストファイルをインポ ートする際のファイル読み込み処理 ②ワークフロー/チャットフローのテキス ト抽出ノードでのファイル読み込み処理 Dify v0.15.0~v1.3.1までは文字化けするPDFがあった(pypdfium2 4.30.1の障害) 2025/05/15にリリースされたv1.4.0で解消(pypdfium2 4.30.0に固定)
ETL処理を実行可能なDifyプラグイン ※2025/05/16段階 ※LLMを利用してOCRするプラグインは含まない ※実行環境はDify Cloud
ETL処理を実行可能なDifyプラグイン(ツール) プラグイン名 プロバイダ ー名 概要 markitdown yevanchen PDF Process 対応ファイル形式 プラグインのラ イセンス 利用するライブラリ MarkItDownをベースにしたDify PDF、Word(.doc、.docx、 用のドキュメント変換プラグイン。 PowerPoint(.ppt、.pptx)、 Markdownで出力可能。 Excel(.xls、.xlsx)、HTML (.html、.htm)、etc... 不明(未記載) markitdown[all] kalochin Difyのための包括的なPDF処理ツ ールスイート。 PDF 不明(未記載) PyPDF2 PyMuPDF(AGPL v3.0) pillow pdfminer_six tavan pdfminer.sixを利用してPDFファ イルからテキストを抽出するツー ルを提供するプラグイン。 PDF MIT pdfminer.six pdfminer.six[image] pymupdf yevanchen PyMuPDFを搭載したDify用の強 PDF 力なPDFテキスト抽出プラグイン。 AGPL v3.0 PyMuPDF(AGPL v3.0) ※PDF Processは前述のPDFの読み込み処理で停止するので紹介対象外
動作確認用ワークフローの実行結果(Dify Cloud) 用途にもよるがETL処理の性能(時間)はかなり気にする必要がある
Difyプラグイン「pymupdf」の出力① ページの区切り情報も含まれておりシンプルにナレッジ登録が可能
Difyプラグイン「pymupdf」の出力② 現状はどのプラグインでもPDF内の表(table)の情報は落ちてしまう
Difyプラグインを実装してみた ● pypdfium2プラグイン ● Unstructuredプラグイン ● pdfplumberプラグイン ※実行環境はDify Cloud
pypdfium2プラグイン Dify Community内の実装(pdf_extractor.py)を参考にしながらローカルプラグ インとしてインストールした。 ● pypdfium2(4.30.0、特定のPDFで文字化けが発生しないバージョン)を利 用してPDFの読み込みを行う ● ページ単位でセパレーター文字列(”******”)を入れる 目的:プラグインの実装方法の調査、他のプラグインとの処理性能の比較
pypdfium2プラグインの実行結果 ● pypdfium2のバージョンを落としたので文字化けしない ● PDFの読み込みが十分に速い ● ライセンス問題をクリアできる ● シンプルな実装なのでテキストを抽出するだけ、表データは読み込めない
Unstructuredプラグイン Dify Community内の実装(unstructured_pdf_extractor.py、実装はあるが未使 用)を参考にしながら実装した。 ● 内部実装と同様にテキスト抽出を行う処理のみ、OCRはしない ● 固定サイズでチャンク分割していたのでページ単位での分割に修正した 目的:他のプラグインとの処理性能の比較
Unstructuredプラグインの実行結果 ● リモートでのデバッグ実行は可能 ● パッケージ化したプラグインをインストールできない(イ ンストール実行後成功したような表示が出た後にプラグイ ンが表示されない) ● デバッグ実行環境(Windows、VSCode)のPython仮想 環境に必要なライブラリをインストールするとプロジェク トフォルダーのサイズが約2GB OCRをしなくても必要なライブラリがインストールされる 実際にOCRする場合はPython以外のライブラリも必要
pdfplumberプラグイン PyMuPDFやpypdfium2と一緒に紹介されていることが多いので実装してみた。 ● ページ毎の表データの取得が簡単に実装可能 ● 表データはページ毎にメタデータとして出力する 目的:他のプラグインとの処理性能の比較、表データの取得可否の確認
pdfplumberプラグインの実行結果 ● PDFの読み込みには時間がかかってしまう(PDFの構造データか ら表データの生成を実行しているためと推測) ● ページ内に複数の表が存在する場合は右記リストに複数の表分の リストが格納される
PDFを読み込むプラグインの総括 ● 利用するPDFライブラリによって処理性能の差が 激しいので目的によって使い分ける必要がある ● 現状公開されているものはテキスト抽出だけしか 行えない(ライブラリに機能はあるが実装してい ない)、表データの抽出まで行おうとするとプラ グインを自前する必要がある ● 実装してみたプラグインも含めてPDFの画像デー タ部分の読み取り(OCR)は現状実行できない 今回はファイル(ドキュメント)のETLに焦点を当て たが次回があればOCRに焦点を当てたい。 Azure Document Intelligence、Docling、 Tesseract OCR...
Difyプラグインに関する所感
Difyプラグインに関する所感 よかった点 ● シンプルなプラグインは実装するのもデプロイするのも非常に簡単、もうコードノー ドには戻れない… ● 市民開発者(ノーコード/ローコードユーザー)のためのRPAの部品になるようなプ ラグイン(ツール)がリリースされている、もっと増えてくれるとうれしい 課題 ● Dify Cloudでのデバッグ実行は挙動が不安定なので要注意(半日以上1日未満接続で きない状態に陥ったことがあった) ● ドキュメントにプラグインのクォータに関する情報が不足しているので次はInside dify-plugin-daemonしてみる予定
ご清聴ありがとうございました