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

Container Compute Service:ACK 上での Dify AI Q&A アシスタントの構築

最終更新日:Jun 22, 2026

Dify を使用すると、企業または個人のナレッジベースを大規模言語モデル (LLM) アプリケーションに統合し、高度にカスタマイズされた AI Q&A ソリューションを構築できます。これらのソリューションをビジネスに統合することで、研究開発および管理の効率を向上させることができます。さらに、Container Compute Service (ACS) クラスターに Dify をデプロイすると、変動するビジネス要求に対応するシームレスなスケーリングを実現し、ビジネスの成長を加速できます。

ソリューション概要

Dify カスタム AI アプリケーションの例

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

Web 統合 AI アプリケーションの例

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

専用の AI Q&A アシスタントを、3 つのステップでセットアップします。

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

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

  3. AI Q&A アシスタントのカスタマイズ:専用のナレッジベースを用意し、これまで正確に回答できなかった質問にも AI アシスタントが回答できるようにします。これにより、専門的な問い合わせをより効果的に処理できます。

Dify の概要

Dify は、Backend as a Service (BaaS) と LLMOps を組み合わせた、オープンソースの大規模言語モデル (LLM) アプリケーション開発プラットフォームです。開発者だけでなく非技術者も、コアコンポーネントを一から作り直すことなく、プロダクショングレードの生成 AI アプリケーションを構築できます。

Dify のアーキテクチャの主要コンポーネント:

  1. コアテクノロジーコンポーネント: Dify は、多数のモデルとの互換性、ユーザーフレンドリーなプロンプト設計インターフェイス、高性能な検索拡張生成 (RAG) システム、カスタマイズ可能なエージェントアーキテクチャなど、LLM アプリケーションの作成に必要な主要コンポーネントを統合しています。

  2. ビジュアルオーケストレーションと運用: Dify の直感的なインターフェイスは、プロンプトのビジュアルオーケストレーション、運用ワークフローの効率化、データセットの効率的な管理を可能にします。これにより、AI アプリケーション開発プロセスが大幅に加速し、開発者は迅速にデプロイできるほか、既存システムへの LLM の統合も行えます。また、継続的な運用最適化もサポートします。

  3. アプリケーションテンプレートとオーケストレーションフレームワーク: Dify は、すぐに使えるアプリケーションテンプレートとオーケストレーションフレームワークを開発者に提供し、大規模言語モデルに基づく生成 AI アプリケーションを迅速に開発できるようにします。また、変化するビジネスニーズに対応するための即時かつスムーズなスケーリングをサポートし、ビジネスの成長を促進します。

これらのコンポーネントは、生成 AI アプリケーションを迅速に開発してデプロイするための包括的なプラットフォームを提供します。

1. ack-dify コンポーネントのインストール

Container Compute Service (ACS) クラスターの作成に既に精通している場合、ビジネスニーズに適したクラスターの作成に進むことができます。

