全部產品
Search
文件中心

ApsaraDB RDS:通過PAI的EAS和RDS PostgreSQL部署大模型RAG對話系統

更新時間:Jan 03, 2025

阿里雲人工智慧平台PAI(Platform For AI)的模型線上服務EAS(Elastic Algorithm Service)提供了情境化部署方式,通過簡單配置幾個參數,您便可以一鍵部署整合了大語言模型(LLM)和檢索增強產生(RAG)技術的對話系統服務,顯著縮短服務部署時間。在使用該服務進行推理驗證時,它能夠有效地從知識庫中檢索相關資訊,並與大語言模型的回答相結合,以產生準確且資訊豐富的答案,從而大幅提高問答的品質和整體效能。該服務適用於問答、摘要產生和依賴外部知識的自然語言處理任務。本文將介紹如何通過RDS PostgreSQL構建向量檢索庫,部署RAG對話系統服務,以及進行模型推理驗證的具體方法。

背景資訊

大語言模型(LLM)在產生準確性和即時性回複方面存在局限,因此並不適合直接用於需要精確資訊的客服或問答等情境。為瞭解決這一問題,當前業界廣泛採用的方法是利用檢索增強產生(Retrieval-Augmented Generation, RAG)技術來增強LLM的效能,這一技術可以顯著提升問答、摘要產生以及其他需要引用外部知識的自然語言處理(NLP)任務的品質。

RAG通過將大語言模型(如通義千問)和資訊檢索組件結合在一起,增強了模型產生答案的準確性和資訊量。在處理使用者查詢時,RAG通過資訊檢索組件在知識庫中尋找與查詢相關的文檔或資訊片段,將這些檢索到的內容與原始查詢一同輸入大語言模型之後,模型能夠利用現有的歸納產生能力產生基於最新資訊的、符合事實的回複,而無需對模型進行重新訓練。

EAS部署的對話系統服務,通過整合大語言模型(LLM)和檢索增強產生(RAG)技術,克服了LLM在準確性和即時性方面的局限,為多種問答情境提供了準確且資訊豐富的響應,從而提升了自然語言處理任務的整體效能和使用者體驗。

前提條件

注意事項

本實踐受制於LLM服務的最大Token數量限制,旨在協助您體驗RAG對話系統的基本檢索功能:

  • 該對話系統受制於LLM服務的伺服器資源大小以及預設Token數量限制,能支援的對話長度有限。

  • 如果無需進行多輪對話,建議您關閉RAG服務的with chat history功能,這樣能有效減少達到限制的可能性。詳情請參見如何關閉RAG服務的with chat history功能

步驟一:準備RDS PostgreSQL向量檢索庫

RAG支援通過RDS PostgreSQL構建向量檢索庫。您需要擷取相關配置參數,以便後續串連向量檢索庫。

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

    建議RDS PostgreSQL執行個體與RAG服務在同一地區,以便利用VPC內網進行通訊。

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

    其中:

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

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

  3. 設定資料庫串連。

    1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。

    2. 在左側導覽列單擊資料庫連接

    3. 在資料庫連接頁面,查看資料庫連接地址和相應連接埠號碼。

  4. 在shared_preload_libraries的運行參數值中添加pg_jieba。例如,將運行參數值改為'pg_stat_statements,auto_explain,pg_cron'。詳細操作請參見設定執行個體參數

    說明

    RDS PostgreSQL使用pg_jieba外掛程式進行中文分詞,用於關鍵詞檢索與召回。

