首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >腾讯云 Elasticsearch RAG 案例

腾讯云 Elasticsearch RAG 案例

原创
作者头像
岳涛
发布2025-06-30 17:26:36
发布2025-06-30 17:26:36
24200
代码可运行
举报
文章被收录于专栏:大数据生态大数据生态
运行总次数:0
代码可运行

说明

本文描述问题及解决方法同样适用于 腾讯云 Elasticsearch Service(ES)

什么是RAG?

随着数据智能技术的不断发展,以大语言模型(LLM)驱动的AIGC为代表的内容生成技术已经成为企业数据智能能力中不可或缺的一部分。但在实践过程中,LLM(例如ChatGPT)仍存在不少问题,例如信息更新不及时、垂直领域知识匮乏,且可能产生“幻觉”(即生成不准确的内容)等问题。

检索增强生成(Retrieval-Augmented Generation,RAG)技术是一种结合了检索和大语言模型内容生成的技术方案,它通过引用外部知识库,在用户输入Query时检索出知识,然后让模型基于可信的知识进行用户回答。RAG具有较高的可解释性和定制能力,可大幅降低大语言模型的幻觉,适用于问答系统、文档生成、智能助手等多种自然语言处理任务。

本篇文章,将手把手教你基于腾讯云ES与HAI平台,搭建专属AI知识库与DeepSeek大模型,让你快速拥有一个更安全、更懂你、且不会“服务器繁忙,请稍后再试”的AI助手。

为什么选择腾讯云ES?

腾讯云ES是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack,支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。在RAG方面,腾讯云ES支持了一站式向量检索、文本+向量混合搜索、倒数排序融合、与大模型集成、GPU高性能推理、字段级别权限控制等能力,同时针对查询性能做了大量优化,有效的提升了数据检索效率,目前已落地微信读书“AI 问书”、微信输入法“问 AI”、腾讯地图、腾讯会议、IMA Copilot、乐享智能搜索等大型应用中。

同时,作为国内公有云首个从自然语言处理、到向量生成/存储/检索、并与大模型集成的端到端一站式技术平台,腾讯云ES作为核心参编单位参与了由中国信通院发起的的RAG标准制定,并成为首个通过RAG权威认证的企业。

通过腾讯云ES,你可以根据自身需求,灵活定制知识库的内容与功能, 打造更懂你、更安全、更可控的专属AI助手。

AI 助手构建

购买ES 集群

1、登录腾讯云ES控制台

2、点击新建

3、计费模式为按量计费,产品版本为AI搜索增强版、ES 版本为 8.16.1

4、ES 节点配置,测试环境可选择为标准型4核8G,节点数为2(生产环境推荐三个以上),磁盘为通用型SSD,磁盘容量为 20GB:

登录Kibana

1、集群创建完成后,点击集群名称,进入访问控制页面,在可视化访问控制设置公网访问策略:

2、获取当前 IP 地址并设置到 IP 白名单中:

3、点击Kibana 公网访问地址访问 Kibana。

部署embedding 模型

集群购买完成后,前往Kibana 部署 Embedding 模型、创建知识库索引与向量化管道:

1、 开启节点出站访问,仅开启数据节点即可,如有专用主节点,仅开启专用主节点即可。(该功能为白名单,请联系工单处理):

注:如需上传自定义模型或第三方平台(如 Huggingface)模型,可参考GitHub - elastic/eland: Python Client and Toolkit for DataFrames, Big Data, Machine Learning and ETL in Elasticsearch

2、登录 Kibana 之后,在左侧导航栏找到Machine Learning功能:

3、 进入模型管理页面,并找到类型为text_embedding的模型,本次演示我们使.multilingual-e5-small_linux-x86_64模型,这是一个 384 维的多语言模型,点击Download

4、下载完成后,点击Deploy,弹窗信息使用默认值即可:

创建索引与向量化管道

1、 在Kibana页面点击进入Dev tools

2、 创建知识库索引:index-name为索引名称,实际可按需命名:

代码语言:javascript
代码运行次数:0
运行
复制
PUT /index-name
{
  "mappings": {
    "properties": {
    "title": {
        "type": "keyword"
      },
      "content": {
        "type": "text"
      },
      "content_embedding": {
        "type": "dense_vector",
        "dims": 384
      }
    }
  }
}

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

代码语言:javascript
代码运行次数:0
运行
复制
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模型向量化之后存储到新的字段中。

写入知识库数据

通过 Bulk API 批量写入数据,可将 title 、content 、url 的内容替换为实际的知识库数据。

