文档

阿里云大模型RAG对话系统最佳实践

更新时间:

大模型RAG对话系统最佳实践,旨在指引AI开发人员如何有效地结合LLM大语言模型的推理能力和外部知识库检索增强技术,使其能更加灵活地返回用户查询的内容,从而显著提升对话系统的性能。适用于问答、摘要生成和其他依赖外部知识的自然语言处理任务。通过该实践,您可以掌握构建一个大模型RAG对话系统的完整开发链路。

背景信息

大语言模型(LLM)在生成准确和实时的回复方面存在局限性,不适合直接用于需要精确信息的客服或问答等场景。当前业界普遍采用检索增强生成(Retrieval-Augmented Generation, RAG)技术来改善LLM的表现。该技术通过结合大语言模型(LLM)(如通义千问)的归纳生成能力和向量检索库的检索能力,增强对用户查询内容的理解,提高生成文本的准确性和丰富度,从而生成更加可靠的回复。在响应用户查询时,RAG对话系统首先利用检索系统从知识库中检索相关内容,然后将检索到的内容与原始查询一同输入大语言模型(LLM),无需重新训练LLM模型就能够获取最新的信息,并产生可靠的输出。

RAG对话系统特别适用于问答、摘要生成和其他依赖外部知识的自然语言处理任务,并且提供定制化提示(Prompt)和基于检索的多轮对话管理功能。通过LangChain实现这些应用,从而进一步提升了用户交互体验和答案质量。

方案架构

image

本方案包括以下功能模块:

  • 向量检索库准备:根据场景需求选择开通Hologres、AnalyticDB PostgreSQL、ElasticSearch,或使用Faiss作为向量检索库供后续RAG对话系统使用。

  • 对话模型推理服务在线部署:您可以在EAS中将对话模型部署为在线服务,以供后续在RAG对话系统中调用模型服务。

  • RAG服务在线部署:您可以在EAS中部署集成LangChain的WebUI服务。

  • 在WebUI界面进行知识问答:打开RAG服务的WebUI应用,然后串联自定义的业务数据进行知识问答,验证对话系统的效果。

前提条件

步骤一:准备向量检索库

您可以选择以下任意一种产品构建本地向量库:

其中,Faiss无需开通或购买即可使用,Hologres、AnalyticDB PostgreSQL和ElasticSearch需要开通并准备相应的WebUI界面配置参数。后续您可以使用准备好的参数连接向量检索库。

Hologres

  1. 开通Hologres实例并创建数据库。具体操作,请参见购买Hologres创建数据库。您需要将已创建的数据库名称保存到本地。

  2. 在实例详情页面查看调用信息。

    1. 单击实例名称,进入实例详情页面。

    2. 网络信息区域,单击指定VPC后的复制,将域名:80前面的内容保存到本地。

  3. 切换到账号管理Tab页,创建自定义用户。并将账号和密码保存到本地,后续用于连接Hologres实例。具体操作,请参见创建自定义用户

    其中:选择成员角色选择实例超级管理员(SuperUser)

AnalyticDB for PostgreSQL

  1. AnalyticDB for PostgreSQL版控制台上创建实例。具体操作,请参见创建实例

    其中:向量引擎优化选择开启

  2. 单击实例名称,进入基本信息页面,在该页面中的数据库连接信息区域,复制内网地址和外网地址并保存到本地。

    说明
    • 如果没有外网地址,您需要单击申请外网地址来获取。具体操作,请参见管理外网地址

    • 如果在同一个VPC内连接实例,只需使用内网地址。

  3. 创建数据库账号,并将数据库账号和密码保存到本地,后续用于连接数据库。具体操作,请参见创建数据库账号

  4. 配置白名单为可信来源IP。具体操作,请参见设置白名单

ElasticSearch

  1. 创建阿里云Elasticsearch实例。具体操作,请参见创建阿里云Elasticsearch实例

    其中:

    • 实例类型选择通用商业版

    • 场景初始化配置选择通用场景

    • 您需要将配置的登录名登录密码保存到本地。

  2. 单击实例名称,进入实例基本信息页面。在该页面获取私网地址私网端口并保存到本地。

