全部產品
Search
文件中心

ApsaraDB RDS:基於RDS PostgreSQL與Dify平台構建AI應用

更新時間:Mar 06, 2025

Dify是一款開源的大語言模型(LLM)應用開發平台。它將後端即服務(Backend as Service)與LLMOps理念相結合,使開發人員能夠迅速構建生產級的產生式AI應用。本文將介紹如何基於RDS PostgreSQL與Dify平台構建智能問答應用。

步驟一:建立RDS PostgreSQL執行個體

  1. 快速建立RDS PostgreSQL執行個體

  2. 為RDS執行個體建立帳號和資料庫,詳情請參見建立帳號和資料庫

    其中:

    • 建立帳號時,帳號類型選擇高許可權帳號

    • 建立資料庫時,授權帳號選擇已建立的高許可權帳號。

  3. 為RDS PostgreSQL開通外網地址。具體操作,請參見開通或關閉外網地址

    將ECS執行個體的公網IP地址,添加到RDS PostgreSQL的白名單中。具體操作請參見設定白名單

  4. 為RDS PostgreSQL的目標資料庫開啟vector外掛程式,詳細操作請參見管理外掛程式

步驟二:部署Dify

  1. 建立ECS執行個體,詳情請參見自訂購買ECS執行個體

    • CPU版ECS執行個體,支援添加線上AI大模型。

    • GPU版ECS執行個體,支援添加線上及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

    您可以通過branch參數指定版本分支,以安裝特定版本。例如,安裝v1.0.0版時,可以使用如下命令。Dify的分支版本請參見dify

    git clone https://github.com/langgenius/dify.git --branch 1.0.0
    說明

    如果未安裝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 service中depends_on:下的- db 進行注釋,以禁用該配置項。

          # API service
          api:
            ......
            depends_on:
              #- db          
              - redis  
        • 將worker service中depends_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 store中profiles:下的- '' 進行注釋,以禁用該配置項。

          # 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、MD和HTM等格式,每個檔案不超過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. 確認知識庫索引。

    Dify平台在建立知識庫時,會預設為每一個知識庫建立HNSW索引,以加速使用pgvector外掛程式進行的向量相似性查詢。系統預設使用如下的SQL語句進行向量相似性查詢。

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

    使用以下語句檢查知識庫表的索引及其預設參數是否符合召回率要求。HNSW索引mef_construction與召回率之間的關係,請參見pgvector效能測試(基於HNSW索引)

    SELECT *
    FROM pg_indexes
    WHERE tablename = 'embedding_vector_index_6b169753_****_****_be66_9bddc44a4848_nod';

    如未自動建立索引,或索引的預設參數不符合召回率要求,請執行以下命令以手動建立索引。

    1. (可選)刪除已有索引。

      DROP INDEX IF EXISTS embedding_vector_index_6b169753_****_****_be66_9bddc44a4848_nod;
    2. 建立索引。

      CREATE INDEX ON embedding_vector_index_6b169753_****_****_be66_9bddc44a4848_nod 
      USING hnsw (embedding vector_cosine_ops);
      WITH (m = '16', ef_construction = '100');
    說明

    embedding_vector_index_6b169753_****_****_be66_9bddc44a4848_nod為索引表名稱,在實際應用中,請根據需要替換該表名稱。

步驟六:建立智能問答應用

本文以應用模板中的Question Classifier + Knowledge + Chatbot模板為例。

  1. 單擊工作室 > 從應用模板建立

    image

  2. 尋找Question Classifier + Knowledge + Chatbot,並單擊使用該模板

  3. 配置應用程式名稱和表徵圖後,單擊建立

  4. 工作室頁面,單擊新建立的應用卡,進入到應用編排頁面。

  5. 配置應用工作流程,刪除Answer模組,保留一個Knowledge Retrieval模組,並將Question Classifier和LLM模組的AI模型修改為通義千問。

    image

    配置通義千問大模型時,需要將Top P的值設定為小於1的數值。

    image

  6. 編輯Question Classifier模組,根據實際情況修改問題分類。例如,此前建立的知識庫是關於PostgreSQL的內容,以PostgreSQL知識問答為例,可以設定:

    • 當問題和PostgreSQL相關時,採用知識庫+通義千問大模型進行歸納總結。

    • 當問題和PostgreSQL無關時,採用通義千問大模型進行回答。

    image

  7. 編輯Knowledge Retrieval模組,添加此前建立的與PostgreSQL相關的知識庫。

    image

  8. 單擊右上方的預覽,進行問答示範。示範正常後,單擊右上方的發布,即可發布應用。