代码语言:javascript
代码运行次数:0
运行
复制
POST index-name/_bulk?pipeline=index-name-pipeline&refresh
{ "index" : {} }
{ "title" : "公司年度财务报告","content": "2022年公司总收入为5000万元,净利润为1200万元。主要增长来源于新产品线的推出和市场扩展。" }
{ "index" : {} }
{ "title" : "员工满意度调查结果","content": "2022年员工满意度调查显示,85%的员工对公司的工作环境表示满意,70%的员工对薪酬福利表示满意。" }
{ "index" : {} }
{ "title" : "产品开发计划","content": "2023年公司计划推出三款新产品,分别是智能手表、无线耳机和智能家居设备。预计第一季度完成研发,第二季度开始量产。" }
{ "index" : {} }
{ "title" : "市场营销策略","content": "2023年的市场营销策略将重点放在数字营销和社交媒体推广上,计划增加30%的营销预算,以提高品牌知名度和市场份额。" }
{ "index" : {} }
{ "title" : "客户反馈汇总","content": "2022年客户反馈汇总显示,客户对产品质量和售后服务的满意度较高,但对物流速度和包装有一定的改进需求。" }
{ "index" : {} }
{ "title" : "竞争对手分析报告","content": "2022年竞争对手分析报告显示,主要竞争对手在产品创新和市场推广方面投入较大,市场份额有所提升。公司需加强研发和市场营销力度。" }
{ "index" : {} }
{ "title" : "员工培训计划","content": "2023年公司将推出一系列员工培训计划,包括领导力培训、技术技能提升和跨部门合作培训,以提高员工综合素质。" }
{ "index" : {} }
{ "title" : "IT系统升级方案","content": "公司计划在2023年对现有IT系统进行升级,包括引入新的ERP系统、提升网络安全措施和优化数据存储解决方案。" }
{ "index" : {} }
{ "title" : "环保政策","content": "公司致力于可持续发展,2023年将实施一系列环保政策,包括减少碳排放、提高能源利用效率和推广绿色办公。" }
{ "index" : {} }
{ "title" : "年度股东大会纪要","content": "2022年度股东大会纪要显示,公司董事会通过了新的发展战略,计划在未来五年内实现年均增长15%的目标。" }
{ "index" : {} }
{ "title" : "年度销售数据分析","content": "2022年公司销售额同比增长20%,其中线上销售占比达到60%。主要销售渠道包括自有电商平台和第三方电商平台。" }
{ "index" : {} }
{ "title" : "研发项目进展报告","content": "2022年公司研发部门完成了五个主要项目,包括新型电池技术和人工智能算法优化。预计这些技术将在未来两年内应用于新产品。" }
{ "index" : {} }
{ "title" : "客户服务改进计划","content": "2023年公司计划提升客户服务质量,包括增加客服人员数量、优化客服流程和引入智能客服系统。" }
{ "index" : {} }
{ "title" : "供应链管理策略","content": "公司计划在2023年优化供应链管理,包括与更多供应商建立合作关系、提升物流效率和降低库存成本。" }
{ "index" : {} }
{ "title" : "员工福利政策","content": "2023年公司将推出新的员工福利政策,包括增加带薪休假天数、提供健康保险和设立员工奖励计划。" }
{ "index" : {} }
{ "title" : "市场调研报告","content": "2022年市场调研报告显示,消费者对智能家居产品的需求持续增长,公司应加大该领域的研发和市场推广力度。" }
{ "index" : {} }
{ "title" : "品牌推广计划","content": "2023年公司将实施新的品牌推广计划,包括赞助大型体育赛事、与知名网红合作和开展线上线下活动。" }
{ "index" : {} }
{ "title" : "年度技术研讨会纪要","content": "2022年度技术研讨会纪要显示,公司技术团队讨论了最新的行业趋势和技术创新,提出了多项技术改进建议。" }
{ "index" : {} }
{ "title" : "员工绩效评估报告","content": "2022年员工绩效评估报告显示,90%的员工达到了预期绩效目标,其中20%的员工表现优异,获得了额外奖励。" }
{ "index" : {} }
{ "title" : "年度招聘计划","content": "2023年公司计划招聘100名新员工,重点招聘技术研发、市场营销和客户服务等岗位,以支持公司业务扩展。" }
{ "index" : {} }
{ "title" : "年度预算规划","content": "2023年公司年度预算规划显示,研发投入将增加20%,市场营销预算将增加30%,以支持新产品开发和市场推广。" }
{ "index" : {} }
{ "title" : "客户满意度调查结果","content": "2022年客户满意度调查结果显示,85%的客户对公司的产品质量表示满意,75%的客户对售后服务表示满意。" }
{ "index" : {} }
{ "title" : "年度环保报告","content": "2022年公司环保报告显示,公司减少了10%的碳排放,增加了15%的能源利用效率,并推广了多项绿色办公措施。" }
{ "index" : {} }
{ "title" : "员工健康计划","content": "2023年公司将推出新的员工健康计划,包括定期健康检查、心理健康咨询和健身活动,以提高员工健康水平。" }
{ "index" : {} }
{ "title" : "年度法律合规报告","content": "2022年公司法律合规报告显示,公司在数据保护、劳动法和环境法规方面均符合相关法律要求。" }
{ "index" : {} }
{ "title" : "年度风险管理报告","content": "2022年公司风险管理报告显示,公司在财务风险、市场风险和运营风险方面采取了多项措施,有效降低了潜在风险。" }
{ "index" : {} }
{ "title" : "年度创新项目计划","content": "2023年公司将启动多个创新项目,包括人工智能应用、区块链技术和新材料研发,以保持技术领先优势。" }
{ "index" : {} }
{ "title" : "年度社会责任报告","content": "2022年公司社会责任报告显示,公司在教育支持、社区服务和环境保护方面做出了积极贡献。" }
{ "index" : {} }
{ "title" : "年度销售目标","content": "2023年公司设定了新的销售目标,计划实现销售额增长25%,并扩大市场份额。" }
{ "index" : {} }
{ "title" : "员工晋升计划","content": "2023年公司将实施新的员工晋升计划,提供更多晋升机会和职业发展路径,以激励员工。" }
{ "index" : {} }
{ "title" : "年度技术创新报告","content": "2022年公司技术创新报告显示,公司在人工智能和区块链技术方面取得了显著进展。" }
{ "index" : {} }
{ "title" : "年度市场份额分析","content": "2022年公司市场份额分析显示,公司在智能家居领域的市场份额增长了15%,在可穿戴设备领域增长了10%。" }
{ "index" : {} }
{ "title" : "员工培训效果评估","content": "2022年员工培训效果评估显示,参加培训的员工技能水平提高了20%,工作效率提高了15%。" }
{ "index" : {} }
{ "title" : "年度客户流失率报告","content": "2022年公司客户流失率报告显示,公司客户流失率降低了5%,主要得益于改进的客户服务和产品质量。" }
{ "index" : {} }
{ "title" : "年度市场竞争策略","content": "2023年公司市场竞争策略包括加大产品创新力度、提升品牌知名度和优化销售渠道。" }
{ "index" : {} }
{ "title" : "年度员工满意度提升计划","content": "2023年公司将实施新的员工满意度提升计划,包括改善工作环境、增加员工福利和提供职业发展机会。" }
{ "index" : {} }
{ "title" : "年度技术研发预算","content": "2023年公司技术研发预算将增加20%,以支持新技术的开发和现有技术的优化。" }

