基于RDS PostgreSQL与Dify平台构建AI应用

Dify是一款开源的大语言模型(LLM)应用开发平台。它将后端即服务(Backend as Service)与LLMOps理念相结合,使开发者能够迅速构建生产级的生成式AI应用。本文将介绍如何基于RDS PostgreSQLDify平台构建智能问答应用。

本方案依赖于RDS PostgreSQL实现。您可以加入RDS PostgreSQL插件交流钉钉群(103525002795),进行咨询、交流和反馈,获取更多关于插件的信息。

步骤一:创建RDS PostgreSQL实例

  1. 快速创建RDS PostgreSQL实例

  2. RDS实例创建账号和数据库,详情请参见创建账号和数据库

    其中:

    • 创建账号时,账号类型选择高权限账号

    • 创建数据库时,授权账号选择已创建的高权限账号。

  3. RDS PostgreSQL开通外网地址。具体操作,请参见开通或关闭外网地址

    ECS实例的公网IP地址,添加到RDS PostgreSQL的白名单中。具体操作请参见设置白名单

  4. RDS PostgreSQL的目标数据库开启vector插件,详细操作请参见管理插件

步骤二:部署Dify

  1. 创建ECS实例,详情请参见自定义购买ECS实例

    • CPUECS实例,支持添加在线AI大模型。

    • GPUECS实例,支持添加在线及ECS本地的AI大模型。

    重要
    • 本文以Alibaba Cloud Linux 3为例。

    • 如果您购买的是GPU版的ECS实例,您需要在配置镜像时,安装对应的GPU驱动。使用GPU版的ECS实例,您可以使用Ollama将大模型部署在ECS上。

  2. ECS中,安装Docker。详情请参见安装Docker

  3. (可选)如果购买的是GPU版的ECS实例,需要执行如下命令,安装container-toolkit组件。

    安装container-toolkit组件

    curl -s -L https://nvidia.github.io/nvidia-container-runtime/centos8/nvidia-container-runtime.repo | \
    sudo tee /etc/yum.repos.d/nvidia-container-runtime.repo
    
    sudo yum install -y nvidia-container-toolkit
    
    #重启docker
    sudo systemctl restart docker
  4. 执行如下命令,获取Dify源码。

    git clone https://github.com/langgenius/dify.git
    说明

    如果未安装Git命令,请执行sudo yum install git -y进行安装。

  5. 配置环境变量,将RDS PostgreSQL作为默认数据库和向量库。

    1. 设置RDS PostgreSQL为默认数据库。

      export DB_USERNAME=testdbuser
      export DB_PASSWORD=dbPassword
      export DB_HOST=pgm-****.pg.rds.aliyuncs.com
      export DB_PORT=5432
      export DB_DATABASE=testdb01

      请根据实际情况替换代码中的参数值。

      参数

      说明

      DB_USERNAME

      RDS PostgreSQL实例的高权限账号。

      DB_PASSWORD

      RDS PostgreSQL实例的高权限账号的密码。

      DB_HOST

      RDS PostgreSQL实例的外网连接地址。

      DB_PORT

      RDS PostgreSQL实例的外网端口,默认为5432。

      DB_DATABASE

      RDS PostgreSQL实例中的数据库名称。

    2. 设置RDS PostgreSQL作为默认向量库。

      export VECTOR_STORE=pgvector
      export PGVECTOR_HOST=pgm-****.pg.rds.aliyuncs.com
      export PGVECTOR_PORT=5432
      export PGVECTOR_USER=testdbuser
      export PGVECTOR_PASSWORD=dbPassword
      export PGVECTOR_DATABASE=testdb01

      请根据实际情况替换代码中的参数值。

      参数

      说明

      VECTOR_STORE

      使用vector插件。

      PGVECTOR_USERNAME

      RDS PostgreSQL实例的高权限账号。

      PGVECTOR_PASSWORD

      RDS PostgreSQL实例的高权限账号的密码。

      PGVECTOR_HOST

      RDS PostgreSQL实例的外网连接地址。

      PGVECTOR_PORT

      RDS PostgreSQL实例的外网端口,默认为5432。

      PGVECTOR_DATABASE

      RDS PostgreSQL实例中的数据库名称。

    您也可以通过.env文件配置RDS PostgreSQL为默认数据库和向量库。

    通过.env配置RDS PostgreSQL为默认数据库和向量库

    1. 执行如下命令,使用Dify示例文件.env.example,覆盖原有.env文件。

      cd /root/dify/docker
      cp .env.example .env
      说明

      获取Dify源码后,/root/dify/docker目录下将自动包含.env.example.env文件。

    2. 编辑.env文件,将如下参数配置为RDS PostgreSQL实例的相关信息。

      #默认数据库配置信息
      DB_USERNAME=testdbuser
      DB_PASSWORD=dbPassword
      DB_HOST=pgm-****.pg.rds.aliyuncs.com
      DB_PORT=5432
      DB_DATABASE=testdb01
      
      #默认向量库配置信息
      VECTOR_STORE=pgvector
      PGVECTOR_HOST=pgm-****.pg.rds.aliyuncs.com
      PGVECTOR_PORT=5432
      PGVECTOR_USER=testdbuser
      PGVECTOR_PASSWORD=dbPassword
      PGVECTOR_DATABASE=testdb01
  6. (可选)若您希望在ECS中避免运行默认的数据库和Weaviate容器,以节省流量和存储空间,请编辑.envdocker-compose.yaml文件,以禁用默认的数据库和Weaviate容器。

    • 编辑.env文件

      1. (可选)执行如下命令,使用Dify示例文件.env.example,覆盖原有.env文件。

        重要

        如果您在将RDS PostgreSQL配置为默认数据库和向量库时已经完成此操作,请跳过此步骤。

        cd /root/dify/docker
        cp .env.example .env
      2. 编辑.env文件,将以下配置进行注释,以禁用该配置项。

        #COMPOSE_PROFILES=${VECTOR_STORE:-weaviate}
    • 编辑docker-compose.yaml文件

      1. 执行如下命令,备份docker-compose.yaml文件。

        cd /root/dify/docker
        cp docker-compose.yaml docker-compose.yaml.bak
      2. 编辑docker-compose.yaml文件,将默认数据库的相关配置进行注释,以禁用相关配置项。

        • API servicedepends_on:下的- db 进行注释,以禁用该配置项。

          # API service
          api:
            ......
            depends_on:
              #- db          
              - redis  
        • worker servicedepends_on:下的- db 进行注释,以禁用该配置项。

          # worker service
          # The Celery worker for processing the queue.
          worker:
            ......
            depends_on:
              #- db
              - redis
        • The postgres database中增加profiles: -pg的配置项。

          # The postgres database.
          db:
            image: postgres:15-alpine
            profiles:
              - pg 
        • The Weaviate vector storeprofiles:下的- '' 进行注释,以禁用该配置项。

          # The Weaviate vector store.    
          weaviate:
             image: semitechnologies/weaviate:1.19.0
             profiles:
               #- ''
               - weaviate
  7. 执行如下命令,启动Dify镜像。

    cd /root/dify/docker
    docker compose -f docker-compose.yaml up -d

步骤三:访问Dify服务

  1. 在浏览器中访问http://<ECS公网IP地址>/install,以访问Dify服务。

    说明

    如果访问失败,请多次刷新页面,Dify正在初始化存储表结构及相关信息。

  2. 请根据页面提示设置管理员账户(即邮箱地址、用户名和密码),以注册Dify平台来使用服务。

步骤四:添加并配置AI模型

本文以通义千问为例。

  1. 登录Dify平台。

  2. 在右上角,单击用户名称 > 设置

  3. 设置页面,选择模型供应商 > 通义千问 > (设置)

  4. 在通义千问的设置页面,单击链接获取阿里云百炼的API Key。

  5. 输入获取到的API Key后,单击保存

image

如果您购买的是GPU版本的是ECS,您可以将通义千问的LLM服务部署在ECS上。

将通义千问的LLM服务部署在ECS

  1. 执行以下命令,创建一个名为ollama的容器,并确保外部网络能够通过主机的11434端口访问容器同一端口上的服务。

    docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama

    返回容器ID:

    a2201932a0c10da50845a85fc8e00c2178d8b4d0936a92f383b284a7ce51****
  2. 进入目标容器,执行如下命令,部署大模型。本文以通义千问的qwen2.5-coder:7brjmalagon/gte-qwen2-7b-instruct:f16模型为例。

    docker exec -it a2201932a0c10da50845a85fc8e00c2178d8b4d0936a92f383b284a7ce51**** /bin/bash
    
    ollama pull qwen2.5-coder:7b
    
    ollama pull rjmalagon/gte-qwen2-7b-instruct:f16
  3. 配置ECS安全组,在入方向增加端口为11434/11434,授权对象为ECS公网IP的授权策略。

  4. 登录Dify平台。

  5. 依次选择用户名称 > 设置 > 模型供应商 > Ollama > 添加模型

  6. 分别添加LLM模型为qwen2.5-coder:7bText Embedding模型为rjmalagon/gte-qwen2-7b-instruct:f16

    其中,模型名称分别为qwen2.5-coder:7brjmalagon/gte-qwen2-7b-instruct:f16基础 URLhttp://<ECS公网IP地址>:11434;其余参数均采用默认设置。

