全部产品
Search
文档中心

容器计算服务 ACS:在ACS基于Dify构建网页定制化AI问答助手

更新时间:Jun 11, 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组件:先通过容器服务创建一个ACS集群,并安装ack-dify组件。

  2. 添加AI问答助手:接着通过访问Dify服务,实现在网站中引入一个AI问答助手。

  3. 定制AI问答助手:最后可以通过准备专属知识库,让AI问答助手回答原本无法准确回答的问题,帮助您更好的应对专业问题的咨询。

Dify简介

Dify是一款开源的大语言模型(LLM)应用开发平台。它融合了后端即服务(Backend as Service)和LLMOps的理念,使开发者可以快速搭建生产级的生成式AI应用。即使您是非技术人员,也能参与到AI应用的定义和数据运营过程中。同时Dify内置了构建LLM应用所需的关键技术栈,这为开发者节省了许多重复造轮子的时间,使其可以更加专注在创新和业务需求上。

技术架构如下图所示。

image

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客服、业务知识问答等应用。详细操作,请参见嵌入网站