步驟二:部署RAG服務

  1. 進入模型線上服務頁面。

    1. 登入PAI控制台

    2. 在左側導覽列單擊工作空間列表,在工作空間列表頁面中單擊待操作的工作空間名稱,進入對應工作空間內。

      如您尚未建立工作空間,請建立工作空間

    3. 在工作空間頁面的左側導覽列選擇模型部署>模型線上服務(EAS),進入模型線上服務(EAS)頁面。image

  2. 模型線上服務頁面,單擊部署服務,在情境化模型部署地區,單擊大模型RAG對話系統部署6eea7736f88e6ec8b3b900e4d028bb48

  3. 部署大模型RAG對話系統頁面,配置以下關鍵參數。

    • 基本資料

      參數

      描述

      服務名稱

      自訂服務名稱。

      模型來源

      支援使用開源公用模型自持微調模型

      模型類別

      根據您的使用情境,選擇模型類型。

      使用自持微調模型時,您需配置相應模型的參數量和精度。

      模型配置

      使用自持微調模型時,您需配置微調模型的檔案路徑。支援以下兩種配置方法:

      說明

      確保使用的模型檔案格式與HuggingFace Transformers相容。

      • 按Object Storage Service:請選擇微調模型檔案所在的OSS路徑。

      • 按Apsara File Storage NAS:請選擇微調模型檔案所在的NAS檔案系統和NAS源路徑。

    • 資源配置

      參數

      描述

      資源配置選擇

      • 當使用開源公用模型時,系統會根據選定的模型類別自動推薦適合的執行個體規格,預設選中。

      • 當使用自持微調模型時,請選擇與目標模型相匹配的執行個體規格,詳情請參見如何切換其他的開源大模型

      推理加速

      目前,部署在A10或GU30系列機型上的Qwen、Llama2、ChatGLM或Baichuan2等系列模型服務,支援啟用推理加速功能。支援以下兩種加速類型:

      • PAI-BladeLLM自動推理加速:BladeLLM提供超高性價比的大模型推理加速能力,可協助您一鍵享受高並發和低延時的技術優勢。

      • 開源架構vllm推理加速

    • 向量檢索庫設定

      參數

      描述

      版本類型

      選擇RDS PostgreSQL。

      主機地址

      配置為RDS PostgreSQL內網地址或外網地址。

      • 使用內網地址:當RAG應用網路和資料庫在同一地區時,您可以使用內網地址串連執行個體。

      • 使用外網地址:當RAG應用網路和資料庫在不同地區時,您需要為RDS PostgreSQL開通外網地址。具體操作,請參見開通或關閉外網地址

      連接埠

      預設為5432,請根據實際情況填寫。

      資料庫

      配置為RDS PostgreSQL資料庫名稱。

      表名稱

      請輸入新的表名稱或已存在的表名稱。對於已存在的表,表結構應符合PAI-RAG要求,例如您可以填寫之前通過EAS部署RAG服務時自動建立的表名稱。

      帳號

      配置為RDS PostgreSQL高許可權帳號。

      密碼

      配置為RDS PostgreSQL高許可權帳號的密碼。

    • 專用網路配置

      參數

      描述

      VPC

      • 當主機地址使用內網地址時,RAG服務需要配置與RDS PostgreSQL執行個體一致的專用網路。

      • 當主機地址使用外網地址時,您需要為RAG服務配置VPC和交換器,並為該VPC配置NAT Gateway和Elastic IP Address(EIP),以便為RAG應用提供公網訪問能力。具體操作,請參見使用公網NAT GatewaySNAT功能訪問互連網。同時您需要將綁定的Elastic IP Address添加到RDS PostgreSQL執行個體的公網訪問白名單中,詳情請參見設定白名單

      交換器

      安全性群組名稱

      配置安全性群組。

      重要

      請勿使用名稱為created_by_rds的安全性群組,該安全性群組僅供系統管控使用。

  4. 單擊部署

    服務狀態變為運行中時,表示服務部署成功。

步驟三:通過WebUI頁面進行模型推理驗證

您可以先在WebUI頁面,參考以下操作步驟對服務進行調試。當您在WebUI頁面調試好問答效果後,可以基於PAI提供的API將其應用到您自己的業務系統中,詳情請參見步驟三:通過API調用進行模型推理

1、配置RAG對話系統

  1. RAG服務部署成功後,單擊服務方式列下的查看Web應用,啟動WebUI頁面。

  2. 配置機器學習模型。

    • Embedding Model Name:系統內建四種模型供您選擇,將自動為您配置最合適的模型。

    • Embedding Dimension:選擇Embedding Model Name後,系統會自動進行配置,無需手動操作。

  3. 測試向量檢索庫串連是否正常。

    系統已自動識別並應用了部署服務時配置的向量檢索庫設定,並且該設定不支援修改。單擊Connect PostgreSQL,驗證RDS PostgreSQL串連是否正常。

2、上傳指定的業務資料檔案

Upload頁簽中,上傳指定的業務資料檔案,類型為.txt、.pdf、Excel(.xlsx或.xls)、.csv、Word(.docx或.doc)、Markdown或.html。

