全部產品
Search
文件中心

Platform For AI:大模型RAG對話系統

更新時間:Aug 31, 2024

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

背景資訊

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

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

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

前提條件

  • 已建立一個Virtual Private Cloud、交換器和安全性群組。詳情請參見建立和管理專用網路建立安全性群組

    說明

    使用Faiss作為向量檢索庫時,不需要建立VPC、交換器和安全性群組。

  • 當使用微調模型部署服務時,您需要準備OSS儲存空間(Bucket)或NAS檔案系統,用來存放微調的模型檔案。具體操作,請參見控制台快速入門建立檔案系統

    說明

    使用Faiss作為向量檢索庫時,需要準備OSS儲存空間(Bucket)。

使用限制

向量檢索庫和EAS必須在相同地區下。

注意事項

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

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

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

步驟一:準備向量檢索庫

RAG支援通過Faiss(Facebook AI Similarity Search)ElasticsearchHologresOpenSearchRDS PostgreSQL構建向量檢索庫。您需要擷取相關配置參數,以便後續串連向量檢索庫。

Faiss

使用Faiss構建本地向量庫,無需購買線上向量庫產品,免去了線上開通向量庫產品的複雜流程,更輕量易用。

Elasticsearch

  1. 建立Elasticsearch執行個體。具體操作,請參見建立Elasticsearch執行個體

    其中:

    • 執行個體類型選擇通用商業版

    • 您需要將配置的登入名稱登入密碼儲存到本地。

  2. 單擊執行個體名稱,進入執行個體基本資料頁面。在該頁面擷取私網地址私網連接埠並儲存到本地。

Hologres

  1. 開通Hologres執行個體並建立資料庫。具體操作,請參見購買Hologres建立資料庫。您需要將已建立的資料庫名稱儲存到本地。

  2. 在執行個體詳情頁面查看調用資訊。

    1. 單擊執行個體名稱,進入執行個體詳情頁面。

    2. 網路資訊地區,單擊指定VPC後的複製,將網域名稱:80前面的內容儲存到本地。

  3. 切換到帳號管理Tab頁,建立自訂使用者。並將帳號和密碼儲存到本地,後續用於串連Hologres執行個體。具體操作,請參見建立自訂使用者

    其中:選擇成員角色選擇執行個體超級管理員(SuperUser)

