赞
踩
去年4月至9月,阿里云人工智能平台 PAI 团队与大数据基础工程技术团队合作,构建了基于知识库检索增强的大模型答疑对话机器人,并在阿里云官方答疑链路、研发小蜜、钉钉大数据技术服务助手等多个线上场景上线,显著提升答疑效率。相关文档:【万字长文】基于阿里云PAI搭建知识库向量检索增强的大模型对话系统
上线几个月来,随着 RAG 技术日趋火热,我们保持对线上链路的迭代,不断加入学界业界最新的 RAG 优化技术(eg: advanced RAG),改进了包括知识入库、 query 改写、多路检索、召回融合、结果重排序、prompt 工程等在内的多个 RAG 模块,线上提效显著。
目前本轮优化已上线阿里云官网最佳实践,并开源在 PAI-RAG 代码库中。随着 RAG 技术迅猛发展,我们在不断跟进最新优化技术,并迭代加入代码库与最佳实践中。
本文为大模型RAG对话系统最佳实践,旨在指引AI开发人员如何有效地结合LLM大语言模型的推理能力和外部知识库检索增强技术,从而显著提升对话系统的性能,使其能更加灵活地返回用户查询的内容。适用于问答、摘要生成和其他依赖外部知识的自然语言处理任务。通过该实践,您可以掌握构建一个大模型RAG对话系统的完整开发链路。
大语言模型(LLM)在生成准确和实时的回复方面存在局限性,不适合直接用于需要精确信息的客服或问答等场景。当前业界普遍采用基于检索增强的RAG技术来改善LLM的表现。该方法通过结合LLM的归纳生成能力和向量检索库的检索能力,增强对用户查询的理解,并产生更加可靠的回复。
检索增强生成(Retrieval-Augmented Generation, RAG)技术结合了大语言模型(LLM),如通义千问,与信息检索系统,以提高文本生成的准确性和丰富度。在响应用户查询时,RAG首先利用检索系统从知识库中检索相关内容,然后将检索到的内容与原始查询一同输入大语言模型(LLM),从而让语言模型不用重新训练就能够获取最新的信息,并产生可靠的输出。RAG特别适用于问答、摘要生成和其他依赖外部知识的自然语言处理任务,同时还支持定制化提示(Prompt)和基于检索的多轮对话管理,类似于LangChain,从而进一步优化用户交互体验和答案质量。
本方案包括以下功能模块:
说明
● 仅在华北6(乌兰察布)地域支持购买灵骏资源,且需要开通白名单。
● 当前灵骏智算资源仅供白名单用户受限申请使用,如果您希望使用灵骏智算资源,您可先提交工单,申请添加灵骏智算使用白名单。
具体步骤一,请参见文档
您可以选择以下任意一种产品构建本地向量库:
其中,Faiss无需开通或购买即可使用,Hologres、AnalyticDB PostgreSQL和ElasticSearch需要开通并准备相应的WebUI界面配置参数。后续您可以使用准备好的参数连接向量检索库。
其中:选择成员角色选择实例超级管理员(SuperUser)。
说明
● 如果没有外网地址,您需要单击申请外网地址来获取。具体操作,请参见管理外网地址。
● 如果在同一个VPC内连接实例,只需使用内网地址。
● 创建数据库账号,并将数据库账号和密码保存到本地,后续用于连接数据库。具体操作,请参见创建数据库账号。
● 配置白名单为0.0.0.0/0。具体操作,请参见设置白名单。
1.创建阿里云Elasticsearch实例。具体操作,请参见创建阿里云Elasticsearch实例。其中:
2.单击实例名称,进入实例基本信息页面。在该页面获取私网地址和私网端口并保存到本地。
使用Faiss构建本地向量库,无需购买线上向量库产品,免去了线上开通向量库产品的复杂流程,更轻量易用。
具体步骤二,请参见文档
在本方案的RAG对话系统链路中,需要部署对话模型推理服务和RAG服务,分别作为与用户交互的对话模型和知识文档预处理步骤的QA提取模型。具体操作步骤如下:
您可以使用自定义的数据微调训练对话模型并部署为推理服务,具体操作,请参见灵骏分布式训练和部署模型。本方案以预置镜像为例,介绍如何部署对话模型推理服务:
2.在PAI-EAS 模型在线服务页面,单击部署服务,在弹出对话框中,选择自定义部署,然后单击确定。
3.在部署服务页面,配置以下关键参数。
参数 | 描述 |
服务名称 | 自定义服务名称。 |
部署方式 | 选择镜像部署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(性价比最高)。 |
专有网络配置 | 当选择Hologres、AnalyticDB for PostgreSQL或ElasticSearch作为向量检索库时,请确保所配置的专有网络与选定的向量检索库保持一致。 当选择Faiss作为向量检索库时,请随意选择一个专有网络。 |
4.单击部署,等待一段时间即可完成模型部署。当服务状态为运行中时,表明服务部署成功。
5.获取VPC地址调用的服务访问地址和Token。
PAI提供了最方便快捷的部署方式,您可以直接在EAS中选择指定的镜像即可部署RAG的WebUI服务,具体操作步骤如下。更多关于RAG链路的详细内容,请参见GitHub开源代码。
https://github.com/aigc-apps/PAI-RAG
参数 | 描述 |
服务名称 | 自定义服务名称。本案例使用的示例值为:chatbot_langchain_vpc。 |
部署方式 | 选择镜像部署AI-Web应用。 |
镜像选择 | 在PAI平台镜像列表中选择chatbot-langchain,镜像版本选择1.0。由于版本迭代迅速,部署时镜像版本选择最高版本即可。 |
运行命令 | 服务运行命令:uvicorn webui:app --host 0.0.0.0 --port 8000 端口号输入:8000。 |
资源组种类 | 选择公共资源组。 |
资源配置方法 | 必须选择GPU类型,实例规格推荐使用ml.gu7i.c16m60.1-gu30(性价比最高)。 额外系统盘:70G。 |
专有网络配置 | 当选择Hologres、AnalyticDB for PostgreSQL或ElasticSearch作为向量检索库时,请确保所配置的专有网络与选定的向量检索库保持一致。 当选择Faiss作为向量检索库时,与对话模型推理服务配置的专有网络保持一致。 |
3.单击部署,等待一段时间即可完成模型部署。当服务状态为运行中时,表明服务部署成功。
4.服务部署成功后,单击服务方式列下的查看Web应用,进入WebUI页面。
具体步骤三,请参见文档
目前RAG对话系统支持集成两类知识库文档类型:HTML和TEXT。以下内容为您介绍两种文档类型支持的产品能力。
1、自定义配置参数
如下图所示,您可以在RAG服务WebUI界面的Settings选项卡中,配置本系统的参数,并测试连接是否正常。
具体参数配置详情如下:
Hologres
以上参数配置完成后,单击Connect Hologres,验证Hologres实例是否连接正常。
AnalyticDB
说明
如果在同一个VPC内连接实例,只需使用内网地址。
ElasticSearch
以上参数配置完成后,单击Connect ElasticSearch,验证ElasticSearch实例是否连接正常。
Faiss
此外,您还可以在Settings选项卡中上传JSON配置文件,并单击Parse config来解析配置文件。解析成功后,WebUI页面将自动根据配置文件内容填写相应配置。不同的向量检索库对应的配置文件内容如下:
Hologres
- {
- "embedding": {
- "model_dir": "embedding_model/",
- "embedding_model": "SGPT-125M-weightedmean-nli-bitfit",
- "embedding_dimension": 768
- },
-
- "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"
- }
- }
AnalyticDB
- {
- "embedding": {
- "model_dir": "embedding_model/",
- "embedding_model": "SGPT-125M-weightedmean-nli-bitfit",
- "embedding_dimension": 768
- },
-
- "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_COLLECTION_NAME": "xxxxxxx",
- "PG_PASSWORD": "passwordxxxx"
- }
- }
ElasticSearch
- {
- "embedding": {
- "model_dir": "embedding_model/",
- "embedding_model": "SGPT-125M-weightedmean-nli-bitfit",
- "embedding_dimension": 768
- },
-
- "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"
- }
- }
Faiss
- {
- "embedding": {
- "model_dir": "embedding_model/",
- "embedding_model": "SGPT-125M-weightedmean-nli-bitfit",
- "embedding_dimension": 768
- },
-
- "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。HOLOCfg即为Hologres的相关配置。您可以参考WebUI界面参数说明进行配置。
2、上传HTML文件
在RAG服务的WebUI页面中,切换到Upload选项卡中,在该页面配置以下参数,并上传HTML类型的用户知识库文档。
其中:
您可以使用PAI提供的rag_chatbot_test_doc.html知识库文档进行Mock测试。
3、文档清洗与切分
在构建向量检索库前,系统会对您所上传的HTML源码文件进行文本处理。包括数据清洗(文本提取、超链替换等)和语义切块(chunk)。
您可以通过设置rank label参数,来控制语义切块的粒度大小,默认为h2。
4、QA提取
将原始的知识文档输入LLM,输出针对该文档的若干QA对,并在后续构建数据库时,用生成的问题Q作为检索index,答案A作为文档内容返回。该方法对知识文档进行语义级别的细粒度划分,使得检索到的文档与用户Query相关度更高,提高信噪比。但QA提取方法依赖于LLM的能力,因此会带来更高的计算开销和时间开销。常用的QA提取方法包括 RefGPT等。
Tricks:对于高信息量、长上下文的知识文档,适合采用QA Extraction方法,将文档划分为更细粒度、信噪比更高的QA子文档。
本方案支持针对官方文档自动提取QA对,以获得更好的检索和回答效果。
以阿里云官方技术文档为例,为您展示提取得到的QA数据。系统会根据您上传的知识库文档自动提取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中查看写入的数据和向量等信息。具体操作,请参见表。
5、向量数据库召回
在RAG服务的WebUI页面的Chat选项卡中,选择Vector Store问答策略,即为直接从向量数据库中召回Top-K条相似结果。
支持在界面Parameters of Vector Retrieval中设置向量检索库返回的相似结果条数,默认为3。
6、关键词检索召回
尽管在大多数复杂场景下,向量检索都能有较好的表现,但在某些语料稀缺的垂直领域,或要求准确匹配的场景,向量检索方法可能不如传统的稀疏检索方法。稀疏检索方法通过对用户Query与知识文档的关键词重叠度来进行排序,因此检索过程更为简单和高效。常见的稀疏检索方法有BM25、TF-IDF等。
Tricks: 在语料稀缺的私有垂直领域(如内部产品文档),或要求准确匹配的场景,建议使用稀疏检索算法。
在本步骤,PAI提供了BM25等关键词检索召回算法来完成稀疏检索召回操作。您可以在页面中选择是否使用关键词检索召回。
7、多路召回融合
向量数据库召回和关键词检索召回具有各自的优势和不足,因此综合二者的召回结果能够提高整体的检索准确性和效率。倒数排序融合(Reciprocal Rank Fusion, RRF)算法将使用不同相关性指标得到的多个排名结果集组合成单个结果集。其基本原则是,在不同搜索策略中始终出现在顶部位置的文档,可能与用户Query相关性更高,因此应该在合并结果中排名更高。RRF算法的具体计算过程详见Cormack, et al.。
Tricks: 一般场景下,建议使用RRF方法组合稀疏检索和向量检索的结果,以得到相关性指标更多维的综合结果。
当您选择使用关键词检索召回,即Keyword Retrieval选择Keyword Ensembled时,PAI将默认使用RRF算法对向量数据库召回结果和关键词检索召回结果进行多路召回融合。
8、检索结果Re-Rank
大多数向量数据库单独使用向量模型作为检索模型。向量模型通常为Bi-Encoder模型,它生成给定文本的embedding向量,通过计算两个文本的embedding向量之间的余弦距离可以得到这两个文本的语义相似度。向量模型计算效率高,但准确度较低,有时会为了计算效率会牺牲一定程度的准确性。
因此我们可以对向量模型第一次召回的Top-K结果进行精度更高的Re-Rank操作,以得到相关度更高、更准确的知识文档。Re-Rank模型是Cross-Encoder模型,它同时接受两个文本句子作为输入,并输出句子对的相似度分数。Cross-Encoder模型精度高,但不适合大规模数据,因此可以采用先试用向量模型粗排得到Top-100相关文档,再使用Re-Rank模型精排的方式,得到与用户Query最相关的文档。常用的开源Re-Rank模型有Cohere-rerank、BAAI/bge-reranker-base、BAAI/bge-reranker-large等。
Tricks: 在计算资源充足的情况下,一般都建议使用向量检索与Re-Rank重排相结合的检索方式。通常第一次向量检索取Top-100,最终精排取Top-3(视具体需求调整)
在本步骤中,PAI提供了BAAI/bge-reranker-base、BAAI/bge-reranker-large等开源模型来完成Re-Rank操作。您可以在页面中选择是否对检索结果进行Re-Rank,以及具体使用的Re-Rank模型。
9、问答Prompt构建
Liu, et al.的研究表明,在长上下文输入中,LLM更容易关注输入首部和尾部的信息,而遗漏位于输入中部的信息。因此,为了提高RAG对话的准确度,可以对知识文档与用户 Query 进行重排序,使LLM更关注与用户Query相关度更高的文档。
Tricks: 建议以「参考文档」-「Prompt模板」-「用户Query」的顺序构建LLM输入,建议在「Prompt模板」中说明「答案中不允许包含编造内容」等 instruction。
本步骤中,PAI 基于上述研究对检索到的知识文档与用户 Query 进行了排序整理,并形成了最终输入大模型前的 Prompt 。在RAG服务的WebUI页面的Chat选项卡中,PAI 提供了多种不同的Prompt策略,上述策略被置为默认策略(Simple),您可以选择合适的预定义Prompt模板或输入自定义的Prompt模板以获得更好的推理效果。
10、LLM知识问答
本方案支持以下三种不同的问答方式,输入您的问题后,具体推理效果如下:
VectorStore
直接从向量数据库中检索并返回TopK条相似结果。
LLM
直接与EAS-LLM对话,返回大模型的回答。
Vector Store + LLM
将检索返回的结果与用户的问题组装成可自定义的Prompt,送入EAS-LLM服务,从中获取问答结果。
1、参数自定义配置
如下图所示,您可以在RAG服务WebUI界面的Settings选项卡中,配置本系统的参数,并测试连接是否正常。
具体参数配置详情,请参见1、自定义配置参数。
2、上传TEXT文件
在RAG服务的WebUI页面中,切换到Upload选项卡中,在该页面配置以下参数,并上传TXT类型的用户知识库文档。
其中:
您可以使用PAI提供的rag_chatbot_test_doc.txt知识库文档进行Mock测试。
3、文档清洗与切分
在构建向量检索库前,系统会对您所上传的知识文档进行预处理。包括数据清洗(文本提取、超链替换等)和切块(chunk)。
您可以通过设置以下两个参数来控制文档切块粒度的大小:
4、向量数据库召回
在RAG服务的WebUI页面的Chat选项卡中,选择Vector Store问答策略,即为直接从向量数据库中召回Top-K条相似结果。
支持在界面Parameters of Vector Retrieval中设置向量检索库返回的相似结果条数,默认为3。
5、关键词检索召回
尽管在大多数复杂场景下,向量检索都能有较好的表现,但在某些语料稀缺的垂直领域,或要求准确匹配的场景,向量检索方法可能不如传统的稀疏检索方法。稀疏检索方法通过对用户Query与知识文档的关键词重叠度来进行排序,因此检索过程更为简单和高效。常见的稀疏检索方法有BM25、TF-IDF等。
Tricks: 在语料稀缺的私有垂直领域(如内部产品文档),或要求准确匹配的场景,建议使用稀疏检索算法。
在本步骤,PAI提供了BM25等关键词检索召回算法来完成稀疏检索召回操作。您可以在页面中选择是否使用关键词检索召回。
6、多路召回融合
向量数据库召回和关键词检索召回具有各自的优势和不足,因此综合二者的召回结果能够提高整体的检索准确性和效率。倒数排序融合(Reciprocal Rank Fusion, RRF)算法将使用不同相关性指标得到的多个排名结果集组合成单个结果集。其基本原则是,在不同搜索策略中始终出现在顶部位置的文档,可能与用户Query相关性更高,因此应该在合并结果中排名更高。RRF算法的具体计算过程详见Cormack, et al.。
Tricks: 一般场景下,建议使用RRF方法组合稀疏检索和向量检索的结果,以得到相关性指标更多维的综合结果。
当您选择使用关键词检索召回,即Keyword Retrieval选择Keyword Ensembled时,PAI将默认使用RRF算法对向量数据库召回结果和关键词检索召回结果进行多路召回融合。
7、检索结果Re-Rank
大多数向量数据库单独使用向量模型作为检索模型。向量模型通常为Bi-Encoder模型,它生成给定文本的embedding向量,通过计算两个文本的embedding向量之间的余弦距离可以得到这两个文本的语义相似度。向量模型计算效率高,但准确度较低,有时会为了计算效率会牺牲一定程度的准确性。
因此我们可以对向量模型第一次召回的Top-K结果进行精度更高的Re-Rank操作,以得到相关度更高、更准确的知识文档。Re-Rank模型是Cross-Encoder模型,它同时接受两个文本句子作为输入,并输出句子对的相似度分数。Cross-Encoder模型精度高,但不适合大规模数据,因此可以采用先试用向量模型粗排得到Top-100相关文档,再使用Re-Rank模型精排的方式,得到与用户Query最相关的文档。常用的开源Re-Rank模型有Cohere-rerank、BAAI/bge-reranker-base、BAAI/bge-reranker-large等。
Tricks: 在计算资源充足的情况下,一般都建议使用向量检索与Re-Rank重排相结合的检索方式。通常第一次向量检索取Top-100,最终精排取Top-3(视具体需求调整)
在本步骤中,PAI提供了BAAI/bge-reranker-base、BAAI/bge-reranker-large等开源模型来完成Re-Rank操作。您可以在页面中选择是否对检索结果进行Re-Rank,以及具体使用的Re-Rank模型。
8、问答Prompt构建
Liu, et al.的研究表明,在长上下文输入中,LLM更容易关注输入首部和尾部的信息,而遗漏位于输入中部的信息。因此,为了提高RAG对话的准确度,可以对知识文档与用户 Query 进行重排序,使LLM更关注与用户Query相关度更高的文档。
Tricks: 建议以「参考文档」-「Prompt模板」-「用户Query」的顺序构建LLM输入,建议在「Prompt模板」中说明「答案中不允许包含编造内容」等 instruction。
本步骤中,PAI 基于上述研究对检索到的知识文档与用户 Query 进行了排序整理,并形成了最终输入大模型前的 Prompt 。在RAG服务的WebUI页面的Chat选项卡中,PAI 提供了多种不同的Prompt策略,上述策略被置为默认策略(Simple),您可以选择合适的预定义Prompt模板或输入自定义的Prompt模板以获得更好的推理效果。
9、LLM知识问答
本方案支持以下三种不同的问答方式,输入您的问题后,具体推理效果如下:
VectorStore
直接从向量数据库中检索并返回TopK条相似结果。
LLM
直接与EAS-LLM对话,返回大模型的回答。
Vector Store + LLM
将检索返回的结果与用户的问题输入已选择的Prompt模板中,送入EAS-LLM服务,从中获取问答结果。
本文为阿里云原创内容,未经允许不得转载。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。