大模型RAG对话系统最佳实践,旨在指引AI开发人员如何有效地结合LLM大语言模型的推理能力和外部知识库检索增强技术,使其能更加灵活地返回用户查询的内容,从而显著提升对话系统的性能。适用于问答、摘要生成和其他依赖外部知识的自然语言处理任务。通过该实践,您可以掌握构建一个大模型RAG对话系统的完整开发链路。
背景信息
大语言模型(LLM)在生成准确和实时的回复方面存在局限性,不适合直接用于需要精确信息的客服或问答等场景。当前业界普遍采用检索增强生成(Retrieval-Augmented Generation, RAG)技术来改善LLM的表现。该技术通过结合大语言模型(LLM)(如通义千问)的归纳生成能力和向量检索库的检索能力,增强对用户查询内容的理解,提高生成文本的准确性和丰富度,从而生成更加可靠的回复。在响应用户查询时,RAG对话系统首先利用检索系统从知识库中检索相关内容,然后将检索到的内容与原始查询一同输入大语言模型(LLM),无需重新训练LLM模型就能够获取最新的信息,并产生可靠的输出。
RAG对话系统特别适用于问答、摘要生成和其他依赖外部知识的自然语言处理任务,并且提供定制化提示(Prompt)和基于检索的多轮对话管理功能。通过LangChain实现这些应用,从而进一步提升了用户交互体验和答案质量。
方案架构
本方案包括以下功能模块:
向量检索库准备:根据场景需求选择开通Hologres、AnalyticDB PostgreSQL、ElasticSearch,或使用Faiss作为向量检索库供后续RAG对话系统使用。
对话模型推理服务在线部署:您可以在EAS中将对话模型部署为在线服务,以供后续在RAG对话系统中调用模型服务。
RAG服务在线部署:您可以在EAS中部署集成LangChain的WebUI服务。
在WebUI界面进行知识问答:打开RAG服务的WebUI应用,然后串联自定义的业务数据进行知识问答,验证对话系统的效果。
前提条件
已开通PAI(EAS)并创建了默认工作空间。具体操作,请参见开通PAI并创建默认工作空间。
如果使用RAM用户来部署模型,需要为RAM用户授予EAS的管理权限,详情请参见云产品依赖与授权:EAS。
步骤一:准备向量检索库
您可以选择以下任意一种产品构建本地向量库:
其中,Faiss无需开通或购买即可使用,Hologres、AnalyticDB PostgreSQL和ElasticSearch需要开通并准备相应的WebUI界面配置参数。后续您可以使用准备好的参数连接向量检索库。
Hologres
开通Hologres实例并创建数据库。具体操作,请参见购买Hologres和创建数据库。您需要将已创建的数据库名称保存到本地。
在实例详情页面查看调用信息。
单击实例名称,进入实例详情页面。
在网络信息区域,单击指定VPC后的复制,将域名
:80
前面的内容保存到本地。
切换到账号管理Tab页,创建自定义用户。并将账号和密码保存到本地,后续用于连接Hologres实例。具体操作,请参见创建自定义用户。
其中:选择成员角色选择实例超级管理员(SuperUser)。
AnalyticDB for PostgreSQL
ElasticSearch
创建阿里云Elasticsearch实例。具体操作,请参见创建阿里云Elasticsearch实例。
其中:
实例类型选择通用商业版。
场景初始化配置选择通用场景。
您需要将配置的登录名和登录密码保存到本地。
单击实例名称,进入实例基本信息页面。在该页面获取私网地址和私网端口并保存到本地。
Faiss
使用Faiss构建本地向量库,无需购买线上向量库产品,免去了线上开通向量库产品的复杂流程,更轻量易用。
步骤二:部署模型服务
在本方案中,您需要部署以下两个服务:一是作为用户交互主体的对话模型推理服务,二是用于知识文档预处理和QA信息提取的RAG服务。具体操作步骤如下:
部署对话模型推理服务
本方案以预置镜像为例,介绍如何部署对话模型推理服务。
进入模型在线服务EAS。
登录PAI控制台。
在左上角顶部菜单栏选择目标地域。
在左侧导航栏选择模型部署 > 模型在线服务(EAS),在下拉框中选择目标工作空间后单击进入EAS。
在模型在线服务页面,单击部署服务,在自定义模型部署区域单击自定义部署。
在部署服务页面,配置以下关键参数。
参数
描述
服务名称
自定义服务名称。
部署方式
选择镜像部署AI-Web应用。
镜像选择
在PAI平台镜像列表中选择chat-llm-webui;镜像版本选择2.0。
说明由于版本迭代迅速,部署时镜像版本选择最高版本即可。
运行命令
不同的模型类型对应的运行命令如下:
使用chatglm2-6b模型进行部署:
python webui/webui_server.py --port=8000 --model-path=THUDM/chatglm2-6b
。使用通义千问-7b模型进行部署:
python webui/webui_server.py --port=8000 --model-path=Qwen/Qwen-7B-Chat
。使用llama2-7b模型进行部署:
python webui/webui_server.py --port=8000 --model-path=meta-llama/Llama-2-7b-chat-hf
。使用Llama2-13b模型进行部署:
python webui/webui_server.py --port=8000 --model-path=meta-llama/Llama-2-13b-chat-hf --precision=fp16
。
端口号配置为:8000。
资源组种类
选择公共资源组。
资源配置方法
选择常规资源配置。
资源配置选择
必须选择GPU类型,实例规格推荐使用ml.gu7i.c16m60.1-gu30(性价比最高);
若您选择使用Llama2-13b模型,实例规格推荐使用ecs.gn6e-c12g1.3xlarge。
专有网络配置
当选择Hologres、AnalyticDB for PostgreSQL或ElasticSearch作为向量检索库时,请确保所配置的专有网络与选定的向量检索库保持一致。
当选择Faiss作为向量检索库时,请随意选择一个专有网络。
单击部署,等待一段时间即可完成模型部署。
当服务状态为运行中时,表明服务部署成功。
获取VPC地址调用的服务访问地址和Token。
单击服务名称,进入服务详情页面。
在基本信息区域,单击查看调用信息。
在调用信息对话框的VPC地址调用页签,获取服务访问地址和Token,并保存到本地。
部署RAG服务并启动WebUI
PAI提供了最方便快捷的部署方式,您可以直接在EAS中选择指定的镜像部署RAG服务,具体操作步骤如下。更多关于RAG链路的详细介绍,请参见GitHub开源代码。
在模型在线服务页面,单击部署服务,在自定义模型部署区域单击自定义部署。
在部署服务页面,配置以下关键参数。
参数
描述
服务名称
自定义服务名称。本案例使用的示例值为:chatbot_langchain_vpc。
部署方式
选择镜像部署AI-Web应用。
镜像选择
在PAI平台镜像列表中选择chatbot-langchain,镜像版本选择1.0。
由于版本迭代迅速,部署时镜像版本选择最高版本即可。
运行命令
服务运行命令:
python webui.py --port=8000
。端口号输入:8000。
资源组种类
选择公共资源组。
资源配置方法
必须选择GPU类型,实例规格推荐使用ml.gu7i.c16m60.1-gu30(性价比最高)。
额外系统盘:70G。
专有网络配置
当选择Hologres、AnalyticDB for PostgreSQL或ElasticSearch作为向量检索库时,请确保所配置的专有网络与选定的向量检索库保持一致。
当选择Faiss作为向量检索库时,与对话模型推理服务配置的专有网络保持一致。
单击部署,等待一段时间即可完成模型部署。
当服务状态为运行中时,表明服务部署成功。
服务部署成功后,单击服务方式列下的查看Web应用,进入WebUI页面。
步骤三:通过WebUI页面进行模型推理验证
您可以先在WebUI页面,参考以下操作步骤对服务进行调试。当您在WebUI页面调试好问答效果后,可以基于PAI提供的API将其应用到您自己的业务系统中。具体操作步骤如下:
1、配置RAG对话系统
如下图所示,您可以在RAG服务WebUI界面的Settings选项卡中,根据选择的向量检索库配置相关参数,并测试连接是否正常。
具体参数配置详情如下:
Emebdding Model:支持选择6种模型,推荐使用SGPT-125M-weightedmean-nli-bitfit。
Emebdding Dimension:选择Emebdding Model后,系统会自动进行配置,无需手动操作。
EAS Url:配置为步骤二中获取的服务访问地址。
EAS Token:配置为步骤二中获取的服务Token。
配置Vector Store。不同的向量检索库对应的参数配置详情如下:
Hologres
Host:配置为步骤一中查询到的Hologres调用信息。
Database:配置为步骤一中创建的数据库名称。
User:配置为步骤一中创建的自定义用户的账号。
Password:配置为步骤一中创建的自定义用户的密码。
Table:配置数据库表名称,例如test_table。
以上参数配置完成后,单击Connect Hologres,验证Hologres实例是否连接正常。
AnalyticDB
ElasticSearch
URL:配置为步骤一中获取的私网地址和端口,格式为:
http://私网地址:端口
。Index:用户自定义的索引名称。
User:配置为步骤一中创建ElasticSearch实例时配置的登录名。
Password:配置为步骤一中创建ElasticSearch实例时配置的登录密码。
以上参数配置完成后,单击Connect ElasticSearch,验证ElasticSearch实例是否连接正常。
Faiss
Path:用户自定义的数据库文件夹名称。例如faiss_path。
Index:用户自定义的索引文件夹名称。例如faiss_index。
此外,您还可以通过在Settings选项卡中上传JSON配置文件,并单击Parse config来解析配置文件。解析成功后,WebUI页面将自动根据配置文件内容填写相应配置。不同的向量检索库对应的配置文件内容如下:
Hologres
{
"embedding": {
"model_dir": "embedding_model/",
"embedding_model": "SGPT-125M-weightedmean-nli-bitfit",
"embedding_dimension": 768
},
"LLM": "EAS",
"EASCfg": {
"url": "http://xx.vpc.pai-eas.aliyuncs.com/api/predict/chatllm_demo_glm2",
"token": "xxxxxxx=="
},
"vector_store": "Hologres",
"HOLOCfg": {
"PG_HOST": "hgpostcn-cn.xxxxxx.vpc.hologres.aliyuncs.com",
"PG_PORT": "80",
"PG_DATABASE": "langchain",
"PG_USER": "user",
"PG_PASSWORD": "password"
}
}
其中:EASCfg即为在步骤二中获取的对话模型推理服务的访问地址和Token。HOLOCfg即为Hologres的相关配置。您可以参考WebUI界面参数说明进行配置。
AnalyticDB
{
"embedding": {
"model_dir": "embedding_model/",
"embedding_model": "SGPT-125M-weightedmean-nli-bitfit",
"embedding_dimension": 768
},
"LLM": "EAS",
"EASCfg": {
"url": "http://xx.pai-eas.aliyuncs.com/api/predict/chatllm_demo_glm2",
"token": "xxxxxxx=="
},
"vector_store": "AnalyticDB",
"ADBCfg": {
"PG_HOST": "gp.xxxxx.rds.aliyuncs.com",
"PG_USER": "xxxxxxx",
"PG_DATABASE": "xxxxxxx",
"PG_PASSWORD": "passwordxxxx",
"PG_COLLECTION_NAME": "xxxxxxx"
}
}
其中:EASCfg即为在步骤二中获取的对话模型推理服务的访问地址和Token。ADBCfg即为AnalyticDB PostgreSQL的相关配置。您可以参考WebUI界面参数说明进行配置。
ElasticSearch
{
"embedding": {
"model_dir": "embedding_model/",
"embedding_model": "SGPT-125M-weightedmean-nli-bitfit",
"embedding_dimension": 768
},
"LLM": "EAS",
"EASCfg": {
"url": "http://xx.pai-eas.aliyuncs.com/api/predict/chatllm_demo_glm2",
"token": "xxxxxxx=="
},
"vector_store": "ElasticSearch",
"ElasticSearchCfg": {
"ES_URL": "http://es-cn-xxx.elasticsearch.aliyuncs.com:9200",
"ES_USER": "elastic",
"ES_PASSWORD": "password",
"ES_INDEX": "test_index"
}
}
其中:EASCfg即为在步骤二中获取的对话模型推理服务的访问地址和Token。ElasticSearchCfg即为ElasticSearch的相关配置。您可以参考WebUI界面参数说明进行配置。
Faiss
{
"embedding": {
"model_dir": "embedding_model/",
"embedding_model": "SGPT-125M-weightedmean-nli-bitfit",
"embedding_dimension": 768
},
"LLM": "EAS",
"EASCfg": {
"url": "http://xx.vpc.pai-eas.aliyuncs.com/api/predict/chatllm_demo_glm2",
"token": "xxxxxxx=="
},
"vector_store": "FAISS",
"FAISS": {
"index_path": "faiss_index",
"index_name": "faiss_file"
}
}
其中:EASCfg即为在步骤二中获取的对话模型推理服务的访问地址和Token。index_path为用户自定义的索引文件夹名称。index_name为用户自定义的数据库文件夹名称。
2、上传知识库文档,并通过配置参数实现特定产品能力
在RAG服务的WebUI页面中,切换到Upload选项卡,通过配置相关参数,实现特定产品能力。
产品能力
配置方法
文档清洗与切分
在构建向量检索库前,系统会对您所上传的源码文件进行文本处理。您可以通过配置以下参数对源码文件进行数据清洗(文本提取、超链替换等)和语义切块(chunk)处理:
Chunk Size:指定每个分块的大小,单位为字节,默认为200。仅当文件类型选择text时,支持配置该参数。
Chunk Overlap:表示相邻分块之间的重叠量,默认为0。仅当文件类型选择text时,支持配置该参数。
Rank Label:控制语义切块的力度大小,默认为h2。仅当文件类型选择html时,支持配置该参数。
QA提取
本方案支持从用户提交的知识库文档中提取QA对,以获得更好的检索和回答效果。参照下图选中Yes复选框即可开启该功能。
说明PAI提供基于refGPT对文档进行解析并提取QA对的功能,上传过程可能持续较长时间。如果您不需要提取QA对,可以取消选中Yes复选框。
以阿里云官方技术文档为例,为您展示提取得到的QA数据对。示例如下:
Q1: 授予OSS和DLF权限 前提条件 如何添加AliyunOSSFullAccess和AliyunDLFFullAccess权限以使用DLF服务? A1: 要添加AliyunOSSFullAccess和AliyunDLFFullAccess权限,请按照以下步骤操作: 1. 访问阿里云控制台,登录您的账号。 2. 进入“安全管理”模块,点击“权限管理”。 3. 选择“用户”,点击“添加权限”。 4. 选择“阿里云OSS”,选择“OSS访问控制”,然后点击“添加权限”。 5. 在“授权策略”中,添加“阿里云DLF服务”的授权策略,并设置为“FullAccess”。 6. 完成上述步骤后,您的阿里云OSS和DLF服务将获得AliyunOSSFullAccess和AliyunDLFFullAccess权限。 Q2: 授予OSS和DLF权限 操作步骤 在集群信息页面,如何找到Worker RAM角色? A2: 在集群信息页面,您需要单击集群资源页签,然后找到Worker RAM角色所在行的链接。
系统提取的QA对会自动写入向量检索库中。以Hologres为例,您可以在Hologres中查看写入的数据和向量等信息。具体操作,请参见表。
上传知识库文档。
在RAG服务的WebUI页面的Upload选项卡中,上传HTML或TEXT类型的知识库文档。
其中关键配置说明如下:
配置项
描述
Which type of files do you want to upload?
支持选择以下两种文档类型:
html
text
Files
参考界面操作指引上传知识库文档,然后单击Upload。支持多文件上传,其中:
HTML文件格式为:HTML。例如rag_chatbot_test_doc.html。
TEXT文件格式为:txt、doc、docx、pdf和md等。例如rag_chatbot_test_doc.txt。
Directory
参考界面操作指引上传包含知识库文档的目录,然后单击Upload。
3、进行知识问答,并通过配置参数实现特定产品能力
在RAG服务的WebUI页面中,切换到Chat选项卡,通过配置相关参数,实现特定产品能力。
产品能力
配置方法
当使用Retrieval方式进行知识问答时,您可以参考以下配置方法实现特定产品能力。
向量数据库召回
选择Retrieval问答策略,即可直接从向量数据库中召回Top K条相似结果。您可以在Parameters of Vector Retrieval区域中,设置向量检索库返回的相似结果条数,默认为3。
关键词检索召回
尽管在大多数复杂场景下,向量数据库召回都能有较好的表现。但在某些语料稀缺的垂直领域,或要求准确匹配的场景,向量数据库召回方法可能不如传统的稀疏检索召回方法。稀疏检索召回方法通过计算用户查询与知识文档的关键词重叠度来进行检索,因此更为简单和高效。
在本方案中,PAI提供了BM25等关键词检索召回算法来完成稀疏检索召回操作。您可以在页面中选择是否使用关键词检索召回。
多路召回融合
向量数据库召回和关键词检索召回具有各自的优势和不足,因此综合二者的召回结果能够提高整体的检索准确性和效率。倒数排序融合(Reciprocal Rank Fusion, RRF)算法通过对每个文档在不同召回方法中的排名进行加权求和,以此计算融合后的总分数。
当您选择使用关键词检索召回,即Keyword Retrieval选择Keyword Ensembled时,PAI将默认使用RRF算法对向量数据库召回结果和关键词检索召回结果进行多路召回融合。
检索结果Re-Rank
大多数向量数据库为了计算效率会牺牲一定程度的准确性。这使其检索结果存在一定随机性,原始返回的Top K不一定最相关。本方案支持对向量数据库第一次召回的Top K结果进行精度更高的Re-Rank操作,以得到相关度更高、更准确的知识文档。
在本方案中,PAI提供了BAAI/bge-reranker-base、BAAI/bge-reranker-large等开源模型来完成Re-Rank操作。您可以在页面中选择是否对检索结果进行Re-Rank,以及具体使用的Re-Rank模型。
当使用RAG(Retrieval + LLM)方式进行知识问答时,您可以参考以下配置方法实现特定产品能力。
问答Prompt构建
PAI提供多种不同的Prompt策略,您可以选择合适的预定义Prompt模板或输入自定义的Prompt模板以获得更好的推理效果。
使用以下三种方式实现知识问答。
Retrieval
直接从向量数据库中检索并返回Top K条相似结果。
LLM
直接与EAS-LLM对话,返回大模型的回答。
RAG(Retrieval + LLM)
将检索返回的结果与用户的问题输入至已选择的Prompt模板中,送入EAS-LLM服务,从中获取问答结果。
步骤四:通过API调用进行模型推理验证
获取RAG服务的调用信息。
单击RAG服务名称,进入服务详情页面。
在基本信息区域,单击查看调用信息。
在调用信息对话框的公网地址调用页签,获取服务访问地址和Token。
通过WebUI页面配置LLM服务调用信息、连接向量数据库,并上传业务数据文件。具体操作,请参见1、配置RAG对话系统和2、上传知识库文档,并通过配置参数实现特定产品能力。
通过API调用服务。
PAI提供了三种调用API的对话方式:
chat/retrieval
、chat/llm
和chat/rag
。具体调用方法如下:curl 命令
方式一:
chat/retrieval
curl -X 'POST' '<service_url>chat/retrieval' -H 'Authorization: <service_token>' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{"question": "什么是人工智能平台PAI?","score_threshold": 900, "vector_topk": 3}' # <service_url>替换为步骤1获取的服务访问地址;<service_token>替换为步骤1获取的服务Token。
方式二:
chat/llm
curl -X 'POST' '<service_url>chat/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?", "topk": 3, "topp": 0.8, "temperature": 0.9}
。方式三:
chat/rag
curl -X 'POST' '<service_url>chat/rag' -H 'Authorization: <service_token>' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{"question": "什么是人工智能平台PAI?","score_threshold": 900, "vector_topk": 3}' # <service_url>替换为步骤1获取的服务访问地址;<service_token>替换为步骤1获取的服务Token。
支持添加其他可调推理参数,例如
{"question":"什么是人工智能平台PAI?", "score_threshold": 900, "vector_topk": 3, "topk": 3, "topp": 0.8, "temperature": 0.9}
。
Python脚本
import requests EAS_URL = 'http://chatbot-langchain.xx.cn-beijing.pai-eas.aliyuncs.com' def test_post_api_chat(): url = EAS_URL + '/chat/retrieval' # url = EAS_URL + '/chat/llm' # url = EAS_URL + '/chat/rag' headers = { 'accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'xxxxx==', } data = { "question":"什么是人工智能平台PAI?", "score_threshold": 900, "vector_topk": 3 } # /chat/llm和/chat/rag方式支持使用其他可调推理参数。 """ data = { "question":"什么是人工智能平台PAI?", "topk": 3, "topp": 0.8, "temperature": 0.9 } """ 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 = response.json() return ans['response'] print(test_post_api_chat())
其中:EAS_URL配置为RAG服务的访问地址;Authorization配置为RAG服务的Token。
相关文档
更多关于EAS的内容介绍,请参见EAS模型服务概述。
您可以通过EAS一键部署LLM(大语言模型)应用,直接使用LangChain框架来集成企业知识库,详情请参见5分钟操作EAS一键部署通义千问模型。
- 本页导读 (1)