Langchain-Chatchat集成MindIE+NPU部署实战
基于华为NPU P310芯片,使用MindIE部署Qwen2.5-3B大模型,通过Docker镜像启动并配置OpenAI兼容接口。结合Xinference运行Embedding模型,实现本地知识库问答系统搭建,适配langchain-chatchat项目全流程。
Langchain-Chatchat 集成 MindIE + NPU 实战部署指南
在企业对数据主权和系统可控性要求日益提升的今天,一个真正“跑在自己机房里”的智能知识库系统,正从可选项变成刚需。我们不再满足于把文档上传到某个云端API换来几句回答——我们需要的是:文档不离内网、推理不碰公网、模型运行在自己的昇腾卡上。
这正是本文要解决的问题:如何用 华为 Atlas 300I Duo 推理卡 搭配 MindIE 推理引擎 和开源框架 Langchain-Chatchat,构建一套完全国产化、全链路离线、高性能的本地知识问答系统。
整个方案的核心思路是——让NPU干它最擅长的事,其余交给生态工具补足。大语言模型(LLM)推理由昇腾NPU通过 MindIE 加速执行;向量化部分则借助 Xinference 在 CPU 上稳定运行 BGE 等 embedding 模型;最后通过 Langchain-Chatchat 完成文档解析、检索增强与自然语言交互闭环。
这套组合拳不仅规避了对外部云服务的依赖,还能充分发挥国产硬件的算力优势。下面我们就从零开始,一步步把这个系统搭起来。
环境准备:打牢基础才能跑得更快
一切的前提是你手上有块能干活的昇腾卡。本次实测环境如下:
- 硬件平台:Atlas 300I Duo 推理卡(单卡或双卡均可)
- 服务器型号:Atlas 800 推理服务器(3000 型号)
- 操作系统:openEuler 22.03 LTS SP2,aarch64 架构
- 驱动栈:CANN 7.0.RC1 及以上版本
- 固件状态:已更新至最新版,确保
/dev/davinci*设备节点正常挂载
⚠️ 提醒几点:
- 所有操作建议以
root用户进行,避免权限问题干扰;- 若未使用默认路径安装驱动,请务必调整 Docker 挂载参数;
- 单卡推荐部署 3B~7B 规模模型,其中 7B 模型建议启用双卡以避免显存溢出。
确认好这些之后,就可以进入下一步:拉起 MindIE 容器,加载 Qwen 大模型。
启动 MindIE:让 Qwen 在 NPU 上跑起来
MindIE 是华为推出的轻量级大模型推理引擎,专为昇腾芯片优化设计。它支持主流架构如 Llama、Qwen、ChatGLM,并提供标准 RESTful 接口和 OpenAI 兼容协议,非常适合集成进现有 AI 应用生态。
使用 Docker 快速部署
docker pull --platform=arm64 swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.1.RC2-300I-Duo-py311-openeuler24.03-lts
docker run -it --privileged \
--ipc=host \
--net=host \
--name=MindIE-qwen3b \
--shm-size=500g \
--device=/dev/davinci0 \
--device=/dev/davinci_manager \
--device=/dev/hisi_hdc \
--device=/dev/devmm_svm \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \
-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
-v /usr/local/sbin:/usr/local/sbin \
-v /root/.cache/modelscope/hub/models/Qwen/Qwen2.5-3B-Instruct:/path-to-weights/Qwen/Qwen2.5-3B-Instruct \
swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.1.RC2-300I-Duo-py311-openeuler24.03-lts \
/bin/bash
几个关键点说明一下:
--shm-size=500g:这是必须的。MindIE 会在共享内存中缓存 Attention KV 缓冲区,如果太小会导致性能骤降甚至崩溃;- 所有
/dev/davinci*设备都需要挂载进去,否则无法访问 NPU; - 模型权重目录做了映射,这样宿主机下载一次后,多个容器可以复用,节省时间也节约空间。
进容器之后第一件事就是装 modelscope 并下载模型:
pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple
modelscope download --model Qwen/Qwen2.5-3B-Instruct
默认会保存到 /root/.cache/modelscope/hub/models/Qwen/Qwen2.5-3B-Instruct,记得在后续配置中正确指向这个路径。
配置与启动:别让一个小参数卡住你一整天
接下来是最容易踩坑的部分——配置文件。
权限设置不能少
先给模型目录加个权限,防止因读取失败导致加载异常:
chmod -R 750 /root/.cache/modelscope/hub/models/Qwen/Qwen2.5-3B-Instruct
修改模型 dtype
目前 MindIE 对 bfloat16 支持尚不完善,而 Qwen 默认保存为 bfloat16 格式。所以需要手动修改其 config.json 中的类型声明:
{
"architectures": ["Qwen2ForCausalLM"],
"torch_dtype": "float16"
}
改成 float16 后才能顺利加载。
主配置文件调整
编辑路径下的主配置文件:
/usr/local/Ascend/mindie/latest/mindie-service/conf/config.json
重点修改以下内容:
"ServerConfig": {
"ipAddress": "0.0.0.0",
"port": 8080,
"allowAllZeroIpListening": true,
"httpsEnabled": false
},
"BackendConfig": {
"npuDeviceIds": [[0]],
"ModelDeployConfig": {
"maxSeqLen": 4096,
"maxInputTokenLen": 2048,
"maxIterTimes": 2048,
"ModelConfig": [
{
"modelName": "qwen_3b_instruct",
"modelWeightPath": "/path-to-weights/Qwen/Qwen2.5-3B-Instruct",
"worldSize": 1,
"trustRemoteCode": true
}
]
},
"ScheduleConfig": {
"maxBatchSize": 16,
"maxPrefillBatchSize": 8,
"maxIterTimes": 2048
}
}
这里有几个工程经验值得分享:
modelName要记牢,后面 Langchain-Chatchat 会根据这个名字去调用模型;- 单卡部署时
worldSize必须设为 1,否则会报设备不可达; maxBatchSize不宜过大,尤其是高并发场景下,容易触发 OOM;maxInputTokenLen控制输入长度上限,超过可能直接崩掉服务。
全部改完后,就可以启动服务了。
启动方式选择
调试阶段建议前台启动,方便看日志:
./bin/mindieservice_daemon
上线后可以用守护进程方式运行:
nohup ./bin/mindieservice_daemon > /var/log/mindie.log 2>&1 &
验证是否成功?很简单,curl 一下就知道:
curl http://127.0.0.1:8080/v1/models
如果返回结果中包含 "id": "qwen_3b_instruct",那就说明模型已经就绪,等待被召唤。
补齐另一半拼图:Xinference 部署 BGE Embedding 模型
虽然 MindIE 很强,但它目前主要聚焦于生成类大模型推理,在 embedding 模型支持方面还不够全面。因此,Langchain-Chatchat 所需的向量编码任务,我们交给另一个优秀的国产工具——Xinference 来完成。
Xinference 是一个分布式推理框架,支持多种 embedding、reranker、语音等模型,部署简单、接口统一,特别适合做模块化拆分。
安装与启动
新建一个 Conda 环境专门跑 Xinference:
conda create -n xinference python=3.11 -y
conda activate xinference
pip install xinference -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install sentence-transformers -i https://pypi.tuna.tsinghua.edu.cn/simple
然后启动服务:
xinference-local --host 0.0.0.0 --port 9997 --log-level DEBUG
打开浏览器访问 http://<your-ip>:9997,你会看到一个简洁的 Web UI 界面。
部署 BGE-M3 模型
在页面上选择:
- Model Type:
embedding - Model Name:
BAAI/bge-m3 - 自定义名称:比如
bge-m3 - Dimensions: 1024
- Max Length: 8192
点击 Launch,几分钟后模型就会加载完成。
测试一下接口是否可用:
curl http://localhost:9997/v1/embeddings \
-H "Content-Type: application/json" \
-d '{
"model": "bge-m3",
"input": ["这是一个测试句子"]
}'
只要返回 embedding 向量,说明 embedding 这条链路也通了。
整合所有组件:Langchain-Chatchat 上场
现在,LLM 有了(MindIE + Qwen),Embedding 有了(Xinference + BGE),接下来就是主角登场——Langchain-Chatchat。
它是目前中文社区中最成熟的本地知识库问答框架之一,支持多格式文档解析、多模型切换、可视化界面,且完全开源。
初始化项目环境
conda create -n chat python=3.11 -y
conda activate chat
cd /root/Langchain-Chatchat
pip install -e libs/chatchat-server/
设置根目录变量:
export CHATCHAT_ROOT=/root/Langchain-Chatchat/libs/chatchat-server
cd $CHATCHAT_ROOT
安装客户端依赖:
pip install xinference-client httpx==0.27.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
初始化配置文件:
python chatchat/cli.py init
这一步会自动生成两个核心配置文件:
configs/model_config.yamlconfigs/settings.yaml
关键配置:打通三端通信
1. 配置 LLM 模型(对接 MindIE)
编辑 model_config.yaml,添加如下项:
llm_models:
- model_name: qwen_3b_instruct
model_type: openai
api_key: "none"
base_url: "http://127.0.0.1:8080/v1"
api_base_url: "http://127.0.0.1:8080/v1"
prefix_keys: ["qwen"]
注意这里的 base_url 正是指向 MindIE 的 OpenAI 兼容接口。由于 MindIE 实现了 /v1/chat/completions 等标准路由,Langchain-Chatchat 只需当作普通 OpenAI 模型调用即可。
2. 配置 Embedding 模型(对接 Xinference)
继续在同一文件中添加:
embedding_models:
- model_name: bge-m3
model_path: ""
device: cpu
normalized: true
is_online: true
online_api_key: "none"
base_url: "http://127.0.0.1:9997/v1"
因为模型运行在 Xinference 上,无需本地路径,只需指定 base_url 和模型名即可。
3. 设置默认模型(settings.yaml)
llm:
default_llm: qwen_3b_instruct
embeddings:
default_embedding: bge-m3
这样系统就知道该用哪个模型来处理请求了。
启动服务,见证闭环时刻
一切就绪后,重建知识库并启动服务:
# 清空旧向量库(首次运行必做)
python chatchat/cli.py kb --recreate-vs
# 启动所有服务(API + Web UI)
python chatchat/cli.py start -a
默认端口如下:
- API Server:
7861 - Web UI:
8501
访问 http://<your-ip>:8501,你应该能看到熟悉的图形界面。
试着上传一份 PDF 或 Word 文档,系统会自动完成切片、向量化、入库全过程。稍等片刻,就可以开始提问了。
当你看到答案准确出自你上传的文档内容时,整个链条才算真正跑通。
实战调优:不只是“能跑”,更要“跑得好”
部署成功只是第一步,真正的挑战在于稳定性与性能平衡。
性能优化建议清单
| 项目 | 推荐值 | 说明 |
|---|---|---|
maxBatchSize |
8~16 | 提高吞吐但增加延迟,视业务需求权衡 |
maxInputTokenLen |
≤2048 | 输入过长易引发 OOM |
共享内存 (shm-size) |
≥300G | 特别是长文本对话场景,必须足够 |
| Embedding 加速 | 若有 GPU,可用 CUDA 版本加速 BGE | |
| 日志级别 | 生产环境关闭 DEBUG 输出 |
常见故障排查指南
-
❌
Connection refused
→ 检查 MindIE 是否正在运行,防火墙是否放行 8080 端口 -
❌
Model not found
→ 核对modelName是否与 config.json 中一致 -
❌
npu-smi not found
→ 确认/usr/local/sbin/npu-smi已正确挂载进容器 -
❌
OOM错误频繁出现
→ 减小 batch size 或降低 max token 长度 -
❌ 返回乱码或截断严重
→ 检查maxIterTimes是否限制过死
这类问题往往不是技术难点,而是细节疏忽所致。保持耐心,逐层验证,总能找到根源。
写在最后:为什么这套组合值得投入
当我们回顾整套架构时,会发现它具备几个非常突出的优势:
- 🔐 数据安全可控:所有处理均在本地完成,文档不出内网,彻底杜绝泄露风险;
- ⚙️ 硬件加速明显:相比纯 CPU 推理,NPU 可将响应延迟降低 60% 以上;
- 🔄 接口高度兼容:MindIE 支持 OpenAI 协议,使得迁移成本极低;
- 🧩 模块解耦灵活:LLM 与 Embedding 分开部署,便于独立升级与扩展;
- 📦 完全开源开放:Langchain-Chatchat 社区活跃,迭代迅速,适配能力强。
更重要的是,这套方案代表了一种趋势:国产算力+国产软件+开源生态 的深度融合正在成为现实。
未来你可以轻松拓展:
- 【进阶】双卡部署 Qwen-7B,显著提升回答质量;
- 【优化】尝试 ATB 引擎替代 MindIE,进一步压榨 NPU 性能;
- 【增强】接入 BGE Reranker 模型,提升检索排序精度;
- 【监控】集成 Prometheus + Grafana 实现 NPU 资源可视化监控。
每一步都不再是空中楼阁,而是基于已有基础设施的自然延伸。
💡 结语
当你的企业文档终于能在自家服务器上被“理解”和“回应”时,那种掌控感是任何 SaaS 服务都无法替代的。这不是炫技,而是一种实实在在的技术自主能力。
随着昇腾生态的持续成熟,MindIE、CANN、Xinference 等工具链日趋完善,搭建一个私有化大模型应用的门槛正在快速下降。Langchain-Chatchat 则像一座桥梁,把复杂的底层技术与直观的业务需求连接在一起。
希望这篇实战记录,能帮你少走几小时弯路,早点看到那个绿色的“回答成功”提示。
📢 更多更新请关注:Langchain-Chatchat GitHub
📞 技术交流群信息详见官网公告(微信/QQ)
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)