【初心者向け】DifyのAPI+Streamlitで作成するネガポジ判定アプリ〜ログイン認証付きアプリの作成〜

運営会社:合同会社サステックス


元Microsoftエンジニアが立ち上げたAI・システム開発に特化したテクノロジーカンパニー。
機械学習や生成AIを活用したPoC開発や業務効率化、プロダクト構築を支援。
累計200件以上のAI開発・技術支援の実績があり、伴走型支援が強み。

この記事は約9分で読めます。

サステックスのバックエンドエンジニアの鈴木です。
本記事では「Dify で作成したネガポジ判定のAPI」を Streamlit に組み込み、商品レビューに対する感情分析(ポジティブ/ネガティブ判定)を行うアプリ作成の手順を、初心者向けに分かりやすくご紹介します。今回は、Basic認証を組み合わせて「ログイン必須」のWebアプリに仕上げます。実装コードも併せて紹介しますので、ぜひDifyのAPIを活用したアプリ開発の参考にしていただけると幸いです。


目次

1. Dify とは?

Dify は、ChatGPTを含む大規模言語モデル(LLM)を活用したアプリをノーコードで素早く作成できる開発プラットフォームです。 本記事では、このDifyを用いて作成したネガポジ(ポジティブ/ネガティブ)判定ができるワークフローをAPI化し、この取得したAPIをStreamlit 内に埋め込んで使用する方法について詳しく解説していきます。


2. このアプリで実現する機能

  • Basic認証(ログイン)を組み込み、アプリにアクセスできるユーザーを制限する。
  • 商品レビューを入力すると、Dify の ワークフローで「ポジティブ/ネガティブ」を判定し、その結果をアプリ上で表示させる。
  • チャット履歴を画面に保持し、過去のやり取りを確認できるようにする。
  • ログアウト機能を実装し、ログイン後に明示的にログアウトできるようにする。

3. 環境準備と前提条件

Python をインストールする

仮想環境を作成する

python -m venv venv

仮想環境を有効化する

source ./venv/bin/activate

Streamlit ライブラリ、 streamlit-authenticator ライブラリ、requestsライブラリをインストールする。

pip install streamlit streamlit-authenticator requests

Dify で組んだネガポジに関するチャットフローをAPI化

  • Dify の管理画面からチャットフローを選択
  • systemプロンプトの設定
  • userプロンプトの設定
  • APIキーの発行(APIリファレンスにアクセス)
  • 「APIキー」をクリックし、表示されるキーをコピーしておく。
  • requirements.txt に依存関係を記載する。

※ 以下のコマンドで、requirements.txtを作成できます。

pip freeze > requirements.txt

4. Streamlit アプリの実装

以下がサンプルコードになります。

import streamlit as st
import streamlit_authenticator as stauth
import requests
import json

# ----- Basic認証の設定 -----
# ユーザーの情報を credentials 辞書で定義。
# ここで "email" キーが無いとエラーになるバージョンもあるので、事前に用意。

credentials = {
    "usernames": {
        "demo": {
            "name": "Demo User",
            "password": "demo",  # 本番ではハッシュ化されたパスワードを推奨
            "email": "demo@example.com",
        }
    }
}

# Authenticator オブジェクトを作成
authenticator = stauth.Authenticate(
    credentials,
    "test_cookie",  # クッキー名
    "abcdef",       # クッキー署名キー(十分に長くランダムな文字列を推奨)
    cookie_expiry_days=30,
)

# ログインフォームをメイン画面に表示
authenticator.login(
    location="main",
    fields={"Form name": "ログイン"}  # ログインフォームの見出しを日本語に変更
)

# ログイン状態を session_state から取得
authentication_status = st.session_state.get("authentication_status", None)
name = st.session_state.get("name", None)
username = st.session_state.get("username", None)