步骤五:创建知识库

通过专属知识库,可使智能问答应用更加精准和专业地回答相关问题。

前提条件

已准备好专属知识库的语料文件。当前已支持TXT、MARKDOWN、MDX、PDF、HTML、XLSX、XLS、DOCX、CSV、MDHTM等格式,每个文件不超过15 MB。

操作步骤

  1. 依次单击知识库 > 创建知识库 > 导入已有文本 > 选择文件 > 下一步,将准备好的文件上传至知识库。

    image

  2. 单击下一步后,您可根据页面引导,进行文本分段与清洗

    此处的配置参数保持默认即可。知识库将自动为上传的文档进行清洗、分段并建立索引,以便后续智能问答应用在回答时检索参考。

通过RDS PostgreSQL验证知识库并增加索引

配置知识库完成后,需要在RDS PostgreSQL数据库中验证知识库内容,并为每一个知识库表添加索引。

  1. 连接Dify使用的RDS PostgreSQL数据库,连接RDS PostgreSQL实例

  2. 执行如下命令,查看知识库对应的ID。

    SELECT * FROM datasets;
  3. 将目标ID中的-替换为_,加上前缀embedding_vector_index_和后缀_nod后,即为存储该知识库的表名称。例如,执行如下命令,即可查看目标知识库在RDS PostgreSQL中存储的数据。

    SELECT * FROM embedding_vector_index_6b169753_****_****_be66_9bddc44a4848_nod;
  4. 为知识库添加索引。

    使用pgvector插件进行向量相似度查询时,系统默认使用如下的SQL语句进行查询。

    SELECT 
        meta, 
        text, 
        embedding <=> $1 AS distance 
    FROM 
        embedding_vector_index_6b169753_****_****_be66_9bddc44a4848_nod 
    ORDER BY 
        distance 
    LIMIT 
        $2;

    因此,需要为每一个知识库表,使用如下语句创建索引。

    CREATE INDEX ON embedding_vector_index_6b169753_****_****_be66_9bddc44a4848_nod 
    USING hnsw (embedding vector_cosine_ops);
    说明

    在实际使用过程中,请替换表名称。

步骤六:创建智能问答应用

本文以应用模板中的Question Classifier + Knowledge + Chatbot模板为例。

  1. 单击工作室 > 从应用模板创建

    image

  2. 查找Question Classifier + Knowledge + Chatbot,并单击使用该模板

  3. 配置应用名称和图标后,单击创建

  4. 工作室页面,单击新创建的应用卡,进入到应用编排页面。

  5. 配置应用工作流,删除Answer模块,保留一个Knowledge Retrieval模块,并将Question ClassifierLLM模块的AI模型修改为通义千问。

    image

    配置通义千问大模型时,需要将Top P的值设置为小于1的数值。

    image

  6. 编辑Question Classifier模块,根据实际情况修改问题分类。例如,此前创建的知识库是关于PostgreSQL的内容,以PostgreSQL知识问答为例,可以设定:

    • 当问题和PostgreSQL相关时,采用知识库+通义千问大模型进行归纳总结。

    • 当问题和PostgreSQL无关时,采用通义千问大模型进行回答。

    image

  7. 编辑Knowledge Retrieval模块,添加此前创建的与PostgreSQL相关的知识库。

    image

  8. 单击右上角的预览,进行问答演示。演示正常后,单击右上角的发布,即可发布应用。