OpenSearch

  1. 建立OpenSearch向量檢索版執行個體。具體操作,請參見購買OpenSearch向量檢索版執行個體

    執行個體建立成功後,會進入待配置狀態。

  2. 執行個體列表頁面,查看OpenSearch向量檢索版的執行個體ID,並儲存到本地。

  3. 準備索引表。

    1. 執行個體列表頁面,單擊目標執行個體操作列下的配置

    2. 表管理頁面,為該執行個體配置表基礎資訊>資料同步>欄位配置>索引結構,之後等待索引重建完成即可正常搜尋。具體操作,請參見通用版快速入門

      其中進行欄位配置時,您可以將以下樣本內容儲存為JSON檔案,然後單擊欄位配置頁面右上方的匯入欄位索引結構,並按控制台操作指引匯入索引檔案。匯入後,將基於檔案內容填寫欄位配置和索引結構。

      {
      	"schema": {
      		"summarys": {
      			"parameter": {
      				"file_compressor": "zstd"
      			},
      			"summary_fields": [
      				"id",
      				"embedding",
      				"file_path",
      				"file_name",
      				"file_type",
      				"node_content",
      				"node_type",
      				"doc_id",
      				"text",
      				"source_type"
      			]
      		},
      		"file_compress": [
      			{
      				"name": "file_compressor",
      				"type": "zstd"
      			},
      			{
      				"name": "no_compressor",
      				"type": ""
      			}
      		],
      		"indexs": [
      			{
      				"index_fields": [
      					{
      						"boost": 1,
      						"field_name": "id"
      					},
      					{
      						"boost": 1,
      						"field_name": "embedding"
      					}
      				],
      				"indexer": "aitheta2_indexer",
      				"index_name": "embedding",
      				"parameters": {
      					"enable_rt_build": "true",
      					"min_scan_doc_cnt": "20000",
      					"vector_index_type": "Qc",
      					"major_order": "col",
      					"builder_name": "QcBuilder",
      					"distance_type": "SquaredEuclidean",
      					"embedding_delimiter": ",",
      					"enable_recall_report": "true",
      					"ignore_invalid_doc": "true",
      					"is_embedding_saved": "false",
      					"linear_build_threshold": "5000",
      					"dimension": "1536",
      					"rt_index_params": "{\"proxima.oswg.streamer.segment_size\":2048}",
      					"search_index_params": "{\"proxima.qc.searcher.scan_ratio\":0.01}",
      					"searcher_name": "QcSearcher",
      					"build_index_params": "{\"proxima.qc.builder.quantizer_class\":\"Int8QuantizerConverter\",\"proxima.qc.builder.quantize_by_centroid\":true,\"proxima.qc.builder.optimizer_class\":\"BruteForceBuilder\",\"proxima.qc.builder.thread_count\":10,\"proxima.qc.builder.optimizer_params\":{\"proxima.linear.builder.column_major_order\":true},\"proxima.qc.builder.store_original_features\":false,\"proxima.qc.builder.train_sample_count\":3000000,\"proxima.qc.builder.train_sample_ratio\":0.5}"
      				},
      				"index_type": "CUSTOMIZED"
      			},
      			{
      				"has_primary_key_attribute": true,
      				"index_fields": "id",
      				"is_primary_key_sorted": false,
      				"index_name": "id",
      				"index_type": "PRIMARYKEY64"
      			},
      			{
      				"index_fields": "file_path",
      				"index_name": "file_path",
      				"index_type": "STRING"
      			},
      			{
      				"index_fields": "file_name",
      				"index_name": "file_name",
      				"index_type": "STRING"
      			},
      			{
      				"index_fields": "file_type",
      				"index_name": "file_type",
      				"index_type": "STRING"
      			},
      			{
      				"index_fields": "node_content",
      				"index_name": "node_content",
      				"index_type": "STRING"
      			},
      			{
      				"index_fields": "node_type",
      				"index_name": "node_type",
      				"index_type": "STRING"
      			},
      			{
      				"index_fields": "doc_id",
      				"index_name": "doc_id",
      				"index_type": "STRING"
      			},
      			{
      				"index_fields": "text",
      				"index_name": "text",
      				"index_type": "STRING"
      			},
      			{
      				"index_fields": "source_type",
      				"index_name": "source_type",
      				"index_type": "STRING"
      			}
      		],
      		"attributes": [
      			{
      				"file_compress": "no_compressor",
      				"field_name": "id"
      			},
      			{
      				"file_compress": "no_compressor",
      				"field_name": "embedding"
      			},
      			{
      				"file_compress": "no_compressor",
      				"field_name": "file_path"
      			},
      			{
      				"file_compress": "no_compressor",
      				"field_name": "file_name"
      			},
      			{
      				"file_compress": "no_compressor",
      				"field_name": "file_type"
      			},
      			{
      				"file_compress": "no_compressor",
      				"field_name": "node_content"
      			},
      			{
      				"file_compress": "no_compressor",
      				"field_name": "node_type"
      			},
      			{
      				"file_compress": "no_compressor",
      				"field_name": "doc_id"
      			},
      			{
      				"file_compress": "no_compressor",
      				"field_name": "text"
      			},
      			{
      				"file_compress": "no_compressor",
      				"field_name": "source_type"
      			}
      		],
      		"fields": [
      			{
      				"compress_type": "uniq",
      				"field_type": "STRING",
      				"field_name": "id"
      			},
      			{
      				"user_defined_param": {
      					"multi_value_sep": ","
      				},
      				"multi_value": true,
      				"compress_type": "uniq",
      				"field_type": "FLOAT",
      				"field_name": "embedding"
      			},
      			{
      				"compress_type": "uniq",
      				"field_type": "STRING",
      				"field_name": "file_path"
      			},
      			{
      				"compress_type": "uniq",
      				"field_type": "STRING",
      				"field_name": "file_name"
      			},
      			{
      				"compress_type": "uniq",
      				"field_type": "STRING",
      				"field_name": "file_type"
      			},
      			{
      				"compress_type": "uniq",
      				"field_type": "STRING",
      				"field_name": "node_content"
      			},
      			{
      				"compress_type": "uniq",
      				"field_type": "STRING",
      				"field_name": "node_type"
      			},
      			{
      				"compress_type": "uniq",
      				"field_type": "STRING",
      				"field_name": "doc_id"
      			},
      			{
      				"compress_type": "uniq",
      				"field_type": "STRING",
      				"field_name": "text"
      			},
      			{
      				"compress_type": "uniq",
      				"field_type": "STRING",
      				"field_name": "source_type"
      			}
      		],
      		"table_name": "abc"
      	},
      	"extend": {
      		"description": [],
      		"vector": [
      			"embedding"
      		],
      		"embeding": []
      	}
      }
  4. 為建立執行個體時綁定的Virtual Private Cloud配置公網訪問功能。具體操作,請參見使用公網NAT GatewaySNAT功能訪問互連網

  5. 為OpenSearch向量檢索版執行個體開通公網訪問。

    說明

    當前,OpenSearch執行個體無法直接通過內網地址被EAS訪問。如需實現內網訪問功能,您需要聯絡您的商務經理。

    1. 查看已綁定的Elastic IP Address地址。

      1. 進入專用網路的資源管理頁面,具體操作,請參見查看專用網路

      2. 單擊已綁定的公網NAT Gateway,進入公網NAT Gateway頁面。image

      3. 單擊公網NAT Gateway執行個體ID,進入基本資料頁面。

      4. 單擊綁定的Elastic IP Address,查看已綁定的Elastic IP Address地址,並儲存到本地。image

    2. 在OpenSearch向量檢索版執行個體列表頁面,單擊目標執行個體名稱,進入執行個體詳情頁面。

    3. 網路資訊地區,開啟公網訪問開關,並在修改公網訪問白名單配置面板中,按照控制台操作指引,將上述步驟已查詢的Elastic IP Address配置為公網訪問白名單。

    4. 網路資訊地區,將公網網域名稱後的訪問地址儲存到本地。

  6. 查看執行個體使用者名稱和密碼。

    即在建立OpenSearch向量檢索版執行個體時,輸入的使用者名稱和密碼。您可以在執行個體詳情頁面的API入口地區查看。image

