すべてのプロダクト
Search
ドキュメントセンター

Container Compute Service:ACS で Dify を使用して AI Q&A アシスタントをカスタマイズする

最終更新日:Jun 12, 2025

Dify は、企業または個人のナレッジベースと大規模言語モデル(LLM)アプリケーションを統合できるプラットフォームです。 Dify を使用して AI Q&A ソリューションを設計し、ビジネスに適用できます。 さらに、ACS クラスターに AI Q&A サービスをデプロイして、ACS がビジネスの需要の増加に合わせてサービスを即座にスムーズにスケールアウトできるようにすることができます。

ソリューション概要

Dify を使用してカスタマイズされたサンプル AI アプリケーション

2024-08-21_16-01-26 (1)

サンプル AI Web アプリケーション

2024-08-23_14-14-02 (1)

AI Q&A アシスタントをカスタマイズするには、次の手順を実行します。

  1. ack-dify をインストールする: ACS クラスタを作成し、クラスタに ack-dify コンポーネントをインストールします。

  2. AI Q&A アシスタントを作成する: Dify にアクセスし、Web サイト用の AI Q&A アシスタントを作成します。

  3. AI Q&A アシスタントをカスタマイズする: 特定の分野に特化した質問に AI Q&A アシスタントが回答できるように、ナレッジベースを準備します。

Dify の紹介

Dify は、LLM アプリケーション開発のためのオープンソースプラットフォームです。 Dify は、Backend as a Service (BaaS) と LLM Operations LLMOps を組み合わせて、生成 AI アプリケーションの開発を効率化します。 Dify は、開発者と非技術系ユーザーの両方にとって、AI アプリケーションのオーケストレーションとデータ操作を容易にします。 Dify には、LLM アプリケーションの構築に必要な主要な技術スタックが事前に組み込まれています。 これにより、既存のソリューションやテクノロジーを再開発する必要がなくなり、ビジネスイノベーションと要件に集中できます。

次の図は、Dify のアーキテクチャを示しています。

Dify のアーキテクチャには、次の主要な部分が含まれています。

  1. LLM アプリケーションに必要な主要コンポーネント。 Dify は、LLM アプリケーションに必要な主要コンポーネントと統合されています。 これらの統合により、Dify はさまざまなモデルをサポートし、ユーザーフレンドリーなプロンプトオーケストレーションインターフェイス、高性能な Retrieval-Augmented Generation (RAG) システム、およびカスタマイズ可能なエージェントフレームワークを提供します。

  2. オーケストレーションと操作を視覚化する直感的なインターフェイス。 Dify は、視覚化されたプロンプトオーケストレーション、操作、および管理をサポートする直感的なインターフェイスを提供します。 これにより、AI アプリケーション開発が大幅に加速され、開発者は LLM を AI アプリケーションに迅速に統合し、アプリケーションを継続的に維持および最適化できます。

  3. すぐに使えるアプリケーションテンプレートとオーケストレーションフレームワークのセット。 Dify は、開発者が LLM を活用した生成 AI アプリケーションを迅速に開発するために使用できる、すぐに使えるアプリケーションテンプレートとオーケストレーションフレームワークを提供します。 さらに、Dify はオンデマンドでビジネスを即座にスムーズにスケーリングできます。

Dify は、生成 AI アプリケーションを開発およびデプロイするための包括的で柔軟性があり、使いやすいプラットフォームです。

1. ack-dify をインストールする

ACS クラスタを作成する手順に精通している場合は、次の手順に従ってクラスタを作成できます。

