You need to enable JavaScript to run this app.
导航
基于云搜索服务构建智能问答系统
最近更新时间:2024.08.08 16:11:07首次发布时间:2024.07.19 16:55:04

在云搜索服务的 ML 服务中,支持创建 RAG 深度学习模型,能把 OpenSearch 的混合检索与大模型生成结果相结合,得到更具语义连贯性和信息准确性的结果。本文介绍基于云搜索服务 RAG 模型和火山方舟平台提供的豆包模型,快速搭建一个云搜索服务官方文档的 RAG 推理服务(智能问答系统),可以咨询云搜索服务产品的各种问题。

背景信息

大语言模型(LLM,Large language model)作为新一轮科技产业革命的战略性技术,其核心能力在于深层语境解析与知识融合。在生成式人工智能方向主要用于图像生成、书写文稿、信息搜索等。当下的 LLM 模型是基于大量数据训练的,目的是让它们掌握广泛的普遍知识,这些知识被储存在它们神经网络的权重(也就是参数记忆)里。但是,如果我们要求 LLM 生成的回答涉及到它训练数据之外的知识,比如最新的、专有的或某个特定领域的信息,这时就可能出现事实上的错误(我们称之为“幻觉”)。
RAG (Retrieval-Augmented Generation,检索增强生成)的核心思想是让语言模型在生成回答或文本时能够动态地从外部知识库中检索相关信息。这种方法能够提高模型生成内容的准确性、可靠性和透明度,同时减少“幻觉”。
图片
本文介绍基于云搜索服务 RAG 模型和火山方舟平台提供的豆包模型,快速搭建一个云搜索服务官方文档的 RAG 推理服务(智能问答系统)。系统使用 OpenSearch 作为外部知识库,火山豆包作为大语言模型,全流程构建在火山引擎平台上。本次实践采用的语料为火山引擎云搜索服务官网文档知识库,将语料处理后存入 OpenSearch 索引中,同时通过部署在云搜索服务 ML 节点上的 Embedding 模型,将原始语料额外转化为向量字段存储在同一个 OpenSearch 索引中,方便后续做混合查询召回。
在查询流程中,用户通过对话框输入问题,RAG 应用会将用户输入的问题通过 Embedding 模型转化为向量,然后使用云搜索服务 OpenSearch 的混合查询功能查询问题向量和问题文本召回 Top n 的文档结果,再将文档结果发送给豆包大模型,最后按照要求根据文档内容回答用户的问题。

注意事项

  • 目前仅 OpenSearch 2.9.0 版本实例支持 ML 服务。
  • ML 服务中的任务管理目前处于白名单开放状态。搭建 RAG 推理服务需要使用,请联系技术支持申请开白使用。

前提条件

  1. 在搭建 RAG 推理服务的过程中会使用多个云产品,为保证网络畅通,需要确保各云资源处于相同地域、相同私有网络环境。请提前创建私有网络和子网,具体操作,请参见创建私有网络创建子网
  2. 目前仅 OpenSearch 2.9.0 版本实例支持 ML 服务,请提前创建 OpenSearch 实例。具体操作,请参见创建实例
    图片
  3. RAG 模型目前只能手动创建,模型文件需要存储到 TOS 存储桶。请提前创建 TOS 存储桶,具体操作,请参见创建存储桶
  4. 云搜索服务实例、文档任务和 RAG 模型均处于私有网络环境,而豆包模型只提供了公网访问地址,为保障网络畅通,您需要配置 NAT 网关并配置公网 IP。请提前在相同地域创建一个公网 IP,具体操作,请参见申请公网IP

准备工作

一、创建 ML 服务

  1. 登录云搜索服务控制台
  2. 在顶部导航栏,选择目标项目和地域。
  3. 启用 ML 服务。
    1. 在左侧导航栏选择 ML 服务,然后单击创建 ML 服务
    2. 创建 ML 服务对话框,设置 ML 服务名称,选择目标 OpenSearch 实例,然后选择资源类型并配置资源。

      说明

      • 目前支持 CPU 和 GPU 两种资源类型,本文选择使用 CPU 类型资源。如需了解各参数含义,请参见启用 ML 服务
      • 使用 CPU 资源类型时,建议选择1:4资源比例,能够保障后续搭建的 RAG 推理服务性能更佳。
      图片
    3. 完成 ML 服务资源配置后,阅读并勾选相关协议,然后单击确定
  4. 启动模型,用于语义嵌入(embedding)。本文推荐使用TownsWu/PEG公共模型。
    1. ML 服务列表页面,单击目标服务名称。
    2. 在左侧导航栏选择模型管理,然后在公共模型中选择TownsWu/PEG模型,再单击后方的启用
      图片
    3. 启动配置对话框,选择资源类型,设置模型节点的规格和数量,然后单击立即启动
      图片
    4. 等待TownsWu/PEG模型启用后,单击模型后方的调用信息,获取模型调用信息。
      图片