1.1 前提条件

  1. バージョン 1.26 以降の ACS クラスター

  2. クラスターの kubeconfig ファイルと kubectl 接続

  3. 動的 NAS ボリュームの設定手順に従います。

    1. StorageClass を作成します。

      手順

      1. パラメータの説明に基づいて以下の YAML を変更し、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 ボリュームは 1 つの NAS ファイルシステムに対応します。

        fileSystemType

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

        • standard:汎用 NAS。詳細については、「汎用 NAS」をご参照ください。

        • extreme:Extreme NAS。詳細については、「Extreme NAS」をご参照ください。

        storageType

        NAS ファイルシステムのストレージ仕様。

        • 汎用 NAS の場合、有効な値は次のとおりです。

          • Performance (デフォルト):パフォーマンスタイプ。

          • Capacity:容量タイプ。

        • Extreme NAS の場合、有効な値は次のとおりです。

          • standard (デフォルト):標準タイプ。

          • advanced:高度タイプ。

        regionId

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

        zoneId

        NAS ファイルシステムが配置されるゾーン。ACS クラスター内の Pod が使用する vSwitch に基づいてゾーンを選択します。NAS ファイルシステムのゾーンは、そのストレージ仕様によって異なります。

        説明

        NAS ファイルシステムは同じ VPC 内のゾーン間でマウントできますが、パフォーマンス向上のため同じゾーンを使用することを推奨します。

        vpcIdvSwitchId

        NAS ファイルシステムのマウントターゲット用の VPC と vSwitch の ID。マウントターゲットは、クラスターの Pod と同じ VPC および vSwitch を使用する必要があります。

        accessGroupName

        NAS ファイルシステムのマウントターゲットの権限グループ。デフォルト値は DEFAULT_VPC_GROUP_NAME です。

        provisioner

        プロビジョナーのタイプ。値は nasplugin.csi.alibabacloud.com である必要があります。これは、Alibaba Cloud NAS 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                  13 m
        ......
    2. PersistentVolumeClaim (PVC) を作成します。

      手順

      1. 以下の YAML コンテンツを nas-pvc-fs.yaml として保存します。

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

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

        パラメータ

        説明

        accessModes

        アクセスモード。

        storage

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

        説明

        Extreme NAS ファイルシステムの最小容量は 100 GiB です。StorageClass で定義された NAS ファイルシステムのタイプが Extreme NAS の場合、storage の値は 100 GiB 以上である必要があります。そうでない場合、対応する PV を作成できません。

        storageClassName

        バインドする 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****   20 Gi      RWX            alibabacloud-cnfs-nas   <unset>                14 s

1.2 コンポーネントのデプロイ

Dify サービス用に、クラスターに ack-dify コンポーネントをデプロイしてください。

  • Container Compute Service (ACS) コンソールにログオンし、左側のナビゲーションペインからクラスターリストを選択します。対象のクラスターの名前をクリックして詳細ページに移動します。

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

    「クラスター詳細」ページの左側のナビゲーションバーで、[アプリケーション] > [Helm] をクリックします。「Helm」ページで、[作成] ボタンをクリックします。「作成」パネルの「アプリケーションシナリオ」タブで、[AIGC/LLM] を選択し、次に [ack-dify] チャートを選択します。

  • 約 1 分待ってから、次のコマンドを実行します。dify-system 名前空間内のすべての Pod が Running 状態になったら、ack-dify コンポーネントがインストールされています。

    kubectl get pod -n dify-system

    Pod が Pending 状態にある場合、クラスターに ack-dify に必要な PVC 依存関係が不足している可能性があります。この場合は、「前提条件」の説明に従って、クラスター用の NAS StorageClass を作成してください。Pod の例外のトラブルシューティング方法の詳細については、「Pod の例外のトラブルシューティング」をご参照ください。

2. AI Q&A アシスタントの追加

2.1 Dify Service へのアクセス

  1. ack-dify Service のパブリックアクセスを有効にします。

    説明

    パブリックアクセスはデモ用です。本番環境でデータセキュリティを確保するには、[アクセス制御] 機能を有効にしてください。

    image

  2. 設定後、[Network] > [Services] > [ack-dify] を選択し、名前空間を dify-system に設定します。ack-dify Service の [外部 IP アドレス (External IP)] が表示されます。この IP をブラウザで開き、Dify にアクセスします。

    image

  3. アカウントを登録します。

    [外部 IP アドレス (External IP)] にアクセスし、画面の案内に従って 管理者アカウント (メールアドレス、ユーザー名、パスワード) を作成します。

    image