RDS PostgreSQL

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

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

    其中:

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

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

  3. 設定資料庫串連。

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

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

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

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

      • 使用外網地址:您需要開通外⽹地址,並將0.0.0.0/0加⼊⽩名單。具體操作,請參見開通或關閉外網地址

步驟二:部署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推理加速

    • 向量檢索庫設定

      根據您的情境需要,任意選擇一種版本類型,作為向量檢索庫。

      FAISS

      參數

      描述

      版本類型

      選擇FAISS

      OSS地址

      選擇當前地區下已建立的OSS儲存路徑。如果沒有可選的儲存路徑,您可以參考控制台快速入門進行建立。

      Elasticsearch

      參數

      描述

      版本類型

      選擇Elasticsearch

      私網地址/連接埠

      配置為步驟一中擷取的私網地址和連接埠,格式為:http://私網地址:連接埠

      索引名稱

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

      帳號

      配置為步驟一中建立Elasticsearch執行個體時配置的登入名稱。

      密碼

      配置為步驟一中建立Elasticsearch執行個體時配置的登入密碼。

      Hologres

      參數

      描述

      版本類型

      選擇Hologres

      調用資訊

      配置為步驟一中查詢到的Hologres調用資訊。

      資料庫名稱

      配置為步驟一中建立的資料庫名稱。

      帳號

      配置為步驟一中建立的自訂使用者的帳號。

      密碼

      配置為步驟一中建立的自訂使用者的密碼。

      表名稱

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

      OpenSearch

      參數

      描述

      訪問地址

      配置為步驟一中查詢的公網訪問地址。

      執行個體id

      配置為步驟一中已建立的OpenSearch向量檢索版執行個體ID。

      使用者名稱

      配置為步驟一中建立OpenSearch向量檢索版執行個體時,輸入的使用者名稱和密碼。

      密碼

      表名稱

      配置為步驟一中配置OpenSearch向量檢索版執行個體時建立的索引表名稱。

      RDS PostgreSQL

      參數

      描述

      主機地址

      配置為步驟一中查詢到內網地址或外網地址。

      連接埠

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

      資料庫

      配置為步驟一中已建立的資料庫名稱。

      表名稱

      自訂設定資料庫名稱。

      帳號

      配置為步驟一中建立的高許可權帳號。

      密碼

      配置為步驟一中建立的高許可權帳號的密碼。

    • 專用網路配置

      參數

      描述

      VPC

      • 當選擇Hologres、Elasticsearch、OpenSearch或RDS PostgreSQL作為向量檢索庫時,請確保所配置的專用網路與選定的向量檢索庫保持一致。

        說明

        使用OpenSearch作為向量檢索庫時,此處可以使用其他專用網路,但需要確保該專用網路具有公網訪問能力,並將綁定的Elastic IP Address添加為OpenSearch執行個體的公網訪問白名單。具體操作,請參見使用公網NAT GatewaySNAT功能訪問互連網公網白名單配置

      • 當選擇Faiss作為向量檢索庫時,無需配置專用網路。

      交換器

      安全性群組名稱

  4. 單擊部署

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

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

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

1、配置RAG對話系統

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

  2. 配置機器學習模型。

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

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

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

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

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. 單擊Upload,系統會先對上傳的檔案進行資料清洗(文本提取、超連結替換等)和語義切塊,然後進行上傳。image

3、配置模型推理參數

配置Retrieval問答策略

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

image

參數

說明

Streaming Output

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

Top K

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

Re-Rank Model

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

說明

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

Keyword Model

支援以下三種檢索方式:

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

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

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

說明

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

PAI提供了BM25等關鍵詞檢索召回演算法來完成稀疏檢索召回操作。向量資料庫檢索召回和關鍵詞檢索召回具有各自的優勢和不足,因此綜合二者的召回結果能夠提高整體的檢索準確性和效率。倒數排序融合(Reciprocal Rank Fusion, RRF)演算法通過對每個文檔在不同召回方法中的排名進行加權求和,以此計算融合後的總分數。當Retrieval選擇Hybrid時,PAI將預設使用RRF演算法對向量資料庫召回結果和關鍵詞檢索召回結果進行多路召回融合。

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

Chat頁簽中,配置RAG(Retrieval + LLM)問答策略。2f946624a50449a379a901b6a8bf716d

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

  • 此外RAG(Retrieval + LLM)問答方式還支援配置Streaming Output、Re-Rank Model和Keyword Model,關於這些參數的配置說明,請參見配置Retrieval問答策略

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頁面串連向量資料庫,並上傳業務資料檔案。具體操作,請參見1、配置RAG對話系統2、上傳指定的業務資料檔案

  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。

相關文檔

通過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