二、配置方舟模型

  1. 登录火山方舟控制台
  2. 在顶部导航栏,选择目标项目和地域。
  3. 选择模型,创建推理接入点。
    1. 在左侧导航栏选择模型推理,然后单击创建推理接入点
    2. 设置接入点名称,建议选择的接入模型为Doubao-pro-32k/240615,然后单击接入模型
      您也可以选择使用Doubao-lite-32k模型。如需了解各参数含义,请参见创建推理接入点
      图片
  4. 查看豆包模型的推理接入点信息。
    1. 模型推理页面,单击新建的模型接入点名称。
    2. API调用页签下,选择API Key授权方式,然后在 SDK 调用示例中获取并保存base urlmodel信息。
      图片
  5. 创建调用豆包模型的 API Key。
    1. 在方舟控制台的左侧导航栏选择 API Key 管理,然后单击创建 API Key
    2. 自定义设置 API Key 的名称,然后单击创建
    3. 创建完成后,查看并保存 API Key。
      图片

三、配置 NAT 网关

豆包模型默认提供公网访问地址,而其他实例资源处于私有网络环境,为保证网络畅通,您可以通过配置 NAT 网关,以确保内网实例能访问到公网。

  1. 登录NAT网关控制台
  2. 在顶部导航栏,选择目标项目和地域。
  3. 创建 NAT 网关。
    1. 在左侧导航栏选择公网NAT网关,然后单击创建公网NAT网关
    2. 在创建网关页面,设置网关名称,选择私有网络子网,公网 IP 选择手动配置方式,然后单击确认订单

      说明

      请和云搜索服务实例选择相同的私有网络和子网。

      图片
    3. 详情页面,确认 NAT 网关配置信息,然后同意并勾选相关条款,再单击立即购买
  4. 为 NAT 网关配置公网 IP。
    1. 在 NAT 网关列表页面,单击目标网关后方的配置公网IP
    2. 公网IP页签下,单击绑定公网IP,然后选择目标 IP 并单击确定
      图片
  5. 为 NAT 网关创建 SNAT 规则。
    2. 在SNAT规则页签下,单击创建SNAT规则
    3. 在弹出的对话框中,设置规则名称,选择粒度为子网,然后选择子网公网IP,再单击确定

    说明

    • 选择云搜索服务实例所在子网。含义为当前子网内所有未绑定公网 IP 的机器均可通过 SNAT 规则访问公网。如需了解其他粒度,请参见管理SNAT规则
    • IP 选择上一步骤绑定的公网 IP。
    图片

搭建 RAG 推理服务(智能问答系统)

步骤一、在 ML 服务中创建文档任务

  1. 登录云搜索服务控制台

  2. 在顶部导航栏,选择目标项目和地域。

  3. 在左侧导航栏选择 ML 服务,查找并单击目标服务名称。

  4. 在左侧导航栏选择任务管理,然后单击创建任务

  5. 创建任务对话框,选择模板代码方式和云搜索文档任务模板,然后配置其他参数,配置完成后单击确定
    图片
    此处仅介绍云搜索文档任务的 config 参数和依赖配置,如需了解其他参数,请参见创建任务

    配置

    说明

    模板参数:修改以下参数配置,然后压缩成一行,再填入 config 参数。

    '{
            "task":"migrate",
            "dim": 1024,
            "opensearch": {
                "username": "实例访问用户,默认为admin",
                "password": "用户密码",
                "host": "实例私网接入点域名",
                "port": 9200,
                "schema": "传输协议,小写的https或http",
                "index": "迁移的索引名称"
            }
       }'
    

    配置 task 参数:

    • "migrate" : 表示启动迁移任务。
    • "init": 表示只创建索引。
    • 其他或不填: 表示从原始文档进行构建,如果需要运行此类任务请提工单咨询。

    配置 dim 参数:
    向量维度,根据 embedding 模型的长度进行填充。本文使用TownsWu/PEG模型,该模型的向量维度为 1024。

    配置 opensearch 实例连接信息:
    包括实例访问用户和密码,访问接入点等信息,以及配置一个索引名称(如cloudsearch-doc),该索引将被创建用于存储向量。

    依赖配置:为云搜索文档任务配置依赖,即火山 pip 源下载不同版本的依赖包并安装。

    • httpx:latest
    • opensearch-py[async]:latest
    • volcengine:latest
    • aiolimiter:1.1.0
    • volcengine_python_sdk:latest
  6. 启动云搜索文档任务。

    1. 在任务列表选择云搜索文档任务,单击操作列中的启动
    2. 等待任务运行。
      任务运行完成后,状态显示为成功
      图片