1.1 準備

  1. ACS クラスタを作成する (バージョン 1.26 以降)。

  2. クラスタの kubeconfig ファイルを取得し、kubectl を使用してクラスタに接続する

  3. 次の手順に従って、動的 NAS ボリュームを構成する

    1. StorageClass を作成します。

      クリックして関連操作を表示する

      1. nas-sc.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。 必要に応じて、テンプレートのパラメータを変更します。

        apiVersion: storage.k8s.io/v1
        kind: StorageClass
        metadata:
          name: alibabacloud-cnfs-nas
        mountOptions:
        - nolock,tcp,noresvport
        - vers=3
        parameters:
          volumeAs: filesystem
          fileSystemType: standard
          storageType: Performance
          regionId: cn-hangzhou
          zoneId: cn-hangzhou-g
          vpcId: "vpc-2ze2fxn6popm8c2mzm****"
          vSwitchId: "vsw-2zwdg25a2b4y5juy****"
          accessGroupName: DEFAULT_VPC_GROUP_NAME
          deleteVolume: "false"
        provisioner: nasplugin.csi.alibabacloud.com
        reclaimPolicy: Retain

        パラメータ

        説明

        volumeAs

        値を filesystem に設定します。これは、NAS ファイルシステムが自動的に作成されることを示します。 各 NAS ボリュームは、NAS ファイルシステムに対応しています。

        fileSystemType

        NAS ファイルシステムのタイプ。

        storageType

        NAS ファイルシステムのストレージタイプ。

        • 汎用 NAS ファイルシステムの有効な値:

          • Performance (デフォルト): パフォーマンス最適化

          • Capacity: 容量最適化

        • 超高速型 NAS ファイルシステムの有効な値:

          • standard (デフォルト): 標準

          • advanced: 高度

        regionId

        NAS ファイルシステムのリージョン ID。 リージョン ID は、ACS クラスタのリージョン ID と同じである必要があります。

        zoneId

        NAS ファイルシステムのゾーン ID。 ACS クラスタ内のポッドの vSwitch に基づいてゾーンを選択します。 NAS ファイルシステムが属するゾーンは、NAS ファイルシステムのストレージタイプに関連しています。 次のストレージタイプがさまざまなゾーンでサポートされています。

        説明

        NAS ファイルシステムは、同じ VPC 内のゾーンをまたいでマウントできます。 パフォーマンス向上のために、同じゾーンを選択することをお勧めします。

        vpcId, vSwitchId

        NAS ファイルシステムのマウントポイントが属する VPC と vSwitch の ID。 ACS クラスタ内のポッドの VPC と vSwitch の ID を指定します。

        accessGroupName

        NAS ファイルシステムのマウントポイントが属する権限グループ。 デフォルト値は DEFAULT_VPC_GROUP_NAME です。

        provisioner

        ドライバ。 値は nasplugin.csi.alibabacloud.com である必要があります。これは、Alibaba Cloud NAS Container Storage Interface (CSI) プラグインを示します。

        reclaimPolicy

        PV の再利用ポリシー。 値を Retain に設定します。これは、PV が削除された場合に NAS ファイルシステムとマウントポイントが保持されることを示します。

      2. StorageClass を作成します。

        kubectl create -f nas-sc.yaml
      3. StorageClass を表示します。

        kubectl get sc

        予想される出力:

        NAME                             PROVISIONER                       RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
        alibabacloud-cnfs-nas            nasplugin.csi.alibabacloud.com    Retain          Immediate              false                  13m
        ......
    2. PVC を作成します。

      クリックして関連操作を表示する

      1. nas-pvc-fs.yaml という名前の YAML ファイルを作成し、次の内容をファイルにコピーします。

        kind: PersistentVolumeClaim
        apiVersion: v1
        metadata:
          name: nas-pvc-fs
        spec:
          accessModes:
            - ReadWriteMany
          storageClassName: alibabacloud-cnfs-nas
          resources:
            requests:
              storage: 20Gi

        次の表は、パラメータについて説明しています。

        パラメータ

        説明

        accessModes

        アクセスモード。

        storage

        ポッドに割り当てられるストレージ容量。これは、作成する NAS ボリュームの容量です。

        説明

        超高速型 NAS ファイルシステムの最小容量は 100 GiB です。 StorageClass で超高速型 NAS ファイルシステムが定義されている場合、storage の値は 100 GiB 以上である必要があります。

        storageClassName

        PVC に関連付ける StorageClass の名前。

      2. PVC を作成します。

        kubectl create -f nas-pvc-fs.yaml
      3. PVC を表示します。

        kubectl get pvc

        次の出力が返された場合、PVC は PV にバインドされています。

        NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS            VOLUMEATTRIBUTESCLASS  AGE
        nas-pvc-fs   Bound    nas-04a730ba-010d-4fb1-9043-476d8c38****   20Gi       RWX            alibabacloud-cnfs-nas   <unset>                14s

