ホーム > AIエージェント > dify > 検証 > DifyのRAG用ファイルを外部から操作する検証

DifyのRAG用ファイルを外部から操作する検証

Difyでは、RAG(検索拡張生成:Retrieval-Augmented Generation)を実装する機能が「ナレッジベース機能」として提供されています。
DifyでRAGとして扱えるデータは下記のようになっています。

TXT, MARKDOWN, MDX, PDF, HTML, XLSX, XLS, DOCX, CSV, VTT, PROPERTIES, MD, HTMをサポートしています。1 つあたりの最大サイズは15MB です。

RAG用のデータは、Difyの「ナレッジ」をクリック後の画面で、アップロードして反映させる事ができます。

図. ナレッジで空のナレッジベースを作成してファイルをアップロード

RAGはLLMが問い合わせる際の情報源として利用されます。

図. ナレッジベースを使用したチャットボット

ここでは、RAG用のファイル操作を外部から行う方法について、下記の簡易検証を行ってみました。

例えば、下図のようにナレッジに「火星保険会社」という箱(ナレッジベース)を作成して、
その中に含まれるファイルを外部から操作(一覧表示、削除、追加)する場合を想定してみます。

  • 外部のプログラムからDifyのナレッジベース内のファイル操作ができるか
  • 外部のWordPressにDifyのナレッジベース内のファイル管理機能を用意して更新できるか
図. ドキュメントの外部操作イメージ

ナレッジAPIの基本仕様

  • APIキー認証が必要
    外部からナレッジAPIにアクセスするには、APIキー認証が必要になります。
    ナレッジAPIのAPI認証(英語版)
  • 主なナレッジAPIのエンドポイント
    ナレッジAPIのエンドポイントは、主に下記のようなエンドポイントがあります。

    操作 エンドポイント 内容 公式サイト
    ナレッジベース一覧取得 GET /datasets Difyに登録されているナレッジベースの一覧を表示します。 https://docs.dify.ai/api-reference/datasets/get-knowledge-base-list
    ドキュメント一覧取得 GET /datasets/{dataset_id}/documents 指定されたナレッジベース内のすべてのドキュメントのリストを取得します。 https://docs.dify.ai/api-reference/documents/get-the-document-list-of-a-knowledge-base
    ファイル追加 POST /datasets/{dataset_id}/document/create-by-file ファイルをアップロードして、既存のナレッジ ベース内に新しいドキュメントを作成します。 https://docs.dify.ai/api-reference/documents/create-a-document-from-a-file
    ファイル更新 POST /datasets/{dataset_id}/document/{document_id}/update-by-file 新しいファイルをアップロードして既存のドキュメントの内容を置き換え・更新します。 https://docs.dify.ai/api-reference/documents/update-a-document-with-a-file
    ファイル削除 DELETE /datasets/{dataset_id}/document/{document_id} ナレッジ ベースから特定のドキュメントを削除します。 https://docs.dify.ai/api-reference/documents/delete-a-document
  • 必要なキーの構造
    ナレッジAPIのアクセスに必要な必要なキーの構造は、下記のようなイメージになっています。

    ナレッジベースAPIのシークレットキー ※ナレッジAPI自体のアクセスに必要。
    └─データセットID(dataset_id) ※今回の例では「火星保険会社」。
    └─ドキュメントID(document_id) ※上記に含まれるファイルのID。

1.ナレッジAPIのシークレットキー取得

  • ナレッジベースAPIのシークレットキーを取得
    ナレッジの画面で左上の「API ACCESS」をクリックして、右上の「APIキー」をクリックします。
    新しいシークレットキーを作成」をクリックすると、下図のように発行されます。
    このキー情報を手元に控えておきます。

    図. ナレッジベースAPIのシークレットキーを取得

