文档中心>Elasticsearch Service>实践教程>RAG 实践:基于腾讯云 ES 与混元,十分钟构建你的专属 AI 助手

RAG 实践:基于腾讯云 ES 与混元,十分钟构建你的专属 AI 助手

最近更新时间:2024-10-17 14:36:21

我的收藏

背景概述

随着数据智能技术的不断发展,以大语言模型(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 控制台,进入ES 集群管理 页面,单击新建

2. 进入新建页面,产品类型选择为:通用版

3. 选择版本:计费模式为按量计费、ES 版本为 8.13.3、商业特性为白金版

4. ES 节点配置,测试环境可选择为 ES.S1(2核4G),节点数为2,磁盘为通用型 SSD,磁盘容量为20GB

5. 其余配置选择默认即可。

登录 Kibana

1. 访问 Kibana,设置公网访问策略。

2. 单击 Kibana 公网访问地址访问 Kibana。


部署 embedding 模型

集群购买完成后,前往 Kibana 部署 Embedding 模型、创建知识库索引与向量化管道。
1. 开启节点出站访问,仅开启数据节点即可,如有专用主节点,仅开启专用主节点即可。(该功能为白名单,请联系 工单 处理)
注意:
如需上传自定义模型或第三方平台(例如 Huggingface)模型,可参见 文档




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. 进入 API Explorer 页面, 安装相关库,参考如下:

3. 进入 API 密钥管理 界面,获取 SecretID、SecretKey。

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. 运行如下代码,文件命名为 demo.py(需与 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()
4. 在上述 python 文件的目录下,使用如下命令运行系统:
streamlit run demo.py
5. 生成的界面如下:


总结

本文通过介绍腾讯云 ES 一站式 RAG 方案,演示如何通过结合腾讯云 ES 与混元大模型,快速构建 RAG 应用。腾讯云 ES 凭借其在传统 PB 级日志和海量搜索场景中积累的丰富经验,通过深度重构底层系统,成功地将多年的性能优化、索引构建和运营管理经验应用于 RAG 领域,并积极探索向量召回与传统搜索技术的融合之道,旨在充分发挥两者的优势,为用户提供更加精准、高效的搜索体验。未来,腾讯云 ES 将持续深耕智能检索领域,在成本、性能、稳定性等方面持续提升,帮助客户降本增效的同时实现业务价值持续增长,欢迎持续关注!