1.2 ack-dify をインストールする

ACK クラスタに Dify をデプロイするには、次の手順を実行して ack-dify コンポーネントをインストールします。

  • ACS コンソール にログインし、左側のナビゲーションペインで [クラスタ] をクリックします。作成したクラスタの名前をクリックします。クラスタの詳細ページで、次の図の手順に従って ack-dify をインストールします。

    コンポーネントの [アプリケーション名][名前空間] を設定する必要はありません。 ⑥ [次へ] をクリックすると、[確認] ダイアログボックスが表示されます。 [はい] をクリックして、デフォルトのアプリケーション名 (ack-dify) と名前空間 (dify-system) を使用します。次に、[チャートバージョン] 1.1.5 を選択し、[OK] をクリックして ack-dify コンポーネントをインストールします。

    image

  • 1 分待って、ローカル環境で次のコマンドを実行します。 dify-system 名前空間のすべてのポッドが Running 状態の場合、ack-dify コンポーネントはインストールされています。

    kubectl get pod -n dify-system

    一部のポッドが Pending 状態の場合、ack-dify の依存 PVC が欠落している可能性があります。 準備 に従って、クラスタに対応する NAS StorageClass を作成します。 ポッドの問題のトラブルシューティング方法の詳細については、「ポッドの問題のトラブルシューティング」をご参照ください。

2. AI 搭載の Q&A アシスタントを作成する

2.1 Dify にアクセスする

  1. (オプション) インターネット経由で ack-dify へのアクセスを有効にします。

    • ROS の [ワンクリックデプロイ] を使用して ack-dify をインストールした場合は、この手順をスキップします。

    • ack-dify へのアクセスを手動でインターネット経由で有効にする場合。

      説明

      本番環境を使用する場合は、データセキュリティを確保するために [アクセス制御] を有効にすることをお勧めします。

      image

  2. ack-dify サービスを更新した後、[ネットワーク] > [サービス] > [ack-dify] を選択し、[dify-system] 名前空間を選択すると、[外部 IP] 列に IP アドレスが表示されます。 Dify にアクセスするには、ブラウザを使用して IP アドレスにアクセスします。

    image

  3. Dify アカウントを作成します。

    ack-dify サービスの [外部 IP アドレス] にアクセスします。 表示されるページで、画面の指示に従って [管理者アカウントを設定] し、メールアドレス、ユーザー名、パスワードを入力して Dify に登録します。

    image

2.2 AI 搭載の Q&A アシスタントを作成する

  1. ack-dify サービスの [外部 IP アドレス] とブラウザを使用して、Dify にログインします。

  2. AI モデルを追加し、モデルの API キーを設定します。 この例では、次の図に示すように、Tongyi Qianwen モデルが追加されています。

    Tongyi Qianwen は無料枠を提供しています。 無料枠を使い果たすと、消費したトークンに基づいて課金されます。 セルフマネージド LLM をデプロイするよりも、モデルプロバイダーからモデルサービスを購入する方が費用対効果が高くなります。

    1. API キーを取得するには、[ユーザー名] > [設定] > [モデルプロバイダー] > [TONGYI (設定)] > [AliCloud から API キーを取得] を選択します。

    2. 取得した API キーを次の図の入力ボックスに指定し、[保存] をクリックします。

    image

  3. 汎用 AI 搭載 Q&A アシスタントを作成します。

    [Studio] > [新規作成] を選択します。 アシスタントの [名前][説明] を指定します。 その他のパラメーターにはデフォルト設定を使用します。

    image

2.3 AI 搭載の Q&A アシスタントをテストする

Web ページに質問を入力して、アシスタントが回答を提供できるかどうかをテストできます。 次の図は例を示しています。 汎用アシスタントは単純な会話のみをサポートしており、「Dify とは何ですか?」などの難しい質問には回答できません。