image

  1. 設定語義切塊參數。

    通過配置以下參數來控制文檔切塊粒度的大小和進行QA資訊提取:

    參數

    描述

    Chunk Size

    指定每個分塊的大小,單位為位元組,預設為500。

    Chunk Overlap

    表示相鄰分塊之間的重疊量,預設為10。

    Process with QA Extraction Model

    通過選中Yes複選框啟動QA資訊提取功能,系統將在您上傳業務資料檔案後自動抽取出QA對,以獲得更好的檢索和回答效果。

  2. FilesDirectory頁簽下上傳業務資料檔案(支援多檔案上傳)或對應目錄。例如rag_chatbot_test_doc.txt

  3. 選中檔案後,系統會先對上傳的檔案進行資料清洗(文本提取、超連結替換等)和語義切塊,然後進行上傳。

    image

3、配置模型推理參數

Chat頁簽中,配置問答策略。

配置Retrieval問答策略

image

參數

說明

Streaming Output

選中Streaming Output後,系統將以流式方式輸出結果。

Retrieval Model

支援以下三種檢索方式:

  • Embedding Only:向量資料庫檢索召回。

  • Keyword Only:關鍵詞檢索召回。

  • Hybrid:向量資料庫和關鍵詞檢索多路召回融合。

說明

在大多數複雜情境下,向量資料庫檢索召回都能有較好的表現。但在某些語料稀缺的垂直領域,或要求準確匹配的情境,向量資料庫檢索召回方法可能不如傳統的稀疏檢索召回方法。稀疏檢索召回方法通過計算使用者查詢與知識文檔的關鍵詞重疊度來進行檢索,因此更為簡單和高效。

RDS PostgreSQL通過pg_jieba外掛程式實現對中文的分詞,用於關鍵詞召回。更多pg_jieba外掛程式的使用說明,請參見中文分詞(pg_jieba)

Reranker Type

大多數向量資料庫為了計算效率會犧牲一定程度的準確性,這使其檢索結果存在一定隨機性,原始返回的Top K不一定最相關。您可以選擇模型simple-weighted-rerankermodel-based-reranker,對向量資料庫第一次召回的Top K結果進行精度更高的Re-Rank操作,以得到相關度更高、更準確的知識文檔。

說明

首次使用時,載入模型可能需要較長時間,請根據需要進行選擇。

Top K

向量檢索庫返回的相似結果數,即從向量資料庫中召回Top K條相似結果。

Similarity Score Threshold

相似性閾值,值越大,相似性越高。

配置RAG(Retrieval + LLM)問答策略

image

  • PAI提供多種不同的Prompt策略,您可以選擇合適的預定義Prompt模板或輸入自訂的Prompt模板以獲得更好的推理效果。

  • 此外RAG(Retrieval + LLM)問答方式還支援配置Streaming Output、Retrieval Mode和Reranker Type等,關於這些參數的配置說明,請參見大模型RAG對話系統

4、模型推理驗證

Retrieval

直接從向量資料庫中檢索並返回Top K條相似結果。

image

LLM

直接與EAS-LLM對話,返回大模型的回答。

image

RAG(Retrieval + LLM)

將檢索返回的結果與使用者的問題輸入至已選擇的Prompt模板中,送入EAS-LLM服務,從中擷取問答結果。

image

