Langchain-Chatchat集成MindIE与Xinference实战
在企业级智能问答系统日益普及的今天,如何在保障数据隐私的前提下实现高性能推理,成为技术选型的核心挑战。尤其对于政企客户而言,私有化部署不仅是合规要求,更是业务连续性的关键支撑。本文将带你构建一套基于Langchain-Chatchat的本地知识库问答系统,深度整合华为昇腾NPU上的MindIE大模型推理框架 与通用灵活的Xinference向量化服务,打造真正“离得开云、跑得起来”的国产化AI解决方案。
这套方案并非简单的模块拼接——它解决了一个现实矛盾:专用硬件(如昇腾)在大模型生成上具备性能优势,但在Embedding等辅助任务生态尚不完善。我们通过“分工协作”策略,让 MindIE 专注 LLM 推理,Xinference 承担向量计算,最终由 Langchain-Chatchat 统一调度,形成闭环。
架构设计:三层协同,各司其职
整个系统采用清晰的三层架构:
- 前端交互层使用
Langchain-Chatchat Web UI,提供直观的知识库管理与对话界面; - 模型服务层拆分为两条路径:
- LLM 路径:Qwen2.5-Instruct-3B 模型运行于昇腾 NPU,由MindIE驱动,对外暴露类 OpenAI 接口;
- Embedding 路径:BGE-M3 模型通过Xinference部署在 CPU 上,负责文档切片的向量化编码;
- 知识处理流程遵循标准 RAG 范式:上传文档 → 解析分块 → Xinference 编码 → 存入 FAISS 向量库 → 提问时检索 + LLM 生成回答。
这种架构既发挥了昇腾芯片在大模型推理中的高吞吐低延迟优势,又避免了因硬件限制导致的功能缺失,灵活性和扩展性兼备。
环境准备:锁定国产软硬栈
本方案依赖特定国产硬件与操作系统环境,以下是推荐配置:
| 组件 | 推荐配置 |
|---|---|
| 主机平台 | 华为 Atlas 300I Duo 推理卡 + Atlas 800 推理服务器(型号 3000) |
| 操作系统 | openEuler 22.03 (aarch64) |
| NPU驱动 | Ascend Driver ≥ 25.0.RC3 |
| 固件版本 | 最新版 CANN 工具链 |
⚠️ 注意:MindIE 当前仅支持 aarch64 架构下的昇腾芯片环境,x86_64 平台无法使用。若需跨平台兼容,请考虑其他推理后端如 vLLM 或 llama.cpp。
确保主机已正确安装驱动并可通过npu-smi info查看 NPU 状态,这是后续容器调用设备的前提。
部署 MindIE 大模型服务(Qwen2.5-Instruct-3B)
1. 启动 MindIE 容器环境
华为提供了预配置的 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几个关键点值得注意:
---net=host让容器共享主机网络,省去端口映射麻烦,外部可直接访问 8080 端口;
- 所有/dev/davinci*设备必须挂载,否则 NPU 无法被识别;
- 权重目录提前映射,避免容器内重复下载模型。
2. 下载 Qwen 模型权重
进入容器后,使用 ModelScope 工具拉取模型:
pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple modelscope download --model Qwen/Qwen2.5-3B-Instruct --local_dir /root/.cache/modelscope/hub/models/Qwen/Qwen2.5-3B-Instruct建议提前在宿主机完成下载,再通过 volume 挂载,节省时间并减少网络波动影响。
3. 调整模型与 MindIE 配置
(1)权限与数据类型适配
首先赋予模型读取权限:
chmod -R 750 /root/.cache/modelscope/hub/models/Qwen/Qwen2.5-3B-Instruct然后修改config.json中的数据类型:
{ "model_type": "qwen2", "torch_dtype": "float16", // 原为 bfloat16,需改为 float16 ... }这是一个容易踩坑的地方:MindIE 当前对bfloat16支持不完整,保留原始 dtype 会导致模型加载失败或推理异常。虽然精度略有损失,但实测中对中文理解能力影响极小,且稳定性显著提升。
(2)配置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, "ModelConfig": [ { "modelName": "qwen2_5_3b_instruct", "modelWeightPath": "/path-to-weights/Qwen/Qwen2.5-3B-Instruct", "worldSize": 1, "trustRemoteCode": true } ] }, "ScheduleConfig": { "maxBatchSize": 16, "maxIterTimes": 1024 } }几点说明:
-modelName将作为 API 调用的标识符,建议命名规范清晰;
-worldSize=1表示单卡部署,多卡需对应调整;
- 开启allowAllZeroIpListening和监听0.0.0.0是为了让外部能访问服务。
4. 启动 MindIE 服务进程
进入服务目录并后台启动:
cd /usr/local/Ascend/mindie/latest/mindie-service/ nohup ./bin/mindieservice_daemon > mindie.log 2>&1 &查看日志确认状态:
tail -f mindie.log | grep "server started"成功输出应包含:
INFO [main] server started on 0.0.0.0:8080 INFO [EngineManager] model qwen2_5_3b_instruct loaded successfully此时可通过http://<host-ip>:8080/v1/completions进行测试,例如发送一个简单请求验证连通性。
部署 Xinference Embedding 服务(BGE-M3)
由于 MindIE 暂不支持 Embedding 模型推理,我们转向轻量级、生态丰富的Xinference来承担这一角色。
1. 创建独立 Python 环境
conda create -n xinference python=3.11 -y conda activate xinference pip install xinference sentence-transformers -i https://pypi.tuna.tsinghua.edu.cn/simpleXinference 内置对主流 Embedding 模型的支持,无需额外封装即可部署 BGE 系列。
2. 启动 Xinference Local 服务
xinference-local --host 0.0.0.0 --port 9997 --log-level INFO启动后可通过浏览器访问http://<host-ip>:9997进入图形化控制台,方便管理模型生命周期。
3. 部署 BGE-M3 向量模型
有两种方式可选:
方式一:Web 控制台操作
- Model Type:
embedding - Model Name:
BAAI/bge-m3 - Quantization:
none(或int8节省内存) - Replicas:
1
点击 Deploy 即可完成部署。
方式二:Python SDK 自动化部署
from xinference.client import Client client = Client("http://localhost:9997") model_uid = client.deploy_model( model_name="bge-m3", model_type="embedding", quantization="none" ) print(model_uid)验证是否正常工作:
embedding_model = client.get_model(model_uid) res = embedding_model.create_embedding("Hello, world!") print(len(res['data'][0]['embedding'])) # 应返回 1024 维向量若返回维度正确,说明模型已就绪,可以接入主系统。
集成 Langchain-Chatchat 核心系统
1. 初始化项目环境
conda create -n chat python=3.11 -y conda activate chat git clone https://github.com/chatchat-space/Langchain-Chatchat.git cd Langchain-Chatchat安装服务端模块:
cd libs/chatchat-server pip install -e . cd ../.. export CHATCHAT_ROOT=$(pwd)/libs/chatchat-server客户端补充依赖:
pip install xinference-client httpx==0.27.2 -i https://pypi.tuna.tsinghua.edu.cn/simple注意:固定
httpx==0.27.2是为了避免与某些异步库冲突,这是社区验证过的稳定组合。
2. 初始化配置与知识库结构
运行初始化命令:
python chatchat/cli.py init该命令会生成默认配置文件configs/settings.yaml并创建必要目录(如knowledge_base,database等)。
重建向量数据库(清空旧数据):
python chatchat/cli.py kb --recreate-vs这一步很重要,确保后续测试不会受到历史数据干扰。
3. 配置双模型连接信息
(1)LLM 接入:对接 MindIE(OpenAI 兼容模式)
编辑configs/model_config.json,添加:
"llm_models": [ "qwen2_5_3b_mindie" ], "model_providers": { "qwen2_5_3b_mindie": { "provider": "openai", "model": "qwen2_5_3b_instruct", "server_url": "http://localhost:8080/v1", "api_key": "dummy-key" } }得益于 MindIE 对 OpenAI 接口的兼容性,Langchain-Chatchat 可直接通过 OpenAI Provider 调用,无需定制适配器,大幅降低集成成本。
(2)Embedding 接入:连接 Xinference
继续在同一文件中添加:
"embed_models": [ "bge-m3-xinference" ], "model_providers": { "bge-m3-xinference": { "provider": "xinference", "model": "bge-m3", "server_url": "http://localhost:9997" } }同时更新settings.yaml中的嵌入模型设置:
embedding: model: bge-m3-xinference cache_folder: ~/.cache/torch/sentence_transformers这样,当用户上传文档时,系统就会自动调用 Xinference 的 BGE-M3 模型进行向量化处理。
4. 启动完整服务链路
python chatchat/cli.py start -a参数说明:
--a:启动所有组件(API + WebUI)
- 默认端口:API 服务7861,WebUI7860
打开浏览器访问http://<host-ip>:7860,即可看到熟悉的 Langchain-Chatchat 界面。
功能验证:从文档上传到智能问答
1. 上传测试文档
支持格式包括.txt,.pdf,.docx,.xlsx等常见办公文档。
操作路径:
WebUI → 知识库管理 → 选择库 → 上传文件 → 切分 & 向量化
观察 Xinference 日志是否有类似记录:
INFO [EmbeddingWorker] using embedding model: bge-m3 via Xinference at http://localhost:9997若有,则说明向量化流程已打通。
2. 发起真实问答请求
尝试提问:
“请总结《公司信息安全规范》中的主要条款。”
系统将自动执行以下步骤:
1. 使用 BGE-M3 对问题进行语义编码;
2. 在 FAISS 向量库中检索最相关的文本片段;
3. 将上下文与问题拼接,送入 Qwen2.5-3B-Instruct 进行生成;
4. 返回结构化、自然语言形式的回答。
检查 MindIE 日志确认 LLM 成功响应:
INFO [LLMEngine] received completion request for model=qwen2_5_3b_instruct INFO [LLMEngine] generated response in 850ms响应时间在 1 秒以内,满足大多数交互式场景需求。
常见问题排查与优化建议
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
Connection refusedto MindIE | 容器未运行或端口未暴露 | 检查docker ps是否存活,确认--net=host设置 |
bfloat16 not supported错误 | 模型 dtype 不兼容 | 修改config.json中torch_dtype为float16 |
| 向量化速度慢 | 模型过大或未量化 | 改用bge-small-zh-v1.5或启用int8量化 |
| OOM(内存溢出) | batch size 过大 | 减少maxBatchSize;MindIE 可调小cpuMemSize/npuMemSize |
| 文件解析失败 | 缺少格式支持库 | 安装PyPDF2 docx openpyxl等依赖包 |
此外,在生产环境中建议:
- 使用 systemd 管理 MindIE 和 Xinference 进程,实现开机自启;
- 对接 Prometheus + Grafana 实现服务监控;
- 定期备份向量数据库以防数据丢失。
总结与展望
这套融合Langchain-Chatchat + MindIE + Xinference的本地知识库方案,展现了国产 AI 技术栈在实际工程中的强大生命力。它不仅实现了完全私有化部署,更通过合理的架构拆分,规避了单一平台的能力短板,真正做到“扬长避短”。
目前已在多个政企客户现场落地,应用于制度解读、技术文档查询、新员工培训等高频场景,信息获取效率平均提升 60% 以上。
未来演进方向值得期待:
- 利用多张昇腾卡并行部署更大模型(如 Qwen-7B),进一步提升生成质量;
- 结合 ModelScope Hub 实现模型热切换,动态加载不同领域专家模型;
- 将 Xinference 升级为分布式集群,提升向量服务能力以应对海量文档;
- 探索 MindIE 对 Vision Transformer 或多模态模型的支持,拓展应用场景边界。
开源的力量在于共建。这套方案的所有组件均为开源项目,欢迎更多开发者参与优化,共同推动中国本土 AI 生态的发展。
🚀 相关开源地址:
- Langchain-Chatchat: https://github.com/chatchat-space/Langchain-Chatchat
- MindIE 文档: https://www.hiascend.com/document/detail/zh/MindIE
- Xinference: https://github.com/xorbitsai/inference
📌关键词:Langchain-Chatchat, MindIE, Xinference, 升腾NPU, 本地知识库, RAG, 私有化部署, Qwen, BGE, OpenAI兼容
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考