image

3. AI 搭載 Q&A アシスタントをカスタマイズする

3.1 ナレッジベースを準備する

上記の手順を実行すると、AI 搭載 Q&A アシスタントが作成されます。「Dify とは何ですか?」などの質問に対してアシスタントが専門的な回答を提供するようにするには、関連するナレッジベースを準備し、アシスタントと統合する必要があります。

構成を簡素化するために、この例では という名前のコーパスファイルが提供されています。ナレッジベースを作成し、コーパスファイルをナレッジベースにアップロードするには、次の手順を実行します。

  1. をナレッジファイルにアップロードします。

    [ナレッジ] > [ナレッジの作成] > [ファイルからインポート] > [参照] > [次へ] を選択します。

    image

  2. [次へ] をクリックし、画面の指示に従って [テキストの前処理とクリーニング] ページのパラメーターを構成します。

    デフォルト設定を使用できます。ナレッジベースは自動的にコーパスをクリーニングし、コーパスのテキストをチャンク化し、コーパスのインデックスを作成します。これにより、アシスタントは回答を生成するときにナレッジベースを簡単に検索できます。

Dify ナレッジベースを準備する手順を表示するには、上記のコーパスファイルを .md ファイルに変換する方法を表示をクリックします。

Dify ナレッジベースを準備する手順を表示

Dify ナレッジベースを準備します。 Dify では、txt、html、.md、pdf 形式の個々のファイルをアップロードできます。

