大语言模型(LLM,Large language model)作为新一轮科技产业革命的战略性技术,其核心能力在于深层语境解析与知识融合。在生成式人工智能方向主要用于图像生成、书写文稿、信息搜索等。当下的 LLM 模型是基于大量数据训练的,目的是让它们掌握广泛的普遍知识,这些知识被储存在它们神经网络的权重(也就是参数记忆)里。但是,如果我们要求 LLM 生成的回答涉及到它训练数据之外的知识,比如最新的、专有的或某个特定领域的信息,这时就可能出现事实上的错误(我们称之为“幻觉”)。
RAG(Retrieval-Augmented Generation,检索增强生成)的核心思想是让语言模型在生成回答或文本时能够动态地从外部知识库中检索相关信息 。这种方法能够提高模型生成内容的准确性、可靠性和透明度,同时减少“幻觉” 。
本文将介绍如何基于火山引擎云搜索服务和方舟平台来构建专属的 RAG 智能问答系统 。系统使用 OpenSearch 作为外部知识库,火山豆包作为大语言模型,全流程构建在火山引擎平台上。本次实践采用的语料为火山引擎云搜索服务知识库,将语料处理后存入 OpenSearch 索引中,同时通过部署在云搜索服务 ML 节点上的 Embedding 模型,将原始语料额外转化为向量字段存储在同一个 OpenSearch 索引中,方便后续做混合查询召回。
在查询流程中,用户通过对话框输入问题,RAG 应用会将用户输入的问题通过 Embedding 模型转化为向量,然后使用云搜索服务 OpenSearch 的混合查询功能查询问题向量和问题文本召回 Top n 的文档结果,再将文档结果发送给豆包大模型,最后按照要求根据文档内容回答用户的问题。
准备资源
创建云搜索 ML 服务
登陆火山引擎云搜索服务控制台(https://console.volcengine.com/es),创建实例集群,版本选用 Opensearch 2.9.0 。 实例创建完成后可根据实际需求,开通实例和 Dashboards 的公网访问。
- 进入实例详情页->ML 服务,配置 CPU /内存比例后启用。
- 进入模型服务->公共模型,启动一个模型用于语义嵌入 Embedding,推荐使用 PEG,配置参数后启动。
开通大模型服务
- 进入火山引擎方舟控制台(https://console.volcengine.com/ark),在模型推理下创建推理接入点,接入模型建议选用 Doubao-pro-32k(或者Doubao-lite-32k),创建完成后可以获取到接入点 Endpoint。
- 在左侧导航栏进入 API Key 管理,创建 API Key 并记录。
# 填充如下内容,后续会用在rag模型中。
{
"model32k": {
"host": "https://ark.cn-beijing.volces.com/api/v3",
"endpoint": "ep-xxxx-xx",
"apikey": ""
}
}
配置 NAT 网关
通过配置 NAT 网关使私有网络内部的实例允许通过 NAT 网关访问到公网,用于连接大模型服务。
首先进入火山引擎 NAT 网关控制台( https://console.volcengine.com/ nat),创建公网 NAT 网关。这里需要注意私有网络和子网一定要和云搜索服务实例所在的网络保持一致,可选用自动配置或手动配置:
- 自动配置会开启私网下所有 ECS 的公网访问,需绑定 EIP(公网 IP);
- 选择手动配置后需要自行配置公网 IP 和访问规则。
搭建步骤
导入任务数据
- 这里演示为基于火山引擎云搜索服务文档语料搭建的推理任务,所以在创建任务时选择模板代码-云搜索文档任务,大家在具体使用中可以根据需求用其他语料库进行搭建。
- 增加 Config 参数,参考如下模板填入。
'{
"task":"migrate",
"dim": 1024,
"opensearch": {
"username": "opensearch的用户名",
"password": "opensearch的密码",
"host": "云搜索接入点域名",
"port": 9200,
"schema": "https",
"index": "迁移的索引名称"
}
}'
- 本文演示添加的依赖为云搜索文档任务配置依赖,如果需要额外依赖可以自行在配置中添加。
运行语义嵌入任务
- 选择 xc_import_embed 模板任务,Config 参数说明:
'{
"opensearch": {
"username": "xxx",
"password": "xxx",
"host": "opensearch-o-xxxx.escloud.ivolces.com",
"port": 9200,
"schema": "https",
"index": "cloud_serach",
"target_index": "cloud_serach"
},
"embedding": {
调用信息复制过来
},
"field_dict": {
"full_title": "full_title_knn",
"summary": "summary_knn",
"content.summary": "content.summary_knn"
}
}'
- 文中实践需要添加的依赖配置如下:
启动 RAG 推理服务
- 在 TOS Bucket 中上传 RAG 推理服务配置。
|-rag-demo
|--rag_config.json
|--config.json
config.json内容
{}
rag_config.json 格式及代码参考如下:
{
"type": "cloud_search_bot",
"opensearch": {
"username": "admin",
"password": "password",
"host": "opensearch-o-xxxxx.escloud.ivolces.com",
"port": 9200,
"schema": "https",
"index": "index_name"
},
"llm": {
"model32k": {
"host": "https://ark.cn-beijing.volces.com/api/v3",
"endpoint": "ep-xxxx-xx",
"apikey": ""
}
},
"embedding": {
"remote_config" : {
"method" : "POST",
"url" : "http://url:port/v1/embeddings",
"params" : {},
"headers" : {
"Content-Type" : "application/json"
},
"advance_request_body" : {
"model" : "TownsWu/PEG"
}
}
},
"generate":true
}
- 创建推理服务(打开私网访问)并启动
完成前面的所有配置操作后,已经可以在相同 VPC 环境的 ECS 中,通过 RAG 模型的调用信息验证云搜索服务文档推理任务了。可以直接在 ECS 命令行中运行调用信息,查看到持续输出 txt 文本内容。
RAG 推理服务演示
为了更加直观的演示云搜索服务文档的 RAG 推理服务,本文借助火山引擎 API 网关产品,为 RAG 推理服务配置一个固定的公网域名。通过直接在浏览器中的固定访问地址访问 RAG 推理服务,并在可视化页面咨询云搜索服务产品的各种问题。
配置公网访问
- 进入 API 网关控制台(https://console.volcengine.com/veapig)创建实例,为保证网络畅通需要选择和云搜索实例相同的私有网络和子网。创建完成后进入实例继续创建服务。
- 接下来创建 Upstream,后端服务选用固定域名,域名和端口从刚刚启用的 RAG 调用信息内获取。
- 并在服务内创建路由,路径选用前缀匹配;Upstream 选用固定域名,使用刚刚创建的 Upstream。
推理问答
创建完成后进入服务列表就可以获取到公网访问域名,拼接 RAG 推理服务的完整访问地址,格式为 http://[url]/?model=[model_name],其中 url 替换为在 API 网关中获取到的服务公网访问域名,model_name 替换为 RAG 模型的名称后就可以在浏览器中通过刚才拼接好的固定域名访问 RAG 推理服务,并在可视化页面中咨询本文所用到的云搜素服务文档库的相关问题。
以上就是以云搜索服务文档库为例,介绍通过火山引擎云搜索服务和方舟平台构建的专属 RAG 智能问答系统,欢迎进入体验馆体验:https://www.volcengine.com/experience/middleware