Dify + FastAPIで“ユーザー任せ”のナレッジチャットを作る方法(OneDrive編)

前回

https://toriaezuugoku.com/dify-2/

前回はローカルファイルやファイルサーバーのExcelファイルでやりましたが、今回はOneDrive上のファイルで同じことをやる方法が分かったので、ご紹介です。

背景

企業内で「FAQチャット」や「ナレッジボット」を作りたいというニーズは多いですが、実際にはこんな課題が付きまといます。

  • Difyのナレッジ機能を使うには管理者権限が必要
  • ナレッジの更新をエンジニアや管理者が担うと負担が重い
  • 各部署ごとにチャット内容をカスタマイズしたい

このブログでは、Excelで作ったQ&Aをそのまま読み込み、各自が独自にチャットを持てる“ユーザー任せ”のナレッジチャットを構築する方法を紹介します。


🛠 環境・前提

  • OS:Windows 11
  • 言語:Python 3.10
  • LLMフロント:Dify1.3.0
  • バックエンド:FastAPI
  • ナレッジ管理:Ondrive上のExcelファイル
  • 組織のMicrosoft365を契約

📘 コンセプト

この仕組みでは、ナレッジの構成をユーザー自身に任せることで、運用のハードルを大きく下げることができます。

  • 各ユーザーがExcelで質問と回答を入力
  • 共有フォルダに配置(例:マイファイル/共有/協業テスト.xlsx
  • FastAPIがExcelを読み込んで、テキストをLLMに渡す。
  • Dify経由でチャットを開始

これにより、「管理者が全てのナレッジを登録・保守する必要がない」状態を作れます。


💬 Excelのフォーマット(例)

質問回答
勤怠の打刻忘れはどうすれば?勤怠システムから「修正申請」を行ってください。
出張精算はいつまでに?毎月5日までに申請してください。

🔧 FastAPI 側の実装

Excelを読み込み,そのまま返します。

必要なライブラリをインストールします。

pip install fastapi uvicorn requests configparser

フォルダ構成は以下のようになります。

your_project/
├── main.py           ← FastAPI本体
├── config.cfg        ← 認証情報

Microsoft 365のアプリケーションのクライアントID、クライアントシークレット、テナントIDが必要になります。システム管理者の方であれば「Microsoft Entra 管理センター」>アプリケーションから作成してください。
作成した情報をconfig.cfgに記載します。

[azure]
clientId = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
clientSecret = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
tenantId = yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy

main.pyは以下のようにしました。

api_download_excel内の”taro@example.com”はご自身のMicrosoft 365アカウントを入力してください。

from fastapi import FastAPI, HTTPException
from fastapi.responses import FileResponse
import requests
import configparser
import os

app = FastAPI()

# 認証情報読み込み
config = configparser.ConfigParser()
config.read("config.cfg")

client_id = config["azure"]["clientId"]
client_secret = config["azure"]["clientSecret"]
tenant_id = config["azure"]["tenantId"]

# アクセストークン取得関数
def get_token():
    url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token"
    payload = {
        "client_id": client_id,
        "client_secret": client_secret,
        "scope": "https://graph.microsoft.com/.default",
        "grant_type": "client_credentials"
    }

    response = requests.post(url, data=payload)
    if response.status_code != 200:
        raise Exception(f"Token Error: {response.text}")
    return response.json()["access_token"]

# OneDriveからExcelダウンロード
def download_excel(user_email: str, filename: str = "test.xlsx", save_as: str = "downloaded_test.xlsx"):
    token = get_token()
    headers = {
        "Authorization": f"Bearer {token}"
    }
    # アプリケーション権限なので「ユーザー指定」が必要
    file_url = f"https://graph.microsoft.com/v1.0/users/{user_email}/drive/root:/{filename}:/content"

    response = requests.get(file_url, headers=headers)
    if response.status_code != 200:
        raise Exception(f"Download Error: {response.text}")

    with open(save_as, "wb") as f:
        f.write(response.content)

    return save_as

# FastAPIルート
@app.get("/download_excel")
def api_download_excel(file_name: str = "test.xlsx"):
    try:
        saved_file = download_excel("taro@example.com", filename=file_name)
        return FileResponse(saved_file, media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', filename=file_name)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

FastAPIの起動は以下のコマンドでやりました。

uvicorn main:app --host 0.0.0.0 --port 8000 --reload
Python FastAPI本格入門

Python FastAPI本格入門

Amazonで詳細を見る

🤖 Dify 側との連携

Dify側で「チャットフロー」で新規作成
「HTTPリクエスト」ブロックと「テキスト抽出」ブロックを追加しただけのシンプルなフローです。

「HTTPリクエスト」ブロックには

API:GET http://[FastAPI立ち上げたPCのIPアドレス]:8000/download_excel?file_name=共有/協業テスト.xlsx

「テキスト抽出」ブロックには

入力変数:HTTPリクエスト files Array[file]

コーディング不要で毎日の仕事が5倍速くなる!Difyで作る生成AIアプリ完全入門

コーディング不要で毎日の仕事が5倍速くなる!Difyで作る生成AIアプリ完全入門

Amazonで詳細を見る

📚 運用イメージ

  • 解答を任せたいテーマごとにExcelファイルを作成・更新
  • ファイルを更新するだけでチャットが使える
  • 管理者はコードや設定変更をしなくていい

✅ メリットまとめ

項目内容
管理コスト各部署に分散。Excelだけでナレッジ登録が完結。
拡張性Excelを複製するだけで、複数チャットボットの展開が可能。
セキュリティ面ファイル共有で権限制御がしやすく、Difyの管理権限を渡さなくてよい。

📝 まとめ

Excel + FastAPI + Dify で「ユーザー任せのナレッジチャット」は簡単に構築できます。
管理者が手を出さずとも、現場主体で運用できるチャットボットを目指しましょう。

ソースコードが必要な方はnoteからご購入をお願いいたします。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA