全部產品
Search
文件中心

Container Compute Service:在ACS基於Dify構建網頁定製化AI問答助手

更新時間:Jun 12, 2025

使用Dify服務您可以實現將企業或個人的知識庫整合到大模型應用中,從而建立出深度定製化的AI問答解決方案,並且可將其整合到您的業務情境,助力您提升日常研發管理效能此外在ACS叢集上部署服務還支援隨業務需求變化即時、平滑地進行擴容,從而有力推動業務發展。

方案概覽

Dify定製化AI應用樣本

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

網頁整合AI應用樣本

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

配置一個專屬AI問答助手,只需3步:

  1. 安裝ack-dify組件:先通過Container Service建立一個ACS叢集,並安裝ack-dify組件。

  2. 添加AI問答助手:接著通過訪問Dify服務,實現在網站中引入一個AI問答助手。

  3. 定製AI問答助手:最後可以通過準備專屬知識庫,讓AI問答助手回答原本無法準確回答的問題,協助您更好的應對專業問題的諮詢。

Dify簡介

Dify是一款開源的大語言模型(LLM)應用開發平台。它融合了後端即服務(Backend as Service)和LLMOps的理念,使開發人員可以快速搭建生產級的產生式AI應用。即使您是非技術人員,也能參與到AI應用的定義和資料營運過程中。同時Dify內建了構建LLM應用所需的關鍵技術棧,這為開發人員節省了許多重複造輪子的時間,使其可以更加專註在創新和業務需求上。

技術架構如下圖所示。

Dify的技術架構包括以下關鍵區段:

  1. 核心技術組件支撐:Dify整合了建立LLM應用程式的核心技術組件,涵蓋了對眾多模型的相容支援、方便使用的Prompt設計介面、高效能的RAG(檢索增強產生)系統,以及可自訂的Agent架構。

  2. 可視化編排和營運:Dify通過其直觀的介面,實現了Prompt的可視化編排、營運流程及資料集的高效管理,極大地加速了AI應用程式的開發進程,使開發人員能夠在短時間內完成部署,或迅速將LLM融入現有系統中,並支援持久性的營運最佳化。

  3. 應用模板和編排架構:Dify為開發人員配備了開箱即用的應用模板和編排架構,使得開發人員能夠依託這些資源迅速開發出基於大規模語言模型的產生式AI應用程式。此外,該平台還支援隨業務需求變化即時、平滑地進行擴容,從而有力推動業務發展。

通過這些技術架構的關鍵組成部分,Dify為開發人員提供了一個全面、靈活且便於使用的平台,以支援產生式AI應用的快速開發和部署。

1. 安裝ack-dify組件

如果您熟悉ACS叢集建立的相關流程,您可以按照以下文檔指引自主建立適合您業務的叢集環境。

1.1 環境準備

  1. 建立ACS叢集,且叢集版本為1.26及以上。

  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儲存卷對應一個NAS檔案系統。

        fileSystemType

        NAS檔案系統的類型。

        • standard:通用型NAS,更多資訊,請參見通用型NAS

        • extreme:極速型NAS,更多資訊,請參見極速型NAS

        storageType

        NAS檔案系統的儲存規格。

        • 對於通用型NAS,可選值如下:

          • Performance(預設):效能型。

          • Capacity:容量型

        • 對於極速型NAS,可選值如下:

          • standard(預設):標準型

          • advanced:進階型

        regionId

        NAS檔案系統所屬地區。需與ACS叢集所屬地區保持一致。

        zoneId

        NAS檔案系統所屬可用性區域。請根據ACS叢集中Pod所使用的交換器,選擇對應的可用性區域。NAS檔案系統所屬可用性區域,與NAS檔案系統的儲存規格相關,具體儲存規格對應可用性區域如下:

        說明

        同一VPC下,NAS可以跨可用性區域掛載。建議選擇同一可用性區域,效能相對更優。

        vpcIdvSwitchId

        NAS檔案系統掛載點所屬的VPC ID和交換器ID。需配置為ACS叢集中Pod使用的VPC ID和交換器ID。

        accessGroupName

        NAS檔案系統掛載點的許可權組。預設為DEFAULT_VPC_GROUP_NAME

        provisioner

        驅動類型。必須配置為nasplugin.csi.alibabacloud.com,表示使用阿里雲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                  13m
        ......
    2. 建立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: 20Gi

        相關參數說明如下:

        參數

        說明

        accessModes

        訪問模式。

        storage

        分配給Pod的儲存容量,即要建立的NAS儲存卷容量。

        說明

        由於極速型NAS有100 GiB的最小容量限制,如果StorageClass中定義的NAS檔案系統類型為極速型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****   20Gi       RWX            alibabacloud-cnfs-nas   <unset>                14s