步骤二、在 ML 服务中创建语义嵌入任务

  1. 登录云搜索服务控制台

  2. 在顶部导航栏,选择目标项目和地域。

  3. 在左侧导航栏选择 ML 服务,查找并单击目标服务名称。

  4. 在左侧导航栏选择任务管理,然后单击创建任务

  5. 创建任务对话框,选择模板代码方式和 xc_import_embed 模板,然后配置其他参数,配置完成后单击确定
    图片
    此处仅介绍 xc_import_embed 任务的 config 参数和依赖配置,如需了解其他参数,请参见创建任务

    配置

    说明

    模板参数:修改以下参数配置,然后压缩成一行,填入 config 参数。

    '{
        "opensearch": {
            "username": "实例访问用户,默认为admin",
            "password": "用户密码",
            "host": "实例私网接入点域名",
            "port": 9200,
            "schema": "传输协议,小写的https或http",
            "index": "源索引",
            "target_index": "目标索引"
        },
        "embedding": {
            "remote_config": {
                "method": "POST",
                "url": "http://d-18***ml2:8000/v1/embeddings",
                "params": {},
                "headers": {
                    "Content-Type": "application/json"
                },
                "advance_request_body": {
                    "model": "TownsWu/PEG"
                }
            }
        },
        "field_dict": {
            "full_title": "full_title_knn",
            "summary": "summary_knn",
            "content.summary": "content.summary_knn"
        }
    }'
    

    配置 opensearch 实例连接信息:
    包括实例访问用户和密码,访问接入点等信息,以及配置源索引和目标索引。

    说明

    源索引和目标索引需要和用于存储文档向量的索引名称保持一致,比如cloudsearch-doc

    配置 embedding 参数:
    获取TownsWu/PEG模型的调用信息,配置到此处的 embedding 参数。

    配置 field_dict 参数:
    需要进行语义嵌入的字段,请直接使用默认配置。

    依赖配置:为云搜索文档任务配置依赖,即火山 pip 源下载不同版本的依赖包并安装。

    • httpx:latest
    • opensearch-py[async]:latest
    • opensearch-py:latest
  6. 启动语义嵌入任务。

    1. 在任务列表选择语义嵌入任务,单击操作列中的启动
    2. 等待任务运行。
      任务运行成功后,状态显示为运行中
      图片