基于HAI平台部署DeepSeek模型

1、登录 高性能应用服务 HAI 控制台

2、单击新建,进入高性能应用服务 HAI 购买页面

选择应用:选择社区应用,应用选择 DeepSeek-R1

地域:选择与ES集群相同的地域,降低网络延迟、提高您的访问速度。

算力方案:选择合适的算力套餐。在单并发访问模型的情况下,建议最低配置如下:

模型

参数量级

推荐算力套餐

DeepSeek-R1

1.5B/7B/8B/14B

GPU基础型

DeepSeek-R1

32B

GPU进阶型

实例名称:自定义实例名称,若不填则默认使用实例 ID 替代。

购买数量:默认1台。

3、单击立即购买。

4、核对配置信息后,单击提交订单,并根据页面提示完成支付。

5、 等待创建完成。单击实例任意位置并进入该实例的详情页面。同时您将在站内信中收到登录密码。此时,可通过可视化界面(GUI)或命令行(Terminal)使用 DeepSeek 模型。此处我们需保存公网IP,以便于通过SDK进行调用。

注:关于HAI部署,详情可参考:高性能应用服务 HAI 快速使用 DeepSeek-R1 模型_

调用DeepSeek大模型

1、 获取站内信里的账号密码

2、 登录服务器

3、 安装ollama:

代码语言:javascript
代码运行次数:0
运行
复制
pip install ollama

4、 保存以下内容为 hai_ds.py,并修改公网ip为站内信的公网ip:

代码语言:javascript
代码运行次数:0
运行
复制
from ollama import Client
client = Client(
  host='http://127.0.0.1:6399'
)

def deepseek_gpt(system_prompt, user_prompt):
    response = client.chat(model='deepseek-r1', messages=[
        {
            "role": "system",
            "content": system_prompt,
        },
        {
            "role": "user",
            "content": user_prompt,
        },
    ],)   

    return response.message.content

AI助手页面构建

1、安装 streamlit与elasticsearch client:

代码语言:javascript
代码运行次数:0
运行
复制
pip install streamlit
pip install elasticsearch==8.16

2、 获取 ES 访问地址:

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

