ジェネラティブエージェンツの大嶋です。
もくもくDifyで「Difyソースコードリーディング #5 - ナレッジベース・RAGの実装を読み解く」というイベントを開催しました。
アーカイブ動画はこちらです。
Difyのソースコードは以下です。
今回も 戸塚さん と一緒に話しながらコードを読んでいきました!
今回のポイント
DifyのRAGの実装の概要
DifyではRAG関係の重要なコードは api/core/rag ディレクトリに置かれているようでした。
api/core/rag以下のディレクトリの概要は、以下のようになっていました。
- cleaner ... 前処理
- data_post_processor ... 後処理(リランクとリオーダーの呼び出し)
- datasource ... Weaviateなどのベクトルデータベースのインテグレーション
- docstore ... RDBにデータを読み書きする機能
- extractor ... CSV、PDF、PPTXなどのファイルからのテキストの抽出
- index_processor ... インデクシングの処理
- models ... Document型の定義
- rerank ... リランクの実装
- retrieval ... Retrievalの処理
- splitter ... チャンク化の処理
IndexingRunner
Difyのナレッジベースの機能でインデクシングを実行したときは、indexing_runner.py のIndexingRunnerクラスが使われるようでした。
IndexingRunnerからextractorやdatasourceなどが呼び出されて処理が進むようです。
インデクシングの際の処理の流れを把握したい場合は、IndexingRunnerクラスがヒントになりそうです。
ファイルからのテキスト抽出処理
extract_processor.py には、以下のように拡張子に応じてテキストの抽出処理を切り替えるよう実装されていました。
if file_extension in {".xlsx", ".xls"}: extractor = ExcelExtractor(file_path) elif file_extension == ".pdf": extractor = PdfExtractor(file_path)
このあたりを改造すると、PDFやPPTXといったファイルからのテキスト抽出処理を変えてみるといったこともできそうです。
次回のご案内
次回は「DSLのYAMLファイルの扱いを読み解く」というテーマです。 ご興味ある方はぜひ気軽にご参加ください!
また、水曜日にもDifyの活用についてのもくもく会があります。 こちらもご興味ある方はぜひ気軽にご参加ください!