步骤三、创建 RAG 模型

  1. 准备 RAG 模型文件。

    1. 在本地创建一个文件夹,并在文件夹中创建两个同级文件。
      文件名如下所示:

      |-rag
      |--config.json
      |--rag_config.json
      
    2. config.json文件中填写以下内容。

      {}
      
    3. rag_config.json文件中填写以下内容。

      {
        "type": "cloud_search_bot",
        "opensearch": {
          "username": "实例访问用户,默认为admin",
          "password": "用户密码",
          "host": "实例私网接入点域名",
          "port": 9200,
          "schema": "传输协议,小写的https或http",
          "index": "用于检索的索引名称"
        },
        "llm": {
          "model32k": {
            "host": "豆包模型的base url信息",
            "endpoint": "豆包模型的model信息",
            "apikey": "调用豆包模型的 API Key"
          }
        },
        "embedding": {
          "remote_config" : {
            "method" : "POST",
            "url" : "http://d-181131787967***-serve-svc.r-***4y7zoml2:8000/v1/embeddings",
            "params" : {},
            "headers" : {
              "Content-Type" : "application/json"
            },
            "advance_request_body" : {
              "model" : "TownsWu/PEG"
            }
          }
        },
        "generate":true
      }
      

      配置

      说明

      opensearch

      配置 OpenSearch 实例的连接信息,包括实例访问用户和密码,访问接入点等信息。
      其中的 index,表示用于检索的索引名称。与前面的索引名称相同,比如cloudsearch-doc

      llm

      配置豆包模型的调用信息,包括 base url、model 和 API Key 信息。

      embedding

      配置已启用的TownsWu/PEG模型的调用信息。

  2. 创建 RAG 模型。

    1. 在云搜索服务的左侧导航栏选择 ML 服务,查找并单击目标服务名称。
    2. 在左侧导航栏选择模型管理,然后选择我的模型页签,再单击创建模型
    3. 创建模型对话框,创建 RAG 模型,然后选择 TOS 存储桶并上传本地已保存的模型文件,配置完成后单击确定
      图片
  3. 启动 RAG 模型。

    1. 我的模型中选择 RAG 模型,单击后方的启用
    2. 启动配置对话框,选择资源类型,设置模型节点的规格和数量,然后单击立即启动

      说明

      配置 RAG 模型的启用资源规格时,配置为1vCPU 4GiB
      如果后续需要为 RAG 推理服务配置浏览器可视化页面,则必须使用1vCPU 4GiB规则。由于 gradio 是有状态的,RAG 推理服务为了保证性能没有配置 sticky session,配置多 CPU 会导致 session 错乱。

      图片
    3. 等待 RAG 模型启动,获取并保存模型调用信息。
      模型启动成功后,单击操作列中的调用信息,然后获取并保存调用信息。
      图片

结果验证

完成前面所有配置操作后,您已经可以在相同 VPC 环境的 ECS 中,通过 RAG 模型的调用信息验证官方文档推理任务了。直接在 ECS 命令行中运行调用信息,您将会查看到持续输出 txt 文本内容。
为了更加直观的演示云搜索服务文档的 RAG 推理服务(智能文档系统),本文借助火山引擎 API 网关产品,为 RAG 推理服务配置一个固定的公网域名。便可以直接在浏览器中通过固定的访问地址访问 RAG 推理服务,并可以在可视化页面咨询云搜索服务产品的各种问题。

配置公网访问域名

  1. 登录API网关控制台
  2. 在顶部导航栏,选择目标项目和地域。
  3. 创建实例。
    1. 在左侧导航栏选择实例管理,然后单击创建实例
    2. 在相同地域中选择创建标准网关,按需配置实例资源,选择相同的私有网络和子网,然后单击确认订单
      如需了解 API 网关实例的更多信息,请参见创建 API 网关实例
      图片
  4. 在 API 网关实例中创建服务。
    1. 单击新建的 API 网关实例,在服务页签下,单击创建服务
    2. 设置服务名称,然后单击确定
      图片
  5. 在 API 网关实例中创建 Upstream。
    1. 单击新建的 API 网关实例,在 Upstream 页签下,单击创建 Upstream
    2. 设置 Upstream 名称,选择后端配置为固定域名,然后填写已获取的 RAG 模型的域名和端口,然后单击确定
      如需详细了解 Upstream 和参数配置,请参见Upstream 概述创建固定域名类型 Upstream
      图片
  6. 在服务中创建路由。
    1. 在 API 网关实例详情中,单击服务页签,然后单击目标服务名称。
    2. 服务概览页签下的路由信息区域,单击创建路由
    3. 设置路由名称,选择路径 Path 为前缀匹配,设置流量分发为固定域名,然后选择已创建的 Upstream 并设置权重为 100%,再单击确定
      如需详细了解路由和参数配置,请参见创建路由
      图片
  7. 获取服务的公网访问域名。
    1. 在 API 网关实例详情中,单击服务页签,查找目标服务。
    2. 鼠标悬停在查看默认域名,即可获取并保存公网访问域名。
      图片

访问 RAG 推理服务(智能问答)

  1. 拼接 RAG 推理服务的完整访问地址。
    格式为:http://[url]/?model=[model_name]
    • url:替换为在 API 网关中获取的服务公网访问域名。
    • model_name:替换为 RAG 模型的名称。
  2. 在浏览器中访问拼接好的地址,即可出现可视化 RAG 推理服务页面。
  3. 输入需要咨询的云搜索服务问题,然后回车确定输入,将会返回最为准确的答案。
    图片