アシスタントのトレーニングを開始する前に、ナレッジベースが準備されていることを確認してください。コーディングを開始する前は、すべてのコーパスファイルは Git リポジトリ内の .md ファイルです。リポジトリから .md ファイルをプルし、1 つのファイルにマージする必要があります。次の手順を実行します。

  1. Git リポジトリのクローンを作成します。 git clone コマンドを実行して、Dify Git リポジトリ をオンプレミス マシンにクローンします。

    git clone https://github.com/langgenius/dify-docs.git
  2. コーパスファイルを処理します。コーパスのテキスト ベクトル化を可能にするには、次の Python コードを使用して、Git リポジトリ内の .md ファイルをマージできます。

    from langchain_text_splitters import MarkdownHeaderTextSplitter, RecursiveCharacterTextSplitter
    import os
    
    
    def merge_markdown_files_from_directory(root_dir, output_file):
        """
        merge_markdown_files_from_directory 関数
          1. 説明:指定されたディレクトリにあるすべての .md ファイルを 1 つの出力ファイルにマージします。
          2. パラメーター:
            root_dir:ルートディレクトリ。
            output_file:出力ファイルのディレクトリ。
          3. 手順:
            os.walk() メソッドを使用して、ルートディレクトリとそのサブディレクトリを走査します。
            ファイルの接尾辞が .md の場合、ファイルのパスを markdown_files リストに追加します。
            出力ファイルを開き、markdown_files リストの各ファイルからデータを読み取り、出力ファイルにデータを書き込みます。
        """
        markdown_files = []
        for root, dirs, files in os.walk(root_dir):
            for file in files:
                if file.endswith('.md'):
                    markdown_files.append(os.path.join(root, file))
    
        with open(output_file, 'w', encoding='utf-8') as outfile:
            for file_path in markdown_files:
                with open(file_path, 'r', encoding='utf-8') as infile:
                    outfile.write(infile.read())
                    # outfile.write('\n\n')
    
                   
    def process_and_write_markdown(file_path: str, headers_to_split_on: list, chunk_size: int, chunk_overlap: int, output_file: str):
        """
        process_and_write_markdown 関数
          1. 説明:
            指定されたヘッダーとチャンク規則に基づいて .md ファイルのテキストをチャンクし、チャンクされたテキストを出力ファイルに書き込みます。
          2. パラメーター:
            file_path:.md ファイルのパス。
            headers_to_split_on:ヘッダーを含むタプル。例: [("#", "Header 1"), ("##", "Header 2")]。
            chunk_size:チャンクの最大サイズ。
            chunk_overlap:2 つの連続するチャンク間の重複部分のサイズ。
            output_file:出力ファイルのディレクトリ。
          3. 手順:
            file_path パラメーターで指定されたパスの .md ファイルからデータを読み取ります。
            headers_to_split_on タプルに基づいて .md ファイルのテキストをチャンクする MarkdownHeaderTextSplitter を作成します。
            chunk_size パラメーターと chunk_overlap パラメーターに基づいてテキストをさらにチャンクする RecursiveCharacterTextSplitter を作成します。
            出力ファイルを開き、チャンクのメタデータと内容を出力ファイルに書き込みます。
        """
        try:
            # file_path パラメーターで指定されたパスの .md ファイルからデータを読み取ります。
            with open(file_path, "r", encoding="utf-8") as doc:
                markdown_content = doc.read()
    
            # headers_to_split_on タプルに基づいて .md ファイルのテキストをチャンクする MarkdownHeaderTextSplitter を作成します。
            splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on, strip_headers=True)
            md_splits = splitter.split_text(markdown_content)
    
            # chunk_size パラメーターと chunk_overlap パラメーターに基づいてテキストをさらにチャンクする RecursiveCharacterTextSplitter を作成します。
            text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
            splits = text_splitter.split_documents(md_splits)
    
            # 出力ファイルを開き、チャンクのメタデータと内容を出力ファイルに書き込みます。
            with open(output_file, "w") as f:
                for line in splits:
                    f.write(str(line.metadata))
                    f.write("\n")
                    f.write(line.page_content)
                    f.write("\n\n\n\n")
    
        except FileNotFoundError:
            raise FileNotFoundError(f"The file {file_path} does not exist.")
    
    
    # 例:
    if __name__ == "__main__":
        """
         1. 次のパラメーターを設定します。
          root_directory:ルートディレクトリ。
          merged_file_path:マージされたコンテンツを含む .md ファイルのパス。
          output_file:出力ファイルのパス。
          headers_to_split_on:ヘッダーのリスト。
          chunk_size と chunk_overlap:チャンクサイズと、2 つの連続するチャンク間の重複部分のサイズ。
        2. 手順:
          merge_markdown_files_from_directory 関数を呼び出して、すべての .md ファイルを merged_file_path パラメーターで指定されたパスの 1 つの .md ファイルにマージします。
          process_and_write_markdown 関数を呼び出して、マージされたコンテンツを含むファイルを処理し、ファイルのデータを出力ファイルに書き込みます。
          スクリプトは上記の手順を実行して、複数の .md ファイルをマージし、ファイルの内容を処理し、マージされたコンテンツを出力ファイルにエクスポートします。
        """
        
        # 処理対象のディレクトリ。
        root_directory = 'path/to/dify-docs/en'
        # マージされたコンテンツを含むファイルのパス。
        merged_file_path = './merged_markdown.md'
        # データクリーニング後の出力ファイルのパス。
        output_file = './dify_doc.md'
        
        merge_markdown_files_from_directory(root_directory, merged_file_path)
        headers_to_split_on = [
            ("#", "Header 1"),
            ("##", "Header 2"),
            ("###", "Header 3"),
        ]
        chunk_size = 500
        chunk_overlap = 50
        process_and_write_markdown(merged_file_path, headers_to_split_on, chunk_size, chunk_overlap, output_file)
    
  3. dify_doc.md コーパスファイルをナレッジベースにアップロードします。

3.2 AI 搭載 Q&A アシスタントを調整および公開する

