前回
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本格入門
Amazonで詳細を見る🤖 Dify 側との連携
Dify側で「チャットフロー」で新規作成
「HTTPリクエスト」ブロックと「テキスト抽出」ブロックを追加しただけのシンプルなフローです。
「HTTPリクエスト」ブロックには
API:GET http://[FastAPI立ち上げたPCのIPアドレス]:8000/download_excel?file_name=共有/協業テスト.xlsx
「テキスト抽出」ブロックには
入力変数:HTTPリクエスト files Array[file]

コーディング不要で毎日の仕事が5倍速くなる!Difyで作る生成AIアプリ完全入門
Amazonで詳細を見る📚 運用イメージ
- 解答を任せたいテーマごとにExcelファイルを作成・更新
- ファイルを更新するだけでチャットが使える
- 管理者はコードや設定変更をしなくていい
✅ メリットまとめ
項目 | 内容 |
---|---|
管理コスト | 各部署に分散。Excelだけでナレッジ登録が完結。 |
拡張性 | Excelを複製するだけで、複数チャットボットの展開が可能。 |
セキュリティ面 | ファイル共有で権限制御がしやすく、Difyの管理権限を渡さなくてよい。 |
📝 まとめ
Excel + FastAPI + Dify で「ユーザー任せのナレッジチャット」は簡単に構築できます。
管理者が手を出さずとも、現場主体で運用できるチャットボットを目指しましょう。
ソースコードが必要な方はnoteからご購入をお願いいたします。