Faiss

使用Faiss构建本地向量库,无需购买线上向量库产品,免去了线上开通向量库产品的复杂流程,更轻量易用。

步骤二:部署模型服务

在本方案中,您需要部署以下两个服务:一是作为用户交互主体的对话模型推理服务,二是用于知识文档预处理和QA信息提取的RAG服务。具体操作步骤如下:

部署对话模型推理服务

本方案以预置镜像为例,介绍如何部署对话模型推理服务。

  1. 进入模型在线服务EAS。

    1. 登录PAI控制台

    2. 在左上角顶部菜单栏选择目标地域。

    3. 在左侧导航栏选择模型部署 > 模型在线服务(EAS),在下拉框中选择目标工作空间后单击进入EAS

  2. 在模型在线服务页面,单击部署服务,在自定义模型部署区域单击自定义部署

  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(性价比最高);

    若您选择使用Llama2-13b模型,实例规格推荐使用ecs.gn6e-c12g1.3xlarge

    专有网络配置

    • 当选择Hologres、AnalyticDB for PostgreSQL或ElasticSearch作为向量检索库时,请确保所配置的专有网络与选定的向量检索库保持一致。

    • 当选择Faiss作为向量检索库时,请随意选择一个专有网络。

  4. 单击部署,等待一段时间即可完成模型部署。

    服务状态运行中时,表明服务部署成功。

  5. 获取VPC地址调用的服务访问地址和Token。

    1. 单击服务名称,进入服务详情页面。

    2. 基本信息区域,单击查看调用信息

    3. 调用信息对话框的VPC地址调用页签,获取服务访问地址和Token,并保存到本地。

部署RAG服务并启动WebUI

PAI提供了最方便快捷的部署方式,您可以直接在EAS中选择指定的镜像部署RAG服务,具体操作步骤如下。更多关于RAG链路的详细介绍,请参见GitHub开源代码

  1. 在模型在线服务页面,单击部署服务,在自定义模型部署区域单击自定义部署

  2. 部署服务页面,配置以下关键参数。

    参数

    描述

    服务名称

    自定义服务名称。本案例使用的示例值为: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作为向量检索库时,与对话模型推理服务配置的专有网络保持一致。

  3. 单击部署,等待一段时间即可完成模型部署。

    服务状态运行中时,表明服务部署成功。

  4. 服务部署成功后,单击服务方式列下的查看Web应用,进入WebUI页面。

步骤三:通过WebUI页面进行模型推理验证

您可以先在WebUI页面,参考以下操作步骤对服务进行调试。当您在WebUI页面调试好问答效果后,可以基于PAI提供的API将其应用到您自己的业务系统中。具体操作步骤如下:

1、配置RAG对话系统

如下图所示,您可以在RAG服务WebUI界面的Settings选项卡中,根据选择的向量检索库配置相关参数,并测试连接是否正常。image

