基于EAS&OpenSearch搭建RAG检索增强对话系统

更新时间:
复制 MD 格式

使用PAI-EASOpenSearch向量检索版,可快速搭建完整的RAG对话系统。OpenSearch支持多种向量检索算法,高精度下性能表现优异,适合基于私有数据的智能问答场景。

注意事项

本实践受制于LLM服务的服务器资源大小以及默认Token数量限制,能支持的对话长度有限,旨在帮助您体验RAG对话系统的基本检索功能。

一、创建OpenSearch向量检索版实例

1.创建实例

  1. 进入OpenSearch控制台,在左上角切换到OpenSearch-向量检索版

  2. 在实例列表页面,创建OpenSearch向量检索版实例。关键参数配置如下,更多配置说明,请参见购买OpenSearch向量检索版实例

    参数

    描述

    商品版本

    选择向量检索版

    专有网络

    选择已创建的专有网络和交换机。

    虚拟交换机

    用户名

    OpenSearch向量检索实例的用户名。

    用户密码

    OpenSearch向量检索实例的密码。

2. 配置索引表

实例创建成功后,会进入待配置状态。参见配置实例创建索引成功后即可正常搜索。关键参数如下:

  • 场景模板选择通用模板,字段配置导入如下配置文件。

    字段配置文件

    {
    	"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": []
    	}
    }
  • 索引结构中,向量维度要与知识库向量模型使用的向量维度保持一致,距离类型建议选择InnerProduct

3.为OpenSearch向量检索版实例开通公网访问功能

目前,EAS只能通过公网访问OpenSearch,需要具备访问公网的能力。因此,您需要为EAS添加VPC,并为该VPC绑定NAT网关和弹性公网IP(EIP)。同时,为确保OpenSearch实例能够接收来自EAS实例的公网请求,您需要为OpenSearch开通公网访问,并将上述EIP地址加入白名单。EAS可以使用与OpenSearch相同的VPC,也可以使用其他VPC。

  1. 为后续部署RAG服务时绑定的专有网络(VPC)配置公网访问功能。具体操作,请参见使用公网NAT网关SNAT功能访问互联网

  2. 查看已绑定的弹性公网IP地址。

    1. 登录专有网络管理控制台单击专有网络实例ID,并切换到资源管理页签。

    2. 单击已绑定的公网NAT网关,进入公网NAT网关页面。在公网访问服务区域,找到公网NAT网关

    3. 单击公网NAT网关实例ID,进入基本信息页面。

    4. 单击绑定的弹性公网IP,查看已绑定的弹性公网IP地址,并保存到本地。切换到绑定的弹性公网IP页签,可查看已绑定的弹性公网IP地址及其分配状态、带宽和条目关联状态等信息。

  3. OpenSearch向量检索版实例列表页面,单击目标实例名称,进入实例详情页面。

  4. 网络信息区域,打开公网访问开关,并在修改公网访问白名单配置面板中,按照控制台操作指引,将上述步骤已查询的弹性公网IP配置为公网访问白名单。

  5. 网络信息区域,将公网域名后的访问地址保存到本地。

二、部署RAG服务并关联OpenSearch

  1. 登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入EAS

  2. 推理服务页签,单击部署服务,然后在场景化模型部署区域,单击大模型RAG对话系统部署

  3. 配置以下关键参数,其他参数配置说明,请参见步骤一:部署RAG服务

    • 基本信息

      • 版本选择:选择LLM一体化部署

      • RAG版本:选择pai-rag:0.3.4

      • 模型类别:选择qwen1.5-1.8b

    • 资源信息:系统会根据所选模型自动推荐资源规格。为避免服务启动失败,建议您使用推荐的规格。

    • 向量检索库设置

      • 版本类型:选择OpenSearch

      • 访问地址:配置为OpenSearch向量检索版实例的公网访问地址。不带http://或https://,例如ha-cn-****.public.ha.aliyuncs.com。

      • 实例id:配置为OpenSearch向量检索版实例的ID。

      • 用户名密码:配置为创建OpenSearch向量检索版实例时设置的用户名和密码。

      • 表名称:配置为2. 配置索引表中已创建的索引表名称。

      • OSS地址:请选择当前地域下已创建的OSS存储目录。通过挂载OSS路径实现知识库管理。

      • 专有网络:确保配置的专有网络具有公网访问能力,并将绑定的弹性公网IP添加为OpenSearch实例的公网访问白名单。具体操作,请参见使用公网NAT网关SNAT功能访问互联网公网白名单配置

  4. 确认参数配置无误后,单击部署。当服务状态变为运行中(约需3分钟)即表示部署成功。

三、使用RAG对话系统

RAG对话系统的基本使用方法如下,更多详细介绍,请参见大模型RAG对话系统(v0.3.x)

1、检查向量检索库配置

  1. 单击目标RAG服务名称,然后在页面右上角单击查看Web应用

  2. 检查向量检索库OpenSearch配置是否正确。

    系统已自动配置知识库default,并自动识别应用了部署RAG服务时配置的向量检索库设置。在向量数据库配置区域,检查OpenSearch配置是否正确,可修改对应配置项为正确配置,然后单击更新知识库

2、上传企业知识库文件

知识库页签的文件管理Tab页上传知识库文件。上传知识库文件的具体操作方法,请参见RAG知识库管理

知识库上传完成后,系统会自动按照PAI-RAG格式将文件存储到向量检索库。对于同名知识库文件,除了FAISS外,其他向量检索库将会覆盖原有文件。支持的文件类型为.html、.htm、.txt、.pdf、.pptx、.md、Excel(.xlsx或.xls)、.jsonl、.jpeg、.jpg、.png、.csvWord(.docx),例如rag_chatbot_test_doc.txt

3、进行知识问答

对话页签,选择知识库名称、使用意图(使用更多工具选择查询知识库)进行知识问答。

OpenSearch特色功能支持

阿里云OpenSearch向量检索版提供图形化界面,支持高效管理索引表(Table)和索引(Index)。以下介绍如何通过控制台查看索引信息并进行数据管理。

索引表管理

  1. 进入阿里云OpenSearch向量检索版实例详情页面。

    1. 登录阿里云OpenSearch向量检索版控制台

    2. 单击已创建的实例ID,进入实例详情页面。

  2. 进入表管理页面,对索引表进行管理操作。

    1. 在左侧导航栏,单击表管理。

      页面中展示当前实例下创建的所有表。表管理页面顶部有添加表按钮,下方表列表展示各表的名称、状态、全量数据来源、表大小、全量生效版本、全量生效时间、增量生效时间、数据更新资源数等信息,操作列提供查看编辑重建索引链接。

    2. 在表管理页面,对索引表进行管理操作,包括查看字段及索引结构、编辑索引、索引重建以及删除索引等。具体操作细节,请参见表管理

数据管理

  1. 进入阿里云OpenSearch向量检索版实例详情页面。

    1. 登录阿里云OpenSearch向量检索版控制台

    2. 单击已创建的实例ID,进入实例详情页面。

  2. 添加数据。

    1. 在左侧导航栏,单击向量管理 > 添加数据

    2. 在页面右侧下拉列表中,选择表单模式开发者模式。表单模式仅支持添加单条数据,开发者模式可同时添加多条数据。

    3. 选择要添加数据的目标索引表(Table)名称。

    4. 按字段输入数据内容或填写数据写入语句,然后单击添加。具体操作请参见:添加数据

      当执行结果出现"message": "success"时,表示数据上传成功,即可完成单条数据或多条数据的添加。

  3. 查看表指标数据,详情请参见表指标

  4. 删除数据。具体操作请参见:删除数据