アシスタントのプロンプトを構成し、ナレッジベースをコンテキストとして構成します。

  1. プロンプトを構成する:次のコンテンツを [指示] テキストエディターにコピーします。プロンプトは、アシスタントが回答を生成する際の指示と制約を提供します。プロンプトは、アシスタントが提供する回答の精度を向上させるのに役立ちます。

    You will act as Dify's AI assistant, dedicated to answering customers' questions about Dify products and their features. Your responses should be based on the existing knowledge base to ensure accuracy. If a question is beyond your knowledge, please honestly inform them that you do not know the answer, to maintain the integrity of the information. Please communicate in a friendly and warm tone, and feel free to use emoticons appropriately to enhance the interactive experience.
  2. ナレッジベースをコンテキストとして構成する:[コンテキスト] パラメーターで [追加] をクリックします。作成したナレッジベースを選択し、[追加] をクリックします。これにより、アシスタントはナレッジベースに基づいて質問に答えることができます。

  3. ページの右上隅で、[公開] > [更新] を選択して構成を保存し、構成を有効にします。

次の図は例を示しています。

image

3.3 アシスタントをテストする

ナレッジベースをアシスタントに統合すると、アシスタントはより専門的で正確な回答を提供できます。image

結論

次の表に、Dify が個人開発者と企業に提供する主要な機能を示します。

主要機能

説明

LLMOps の包括的なサポート

Dify は、既存の AI アプリケーションに対して包括的な O&M 機能を提供します。たとえば、Dify はログとメトリックに基づくリアルタイムモニタリングをサポートし、本番データとユーザーフィードバックに基づいてプロンプト、データセット、およびモデルの継続的な最適化を提供します。

RAG エンジン

Dify は、ドキュメントのインポートや情報検索など、データ操作を実行するためのエンドツーエンドの RAG パイプラインを提供します。RAG パイプラインはデータの準備を簡素化し、pdf や ppt などの一般的なファイル形式を直接処理できます。

エージェント

Dify を使用すると、開発者は LLM の関数呼び出しまたは ReAct パラダイムに基づいてエージェントを定義できます。エージェントには、組み込みツールまたはカスタムツールを追加できます。Dify は 50 以上の組み込みツールを提供しています。

ワークフローオーケストレーション

Dify は、開発者がさまざまなコンポーネントをドラッグアンドドロップして接続し、複雑な AI ワークフローを迅速に構築できる視覚化されたキャンバスを提供します。この方法では複雑なコーディングは必要なく、アプリケーション開発を開発者にとって簡単かつ直感的に行うことができます。

可観測性

Dify は、ダッシュボードを通じて LLM アプリケーションの品質とコストを追跡し、評価を提供します。これらの機能を使用して、LLM アプリケーションを監視できます。

エンタープライズ機能 (SSO/アクセス制御)

Dify は、企業や組織のデータ漏洩とデータ破損のリスクを軽減し、データセキュリティとサービス継続性を確保するのに役立ちます。

本番環境に Q&A アシスタントをデプロイする

AI 搭載の Q&A アシスタントを企業または個人開発者の本番環境に適用するには、次の方法を使用します。

  1. Web サイトを使用してアシスタントを公開します。

    Dify を使用して AI アプリケーションを作成した後、インターネット経由でアクセスできる Web アプリケーションを使用してアプリケーションを公開できます。アプリケーションは、オーケストレーションしたプロンプトと構成に基づいて動作します。詳細については、「シングルページ Web アプリとして公開する」をご参照ください。

  2. Dify API へのアクセスを公開します。

    Dify は、BaaS の概念に準拠した API を提供しています。開発者は、複雑なバックエンドアーキテクチャとデプロイメントプロセスに焦点を当てることなく、フロントエンドから直接 LLM の強力な機能を使用できます。詳細については、「API を使用した開発」をご参照ください。

  3. フロントエンドコンポーネントに基づいてカスタム開発を実行します。

    新しい製品をゼロから開発する場合、または製品プロトタイプの設計段階にある場合は、Dify を使用して AI サイトを迅速に立ち上げることができます。詳細については、「フロントエンドテンプレートに基づいて再開発する」をご参照ください。

  4. AI アプリケーションを企業または個人開発者の Web サイトに埋め込みます

    Dify を使用すると、AI アプリケーションを Web サイトに埋め込むことができます。企業の公式 Web サイトに AI カスタマーサービスチャットボットと Q&A チャットボットを数分で構築して埋め込むことができます。詳細については、「Web サイトへの埋め込み」をご参照ください。