3、Web界面参考如下代码( 可命名为 web_ds.py,需与hai_ds.py在一个目录下)

代码语言:javascript
代码运行次数:0
运行
复制
import streamlit as st
from elasticsearch import Elasticsearch
from hai_ds import deepseek_gpt

es_client = Elasticsearch(
    "https://es-xxxxxx.public.tencentelasticsearch.com:9200",basic_auth=("elastic", "******"))

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":{
            "rank_fusion":{
                "rank_window_size":100,
                "rank_constant":20
            }
        }
    }
    result = es_client.search(index="index-name", body=es_query)
    return result["hits"]["hits"]

def create_deepseek_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:
结合{context}的信息回答{question}的问题,要求简练高效
"""
    return prompt

def generate_deepseek_completion(user_prompt, question):
    response = deepseek_gpt(user_prompt, question)
    response_str = str(response)
    # 去掉 <think> 标签及其内容
    while '<think>' in response_str and '</think>' in response_str:
        start_idx = response_str.find('<think>')
        end_idx = response_str.find('</think>') + len('</think>')
        response_str = response_str[:start_idx] + response_str[end_idx:]
    return response_str

def format_result(hit):
    title = hit["_source"]["title"]
    return f'[{title}]'

def main():
    st.markdown("<h1 style='text-align: center;'>XX科技AI决策助理</h1>", unsafe_allow_html=True)

    # 创建输入框和查询按钮
    question = st.text_input("请输入您的问题:")
    if st.button("查询并生成答案"):
        # 显示“思考中...”信息
        status_text = st.empty()
        status_text.text("思考中...")

        # 获取Elasticsearch结果并创建HunYuan提示
        elasticsearch_results = get_elasticsearch_results(question)
        user_prompt = create_deepseek_prompt(elasticsearch_results, question)
        system_prompt = f"""
你是一个问答任务的助手。使用呈现的上下文实事求是地回答问题。
"""

        # 使用deepseek模型生成回答
        openai_completion = generate_deepseek_completion(system_prompt, user_prompt)

        # 覆盖“思考中...”信息并显示结果
        status_text.empty()
        st.markdown("### 回答:")
        st.markdown(f"<div style='border: 2px solid #4CAF50; padding: 10px; border-radius: 5px;'>{openai_completion}</div>", unsafe_allow_html=True)

        # 添加换行
        st.markdown("<br>", unsafe_allow_html=True)

        # 展示Elasticsearch查询结果
        st.markdown("### 大模型参考的文档:")
        references_html = "<div style='background-color: #f0f0f0; padding: 10px; border-radius: 5px;'>"
        for hit in elasticsearch_results:
            references_html += f"<div style='color: #808080;'>{format_result(hit)}</div>"
        references_html += "</div>"
        st.markdown(references_html, unsafe_allow_html=True)

    # 添加换行
    st.markdown("<br>", unsafe_allow_html=True)

    # 添加推荐问题
    st.markdown("### 推荐问题:")
    recommended_questions = [
        "2023年公司计划推出的新产品有哪些?",
        "公司2022年的财务报告是什么?",
        "员工满意度调查结果如何?",
        "公司2023年的市场营销策略是什么?"
    ]
    recommendations_html = "<div style='background-color: #f0f0f0; padding: 10px; border-radius: 5px;'>"
    for rq in recommended_questions:
        recommendations_html += f"<div style='color: #808080; padding: 5px;'>{rq}</div>"
    recommendations_html += "</div>"
    st.markdown(recommendations_html, unsafe_allow_html=True)

if __name__ == "__main__":
    main()

在上述 python 文件的目录下,使用如下命令运行系统:

代码语言:javascript
代码运行次数:0
运行
复制
streamlit run web_ds.py

4、开启访问白名单

私域数据问答测试

“2023年公司计划推出的新产品有哪些?”

“公司2022年的财务报告是什么?”

“员工满意度调查结果如何?”

“公司2023年的市场营销策略是什么?”

可见,使用腾讯云ES与HAI构建基于DeepSeek的RAG应用,可同时结合DeepSeek强大的推理与内容生成能力、腾讯云ES一站式RAG方案以及HAI平台高效的模型部署能力,显著提高答案生成的准确性、可靠性,有效避免大模型的幻觉问题,为企业提供更加优质的本地知识库智能问答服务。

总结

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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明
  • 什么是RAG?
  • 为什么选择腾讯云ES?
  • AI 助手构建
    • 购买ES 集群
    • 登录Kibana
    • 部署embedding 模型
    • 创建索引与向量化管道
    • 写入知识库数据
    • 基于HAI平台部署DeepSeek模型
    • 调用DeepSeek大模型
    • AI助手页面构建
    • 私域数据问答测试
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档