2.2 AI Q&A アシスタントの作成

  1. ブラウザに [外部 IP アドレス (External IP)] を入力し、Dify プラットフォームにログインします。

  2. AI モデル (この例では Qwen) を追加し、Alibaba Cloud の API キーを設定します。次の図を参照してください:

    Qwen の無料クォータを使い切ると、トークン使用量に基づいて課金されます。これは、モデルのセルフホスティングと比べて初期費用を抑えられます。

    1. API キーの取得:ユーザー名 > 設定 > [Model Provider] を選択し、[Qwen] プラグインをインストールして設定してから、[Get API Key From Alibaba Cloud] を選択します。

    2. API キーを入力し、保存 をクリックします。

    image

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

    [Studio] > [Create from Blank] を選択し、アシスタントの 名前[Description] を入力します。その他のパラメーターはデフォルトのままにします。

    image

2.3 AI Q&A アシスタントの検証

質問を入力してアシスタントをテストします。汎用チャットボットは簡単な会話には対応できますが、現時点では Dify 固有の質問には回答できません。

image

3. AI アシスタントのカスタマイズ

3.1 ナレッジベースの作成

Dify 関連の技術的な質問に正確に回答するために、アシスタント専用のナレッジベースを構成します。

この例では、コーパスファイル dify_doc.md を使用します。以下の手順でナレッジベースを作成してアップロードします。

  1. 準備したコーパスファイル dify_doc.md をナレッジベースにアップロードします。

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

    image

  2. 次へ をクリックします。テキストセグメンテーションとクリーニングを実行し、保存します。

    デフォルト設定のままにします。ナレッジベースは、ドキュメントを自動的にクリーニング、セグメント化し、取得のためにインデックスを作成します。

上記のコーパスファイルが単一の .md ファイルにどのように整理されているかを確認するには、以下の折りたたみセクションを展開して詳細をご覧ください。

カスタムナレッジベースの準備

専用の Dify ナレッジベースを準備します。Dify は現在、TXT、HTML、Markdown、PDF 形式の単一ファイルのアップロードをサポートしています。

トレーニングを開始する前に、ナレッジベースを準備する必要があります。以前のすべての CODING ドキュメントは Markdown を使用して Git リポジトリで管理されていたため、ドキュメントをローカルにプルし、一連の .md ファイルを単一のファイルにマージするだけです。以下に参考例を示します。

  1. コードリポジトリのクローンを作成します。Git コマンドを使用して、対応する Dify コードリポジトリをクローンします。

    git clone https://github.com/langgenius/dify-docs.git
  2. コーパスの整理。後で行うコーパスのベクトル化を容易にするため、以下の Python コードを使用して、Dify コードリポジトリ内の .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 ファイルの内容を出力ファイルにマージします。
          2. パラメータ:
            root_dir: 指定されたルートディレクトリのパス。
            output_file: 出力ファイルのパス。
          3. 実装:
            os.walk を使用して root_dir ディレクトリとそのサブディレクトリをトラバースします。
            各ファイルが .md で終わるかどうかをチェックします。該当する場合、そのパスを markdown_files リストに追加します。
            output_file を書き込みモードで開き、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. 機能:
            単一の Markdown ファイルの内容を処理し、指定されたヘッダーとチャンキングルールに基づいてテキストを分割し、結果を新しいファイルに書き込みます。
          2. パラメータ:
            file_path: 入力 Markdown ファイルのパス。
            headers_to_split_on: ヘッダーレベルを定義するタプルのリスト。例: [("#", "Header 1"), ("##", "Header 2")]。
            chunk_size: 各テキストチャンクの最大長。
            chunk_overlap: テキストチャンク間のオーバーラップ長。
            output_file: 出力ファイルのパス。
          3. 実装:
            file_path から Markdown ファイルの内容を読み取ります。
            MarkdownHeaderTextSplitter オブジェクトを作成して、headers_to_split_on に基づいて内容を分割します。
            RecursiveCharacterTextSplitter オブジェクトを作成して、chunk_size と chunk_overlap に基づいてテキストをさらに分割します。
            output_file を開き、分割された各チャンクのメタデータと内容をファイルに書き込みます。
        """
        try:
            # file_path から Markdown ファイルの内容を読み取ります。
            with open(file_path, "r", encoding="utf-8") as doc:
                markdown_content = doc.read()
    
            # MarkdownHeaderTextSplitter オブジェクトを作成して、headers_to_split_on に基づいて内容を分割します。
            splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on, strip_headers=True)
            md_splits = splitter.split_text(markdown_content)
    
            # RecursiveCharacterTextSplitter オブジェクトを作成して、chunk_size と chunk_overlap に基づいてテキストをさらに分割します。
            text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
            splits = text_splitter.split_documents(md_splits)
    
            # output_file を開き、分割された各テキストチャンクのメタデータと内容をファイルに書き込みます。
            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: マージされた Markdown ファイルのパス。
          output_file: 最終的に処理された出力ファイルのパス。
          headers_to_split_on: ヘッダーレベルのリスト。
          chunk_size と chunk_overlap: テキストチャンクのサイズとオーバーラップ長。
        2. 実行ステップ:
          merge_markdown_files_from_directory を呼び出して、すべての .md ファイルを merged_file_path にマージします。
          process_and_write_markdown を呼び出して、マージされたファイルを処理し、結果を output_file に書き込みます。
          以上の手順により、複数の Markdown ファイルのマージから最終的な処理、出力までの一連のスクリプト処理が完了します。
        """
        
        # 処理するフォルダのパス
        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 アシスタントのオーケストレーションと公開