1.2 組件部署

Dify服務使用的ack-dify組件需要部署在叢集之上,您可以按照以下步驟部署組件並排查問題。

  • 登入容器計算服務控制台,在左側導覽列選擇叢集列表單擊目的地組群名稱,進入叢集詳情頁面,如下圖所示,按照序號依次單擊,為目的地組群安裝ack-dify組件。

    您無需為組件配置應用程式名稱命名空間,單擊⑥下一步後會出現一個請確認的彈框,單擊,即可使用預設的應用程式名稱(ack-dify)和命名空間(dify-system)。然後選擇Chart 版本1.1.5,單擊確定即可完成ack-dify組件安裝。

    image

  • 等待1分鐘左右,在本地執行以下命令,如果dify-system命名空間下的Pod均已處於Running狀態, 表明ack-dify組件已經安裝成功。

    kubectl get pod -n dify-system

    如果您發現有Pod處於Pending狀態,可能是因為已有叢集缺少ack-dify的PVC依賴,請按照環境準備為叢集建立對應的NAS StorageClass。更多Pod異常問題排查,請參見Pod異常問題排查

2. 添加AI問答助手

2.1 訪問Dify服務

  1. 為ack-dify服務開啟公網訪問功能。

    說明

    公網訪問便於示範操作,如果您在生產環境中部署,為了您的應用資料安全,建議您開啟存取控制功能。

    image

  2. 配置完成後,依次單擊網路 > 服務 > ack-dify,命名空間為dify-system,您會看到ack-dify服務的外部IP地址(External IP),將該外部IP地址輸入瀏覽器地址欄即可訪問Dify服務。

    image

  3. 註冊帳號。

    訪問外部IP地址(External IP),請根據頁面提示設定管理員賬戶(即郵箱地址、使用者名稱和密碼),以註冊Dify平台來使用服務。

    image

2.2 建立AI問答助手

  1. 在瀏覽器中輸入外部IP地址(External IP),登入Dify平台。

  2. 添加並配置所需要的AI模型(以通義千問為例),並為模型配置從阿里雲擷取的API Key。如下圖所示:

    通義千問提供的免費額度消耗完後按Token計費,相比您自主部署大模型可以顯著降低初期的投入成本。

    1. 擷取API Key:依次單擊使用者名稱稱>設定>模型供應商>安裝並設定通義千問外掛程式>從阿里雲擷取API Key

    2. 將擷取到的API Key輸入到下圖所示的輸入欄中,單擊儲存

    image

  3. 建立一個通用型AI問答助手。

    依次單擊工作室>建立空白應用,並為AI問答助手輸入名稱描述,其他參數保持預設即可。

    image

2.3 驗證AI問答助手

現在您可以在頁面輸入問題以查看目前AI問答助手配置的最新效果。由於下圖樣本中調用的是一個通用型聊天機器人,所以只能進行簡單對話,暫時還無法回答Dify相關的專業問題。

image

3. 定製AI問答助手

3.1 建立知識庫

通過前面的操作,您已經擁有了一個可以對話的AI問答助手。但是如果您想讓AI問答助手像專業人士一樣,更加精準且專業地回答Dify技術相關的問題,您還需要為AI問答助手配置專屬語料知識庫。