# ログイン結果に応じて分岐
if authentication_status is True:
    st.success(f"ようこそ、{name}さん!")
    # ----- ここからチャットボットのUI -----
    st.title("商品レビュー感情分析チャットボット")
    
    # セッションステートにチャット履歴を保存
    if "chat_history" not in st.session_state:
        st.session_state.chat_history = []
    
    # 商品レビュー入力欄
    user_review = st.text_input("商品レビューを入力してください:")
    
    # 送信ボタン
    if st.button("送信"):
        if user_review.strip() == "":
            st.warning("レビューを入力してください。")
        else:
            # ユーザーの発言をチャット履歴に追加
            st.session_state.chat_history.append(
                {"sender": "user", "message": user_review}
            )
            
            # Dify の APIエンドポイント
            api_url = "https://api.dify.ai/v1/chat-messages"
            
            # API に送るペイロード
            payload = {
                "query": user_review,
                "inputs": {},
                "response_mode": "blocking",
                "user": "your_unique_user_id",
                "conversation_id": "",
            }
            
            # API キーの指定
            headers = {
                "Content-Type": "application/json",
                "Authorization": "Bearer {ここにDifyのAPIキーを入力}",
            }
            
            # API を呼び出し → レスポンス解析
            try:
                response = requests.post(
                    api_url, data=json.dumps(payload), headers=headers
                )
                response.raise_for_status()
                data = response.json()
                
                # 取得した判定結果をチャット履歴に追加
                bot_message = f"判定: {data.get('answer', '判定結果なし')}"
                st.session_state.chat_history.append(
                    {"sender": "bot", "message": bot_message}
                )
            except Exception as e:
                # エラーの場合もチャット履歴に追加
                error_msg = f"エラーが発生しました: {e}"
                st.session_state.chat_history.append(
                    {"sender": "bot", "message": error_msg}
                )
    
    # チャット履歴の表示
    st.markdown("### チャット履歴")
    for chat in st.session_state.chat_history:
        if chat["sender"] == "user":
            st.markdown(f"あなた: {chat['message']}")
        else:
            st.markdown(f"ボット: {chat['message']}")
    
    # ログアウトボタン
    authenticator.logout("ログアウト", "main")

elif authentication_status is False:
    st.error("ユーザー名またはパスワードが正しくありません")
else:
    st.warning("ログインしてください")

5. Dify の API を呼び出す

Dify では、構築したチャットフロー(例えば「文章がポジティブ or ネガティブかを判定するプロンプトを設定したAIチャット」)をAPI で呼び出すことができます。

  • 「API Key」を取得 → 今回のコード内の Authorization: Bearer <API Key> の部分に埋め込む
  • リクエストボディ query に、判定対象となるテキストを送信
  • レスポンスボディの “answer” が AI の返答として返されます。

これにより、テキストを送るたびに AI がネガポジ判定し、結果を返してくれます。


6. 実行手順

  1. 上記コードを app.py ファイルに保存

ターミナル(またはコマンドプロンプト) でアプリを起動

streamlit run app.py
  1. ブラウザが自動で開き、ログイン画面が表示される
    • ユーザー名:demo
    • パスワード:demo
  2. ログインに成功すると「商品レビュー感情分析チャットボット」の画面に移る
    • テキストボックスに商品レビューを入力 → 「送信」 ボタンを押すと Dify API に送られ、判定結果が表示されます。

7. まとめ

この記事では、Dify の APIStreamlit に組み込み、Basic認証付きのネガポジ判定アプリを実装する方法を解説しました。

  • streamlit_authenticator で手軽にログイン機能を追加
  • requests を用いて、Dify API を呼び出すだけで 感情分析(ネガポジ判定) が可能

Streamlit はデータサイエンスや機械学習のアプリを手早く可視化するための便利なUIフレームワークです。今回のように外部のAIサービス(Dify) と簡単に連携し、ユーザーログインも含めたアプリを構築できます。興味がある方は、是非色々なアプリをStreamlitを使って作成してみてください。


「AI活用したいけど、どこに頼めばいいか分からない…」とお悩みの方へ。
サステックスは、AI歴10年以上の元Microsoftエンジニアが率いる開発チームです。
PoC〜開発運用まで、ビジネスと技術の両面で支援します。まずは無料で相談してみませんか?

目次