2.外部のプログラムからファイル操作

  • ナレッジベースAPIのシークレットキーを使用してナレッジベース一覧を取得
    ナレッジAPIのAPI認証(英語版)
    の仕様を元にして、下記のようなPythonのプログラムを実行してみます。

    import requests
    
    API_KEY = "シークレットキー"
    BASE_URL = "http://localhost/v1"url = f"{BASE_URL}/datasets"
    headers = {"Authorization": f"Bearer {API_KEY}"}BASE_URL = "http://localhost/v1"
    
    url = f"{BASE_URL}/datasets"
    headers = {"Authorization": f"Bearer {API_KEY}"}
    
    resp = requests.get(url, headers=headers)
    datasets = resp.json().get("data", [])
    
    # 見やすく整形して表示
    print(f"{'ID':36} | {'File Name'}")
    print("-" * 60)
    for ds in datasets:
    	dataset_id = ds.get("id")
    	file_name = ds.get("metadata", {}).get("file_name", ds.get("name"))
    	print(f"{dataset_id} | {file_name}")
    

    結果は下記のように出力されました。

    ID                                   | File Name
    ------------------------------------------------------------
    224785c5-6120-46b8-842f-f0caf3fdcc96 | 火星保険会社
    
  • ナレッジAPI経由でファイルの追加
    上記で得られたデータセットIDを用いて、下記のようなPythonのプログラムを実行してみます。
    前提として、実行するPythonのプログラムと同じ階層に、追加するファイル「火星保険会社_add01.pdf」を設置しておきます。
    ※データセットIDの「224785c5-6120-46b8-842f-f0caf3fdcc96」はサンプルですので、実際の値に読み替えてください。

    import requests
    
    API_KEY = "シークレットキー"
    BASE_URL = "http://localhost/v1"
    DATASET_ID = "224785c5-6120-46b8-842f-f0caf3fdcc96"
    
    headers = {"Authorization": f"Bearer {API_KEY}"}
    
    url = f"{BASE_URL}/datasets/{DATASET_ID}/document/create_by_file"
    
    files = {
        "file": ("火星保険会社_add01.pdf", open("火星保険会社_add01.pdf", "rb"), "application/pdf")
    }
    
    data = {
        "indexing_technique": "high_quality"  # or "economy"
    }
    
    resp = requests.post(url, headers=headers, files=files, data=data)
    print(resp.status_code, resp.json())
    

    下図のようにDifyのナレッジベースに反映されました。

    図. ナレッジAPI経由でファイルの追加
  • ナレッジAPI経由でファイルの削除
    ドキュメントの詳細画面のURLから、ドキュメントIDを確認します。

    図. ナレッジAPI経由でファイルの削除

    上記で得られたドキュメントIDを用いて、下記のようなPythonのプログラムを実行してみます。
    ※ドキュメントIDの「54c839fc-e8e4-4aad-bb4c-055f46dd09de」はサンプルですので、実際の値に読み替えてください。

    import requests
    
    API_KEY = "シークレットキー"
    BASE_URL = "http://localhost/v1"
    DATASET_ID = "224785c5-6120-46b8-842f-f0caf3fdcc96"
    DOCUMENT_ID = "54c839fc-e8e4-4aad-bb4c-055f46dd09de"  # 削除対象のドキュメントID
    
    headers = {"Authorization": f"Bearer " + API_KEY}
    
    url = f"{BASE_URL}/datasets/{DATASET_ID}/documents/{DOCUMENT_ID}"
    
    resp = requests.delete(url, headers=headers)
    
    print(resp.status_code)
    print(resp.text)
    

    実行の結果、Difyのナレッジベースから削除されました。
    チャットボットでナレッジベース参照時に削除分は参照されなくなりました。

2.WordPressからファイル操作

  • ローカルのDifyのアドレスを一時的に外部公開
    この例ではDifyがローカル環境の
    http://localhost/
    で、WordPressは外部のアドレス
    https://xxxxx.com/
    のため、WordPressからDifyのアドレスを参照できるようにするためにngrokのサービスを活用してみます。
    ngrokにサインインすると、下図のようにOSに沿ったインストール手順が示されます。

    図. ngrokのOSに沿ったインストール手順

    インストールが完了後、macOSの場合はターミナル(Windowsの場合はPowerShell)で下記のコマンドを実行します。

    ngrok http http://localhost

    成功すると、下図のように外部公開用のアドレスが発行されます。

    図. ngrokの実行結果
  • WordPressの管理機能を用意
    下記のような要件でWordPressの管理機能を用意します。

    設定:
    API_KEY / BASE_URL / DATASET_ID を保存
    ※BASE_URLはngrokによって発行された外部公開用のアドレスを設定
    ↓
    保存後に一覧表示一覧:
    GET /v1/datasets/{dataset_id}/documents
    結果をテーブル表示(Document ID / File Name / 削除ボタン)
    
    追加:
    POST /v1/datasets/{dataset_id}/document/create_by_file
    (WordPress HTTP API を経由せず、PHPの cURL で直接 multipart を送る)
    
    削除:
    DELETE /v1/datasets/{dataset_id}/documents/{document_id}
    成功コード 200/204 で削除完了
    
    図. WordPressの管理機能を用意
  • WordPress管理機能の動作確認
    ファイルの追加・削除を実行し、Difyのナレッジベースへの反映を確認します。
    当方の環境では動作できました。

    図. WordPress管理機能の動作確認
Categorys : 検証 | dify