EAS提供了场景化部署方式,通过简单配置几个参数,您便可以一键部署集成了大语言模型(LLM)和检索增强生成(RAG)技术的对话系统服务,显著缩短服务部署时间。在使用该服务进行推理验证时,它能够有效地从知识库中检索相关信息,并与大语言模型的回答相结合,以产生准确且信息丰富的答案,从而大幅提高问答的质量和整体性能。该服务适用于问答、摘要生成和依赖外部知识的自然语言处理任务。本文为您介绍如何部署RAG对话系统服务以及如何进行模型推理验证。
背景信息
大语言模型(LLM)在生成准确性和实时性回复方面存在局限,因此并不适合直接用于需要精确信息的客服或问答等场景。为了解决这一问题,当前业界广泛采用的方法是利用检索增强生成(Retrieval-Augmented Generation, RAG)技术来增强LLM的性能,这一技术可以显著提升问答、摘要生成以及其他需要引用外部知识的自然语言处理(NLP)任务的质量。
RAG通过将大语言模型(如通义千问)和信息检索组件结合在一起,增强了模型生成答案的准确性和信息量。在处理用户查询时,RAG通过信息检索组件在知识库中寻找与查询相关的文档或信息片段,将这些检索到的内容与原始查询一同输入大语言模型之后,模型能够利用现有的归纳生成能力产生基于最新信息的、符合事实的回复,而无需对模型进行重新训练。
使用EAS部署的对话系统服务,通过集成大语言模型(LLM)和检索增强生成(RAG)技术,克服了LLM在准确性和实时性方面的局限,为多种问答场景提供了准确且信息丰富的响应,从而提升了自然语言处理任务的整体效能和用户体验。
前提条件
注意事项
本实践受制于LLM服务的最大Token数量限制,旨在帮助您体验RAG对话系统的基本检索功能:
该对话系统受制于LLM服务的服务器资源大小以及默认Token数量限制,能支持的对话长度有限。
如果无需进行多轮对话,建议您在RAG服务的WebUI页面关闭with chat history功能,这样能有效减少达到限制的可能性。详情请参见如何关闭RAG服务的with chat history功能。
步骤一:部署RAG服务
部署大模型RAG对话系统,并绑定向量检索库,具体操作步骤如下:
登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入EAS。
在模型在线服务(EAS)页面,单击部署服务,然后在场景化模型部署区域,单击大模型RAG对话系统部署。
在部署大模型RAG对话系统页面,配置以下关键参数。
基本信息
参数
描述
模型来源
支持以下两种模型来源:
开源公共模型:PAI预置了多种开源公共模型供您选择,包括Qwen、Llama、ChatGLM、Baichuan、Falcon、Yi、Mistral、Gemma、DeepSpeek等。您可以直接部署相应参数量的模型。
自持微调模型:PAI也支持部署您自行微调后的模型,来满足特定的场景。
模型类别
当使用开源公共模型时,您可以根据具体使用场景选择相应参数量的开源模型。
使用自持微调模型时,您需要根据您微调的模型,选择相应的模型类别、参数量以及精度。
模型配置
使用自持微调模型时,您需配置微调模型的文件路径。后续部署服务时,系统将从该路径读取模型配置文件。支持以下两种配置类型:
说明建议您在Huggingface的Transformers下运行微调后的模型,确认其输出结果符合预期后,再考虑将其部署为EAS服务。
对象存储(OSS):请选择微调模型文件所在的OSS存储路径。
文件存储(NAS):请选择微调模型文件所在的NAS文件系统、NAS挂载点和NAS源路径。
资源配置
参数
描述
资源配置选择
在选择模型类别后,系统将自动匹配适合的资源规格。更换至其他资源规格,可能会导致模型服务启动失败。
推理加速
目前,部署在A10或GU30系列机型上的Qwen、Llama2、ChatGLM或Baichuan2等系列模型服务,支持启用推理加速功能。支持以下两种加速类型:
PAI-BladeLLM自动推理加速:BladeLLM提供超高性价比的大模型推理加速能力,可帮助您一键享受高并发和低延时的技术优势。
开源框架vllm推理加速
向量检索库设置
RAG支持通过Faiss(Facebook AI Similarity Search)、Elasticsearch、Milvus、Hologres、OpenSearch或RDS PostgreSQL构建向量检索库。根据您的场景需要,任意选择一种版本类型,作为向量检索库。
FAISS
使用Faiss构建本地向量库,无需购买线上向量库产品,免去了线上开通向量库产品的复杂流程,更轻量易用。
参数
描述
版本类型
选择FAISS。
OSS地址
选择当前地域下已创建的OSS存储路径,用来存储上传的知识库文件。如果没有可选的存储路径,您可以参考控制台快速入门进行创建。
说明如果您选择使用自持微调模型部署服务,请确保所选的OSS存储路径不与自持微调模型所在的路径重复,以避免造成冲突。
ElasticSearch
配置阿里云ElasticSearch实例的连接信息。关于如何创建ElasticSearch实例及准备配置项,请参见准备向量检索库Elasticsearch。
参数
描述
版本类型
选择Elasticsearch。
私网地址/端口
配置Elasticsearch实例的私网地址和端口,格式为
http://<私网地址>:<私网端口>
。如何获取Elasticsearch实例的私网地址和端口号,请参见查看实例的基本信息。索引名称
输入新的索引名称或已存在的索引名称。对于已存在的索引名称,索引结构应符合PAI-RAG要求,例如您可以填写之前通过EAS部署RAG服务时自动创建的索引。
账号
配置创建Elasticsearch实例时配置的登录名,默认为elastic。
密码
配置创建Elasticsearch实例时配置的登录密码。如果您忘记了登录密码,可重置实例访问密码。
Milvus
配置Milvus实例的连接信息。关于如何创建Milvus实例及准备配置项,请参见准备向量检索库Milvus。
参数
描述
版本类型
选择Milvus。
访问地址
配置为Milvus实例内网地址。您可以前往阿里云Milvus控制台的实例详情页面的访问地址区域进行查看。
代理端口
配置为Milvus实例的Proxy Port,默认为19530。您可以前往阿里云Milvus控制台的实例详情页面的访问地址区域进行查看。
账号
配置为root。
密码
配置为创建Milvus实例时,您自定义的root用户的密码。
数据库名称
配置为数据库名称,例如default。创建Milvus实例时,系统会默认创建数据库default,您也可以手动创建新的数据库,具体操作,请参见管理Databases。
Collection名称
输入新的Collection名称或已存在的Collection名称。对于已存在的Collection,Collection结构应符合PAI-RAG要求,例如您可以填写之前通过EAS部署RAG服务时自动创建的Collection。
Hologres
配置为Hologres实例的连接信息。如果未开通Hologres实例,可参考购买Hologres进行操作。
参数
描述
版本类型
选择Hologres。
调用信息
配置为指定VPC的host信息。进入Hologres管理控制台的实例详情页,在网络信息区域单击指定VPC后的复制,获取域名
:80
前的host信息。数据库名称
配置为Hologres实例的数据库名称。如何创建数据库,详情请参见创建数据库。
账号
配置为已创建的自定义用户账号。具体操作,请参见创建自定义用户,其中选择成员角色选择实例超级管理员(SuperUser)。
密码
配置为已创建的自定义用户的密码。
表名称
输入新的表名称或已存在的表名称。对于已存在的表名称,表结构应符合PAI-RAG要求,例如可以填写之前通过EAS部署RAG服务自动创建的Hologres表。
OpenSearch
配置为OpenSearch向量检索版实例的连接信息。关于如何创建OpenSearch实例及准备配置项,请参见准备向量检索库OpenSearch。
参数
描述
版本类型
选择OpenSearch。
访问地址
配置为OpenSearch向量检索版实例的公网访问地址。您需要为OpenSearch向量检索版实例开通公网访问功能,具体操作,请参见准备向量检索库OpenSearch。
实例id
在OpenSearch向量检索版实例列表中获取实例ID。
用户名
配置为创建OpenSearch向量检索版实例时,输入的用户名和密码。
密码
表名称
配置为准备OpenSearch向量检索版实例时创建的索引表名称。如何准备索引表,请参见准备向量检索库OpenSearch。
RDS PostgreSQL
配置为RDS PostgreSQL实例数据库的连接信息。关于如何创建RDS PostgreSQL实例及准备配置项,请参见准备向量检索库RDS PostgreSQL。
参数
描述
版本类型
选择RDS PostgreSQL。
主机地址
配置为RDS PostgreSQL实例的内网地址,您可以前往云数据库RDS PostgreSQL控制台页面,在RDS PostgreSQL实例的数据库连接页面进行查看。
端口
默认为5432,请根据实际情况填写。
数据库
配置为已创建的数据库名称。如何创建数据库和账号,请参见创建账号和数据库,其中:
创建账号时,账号类型选择高权限账号。
创建数据库时,授权账号选择已创建的高权限账号。
表名称
自定义配置数据库表名称。
账号
配置为已创建的高权限账号和密码。如何创建高权限账号,请参见创建账号和数据库,其中账号类型选择高权限账号。
密码
专有网络配置
参数
描述
VPC
当选择Hologres、ElasticSearch、Milvus、OpenSearch或RDS PostgreSQL作为向量检索库时,请确保所配置的专有网络与选定的向量检索库保持一致。
说明使用OpenSearch作为向量检索库时,此处可以使用其他专有网络,但需要确保该专有网络具有公网访问能力,并将绑定的弹性公网IP添加为OpenSearch实例的公网访问白名单。具体操作,请参见使用公网NAT网关SNAT功能访问互联网和公网白名单配置。
当选择Faiss作为向量检索库时,无需配置专有网络。
交换机
安全组名称
单击部署。
当服务状态变为运行中时,表示服务部署成功。
步骤二:通过WebUI页面进行调试
请按照以下操作步骤,在WebUI页面上传企业知识库文件并对问答效果进行调试。
1、连接向量检索库
RAG服务部署成功后,单击服务方式列下的查看Web应用,启动WebUI页面。
配置Embedding模型。系统将通过该模型将文本分块转换为Embedding向量。
Embedding Model Name:系统内置四种模型供您选择,将自动为您配置最合适的模型。
Embedding Dimension:设置Embedding维度,维度的设置对模型的性能有直接影响。在您选择Embedding模型后,系统将自动配置Embedding维度,无需手动操作。
测试向量检索库连接是否正常。
系统已自动识别并应用了部署服务时配置的向量检索库设置。以Hologres为例,您可以单击Connect Hologres,来验证Hologres连接是否正常。如果连接失败,请检查步骤一中向量检索库配置是否正确,修改对应配置项为正确配置,然后重新连接实例。
2、上传企业知识库文件
您可以按照以下流程上传您的企业知识库文件,系统会自动按照PAI-RAG格式将知识库存储到向量检索库中,以方便您进行后续的知识检索。您也可以利用向量检索库中已有的知识库,但必须符合PAI-RAG格式要求,否则可能会导致检索报错。
在Upload页签,设置语义分块参数。
通过配置以下参数来控制文档分块粒度的大小和进行QA信息提取:
参数
描述
Chunk Size
指定每个文本分块的大小,单位为字节,默认为500。
Chunk Overlap
表示相邻分块之间的重叠量,默认为10。
Process with QA Extraction Model
通过选中Yes复选框启动QA信息提取功能,系统将在您上传企业知识库文件后自动抽取出QA对,以获得更好的检索和回答效果。
在Files或Directory页签下上传企业知识库文件(支持多文件上传)或对应目录。支持的文件类型为.txt、.pdf、Excel(.xlsx或.xls)、.csv、Word(.docx或.doc)、Markdown或.html,例如rag_chatbot_test_doc.txt。
单击Upload,系统会先对上传的文件进行数据清洗(包括文本提取、超链接替换等)和语义切块,然后进行上传。
3、配置模型推理参数
在Chat页签配置问答策略:
配置Retrieval问答策略
参数 | 说明 |
Streaming Output | 选中Streaming Output后,系统将以流式方式输出结果。 |
Retrieval Mode | 支持以下三种检索方式:
说明 在大多数复杂场景下,向量数据库检索召回都能有较好的表现。但在某些语料稀缺的垂直领域,或要求准确匹配的场景,向量数据库检索召回方式可能不如传统的稀疏检索召回方式。稀疏检索召回方法通过计算用户查询与知识文档的关键词重叠度来进行检索,因此更为简单和高效。 PAI提供了BM25等关键词检索召回算法来完成稀疏检索召回操作。向量数据库检索召回和关键词检索召回具有各自的优势和不足,因此综合二者的召回结果能够提高整体的检索准确性和效率。 倒数排序融合(Reciprocal Rank Fusion, RRF)算法通过对每个文档在不同召回方法中的排名进行加权求和,以此计算融合后的总分数。当Retrieval选择Hybrid时,PAI将默认使用RRF算法对向量数据库召回结果和关键词检索召回结果进行多路召回融合。 |
Reranker Type | 大多数向量数据库为了计算效率会牺牲一定程度的准确性,这使其检索结果存在一定随机性,原始返回的Top K不一定最相关。您可以选择以下两种排序类型,对向量数据库第一次召回的Top K结果进行精度更高的Re-Rank操作,以得到相关度更高、更准确的知识文档。
|
Top K | 向量检索库返回的相似结果数,即从向量数据库中召回Top K条相似结果。 |
配置RAG(Retrieval + LLM)问答策略
PAI提供多种不同的Prompt策略,您可以选择合适的预定义Prompt模板或输入自定义的Prompt模板以获得更好的推理效果。RAG系统会将检索返回的结果与用户问题填充到提示词模板中,随后一并提交至大型语言模型进行处理。
此外RAG(Retrieval + LLM)问答方式还支持配置Streaming Output、Retrieval Mode和Reranker Type等参数。关于这些参数的配置说明,请参见配置Retrieval问答策略。
4、模型推理验证
Retrieval
直接从向量数据库中检索并返回Top K条相似结果。
LLM
直接与EAS-LLM对话,返回大模型的回答。
RAG(Retrieval + LLM)
将检索返回的结果与用户问题填充至已选择的Prompt模板中,一并送入EAS-LLM服务进行处理,从中获取问答结果。
调试完成后,您可以基于PAI提供的API将其应用到您自己的业务系统中,详情请参见步骤三:通过API调用进行模型推理。
步骤三:通过API调用进行模型推理
获取RAG服务的调用信息。
单击RAG服务名称,进入服务详情页面。
在基本信息区域,单击查看调用信息。
在调用信息对话框的公网地址调用页签,获取服务访问地址和Token。
您还可以根据已生成的符合PAI-RAG格式的表结构,将企业知识库自行上传到向量检索库中。
通过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部署。
一键部署基于Stable Diffusion WebUI的服务。详情请参见AI绘画-SDWebUI部署。
常见问题
如何关闭RAG服务的with chat history功能
在RAG服务的WebUI页面中,去勾选Chat history复选框。