具体参数配置详情如下:

  • 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

    • Host:配置为步骤一中获取的数据库连接外网地址。

      说明

      如果在同一个VPC内连接实例,只需使用内网地址。

    • User:配置为步骤一中创建的数据库账号。

    • Database:配置为数据库名称。您可以登录数据库后进行查看,如何登录数据库,请参见登录数据库image.png

    • Password:配置为步骤一中创建的数据库密码。

    • CollectionName:用户自定义的数据库表名称。例如langchain_document

    • Pre_delete:是否删除已存在的Database。取值为:True(删除)、False(不删除)。

    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、上传知识库文档,并通过配置参数实现特定产品能力

  1. 在RAG服务的WebUI页面中,切换到Upload选项卡,通过配置相关参数,实现特定产品能力。

    产品能力

    配置方法

    文档清洗与切分

    在构建向量检索库前,系统会对您所上传的源码文件进行文本处理。您可以通过配置以下参数对源码文件进行数据清洗(文本提取、超链替换等)和语义切块(chunk)处理:

    • Chunk Size:指定每个分块的大小,单位为字节,默认为200。仅当文件类型选择text时,支持配置该参数。

    • Chunk Overlap:表示相邻分块之间的重叠量,默认为0。仅当文件类型选择text时,支持配置该参数。

    • Rank Label:控制语义切块的力度大小,默认为h2。仅当文件类型选择html时,支持配置该参数。

    QA提取

    本方案支持从用户提交的知识库文档中提取QA对,以获得更好的检索和回答效果。参照下图选中Yes复选框即可开启该功能。

    说明

    PAI提供基于refGPT对文档进行解析并提取QA对的功能,上传过程可能持续较长时间。如果您不需要提取QA对,可以取消选中Yes复选框。

    image

    以阿里云官方技术文档为例,为您展示提取得到的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中查看写入的数据和向量等信息。具体操作,请参见image

  2. 上传知识库文档。

    在RAG服务的WebUI页面的Upload选项卡中,上传HTML或TEXT类型的知识库文档。image

    其中关键配置说明如下:

    配置项

    描述

    Which type of files do you want to upload?

    支持选择以下两种文档类型:

    • html

    • text

    Files

    参考界面操作指引上传知识库文档,然后单击Upload。支持多文件上传,其中:

    Directory

    参考界面操作指引上传包含知识库文档的目录,然后单击Upload

3、进行知识问答,并通过配置参数实现特定产品能力

  1. 在RAG服务的WebUI页面中,切换到Chat选项卡,通过配置相关参数,实现特定产品能力。

    产品能力

    配置方法

    当使用Retrieval方式进行知识问答时,您可以参考以下配置方法实现特定产品能力。

    向量数据库召回

    选择Retrieval问答策略,即可直接从向量数据库中召回Top K条相似结果。您可以在Parameters of Vector Retrieval区域中,设置向量检索库返回的相似结果条数,默认为3。image

    关键词检索召回

    尽管在大多数复杂场景下,向量数据库召回都能有较好的表现。但在某些语料稀缺的垂直领域,或要求准确匹配的场景,向量数据库召回方法可能不如传统的稀疏检索召回方法。稀疏检索召回方法通过计算用户查询与知识文档的关键词重叠度来进行检索,因此更为简单和高效。

    在本方案中,PAI提供了BM25等关键词检索召回算法来完成稀疏检索召回操作。您可以在页面中选择是否使用关键词检索召回。image

    多路召回融合

    向量数据库召回和关键词检索召回具有各自的优势和不足,因此综合二者的召回结果能够提高整体的检索准确性和效率。倒数排序融合(Reciprocal Rank Fusion, RRF)算法通过对每个文档在不同召回方法中的排名进行加权求和,以此计算融合后的总分数。

    当您选择使用关键词检索召回,即Keyword Retrieval选择Keyword Ensembled时,PAI将默认使用RRF算法对向量数据库召回结果和关键词检索召回结果进行多路召回融合。image

    检索结果Re-Rank

    大多数向量数据库为了计算效率会牺牲一定程度的准确性。这使其检索结果存在一定随机性,原始返回的Top K不一定最相关。本方案支持对向量数据库第一次召回的Top K结果进行精度更高的Re-Rank操作,以得到相关度更高、更准确的知识文档。

    在本方案中,PAI提供了BAAI/bge-reranker-baseBAAI/bge-reranker-large等开源模型来完成Re-Rank操作。您可以在页面中选择是否对检索结果进行Re-Rank,以及具体使用的Re-Rank模型。

    image

    当使用RAG(Retrieval + LLM)方式进行知识问答时,您可以参考以下配置方法实现特定产品能力。

    问答Prompt构建

    PAI提供多种不同的Prompt策略,您可以选择合适的预定义Prompt模板或输入自定义的Prompt模板以获得更好的推理效果。image

  2. 使用以下三种方式实现知识问答。

    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页面配置LLM服务调用信息、连接向量数据库,并上传业务数据文件。具体操作,请参见1、配置RAG对话系统2、上传知识库文档,并通过配置参数实现特定产品能力

  3. 通过API调用服务。

    PAI提供了三种调用API的对话方式:chat/retrievalchat/llmchat/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。

相关文档

  • 本页导读 (1)
文档反馈