随着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模型,可以自行从魔乐社区下载。模型链接:

  • https://modelers.cn/models/xinference/bge-m3

  • https://modelers.cn/models/xinference/bge-reranker-v2-m3

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. 选择所需镜像,点击“立即下载”:

图片

2. 根据弹出的镜像下载指令安装对应的docker镜像, 请确保机器有网络链接:

图片

2.2.2 加载镜像

1. 查看镜像id

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

图片

  • 镜像名:swr.cn-south-1.myhuaweicloud.com/ascendhub/mis-tei:6.0.RC3-800I-A2-aarch64

  • 镜像 ID:05208487bedf

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

        以下为完整示例:

        # 变量
        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蒸馏模型):

                图片

                2. 根据弹出的镜像下载指令安装docker镜像,请确保机器有网络连接:

                图片

                3.2.2 加载镜像

                1. 查看镜像id

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

                图片

                • 镜像名:swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.0.T3-800I-A2-py311-openeuler24.03-lts

                • 镜像 ID:2ed659651f4f

                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. 设置账号

                                            图片

                                            首次登陆请设置管理员账号。邮箱无需设置真实邮箱,可随意进行设置,只需符合邮箱规范。例如:test@xxx.com。

                                            图片

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

                                            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%201.0.0%20%E6%98%AF%E4%BB%80%E4%B9%88%2001.pdf 

                                            图片

                                            3)设置分段

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

                                            图片

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

                                            图片

                                            4)创建应用

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

                                            图片

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

                                            图片

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

                                            图片

                                            图片

                                            问答测试:

                                            图片

                                            --END--
                                            Logo

                                            欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

                                            更多推荐