基于Atlas 800I A2的RAG端到端实践

随着DeepSeek在各行业快速应用落地,如何基于DeepSeek构建上层业务应用已成为推动行业进步的关键,开源社区提供了很多可选的应用套件,本文以Dify为例,介绍了从0开始基于DeepSeek蒸馏模型,构建RAG系统的端到端实践。

注:本实践需要提前开通服务器对外端口,需预留6个端口号:

1、MindIE大模型推理服务1个;

2、embedding和rerank模型3个;

3、dify应用服务开通2个。

用户根据实际服务器情况配置IP及端口。举例:MindIE服务开通:40033;embedding和rerank模型开通:40035、40036、40037;dify服务开通:40038和442。

1. 什么是RAG?

RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合检索技术与生成模型的技术框架,旨在通过外部知识库优化大语言模型的生成结果,提升回答的准确性和上下文相关性。RAG 通过检索外部知识库中的信息(如文档、段落或结构化数据),将检索到的内容与用户查询结合后,输入生成模型,使模型输出的回答既具备生成灵活性,又减少事实性错误‌。

RAG的核心流程分为检索与生成两部分。

  1. 检索:从外部知识库中提取与用户查询相关的内容,例如通过语义相似度匹配或关键词筛选‌。通常使用embeding模型初步从知识库中筛选出候选内容,再通过reranker模型对粗排结果进行深度分析,优化检索到的上下文内容。

  2. 生成:将检索结果与原始问题合并为增强后的提示词,输入llm模型,生成基于外部知识库的回答。

本次实践将使用TEI部署检索服务,提供embeding与reranker 服务化接口,使用Mind IE部署DeepSeek-R1-Distill-Qwen-14B作为大语言模型,最终将两者接入dify,进行统一调用

2. TEI服务化部署

TEI(Text Embeddings Inference)是由Hugging Face团队开发的开源高性能文本嵌入推理引擎,专为生产环境中的大规模语义计算设计。其核心目标是解决传统深度学习框架(如PyTorch)在部署文本嵌入模型时面临的性能瓶颈,通过Rust语言底层优化和动态批处理技术,实现比原生实现高5-10倍的吞吐量,同时将延迟降低至毫秒级。TEI支持主流的预训练嵌入模型(如BERT、Sentence-BERT、E5等),只需指定HuggingFace模型ID即可快速部署为标准化API服务,无需复杂代码改造。

昇腾目前已支持TEI部署。

2.1 权重下载

本文档以bge-m3模型作为embedding模型,bge-reranker-v2-m3作为rerank模型,可以自行从魔乐社区下载。模型链接:

2.2 环境准备

2.2.1 拉取镜像

首先,下载最新的TEI镜像安装包。

镜像介绍:该镜像基于text embedding inference 适配昇腾NPU卡提供embedding、reranker等服务化接口,接口兼容开源text embedding inference, 该镜像支持embedding和reranker、Sequence Classification等模型,该镜像以普通用户HwHiAiUser用户运行。

镜像下载:https://www.hiascend.com/developer/ascendhub/detail/07a016975cc341f3a5ae131f2b52399d

  1. 选择所需镜像,点击"立即下载":
  1. 根据弹出的镜像下载指令安装对应的docker镜像, 请确保机器有网络链接:

2.2.2 加载镜像

1. 查看镜像id

获取镜像后,运行 docker images 指令,可以查看当前下载的TEI镜像。

2. 创建容器启动指令

用 vim docker_start.sh 创建容器启动脚本,在脚本中添加以下变量:

复制代码
# 变量model_dir=权重路径image_id=镜像idembedding_model_id=embedding模型reranker_model_id=reranker模型listen_ip=监听ipembedding_listen_port=embedding服务端口reranker_listen_port=reranker服务端口npu_id=使用的npu卡号

添加embedding与reranker的服务启动命令到容器的入口脚本中:

复制代码
# 写入embedding与reranker启动命令mkdir ./.tempecho "#!/bin/bash" > ./.temp/run.shecho "" >> ./.temp/run.shecho "bash start.sh $embedding_model_id $listen_ip $embedding_listen_port > logs/embedding.log 2>&1 &" >> ./.temp/run.shecho "sleep 20" >> ./.temp/run.shecho "bash start.sh $reranker_model_id $listen_ip $reranker_listen_port > logs/reranker.log 2>&1 &" >> ./.temp/run.shecho "wait" >> ./.temp/run.shchmod +x ./.temp/run.sh

添加容器启动命令:

复制代码
# 启动容器docker run -itd --name=tei --net=host --privileged --user root \  -e ASCEND_VISIBLE_DEVICES=$npu_id \  -e HOME=/home/HwHiAiUser \  -v $model_dir:/home/HwHiAiUser/model \  -v ./.temp/run.sh:/home/HwHiAiUser/run.sh \  -v ./logs:/home/HwHiAiUser/logs \  --entrypoint /home/HwHiAiUser/run.sh \  $image_id
rm -rf ./.temp

以下为完整示例:

bash 复制代码
# 变量
model_dir=/mnt/nvme1n1/bge-weights
image_id=05208487bedf
embedding_model_id=BAAI/bge-m3
reranker_model_id=BAAI/bge-reranker-v2-m3
listen_ip=0.0.0.0
embedding_listen_port=12345
reranker_listen_port=54321
npu_id=0
# 写入embedding与reranker启动命令
mkdir ./.temp
echo "#!/bin/bash" > ./.temp/run.sh
echo "" >> ./.temp/run.sh
echo "bash start.sh $embedding_model_id $listen_ip $embedding_listen_port > logs/embedding.log 2>&1 &" >> ./.temp/run.sh
echo "sleep 20" >> ./.temp/run.sh
echo "bash start.sh $reranker_model_id $listen_ip $reranker_listen_port > logs/reranker.log 2>&1 &" >> ./.temp/run.sh
echo "wait" >> ./.temp/run.sh

chmod +x ./.temp/run.sh
# 启动容器
docker run -itd --name=tei --net=host --privileged --user root \
  -e ASCEND_VISIBLE_DEVICES=$npu_id \
  -e HOME=/home/HwHiAiUser \
  -v $model_dir:/home/HwHiAiUser/model \
  -v ./.temp/run.sh:/home/HwHiAiUser/run.sh \
  -v ./logs:/home/HwHiAiUser/logs \
  --entrypoint /home/HwHiAiUser/run.sh \
  $image_id
rm -rf ./.temp

3. 启动容器并测试

复制代码
# 启动容器bash docker_start.sh
# 查看服务状态tail -f logs/embedding.logtail -f logs/reranker.log

若服务启动完成,会返回如下结果:

成功启动后可通过如下命令进行测试:

embedding:

复制代码
curl 127.0.0.1:12345/embed \    -X POST \    -d '{"inputs":"What is Deep Learning?"}' \    -H 'Content-Type: application/json'

结果:

reranker:

复制代码
curl 127.0.0.1:54321/rerank \    -X POST \    -d '{"query":"What is Deep Learning?", "texts": ["Deep Learning is not...", "Deep learning is..."]}' \    -H 'Content-Type: application/json'

结果:

3. MindIE服务化部署

MindIE(Mind Inference Engine,昇腾推理引擎)是华为昇腾针对AI全场景业务的推理加速套件。通过分层开放AI能力,支撑用户多样化的AI业务需求,使能百模千态,释放昇腾硬件设备算力。向上支持多种主流AI框架,向下对接不同类型昇腾AI处理器,提供多层次编程接口,帮助用户快速构建基于昇腾平台的推理业务。

3.1 权重下载

本文以DeepSeek-R1-Distill-Qwen-14B模型为例,可以自行从魔乐社区下载:

https://modelers.cn/models/State_Cloud/DeepSeek-R1-Distill-Qwen-14B

3.2 环境准备

3.2.1 拉取镜像

首先,申请并获取最新的MindIE镜像安装包:

镜像介绍:该镜像已具备模型运行所需的基础环境,包括:CANN、FrameworkPTAdapter、MindIE与ATB-Models,可实现模型快速上手推理。注意,为方便使用,该镜像中内置了ATB-Models压缩包,并放置于/opt/package之下,如需使用,可从镜像中获取。

镜像下载:https://www.hiascend.com/developer/ascendhub/detail/af85b724a7e5469ebd7ea13c3439d48f

  1. 选择所需镜像,点击"立即下载"(1.0.0及以后版本支持DeepSeekR1蒸馏模型):
  1. 根据弹出的镜像下载指令安装docker镜像,请确保机器有网络连接:

3.2.2 加载镜像

1. 查看镜像id

获取镜像后,运行docker images指令,可以查看当前下载的TEI镜像。

2. 创建容器启动指令

用vim docker_start.sh创建容器启动脚本,在脚本中添加以下指令:

复制代码
container_name=$1  # 参数1:容器名称image_id=$2         # 参数2:镜像IDmodel_path=$3       # 参数3:权重路径docker run -it --privileged --name=$container_name --net=host --shm-size=500g\--device=/dev/davinci_manager \--device=/dev/devmm_svm \--device=/dev/hisi_hdc \-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \-v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \-v /usr/local/sbin/:/usr/local/sbin/ \-v /var/log/npu/slog/:/var/log/npu/slog \-v /var/log/npu/profiling/:/var/log/npu/profiling \-v /var/log/npu/dump/:/var/log/npu/dump \-v /var/log/npu/:/usr/slog \-v /etc/hccn.conf:/etc/hccn.conf \-v $model_path:/model \$image_id \/bin/bash

3. 启动容器

复制代码
export container_name=mindie_2.0.T3export image_id=2ed659651f4fexport model_path=/home/weights/DeepSeek-R1-Distill-Qwen-14Bbash docker_start.sh $container_name $image_id $model_path

3.2.3 启动mindie服务化

1. 更改模型config.json文件权限

复制代码
chmod 640 /model/config.json

2. 更改服务化配置文件

进入服务化路径,并打开服务化配置文件:

复制代码
cd /usr/local/Ascend/mindie/latest/mindie-service/      vim conf/config.json

修改以下参数,更多参数请参考MindIE官网(配置参数说明-MindIE Server https://www.hiascend.com/document/detail/zh/mindie/100/mindieservice/servicedev/mindie_service0285.html

复制代码
# "ServerConfig": "ipAddress" : $服务器ip         "httpsEnabled" : false       # "BackendConfig"          "npuDeviceIds" : [[0,1]]     "maxSeqLen" : 32768         "maxInputTokenLen": 16384    "modelName" : "deepseek-qwen""modelWeightPath" : "/model"   "worldSize": 2            # "ScheduleConfig" "maxPrefillTokens" : 16384"maxIterTimes" : 16384

3. 启动服务化

复制代码
cd /usr/local/Ascend/mindie/latest/mindie-service/./bin/mindieservice_daemon

显示 "Daemon start success! "代表成功拉起服务化。

注:若希望后台运行,可使用命令"nohup ./bin/mindieservice_daemon 2>&1 &"后台启动,之后使用"tail -f nohup.out"命令查看mindie service的状态。

4. 发送请求进行测试

开启另外一个窗口,连接服务器,并进入容器,发送以下指令(若使用后台启动,则可以直接在当前窗口发送请求指令):

复制代码
curl -H "Accept: application/json" \                       -H "Content-type: application/json" \                       -X POST -d '{                                       "model": "qwen",                                     "messages": [{"role": "user", "content": "请介绍一下什么是蒸馏模型"}], "max_tokens": 32768,                                  "stream": false                                      }' http://127.0.0.1:1025/v1/chat/completions

请求结果:

4. Dify

4.1 工具介绍

Dify 是一款开源的大语言模型(LLM)应用开发平台,通过 ‌低代码/无代码‌ 的模块化设计降低生成式 AI 应用的开发门槛,支持集成 OpenAI、Claude3 等主流模型及自托管模型(如 Ollama)‌。其核心功能包括 ‌后端即服务(BaaS)‌、‌可视化 Prompt 编排‌ 和 ‌LLMOps 工具链‌,可灵活构建智能客服、文本生成等场景‌。平台内置 ‌RAG 引擎‌ 实现知识库检索增强生成,并通过 ‌Agent 框架‌ 支持复杂任务分解与工具调用(如搜索、绘图),结合 ‌Workflow 工作流‌ 实现多步骤业务逻辑自动化‌。

4.2 Dify安装

具体可参考官方手册:https://docs.dify.ai/zh-hans/getting-started/install-self-hosted/docker-compose

4.2.1 前置条件

|--------|------------|-----------|----------------|----------------|
| 硬件与软件 | cpu | ram | docker | docker compose |
| 要求(版本) | >= 2 Core | >= 4 GiB | 19.03 or later | 1.28 or later |

4.2.2 安装

1. 拉取github仓库。

以0.15.3版本为例:

复制代码
git clone https://github.com/langgenius/dify.git --branch 0.15.3

2. 启动dify

进入docker目录:

cd dify/docker

复制环境配置文件:

复制代码
cp .env.example .env

vim打开.env文件更改端口号:

复制代码
vim .env

将NGINX_PORT与NGINX_PORT_EXPOSE更改为未使用的端口。

默认使用80端口,若无冲突则无需更改。

启动容器

复制代码
docker compose up -d

首次启动时,docker会自动从云端仓库拉取镜像。但由于网络因素,国内通常无法正常从默认docker源进行拉取。请自行更改/etc/docker/daemon.json配置文件,添加国内镜像源(请自行搜索)。

复制代码
vim /etc/docker/daemon.json

/etc/docker/daemon.json

复制代码
{    "default-runtime": "ascend",    "registry-mirrors":[        ...    ],    "runtimes": {        "ascend": {            "path": "/usr/local/Ascend/Ascend-Docker-Runtime/ascend-docker-runtime",            "runtimeArgs": []            }    }}

运行结束后,会得到以下输出,代表容器已全部拉起:

检查容器是否正常运行:

复制代码
docker compose ps

可看到所有容器的运行状态与占用端口。应该看到包含3个业务服务(api / worker / web)以及6个基础组件(weaviate / db / redis / nginx / ssrf_proxy / sandbox)在内的总共9个容器,且STATUS均为Up。

4.3 Dify使用

4.3.1 配置dify

1. 登录dify网页

在浏览器内输入"服务器ip:端口号"该端口号为在启动dify时更改的nginx port,若无更改,则使用默认的80端口登录。

2. 设置账号

首次登陆请设置管理员账号。邮箱无需设置真实邮箱,可随意进行设置,只需符合邮箱规范。例如:[email protected]

之后使用设置的账号登录。

3. 配置模型

llm模型:

点击右上角用户头像,进入设置。

选择模型供应商中的OpenAI-API-compatible模块。点击添加模型。

模型类型选择"LLM","模型名称"与Mind IE服务化配置文件"config.json"中的"modelName"保持一致,"API endpoint URL"填写"http://$服务器ip:$mindie端口/v1",其中Mind IE端口在Mind IE服务化配置文件"config.json"中设置,默认为1025。"模型上下文长度"与"最大 token 上限"按需填写。

Embedding模型:

选择模型供应商中的Text Embedding Inference模块。点击添加模型。

"模型类型"选择"Text Embedding","模型名称"为"bge-m3","服务器URL"为"http://$服务器ip:$embedding端口",其中embedding端口在2.2.2节中设置,为"12345"。"API Key"可随意填写。

Reranker模型:

继续在Text Embedding Inference中添加模型。

"模型类型"选择"Rerank","模型名称"为"bge-reranker-v2-m3","服务器URL"为"http://$服务器ip:$rerank端口",其中rerank端口在2.2.2节中设置,为"54321"。"API Key"可随意填写。

4. 知识库配置

1)创建知识库:

2)上传本地文档

(以该文档为例)https://www.hiascend.com/doc_center/source/zh/mindie/100/whatismindie/MindIE 1.0.0 是什么 01.pdf

3)设置分段

embedding模型选择bge-m3,rerank模型选择bge-reranker-v2-m3。其余分段类型,分段长度,检索方式等可自行尝试,寻找最优方案。

等待嵌入处理完成,根据文档大小,分段方式与长度耗时不等。

4)创建应用

回到工作室,创建空白应用。

创建聊天助手,进行测试。

点击添加上下文,选择知识库进行添加。

问答测试:

复制代码
--END--
相关推荐
audyxiao001几秒前
多元时间序列预测的范式革命:从数据异质性到基准重构
人工智能·大模型·transformer·智能交通
zlbcdn33 分钟前
C#通过API接口返回流式响应内容---分块编码方式
deepseek·流式响应api
欣然~1 小时前
利用 OpenCV 库进行实时目标物体检测
人工智能·opencv·计算机视觉
硅基打工人1 小时前
小语言模型(SLM)技术解析:如何在有限资源下实现高效AI推理
人工智能·语言模型·自然语言处理
时光旅人01号2 小时前
Ubuntu 常用指令手册
linux·运维·服务器·深度学习·神经网络·ubuntu
LitchiCheng2 小时前
【[特殊字符]SO-Arm100 机械臂 ROS2 配置保姆级教程】MoveIt Setup Assistant 从 0 到 1 实操!避坑指南
人工智能·ar
龙鹤鹿2 小时前
langchain4j官方文档解读
java·人工智能
pen-ai2 小时前
【NLP】 3. Distributional Similarity in NLP(分布式相似性)
人工智能·分布式·自然语言处理
掘金詹姆斯2 小时前
🚀IDEA+DeepSeek双剑合璧:3倍编码速度的隐藏技巧大公开!
人工智能
起个破名想半天了2 小时前
计算机视觉cv2入门之边缘检测
人工智能·计算机视觉·opencv-python