

点击蓝字,关注我们

本文共计5255字 预计阅读时长16分钟
一、引言
众所周知,RAG 已不再是早期的 Native RAG,而是作为 Agent 中的核心组件,作为企业级应用的决策大脑,是 Agent 获取知识、执行复杂任务的底层支持。当然,检索也不再是静态的一次性动作,而是根据任务需求,主动、多次、精准的调用内外部知识。
于企业而言,如何在保证数据绝对安全的前提下,构建一套高精度又可以适配业务的生产级 RAG 系统,支撑到上游各个业务部门稳定调用,是所有企业AI落地的核心命题。
企业 RAG 的三大痛点:
本文将介绍一套在私有化环境下,兼顾极致搜索准确度与数据安全的黄金组合。
二、架构设计
为了彻底解决前文提到的数据安全、检索准确度与业务适配灵活性这三大痛点,我们设计了基于 VPC(虚拟私有网络) 为安全底座,腾讯云 ES 为检索核心,Dify 为逻辑编排引擎的闭环架构。
架构组件概览:

接下来,笔者将基于腾讯云 ES 以及相关服务,实操搭建一套企业级 RAG 框架。
三、场景实践
1.创建 ES 集群,获取 ES 访问地址
ES 作为整个框架的核心底层引擎,用于文本、向量的存储和检索,是整个 RAG 框架的前置条件。
我们首先需要购买一个 ES 集群,具体操作参考官网文档:
https://cloud.tencent.com/document/product/845/19536
具体配置参考:
集群创建成功后,进入对应集群的访问控制(https://console.cloud.tencent.com/es/cluster/detail?instanceId=es-71szkmx7®ion=ap-guangzhou&searchQuery=%3FpageIndex%3D1%26pageSize%3D10%26region%3Dap-guangzhou&tab=access-control)下可获取相关信息,用户名为 elastic,密码在创建集群时所设置,如已忘记可以重置。

2.购买 TKE 集群,部署 Dify
相比自建部署 Dify,我们推荐腾讯云 TKE 和轻应用服务提供的一键部署 Dify 方案,具备高可用、灵活弹性等特点,可以满足企业的生产部署需求,本次实践以 TKE 为例。
具体操作如下:
1.创建 TKE 集群




2.进入创建的 TKE 集群




3.在存储中的 StorageClass 页签中创建命名为 cfs 的 Storageclass 对象,Provisioner选择文件存储cfs,保持子网一致。


4.部署 Dify



Dify 部署详情方案
3.将向量库设置为 ES
Dify 默认的向量数据库为 Weaviate,默认随 Dify 部署,仅适合 Demo 或较小数据量使用。我们要利用 ES 强大的混合搜索能力,去提升整个 RAG 系统的精准度,所以在这一步,我们需要将默认的向量库配置变更为 ES。
以 TKE 为例(轻应用服务需要登录到机器中,在docker 目录,编辑 .env 配置文件)
1.进入 TKE 集群,在配置管理页面,修改 Dify 的 API 和 Work 两个配置,操作一致,可以在界面上修改,也可直接编辑YAML,以在页面上更新为例。

2.点击更新配置,更改如下配置项

具体信息如下:
# VECTOR_STORE 修改为 elasticsearch
VECTOR_STORE=elasticsearch
# ES相关配置
ELASTICSEARCH_HOST=https://xxxxxxx # 注意这里的9200不要重复写
ELASTICSEARCH_PORT=9200
ELASTICSEARCH_USERNAME=elastic
ELASTICSEARCH_PASSWORD=PASSWORD
KIBANA_PORT=5601
3.重启工作负载
因为已经调整了 API 和 Worker 组件,需要重新部署更新,具体操作如下:

此时 Dify 使用的向量库就被修改成了 ES,我们还缺一个 Dify 服务入口。
4.新建 Ingress
通过 Ingress 和 CLB 负载均衡将 Dify 服务暴露出来,并提供安全的访问方式。
具体操作如下:




4.登录 Dify,配置模型服务
首次访问 Dify 需要先配置管理员账号,设置界面如下,然后根据设置的邮箱和密码进行登录,注意保存好管理员账号信息。

在搭建 RAG 过程中,除了本身需要文本和向量存储的 ES,还涉及 Embedding、Rerank 以及 LLM 等服务,在 Dify 上支持自定义和编排。
同时腾讯云 ES 提供两种模式的解决方案,进行上述服务的调用。
方案一:原子服务模式(推荐)

网络说明:
重点说明原子服务接口:
具体操作:
1.进入Dify的插件页面

2.选择插件市场(注意在购买节点时要开公网,如因业务需要不能开公网,则需本地上传或直接拉取 Github 仓库:
https://github.com/langgenius/dify-plugins/tree/main/TencentCloud/ES

3.搜索腾讯云 ES,进行插件安装

4. 插件安装成功后,可直接在入库和检索环节调用相关模型服务

5.在进入设置页面设置模型的秘钥信息

6.选择模型供应商,配置腾讯云 ES 的原子服务接口调用信息, ID 和 Key 请从云API 获取。

方案二:机器学习节点模式

腾讯云 ES 机器学习节点目前仅支持 Embedding、Rerank 模型的部署。
方案安全说明:
方案链路说明:
1.因为 Dify 不知道如何直接调用 ES 的 _infer API,因此需要写一个极简的 Python Web 服务(Adapter),将 ES 的私有推理接口转换成 OpenAI 兼容接口。
2.架构: Dify -> Python Adapter (VPC内) -> ES ML Node (_infer API)
实施路径:
1.在 ES 中部署模型: 在 ES 控制台上传模型,注意如要部署模型,需提前购买 ES机器学习节点

2.部署 Adapter,创建一个简单的 Flask/FastAPI 服务,部署在CVM 上
这里以embedding为例,在 CVM 部署一个简单的协议转换服务。

sudo yum update -y
sudo yum install -y python3 git
importos
importasyncio
importlogging
fromtypingimportUnion,List
fromfastapiimportFastAPI,HTTPException
frompydanticimportBaseModel
fromelasticsearchimportElasticsearch
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s- %(name)s- %(levelname)s- %(message)s',
handlers=[
logging.FileHandler('embedding_service.log'), # 输出到文件
logging.StreamHandler() # 同时输出到控制台
]
)
logger=logging.getLogger(__name__)
ES_URL=os.getenv("ES_URL","http://you_es_internal_ip:9200") # ES内网ip
ES_USER=os.getenv("ES_USER","username") # ES用户名
ES_PASS=os.getenv("ES_PASS","password") # ES密码
ES_MODEL_ID=os.getenv("ES_MODEL_ID","es_model_id") # ES部署的模型id
app=FastAPI()
# 全局变量存储ES连接,初始化为None
es=None
classEmbeddingRequest(BaseModel):
input:Union[str,List[str]]
model:str
@app.on_event("startup")
asyncdefstartup_event():
"""应用启动时创建ES连接"""
globales
# 添加证书验证配置,提高连接稳定性
es=Elasticsearch(
ES_URL,
basic_auth=(ES_USER,ES_PASS),
verify_certs=False # 如果是自签名证书或测试环境,关闭证书验证
)
logger.info("Elasticsearch连接已建立")
@app.on_event("shutdown")
asyncdefshutdown_event():
"""应用关闭时关闭ES连接"""
globales
ifes:
es.close()
logger.info("Elasticsearch连接已关闭")
@app.post("/v1/embeddings")
asyncdefcreate_embeddings(request:EmbeddingRequest):
texts= [request.input] ifisinstance(request.input,str)elserequest.input
ifnottexts:
raiseHTTPException(status_code=400,detail="input empty")
# 构造 ESdocs(字段名需与模型训练时一致,使用text_field字段)
docs= [{"text_field":t} fortintexts]
loop=asyncio.get_event_loop()
try:
# 使用requests库直接调用ESAPI,避免transport的限制
importrequests
importjson
url=f"{ES_URL}/_ml/trained_models/{ES_MODEL_ID}/_infer"
body= {"docs":docs}
# 构建认证头
auth=(ES_USER,ES_PASS)
headers= {"Content-Type":"application/json"}
resp=awaitloop.run_in_executor(
None,
lambda:requests.post(
url,
auth=auth,
headers=headers,
json=body,
verify=False, # 关闭证书验证
timeout=30
)
)
# 检查响应状态
ifresp.status_code !=200:
raiseException(f"ES API返回错误状态: {resp.status_code}, 响应: {resp.text}")
resp_data=resp.json()
logger.info(f"ES推理响应状态: {resp.status_code}")
exceptExceptionase:
logger.error(f"ES推理错误详情: {e}")
raiseHTTPException(status_code=502,detail=f"ES infer error: {e}")
# 根据ES返回结构解析predicted_value
inference_results=resp_data.get("inference_results", [])
embeddings= []
fori,resultinenumerate(inference_results):
predicted_value=result.get("predicted_value")
ifpredicted_value:
embeddings.append(predicted_value)
logger.info(f"成功获取第{i}个文本的嵌入向量,长度: {len(predicted_value)}")
else:
logger.error(f"第{i}个结果中未找到predicted_value,结果结构: {result}")
raiseHTTPException(status_code=500,detail=f"No predicted_value found in result {i}")
ifnotembeddings:
logger.error(f"未找到任何嵌入向量,完整响应: {resp_data}")
raiseHTTPException(status_code=500,detail="No embeddings generated from ES")
return {
"object":"list",
"data": [{"object":"embedding","embedding":emb,"index":i} fori,embinenumerate(embeddings)],
"model":request.model,
"usage": {
"prompt_tokens":sum(len(text)fortextintexts),
"total_tokens":sum(len(text)fortextintexts)
}
}
requirement.txt
fastapi==0.83.0
uvicorn[standard]==0.16.0
elasticsearch==8.11.0
pydantic==1.9.0
requests==2.25.1
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install -r requirement.txt
deactivate
nohup uvicorn main:app --host 0.0.0.0 --port 8000> service.log 2>&1 &
curl -X POST "http://localhost:8000/v1/embeddings" -H "Content-Type: application/json" -d '{ "input": "这是一个测试文本", "model": "bge-base-zh-v1.5"}'
3.Dify 配置模型服务,与原子服务类似,Dify 提供了 OpenAI-API-Compatible 插件,我们需要安装这个插件,将我们的模型服务转发进来


OpenAI-API-Compatible 并非一个需要独立下载的大型插件或运行时环境,它只是 Dify 内部的一个驱动程序或模型协议解析器,所以它也是在 VPC 下的,不涉及出域。
5.测试验证
1.创建知识库,并导入文档

2.配置 Embedding 和混合检索

3.完成文档导入和向量化

4.在 ES 中查看数据是否写入成功,进入 ES 控制台查看对应集群的索引

5.在知识库中召回测试,召回成功如下

6.应用编排测试,可进行知识库检索以及LLM调用

四、结语
在 AI 原生应用的浪潮中,RAG 已经完成了从实验项目到生产工具的蜕变,它正在成为企业决策的核心知识系统。在那些充斥着专业术语、复杂逻辑、且对数据安全有极高要求的企业核心场景里,腾讯云 ES 以其多年的技术积淀,证明了在混合检索、大规模并发及索引管理上的统治力。
构建一套生产级的 RAG 系统并非终点,而是一个持续进化的起点。随着 Agentic RAG 的深入,腾讯云 ES 将在索引构建、查询理解、检索排序到结果生成全链路 AI 化,成为 AI 时代最具竞争力的搜索基础设施,不仅仅服务人类用户,更要成为面向千万级 Agent 的核心检索层。
END

清明节兼具自然与人文两大内涵,既是自然节气点,也是传统节日。扫墓祭祖与踏青郊游是清明节的两大礼俗主题,这两大传统礼俗在中国自古传承,至今不辍。

关注腾讯云大数据╳探索数据的无限可能
往期精彩



求点赞

求分享

求喜欢