為簡化操作步驟,本樣本已經為您整理好語料檔案dify_doc.md,您只需按照如下步驟進行操作,即可完成建立和上傳專屬知識庫。

  1. 將整理好的語料檔案dify_doc.md上傳至知識庫。

    依次單擊知識庫>建立知識庫>匯入已有文本>選擇檔案>下一步

    image

  2. 單擊下一步後,您可根據頁面引導,進行文本分段與清洗後儲存即可。

    此處的配置參數保持預設即可。知識庫將自動為上傳的文檔進行清洗、分段並建立索引,以便後續AI問答助手在回答時檢索參考。

如果您需要瞭解上述語料檔案是如何整理為一個.md檔案,請展開下方摺疊項查看詳細資料。

展開查看如何準備專屬的Dify語料知識庫

準備專屬的Dify語料知識庫。目前Dify僅支援上傳單個檔案,檔案格式支援TXT、HTML、MarkDown、PDF。

您在正式開始訓練前,需要先把語料知識庫準備好。由於CODING之前的所有文檔皆以Git代碼倉庫 + Markdown的形式進行協作,因此您只需要先把文檔拉到本地,並把倉庫中的一系列.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 中的每個檔案內容,將其寫入 output_file。
        """
        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 拆分 Markdown 內容。
            建立 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 拆分 Markdown 內容。
            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 編排並發布AI問答助手

為已建立的AI助手配置提示詞並添加上下文知識庫。

  1. 配置提示詞:拷貝以下內容至提示詞中。提示詞用於對AI的回複做出指令和約束,可以提升AI問答助手的回答表現和結果準確性。

    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. 添加上下文知識庫:單擊上下文地區的添加,根據頁面提示為AI問答助手配置的專屬知識庫,使AI問答助手獲得精準且專業回答問題的能力。

  3. 在頁面右上方單擊發布>更新手動儲存配置資訊,使Dify服務的配置生效。

配置效果如下所示:

image

3.3 檢驗效果

相較於上文的通用型聊天機器人,配置了專屬知識庫的AI助手通過整合相關領域的知識庫,能夠提供更加專業、準確的資訊和建議。image

下表歸納總結了Dify具備的核心功能,您可根據個人或企業情境來自主選擇使用。

Dify核心功能

說明

全面的LLMOps

對於已部署的AI應用,Dify提供完善的營運支援,包括即時監控應用日誌和效能指標,以及基於生產資料和使用者反饋持續最佳化提示、資料集和模型。

RAG引擎

Dify提供端到端的RAG管道,支援從文檔攝入到資訊檢索的全流程,能夠直接處理PDF、PPT等常見文檔格式,簡化資料準備工作。

Agent

Dify允許開發人員基於LLM函數調用或ReAct範式定義Agent,並為其添加預構建或自訂工具,平台內建50多種工具。

workflow工作流程編排

Dify提供了一個可視化的畫布,允許開發人員通過拖拽和串連不同的組件,快速構建複雜的AI工作流程,無需深入複雜的代碼編寫,大大降低了開發門檻。

可觀測性

提供了對LLM應用程式的品質和成本的跟蹤和評估能力,通過其監控儀表板,您可以輕鬆配置和啟用這些功能,以增強LLM應用程式的可觀測性。‌

企業功能(SSO/存取控制)

企業組織可降低資訊泄露和資料損害的風險,確保資訊安全和業務連續。

用到生產環

如果您想將開發的AI問答助手引入到您企業或個人的生產環境,可以通過以下四種方式操作。

  1. 公開分享的網站。

    您使用Dify建立AI應用發行就緒為一個可供您在互連網上公開訪問的Web應用,該應用將根據您的Prompt和編排設定進行工作。詳細操作,請參見發布為公開Web網站

  2. 基於API介面調用。

    Dify基於“後端即服務”理念為所有應用提供了API,開發人員可以直接在前端應用中擷取大型語言模型的強大能力,而無需關注複雜的後端架構和部署過程。詳細操作,請參見基於APIs開發

  3. 基於前端組件再開發。

    如果您是從頭開發新產品或者在產品原型設計階段,您可以使用Dify快速發布AI網站。詳細操作,請參見基於前端組件再開發

  4. 嵌入到您企業或個人網站。

    Dify支援將您的AI應用嵌入到業務網站中,您可以使用該能力在幾分鐘內製作具有業務資料的官網AI客服、業務知識問答等應用。詳細操作,請參見嵌入網站