プロンプトを設定し、アシスタントのコンテキストにナレッジベースを追加します。

  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, in order 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 結果の検証

専用のナレッジベースにより、AI アシスタントは汎用チャットボットよりも正確でドメイン固有の回答を提供します。image

まとめ

Dify のコア機能:

機能

説明

包括的な LLMOps

アプリケーションのログとメトリクスをリアルタイムでモニタリングし、本番データに基づいてプロンプト、データセット、モデルを継続的に最適化します。

RAG エンジン

ドキュメントの取り込みから検索までのエンドツーエンドの RAG パイプライン。PDF や PPT などの一般的なフォーマットを直接処理します。

エージェント

LLM の関数呼び出しまたは ReAct パラダイムを使用してエージェントを定義し、50 以上の組み込みツールとカスタムツールをサポートします。

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

コンポーネントをドラッグアンドドロップで接続して AI ワークフローを構築するためのビジュアルキャンバスで、コーディングは最小限で済みます。

可観測性

監視ダッシュボードを通じて LLM アプリケーションの品質とコストを追跡および評価します。

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

組織は、情報漏洩やデータ破損のリスクを軽減し、情報セキュリティとビジネスの継続性を確保できます。

本番環境に適用

AI Q&A アシスタントを本番環境にデプロイするための 4 つのオプション:

  1. 公開共有 Web サイト。

    Dify で作成した AI アプリケーションは、インターネット上でアクセス可能な Web アプリケーションとして公開でき、プロンプトとオーケストレーションの設定に基づいて動作します。詳細については、「公開 Web アプリとして公開する」をご参照ください。

  2. API ベースの呼び出し。

    Dify は、「Backend-as-a-Service」の概念に基づき、すべてのアプリケーションに API を提供します。これにより、開発者は複雑なバックエンドアーキテクチャやデプロイを気にすることなく、フロントエンドアプリケーションで大規模言語モデルの能力を活用できます。詳細については、「API を使用した開発」をご参照ください。

  3. フロントエンドコンポーネントをベースにした再開発。

    ゼロから新しい製品を開発している場合や、プロトタイプの設計段階にある場合は、Dify を使用して AI サイトを迅速に公開できます。詳細については、「フロントエンドコンポーネントをベースにした再開発」をご参照ください。

  4. エンタープライズまたは個人の Web サイトへの埋め込み。

    Dify は、AI アプリケーションをビジネス Web サイトに埋め込むことをサポートしています。この機能を使用して、公式 AI カスタマーサービス、ビジネス Q&A、その他のアプリケーションをビジネスデータを使用して数分で作成できます。詳細については、「Web サイトへの埋め込み」をご参照ください。