步驟四:通過API調用進行模型推理驗證

  1. 擷取RAG服務的調用資訊。

    1. 單擊RAG服務名稱,進入服務詳情頁面。

    2. 基本資料地區,單擊查看調用資訊

    3. 調用資訊對話方塊的公網地址調用頁簽,擷取服務訪問地址和Token。

  2. 通過WebUI頁面串連向量檢索庫,並上傳企業知識庫檔案

    您還可以根據已產生的符合PAI-RAG格式的表結構,將企業知識庫自行上傳到向量檢索庫中。

  3. 通過API調用服務。

    PAI提供了三種調用API的對話方式:service/query/retrieval(Retrieval)service/query/llm(LLM)和service/query(RAG)。具體調用方法如下:

    cURL 命令

    • 發送單輪對話請求

      • 方式一:service/query/retrieval(Retrieval)

        curl -X 'POST'  '<service_url>service/query/retrieval' -H 'Authorization: <service_token>' -H 'accept: application/json' -H 'Content-Type: application/json'  -d '{"question": "什麼是人工智慧平台PAI?"}'
        # <service_url>替換為步驟1擷取的服務訪問地址;<service_token>替換為步驟1擷取的服務Token。
      • 方式二:/service/query/llm(LLM)

        curl -X 'POST'  '<service_url>service/query/llm' -H 'Authorization: <service_token>' -H 'accept: application/json'  -H 'Content-Type: application/json'  -d '{"question": "什麼是人工智慧平台PAI?"}'
        # <service_url>替換為步驟1擷取的服務訪問地址;<service_token>替換為步驟1擷取的服務Token。

        支援添加其他可調推理參數,例如{"question":"什麼是人工智慧平台PAI?", "temperature": 0.9}

      • 方式三:service/query(RAG)

        curl -X 'POST'  '<service_url>service/query' -H 'Authorization: <service_token>' -H 'accept: application/json'  -H 'Content-Type: application/json'  -d '{"question": "什麼是人工智慧平台PAI?"}'
        # <service_url>替換為步驟1擷取的服務訪問地址;<service_token>替換為步驟1擷取的服務Token。

        支援添加其他可調推理參數,例如{"question":"什麼是人工智慧平台PAI?", "temperature": 0.9}

    • 發送多輪對話請求

      其中對話方式RAG和LLM支援發送多輪對話請求,以RAG對話為例,具體配置方法如下:

      # 發送請求。 
      curl -X 'POST'  '<service_url>service/query' -H 'Authorization: <service_token>' -H 'accept: application/json'  -H 'Content-Type: application/json'  -d '{"question": "什麼是人工智慧平台PAI?"}'
      
      # 傳入上述請求返回的session_id(對話歷史會話唯一標識),傳入session_id後,將對話歷史進行記錄,調用大模型將自動攜帶儲存的對話歷史。
      curl -X 'POST'  '<service_url>service/query' -H 'Authorization: <service_token>' -H 'accept: application/json'  -H 'Content-Type: application/json'  -d '{"question": "它有什麼優勢?","session_id": "ed7a80e2e20442eab****"}'
      
      # 傳入chat_history(使用者與模型的對話歷史),list中的每個元素是形式為{"user":"使用者輸入","bot":"模型輸出"}的一輪對話,多輪對話按時間順序排列。
      curl -X 'POST'  '<service_url>service/query' -H 'Authorization: <service_token>' -H 'accept: application/json'  -H 'Content-Type: application/json'  -d '{"question":"它有哪些功能?", "chat_history": [{"user":"PAI是什嗎?", "bot":"PAI是阿里雲的人工智慧平台......"}]}'
      
      # 同時傳入session_id和chat_history,會用chat_history對儲存的session_id所對應的對話歷史進行追加更新。 
      curl -X 'POST'  '<service_url>service/query' -H 'Authorization: <service_token>' -H 'accept: application/json'  -H 'Content-Type: application/json'  -d '{"question":"它有哪些功能?", "chat_history": [{"user":"PAI是什嗎?", "bot":"PAI是阿里雲的人工智慧平台......"}], "session_id": "1702ffxxad3xxx6fxxx97daf7c"}'

    Python指令碼

    • 發送單輪對話請求,程式碼範例如下:

      import requests
      
      EAS_URL = 'http://xxxx.****.cn-beijing.pai-eas.aliyuncs.com'
      headers = {
          'accept': 'application/json',
          'Content-Type': 'application/json',
          'Authorization': 'MDA5NmJkNzkyMGM1Zj****YzM4M2YwMDUzZTdiZmI5YzljYjZmNA==',
      }
      
      
      def test_post_api_query_llm():
          url = EAS_URL + '/service/query/llm'
          data = {
             "question":"什麼是人工智慧平台PAI?"
          }
          response = requests.post(url, headers=headers, json=data)
      
          if response.status_code != 200:
              raise ValueError(f'Error post to {url}, code: {response.status_code}')
          ans = dict(response.json())
          print(f"======= Question =======\n {data['question']}")
          print(f"======= Answer =======\n {ans['answer']} \n\n")
      
      
      def test_post_api_query_retrieval():
          url = EAS_URL + '/service/query/retrieval'
          data = {
             "question":"什麼是人工智慧平台PAI?"
          }
          response = requests.post(url, headers=headers, json=data)
      
          if response.status_code != 200:
              raise ValueError(f'Error post to {url}, code: {response.status_code}')
          ans = dict(response.json())
          print(f"======= Question =======\n {data['question']}")
          print(f"======= Answer =======\n {ans['docs']}\n\n")
      
      
      def test_post_api_query_rag():
          url = EAS_URL + '/service/query'
          data = {
             "question":"什麼是人工智慧平台PAI?"
          }
          response = requests.post(url, headers=headers, json=data)
      
          if response.status_code != 200:
              raise ValueError(f'Error post to {url}, code: {response.status_code}')
          ans = dict(response.json())
          print(f"======= Question =======\n {data['question']}")
          print(f"======= Answer =======\n {ans['answer']}")
          print(f"======= Retrieved Docs =======\n {ans['docs']}\n\n")
      # LLM
      test_post_api_query_llm()
      # Retrieval
      test_post_api_query_retrieval()
      # RAG(Retrieval+LLM)
      test_post_api_query_rag()
      

      其中:EAS_URL配置為RAG服務的訪問地址,您需要將訪問地址末尾的/刪除;Authorization配置為RAG服務的Token。

    • 發送多輪對話請求

      LLM和RAG(Retrieval+LLM)支援發送多輪對話請求,程式碼範例如下:

      import requests
      
      EAS_URL = 'http://xxxx.****.cn-beijing.pai-eas.aliyuncs.com'
      headers = {
          'accept': 'application/json',
          'Content-Type': 'application/json',
          'Authorization': 'MDA5NmJkN****jNlMDgzYzM4M2YwMDUzZTdiZmI5YzljYjZmNA==',
      }
      
      
      def test_post_api_query_llm_with_chat_history():
          url = EAS_URL + '/service/query/llm'
          # Round 1 query
          data = {
             "question":"什麼是人工智慧平台PAI?"
          }
          response = requests.post(url, headers=headers, json=data)
      
          if response.status_code != 200:
              raise ValueError(f'Error post to {url}, code: {response.status_code}')
          ans = dict(response.json())
          print(f"=======Round 1: Question =======\n {data['question']}")
          print(f"=======Round 1: Answer =======\n {ans['answer']} session_id: {ans['session_id']} \n")
         
          # Round 2 query
          data_2 = {
             "question": "它有什麼優勢?",
             "session_id": ans['session_id']
          }
          response_2 = requests.post(url, headers=headers, json=data_2)
      
          if response.status_code != 200:
              raise ValueError(f'Error post to {url}, code: {response.status_code}')
          ans_2 = dict(response_2.json())
          print(f"=======Round 2: Question =======\n {data_2['question']}")
          print(f"=======Round 2: Answer =======\n {ans_2['answer']} session_id: {ans_2['session_id']} \n\n")
      
      
      def test_post_api_query_rag_with_chat_history():
          url = EAS_URL + '/service/query'
         
          # Round 1 query
          data = {
             "question":"什麼是人工智慧平台PAI?"
          }
          response = requests.post(url, headers=headers, json=data)
      
          if response.status_code != 200:
              raise ValueError(f'Error post to {url}, code: {response.status_code}')
          ans = dict(response.json())
      
          print(f"=======Round 1: Question =======\n {data['question']}")
          print(f"=======Round 1: Answer =======\n {ans['answer']} session_id: {ans['session_id']}")
          print(f"=======Round 1: Retrieved Docs =======\n {ans['docs']}\n")
      
          # Round 2 query
          data = {
             "question":"它可以做什嗎?",
             "session_id": ans['session_id']
          }
          response = requests.post(url, headers=headers, json=data)
      
          if response.status_code != 200:
              raise ValueError(f'Error post to {url}, code: {response.status_code}')
          ans = dict(response.json())
      
          print(f"=======Round 2: Question =======\n {data['question']}")
          print(f"=======Round 2: Answer =======\n {ans['answer']} session_id: {ans['session_id']}")
          print(f"=======Round 2: Retrieved Docs =======\n {ans['docs']}")
      # LLM
      test_post_api_query_llm_with_chat_history()
      # RAG(Retrieval+LLM)
      test_post_api_query_rag_with_chat_history()
      

      其中:EAS_URL配置為RAG服務的訪問地址,您需要將訪問地址末尾的/刪除;Authorization配置為RAG服務的Token。

RDS PostgreSQL特色功能支援

串連作為向量檢索庫的RDS PostgreSQL資料庫後,可以查看已匯入的知識庫內容。串連資料庫請參見串連PostgreSQL執行個體

image

相關文檔

通過EAS,您還可以完成以下情境化部署:

  • 部署支援WebUI和API調用的LLM大語言模型,並在部署LLM應用後,利用LangChain框架組成企業知識庫,實現智能問答和自動化功能。詳情請參見5分鐘使用EAS一鍵部署LLM大語言模型應用

  • 部署基於ComfyUI和Stable Video Diffusion模型的AI視頻產生服務,協助您完成社交平台短視頻內容產生、動畫製作等任務。詳情請參見AI視頻產生-ComfyUI部署

常見問題

如何關閉RAG服務的with chat history功能

在RAG服務的WebUI頁面中,去勾選Chat history複選框。image