前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >RAG 实践:基于腾讯云 ES 与混元,十分钟构建你的专属 AI 助手

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

原创
作者头像
腾讯云大数据
发布于 2025-02-10 08:59:32
发布于 2025-02-10 08:59:32
17700
代码可运行
举报
运行总次数:0
代码可运行

背景概述

随着数据智能技术的不断发展,以大语言模型(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 为索引名称,实际可按需命名。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PUT /index-name
{
  "mappings": {
    "properties": {
    "title": {
        "type": "keyword"
      },
      "content": {
        "type": "text"
      },
      "url": {
        "type": "keyword"
      }
    }
  }
}

3. 创建推理管道,该管道可用于写入数据时进行数据向量化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 的内容替换为您实际的知识库数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install streamlit

2. 获取 ES 访问地址。

用户名为 elastic、密码在创建集群时设置,使用本地 mac 测试时,可开启公网访问,实际生产时,建议使用内网访问地址。

3. 运行如下代码,文件命名为 demo.py(需与 hunyuan.py 在一个目录下)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 文件的目录下,使用如下命令运行系统:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
streamlit run demo.py

5. 生成的界面如下:

总结

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(二)
HML(HarmonyOS Markup Language)是一套类HTML的标记语言,通过组件,事件构建出页面的内容。页面具备数据绑定、事件绑定、列表渲染、条件渲染和逻辑控制等高级能力。
枫叶丹
2025/01/27
750
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(二)
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 构建用户界面(一)
组件(Component)是构建页面的核心,每个组件通过对数据和方法的简单封装,实现独立的可视、可交互功能单元。组件之间相互独立,随取随用,也可以在需求相同的地方重复使用。
枫叶丹
2025/02/02
800
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 构建用户界面(一)
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(二) -> stepper
Stepper组件默认填充父容器,通过border和background-color设置边框、背景色。
枫叶丹
2025/02/11
700
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(二) -> stepper
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(七) -> JS动画(二)
通过createAnimator创建一个动画对象,通过设置参数options来设置动画的属性。
枫叶丹
2025/03/06
420
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(七) -> JS动画(二)
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(二) -> swiper
Swiper组件当不开启循环播放(loop="false")时添加自动播放属性(autoplay),设置自动播放时播放时间间隔(interval),页面会自动切换并停留在最后一个子组件页面。添加digital属性启用数字导航点,设置切换时为渐隐滑动效果(scrolleffect="fade")。
枫叶丹
2025/02/21
820
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(二) -> swiper
HarmonyOS-Codelabs系列挑战之构建你的数据应用
整体上是在官方的Demo基础上做的,这里把官方的Demo放在这里,感兴趣小伙伴可以看看:【JS基础组件】switch、chart的使用
山河已无恙
2023/03/02
2810
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 构建用户界面(二)
添加交互可以通过在组件上关联事件实现。本节将介绍如何用div、text、image组件关联click事件,构建一个如下图所示的点赞按钮。
枫叶丹
2025/02/04
620
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 构建用户界面(二)
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(七) -> JS动画(二)
通过createAnimator创建一个动画对象,通过设置参数options来设置动画的属性。
枫叶丹
2025/03/04
600
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(七) -> JS动画(二)
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(一)
List是用来显示列表的组件,包含一系列相同宽度的列表项,适合连续、多行地呈现同类数据。
枫叶丹
2025/02/06
500
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(一)
Vue CLI 2 脚手架 TabBar 组件封装
本文记录在 vue cli 2 中封装 tabbar 组件详细步骤,主要是为了感受 vue 的组件封装思想,也是前面学习 vue 基础的练习案例
很酷的站长
2022/12/28
2900
Vue CLI 2 脚手架 TabBar 组件封装
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(七) -> JS动画(一)
通过调用animate方法获得animation对象,animation对象支持动画属性、动画方法和动画事件。
枫叶丹
2025/03/01
530
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(七) -> JS动画(一)
【HarmonyOS】Tabs使用封装
在写Tabs时,会使用很多个TabContent来实现不同页面的展示内容,但是如果TabContent数量很多时,会导致Tabs代码量大而且很臃肿,因此想着尝试去封装Tabs的使用,可以让界面整洁和对内容界面的解耦。
钟子翔
2024/12/24
760
Vue之Tabbar的实现
  最终的效果如下图所示,下面小编一一为大家解析每个部分如何实现,并附上最终的实现代码。
yuanshuai
2022/08/22
2.5K0
Vue之Tabbar的实现
39·灵魂前端工程师养成-MVC
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/11/08
7570
39·灵魂前端工程师养成-MVC
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(六) -> CSS动画
在关键帧(Keyframes)中动态设置父组件的width和height,实现组件变大缩小。子组件设置scale属性使父子组件同时缩放,再设置opacity实现父子组件的显示与隐藏。
枫叶丹
2025/02/27
900
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(六) -> CSS动画
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(五) -> Svg
通过设置width、height、x、y和viewBox属性为Svg设置宽度、高度、x轴坐标、y轴坐标和Svg视口。
枫叶丹
2025/02/24
820
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(五) -> Svg
TabBar(标签栏)实现思路
一个小demo的学习,似乎让我稍微理解了一下组件化开发过程中的封装和复用思想. 钩子函数和路由里的几个函数在组件间进行交互时候似乎显得尤其重要.
名字是乱打的
2021/12/23
1.5K0
TabBar(标签栏)实现思路
【小程序UI教程】小程序滑动选择tab-view
功能 可以来回滑动得tab-view功能,小程序实现 在android ios 平台测试过,确保真实环境一致 如何使用 复制page下的文件夹到自己项目中 配置app.json 具体教程查看解压包d
用户5997198
2019/09/20
9470
【小程序UI教程】小程序滑动选择tab-view
Elementui tabs组件内添加组件
siderBar和tab-bar在同一个组件内,所以要实现参数传递,需要先emit提交事件,再在父组件传递给另一个子组件,这样链路就完整了,没看懂我的看下面的参考吧,我也是参考它的结合自己的代码实现
老梁
2019/09/10
2.8K0
Elementui tabs组件内添加组件
保姆级全栈项目BBS 开发实录 第二章:前端基础页面
https://cdn.jsdelivr.net/gh/Qiu-JW/NotePicture/2024/08/image-20240806215014105.png
Qiuner
2024/11/21
530
保姆级全栈项目BBS 开发实录 第二章:前端基础页面
推荐阅读
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(二)
750
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 构建用户界面(一)
800
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(二) -> stepper
700
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(七) -> JS动画(二)
420
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(二) -> swiper
820
HarmonyOS-Codelabs系列挑战之构建你的数据应用
2810
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 构建用户界面(二)
620
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(七) -> JS动画(二)
600
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(一)
500
Vue CLI 2 脚手架 TabBar 组件封装
2900
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(七) -> JS动画(一)
530
【HarmonyOS】Tabs使用封装
760
Vue之Tabbar的实现
2.5K0
39·灵魂前端工程师养成-MVC
7570
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(六) -> CSS动画
900
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(五) -> Svg
820
TabBar(标签栏)实现思路
1.5K0
【小程序UI教程】小程序滑动选择tab-view
9470
Elementui tabs组件内添加组件
2.8K0
保姆级全栈项目BBS 开发实录 第二章:前端基础页面
530
相关推荐
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验