背景概述
随着数据智能技术的不断发展,以大语言模型(LLM)驱动的 AIGC 为代表的内容生成技术已经成为企业数据智能能力中不可或缺的一部分,但传统的内容生成技术存在信息更新不及时、垂直领域知识匮乏、模型幻觉等问题,如何推进大模型在各行业、各业务场景落地是各方普遍关注的问题,而检索增强生成(Retrieval-Augmented Generation,RAG)技术则为此提供了有效的解决方案,成为数据智能时代的一大趋势。
RAG 是一种结合了检索和大语言模型内容生成的技术方案,它通过引用外部知识库,在用户输入 Query 时检索出知识,然后让模型基于可信的知识进行用户回答。RAG 具有较高的可解释性和定制能力,可大幅降低大语言模型的幻觉,适用于问答系统、文档生成、智能助手等多种自然语言处理任务中。本文将通过介绍腾讯云ES 一站式 RAG 方案,演示如何通过结合腾讯云ES 与混元大模型,快速构建 RAG 应用。
腾讯云ES 一站式 RAG 方案
腾讯云ES 是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成 X-Pack,支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。在自研内核方面,腾讯云ES 依托腾讯内外部海量业务的运营经验,针对 ES 内核进行了成本、性能、稳定性、拓展性等方面的优化,是亚太地区开源贡献第一的团队,使用腾讯云ES 您可以高效构建在线搜索、向量检索、日志分析、运维监控、智能问答等服务。
在 RAG 方面,腾讯云ES 支持了一站式向量检索、文本+向量混合搜索、倒数排序融合、与大模型集成、GPU 高性能推理、字段级别权限控制等能力,同时针对查询性能做了大量优化,有效的提升了数据检索效率。
当然,作为国内公有云首个从自然语言处理、到向量生成/存储/检索、并与大模型集成的端到端一站式技术平台,腾讯云ES 也作为核心参编单位参与了由信通院组织的 RAG 标准制定,同时成为首个通过 RAG 权威认证的企业。
AI助手构建
购买ES 集群
1、 登录腾讯云ES 控制台:
https://cloud.tencent.com/login?s_url=https%3A%2F%2Fconsole.cloud.tencent.com%2Fapi%2Fexplorer%3FProduct%3Dhunyuan%26Version%3D2023-09-01%26Action%3DChatCompletions
(复制链接到浏览器打开)
2、 点击「新建」
3、产品类型选择为:通用版
4、选择版本:计费模式为按量计费、ES 版本为 8.13.3、商业特性为白金版
5、 ES 节点配置,测试环境可选择为ES.S1(2核4G),节点数为2,磁盘为通用型SSD,磁盘容量为 20GB
6、 其余配置选择默认即可
登录Kibana
访问 Kibana,设置公网访问策略
3、 点击Kibana 公网访问地址访问 Kibana
部署embedding 模型
集群购买完成后,前往Kibana 部署 Embedding 模型、创建知识库索引与向量化管道
1、 开启「节点出站访问」,仅开启数据节点即可,如有专用主节点,仅开启专用主节点即可。(该功能为白名单,请联系工单处理)
注:如需上传自定义模型或第三方平台(如 Huggingface)模型,可参考文档
https://github.com/elastic/eland(复制链接到浏览器打开)
2、登录 Kibana 之后,在左侧导航栏找到「Machine Learning」功能
3、进入模型管理页面,并找到类型为「text_embedding」的模型
4、如为未下载状态,选中模型,并点击「Add trained model」,本次演示我们使用「.multilingual-e5-small_linux-x86_64」模型
5、下载完成后,点击部署
6、为快速体验,配置使用默认值即可
创建索引与向量化管道
1、 点击进入「Dev tools」
2、 创建知识库索引
index-name为索引名称,实际可按需命名
PUT /index-name
{
"mappings": {
"properties": {
"title": {
"type": "keyword"
},
"content": {
"type": "text"
},
"url": {
"type": "keyword"
}
}
}
}
3、 创建推理管道,该管道可用于写入数据时进行数据向量化
PUT /_ingest/pipeline/index-name-pipeline
{
"description": "Text embedding pipeline",
"processors": [
{
"inference": {
"model_id": ".multilingual-e5-small_linux-x86_64",
"input_output": [
{
"input_field": "content",
"output_field": "content_embedding"
},
{
"input_field": "title",
"output_field": "title_embedding"
}
]
}
}
]
}
上述管道,将字段「content、title」的内容,调用.multilingual-e5-small_linux-x86_64 模型向量化之后存储到新的字段中。
写入知识库数据
通过 Bulk API 批量写入数据,可将 title 、content 、url 的内容替换为您实际的知识库数据。
POST index-name/_bulk?pipeline=index-name-pipeline&refresh
{ "index" : {} }
{ "title" : "标题 1","content": "内容 1","url": "https:url1" }
{ "index" : {} }
{ "title" : "标题 2","content": "内容 2","url": "https:url2" }
调用混元大模型
1、 python 文件命名为 hunyuan.py
2、 安装相关库,参考如下,控制台链接:
https://cloud.tencent.com/login?s_url=https%3A%2F%2Fconsole.cloud.tencent.com%2Fapi%2Fexplorer%3FProduct%3Dhunyuan%26Version%3D2023-09-01%26Action%3DChatCompletions (复制链接到浏览器打开)
3、获取 SecretID、SecretKey,控制台链接:
https://cloud.tencent.com/login?s_url=https%3A%2F%2Fconsole.cloud.tencent.com%2Fapi%2Fexplorer%3FProduct%3Dhunyuan%26Version%3D2023-09-01%26Action%3DChatCompletions
(复制链接到浏览器打开)
import json
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.hunyuan.v20230901 import hunyuan_client, models
def hunyuan_gpt(system_prompt, content):
try:
# 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
cred = credential.Credential("SecretId", "SecretKey")
# 实例化一个http选项,可选的,没有特殊需求可以跳过
httpProfile = HttpProfile()
httpProfile.endpoint = "hunyuan.tencentcloudapi.com"
# 实例化一个client选项,可选的,没有特殊需求可以跳过
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
# 实例化要请求产品的client对象,clientProfile是可选的
client = hunyuan_client.HunyuanClient(cred, "", clientProfile)
# 实例化一个请求对象,每个接口都会对应一个request对象
req = models.ChatCompletionsRequest()
params = {
"Model": "hunyuan-standard",
"Messages": [
{"Role": "system", "Content": system_prompt},
{"Role": "user", "Content": content}
]
}
req.from_json_string(json.dumps(params))
# 返回的resp是一个ChatCompletionsResponse的实例,与请求对象对应
resp = client.ChatCompletions(req)
return resp
except TencentCloudSDKException as err:
return str(err)
智能问答系统构建
1、 安装 streamlit
pip install streamlit
2、获取 ES 访问地址
用户名为 elastic、密码在创建集群时设置,用本地mac测试时,可开启公网访问,实际生产时,建议使用内网访问地址
3、 运行如下代码(需与 hunyuan.py 在一个目录下)
import streamlit as st
from elasticsearch import Elasticsearch
from hunyuan import hunyuan_gpt
es_client = Elasticsearch(
"ES 集群访问地址",basic_auth=("用户名", "密码"))
def get_elasticsearch_results(query):
es_query = {
"knn": {
"field": "content_embedding",
"num_candidates": 100,
"query_vector_builder": {
"text_embedding": {
"model_id": ".multilingual-e5-small_linux-x86_64",
"model_text": query
}
}
},
"query":{
"match":{
"content":query
}
},
"rank":{
"rrf":{
"window_size":100,
"rank_constant":20
}
}
}
result = es_client.search(index="index-name", body=es_query)
return result["hits"]["hits"]
def create_hunyuan_prompt(results,question):
context = ""
for hit in results:
source_field = hit["_source"]["content"]
hit_context = source_field
context += f"{hit_context}\n"
prompt = f"""
Instructions:
回答此问题:{question}
回答时,你只能参考文档{context} 生成答案,如果无法生成答案,请回复:对不起,该问题我无法回答
"""
return prompt
def generate_hunyuan_completion(user_prompt, question):
response = hunyuan_gpt(user_prompt, question)
return response.Choices[0].Message.Content
def format_result(hit):
title = hit["_source"]["title"]
return f'[{title}]'
def main():
st.title("我的专属AI助手")
# 创建输入框和查询按钮
question = st.text_input("请输入您的问题:")
if st.button("查询并生成答案"):
# 获取Elasticsearch结果并创建HunYuan提示
elasticsearch_results = get_elasticsearch_results(question)
user_prompt = create_hunyuan_prompt(elasticsearch_results,question)
system_prompt = f"""
你是一个问答任务的助手。使用呈现的上下文真实、实事求是地回答问题。
"""
# 使用HunYuan模型生成回答
openai_completion = generate_hunyuan_completion(system_prompt, user_prompt)
# 显示结果
st.write(openai_completion)
# 展示Elasticsearch查询结果
st.write("大模型参考的文档:")
for hit in elasticsearch_results:
st.markdown(format_result(hit))
if __name__ == "__main__":
main()
在上述 python 文件的目录下,使用如下命令运行系统:
streamlit run demo.py
生成的界面如下:
总结
本文通过介绍腾讯云ES 一站式 RAG 方案,演示如何通过结合腾讯云 ES 与混元大模型,快速构建RAG 应用。腾讯云ES凭借其在传统PB级日志和海量搜索场景中积累的丰富经验,通过深度重构底层系统,成功地将多年的性能优化、索引构建和运营管理经验应用于RAG领域,并积极探索向量召回与传统搜索技术的融合之道,旨在充分发挥两者的优势,为用户提供更加精准、高效的搜索体验。未来,腾讯云ES将持续深耕智能检索领域,在成本、性能、稳定性等方面持续提升,帮助客户降本增效的同时实现业务价值持续增长,欢迎持续关注!
腾讯云大数据将持续致力于为各行业客户提供轻快、易用,智能的大数据平台。
关注腾讯云大数据公众号
邀您探索数据的无限可能
点击阅读原文,了解更多相关产品详情
↓↓↓