个人域名备案 网站名称,做货代在哪个网站找客源,制作网页的基本步骤记事本,网站后台关键词链接怎样做Langchain-Chatchat集成华为NPU部署Qwen2.5
在企业级AI应用逐渐从“可用”迈向“可控”的今天#xff0c;如何在保障数据安全的前提下构建高效、低成本的智能问答系统#xff0c;成为众多组织面临的核心命题。公有云API虽然便捷#xff0c;但一旦涉及敏感文档或内部知识库如何在保障数据安全的前提下构建高效、低成本的智能问答系统成为众多组织面临的核心命题。公有云API虽然便捷但一旦涉及敏感文档或内部知识库数据出境风险和合规审查便成了绕不开的难题。于是本地化部署不再是一种选择而是一种必然。我们尝试的这条技术路径正是围绕“国产算力 开源框架 高性价比模型”展开使用Langchain-Chatchat作为前端交互与流程编排引擎依托华为Atlas 300I Duo 推理卡P310芯片提供稳定高效的NPU算力通过MindIE推理引擎加速通义千问 Qwen2.5-3B-Instruct 模型运行并借助Xinference补足中文Embedding能力短板。整套方案实现了从文档上传、向量化索引、语义检索到生成式回答的全流程闭环所有环节均在本地完成真正做到了“数据不出门、算力不依赖”。这套组合拳的背后不仅是技术栈的拼接更是对性能、成本与安全性三者平衡的艺术性把握——中等规模语言模型避免了7B以上带来的显存压力昇腾NPU提供了比GPU更具性价比的国产替代方案而开源生态则极大降低了开发门槛与维护成本。环境准备硬件与软件协同是基础任何高性能推理系统的起点都是一个稳定且匹配的底层环境。我们在实际部署过程中发现哪怕是最微小的驱动版本错配也可能导致整个服务启动失败。硬件配置清单组件规格NPU卡Atlas 300I Duo单卡P31016GB HBM主机Atlas 800 推理服务器型号 3000操作系统openEuler 22.03 (aarch64)该平台基于ARM64架构设计因此所有镜像和依赖都必须支持aarch64架构。Atlas 300I Duo 单卡具备16GB高带宽内存HBM足以支撑Qwen2.5-3B这类中等规模模型的全参数加载与KV Cache缓存需求。软件依赖项Ascend驱动建议使用 CANN 8.0.RC1 或更高版本固件状态确保/dev/davinci0设备节点正常存在Docker需支持--platformarm64参数以拉取对应架构镜像Conda用于隔离Python环境避免包冲突特别提醒若主机未预装npu-smi工具请务必挂载宿主机的/usr/local/sbin/npu-smi到容器内否则无法查看NPU资源使用情况排查问题时将极为被动。MindIE部署 Qwen2.5-3B-Instruct 模型NPU加速MindIE 是华为推出的轻量级大模型推理服务框架专为昇腾NPU优化支持主流LLM的快速部署与OpenAI兼容接口调用。对于希望快速接入现有系统的团队来说它几乎是目前最平滑的选择。使用官方镜像启动容器docker pull --platformarm64 swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.1.RC2-300I-Duo-py311-openeuler24.03-lts docker run -it --privileged \ --ipchost --nethost \ --namechatchat-mindie-qwen \ --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⚠️ 注意事项- 必须挂载全部NPU相关设备节点及驱动目录- 共享内存设置为500g可有效防止prefill阶段因共享内存不足导致OOM- 若使用双卡需扩展--device并修改后续配置中的npuDeviceIds为[[0,1]]这个命令看起来冗长但每一项都有其意义。例如--ipchost是为了允许进程间高效通信尤其在多线程推理场景下至关重要而--nethost则简化了端口映射逻辑让服务直接暴露在主机网络中。下载模型权重进入容器后执行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成功标志是在指定路径下出现以下关键文件-config.json-pytorch_model.bin.index.json-tokenizer.model- 分片权重.bin文件若干建议提前在宿主机下载好模型并挂载避免重复拉取浪费时间。修改模型配置适配 MindIE1调整权限chmod -R 750 /root/.cache/modelscope/hub/models/Qwen/Qwen2.5-3B-Instruct权限不足可能导致MindIE读取模型失败尤其是在多用户环境中。2修改config.json中的数据类型编辑/root/.cache/modelscope/hub/models/Qwen/Qwen2.5-3B-Instruct/config.json将torch_dtype: bfloat16替换为torch_dtype: float16 原因在于当前 MindIE 对bfloat16的支持尚不完善而 Qwen 官方发布的是bfloat16权重。转换为float16后虽略有精度损失但在实际问答任务中几乎无感却能显著提升加载成功率。这一步看似简单却是我们踩过最深的一个坑——没有日志报错也没有明确提示只是卡在初始化阶段不动。最终通过对比其他可运行模型才发现 dtype 不匹配的问题。3配置 MindIE 服务参数编辑vim /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: qwen2_5_3b, modelWeightPath: /root/.cache/modelscope/hub/models/Qwen/Qwen2.5-3B-Instruct, worldSize: 1, cpuMemSize: 8, npuMemSize: -1, backendType: atb, trustRemoteCode: true } ] }, ScheduleConfig: { maxBatchSize: 16, maxPrefillBatchSize: 8, maxPrefillTokens: 4096, maxIterTimes: 2048 } } } 字段说明-modelName将作为后续Langchain-Chatchat调用的标识符-worldSize1表示单卡部署若使用双卡需设为2并绑定多设备- 总序列长度约束maxSeqLen maxInputTokenLen maxIterTimes ≤ 模型上下文窗口。Qwen2.5支持最长32K此处设为4K已能满足大多数问答场景-npuMemSize-1表示自动分配全部可用显存启动 MindIE 服务# 前台启动便于调试 ./bin/mindieservice_daemon # 或后台守护运行 nohup ./bin/mindieservice_daemon mindie_qwen.log 21 ✅ 成功标志日志中出现LLM Engine started successfully并通过以下命令验证curl http://localhost:8080/v1/models预期响应{ data: [ { id: qwen2_5_3b, object: model } ] }一旦看到这个结果说明模型已经就绪可以接受外部请求。Xinference 部署 Embedding 模型bge-large-zh-v1.5尽管MindIE专注于LLM推理但它目前并未提供高效的文本嵌入模型支持。为此我们引入Xinference在CPU上部署bge-large-zh-v1.5这款模型在中文语义理解方面表现优异尤其适合企业文档的向量化处理。创建独立环境conda create -n xinference python3.11 -y conda activate xinference pip install xinference sentence-transformers -i https://pypi.tuna.tsinghua.edu.cn/simple启动 Xinference 服务xinference-local --host 0.0.0.0 --port 9997 --log-level DEBUG访问http://server_ip:9997进入Web UI界面。部署 bge-large-zh-v1.5 模型在 Web 控制台操作- 点击【Launch Model】→【Embedding】- 搜索bge-large-zh-v1.5- 设置名称为bge-zh- 资源选择CPU默认即可- 点击启动✅ 成功标志状态变为 Running并可通过接口测试向量输出值得注意的是虽然Embedding模型运行在CPU上但由于其计算密集度远低于LLM自回归生成因此对整体延迟影响较小。而且 Xinference 支持分布式部署未来也可横向扩展至专用CPU节点。Langchain-Chatchat 项目部署与集成Langchain-Chatchat 是目前开源社区中最成熟的本地知识库问答框架之一具备完整的文档解析、切片、向量化、检索与生成流程。更重要的是它原生支持多种后端模型接入方式为我们整合异构系统提供了极大便利。初始化项目环境conda create -n chat python3.11 -y conda activate chat git clone https://github.com/chatchat-space/Langchain-Chatchat.git cd Langchain-Chatchat/libs/chatchat-server/ # 安装核心包 pip install -e . # 安装客户端依赖 pip install xinference-client httpx0.27.2 -i https://pypi.tuna.tsinghua.edu.cn/simple设置根目录变量export CHATCHAT_ROOT$(pwd)初始化配置python chatchat/cli.py init该命令会生成默认配置文件configs/settings.yaml这是我们后续定制的核心入口。配置 LLM 与 Embedding 模型连接编辑configs/settings.yaml进行关键修改。1配置 OpenAI 兼容接口指向 MindIEllm_model_config: model_list: - model_name: qwen2_5_3b provider: openai api_base: http://localhost:8080/v1 api_key: any-key # MindIE无需鉴权 context_len: 32768 技巧揭秘MindIE 实现了 OpenAI API 兼容接口这意味着 Langchain-Chatchat 可将其视为普通OpenAI后端来调用无需任何代码改造。这是实现无缝集成的关键所在。2配置 Xinference Embedding 模型embedding_model_config: model_list: - model_name: bge-zh provider: xinference api_base: http://localhost:9997 embed_title: # bge不需要title注意api_base地址要与 Xinference 实际监听地址一致。3设置默认模型model_defaults: llm: model: qwen2_5_3b provider: openai embedding: model: bge-zh provider: xinference这样配置后系统将自动使用上述模型处理所有请求。初始化知识库向量数据库# 清空旧索引并重建 python chatchat/cli.py kb --recreate-vs此命令会- 扫描data/knowledge_base目录下的文档- 使用 Xinference 的bge-zh模型生成 embeddings- 存入本地向量数据库默认为 FAISS 支持格式包括.txt,.md,.docx,.pdf,.xlsx等常见办公文档基本覆盖企业日常所需。启动服务# 启动API后端 python chatchat/cli.py start -a默认启动三个服务- FastAPIhttp://0.0.0.0:8000- WebSocket用于流式响应- 前端页面http://0.0.0.0:8501自动跳转也可分别启动python chatchat/cli.py start --api # 只启API python chatchat/cli.py start --webui # 只启前端当浏览器打开http://your-ip:8501并显示交互界面时恭喜你整个系统已经跑通功能验证与性能实测测试问答流程上传一份公司产品手册 PDF 至data/knowledge_base/sample/docs/执行重建向量库python chatchat/cli.py kb --recreate-vs -n sample访问前端页面http://your-ip:8501输入问题例如“我们的旗舰产品有哪些核心功能”预期结果- 系统自动检索相关段落- 调用 Qwen2.5-3B 生成结构化回答- 输出内容准确、连贯、基于文档事实我们曾用某科技公司的年度财报PDF测试提问“去年研发投入同比增长多少”系统不仅能定位到具体章节还能提取出“同比增长23%”这一结论并附上原文引用位置。性能指标参考单卡 P310项目指标输入吞吐~128 tokens/secprefill阶段输出速度~18 tokens/secautoregressive生成平均响应延迟 2s问题长度512 tokens显存占用~14.2 GB含KV Cache支持并发数≤ 8batch16, seq4096✅ 实测表明Qwen2.5-3B 在华为NPU上可稳定运行适用于中小型企业知识库场景。即使面对复杂多跳问题也能保持良好的推理连贯性。值得一提的是由于采用FAISS作为向量数据库检索速度极快通常在几十毫秒内完成几乎不影响整体响应时间。优化建议与常见问题排查✅ 成功要点总结环节关键点环境搭建使用官方MindIE镜像确保驱动匹配模型加载修改torch_dtype为float16接口兼容利用 MindIE 的 OpenAI API 模式对接 Chatchat向量模型Xinference 补足 Embedding 缺口这些经验不是来自文档而是我们在连续三天调试失败后一点点试出来的。❗ 常见问题排查Q1启动 MindIE 报错Failed to initialize device检查/dev/davinci*是否存在确认 CANN 驱动版本与镜像兼容运行npu-smi info查看设备状态Q2Langchain-Chatchat 调用返回 404 或连接拒绝检查 MindIE 是否监听0.0.0.0:8080使用curl http://localhost:8080/v1/models测试连通性确保防火墙未拦截端口Q3Embedding 模型无法加载确保 Xinference 服务正常运行检查settings.yaml中api_base地址是否可达可手动调用/v1/embeddings接口测试遇到问题不要慌先看日志再逐层验证服务可达性。很多时候只是某个端口没开或者路径写错了。展望不止于“能用”更要“好用、安全、可持续”这套方案的价值不仅仅在于它能让一个本地知识库系统跑起来更在于它展示了一条清晰的技术演进路径以国产算力为底座以开源生态为工具以自主可控为目标。未来可拓展方向包括-多模态支持结合 VisualGLM 实现图文混合问答-分布式部署利用双卡或多节点协同提升吞吐-模型微调通过 LoRA 适配垂直领域术语体系-加密通信启用 HTTPS/TLS 保障内网传输安全真正的智能知识中枢不应只是一个“会答问题的机器人”而应成为组织记忆的载体、决策支持的助手、新人培训的导师。当我们把企业的知识沉淀转化为可检索、可推理、可生成的能力时AI才真正开始创造价值。目标不止是“能用”更是“好用、安全、可持续”。通过这套方案企业可以在不依赖外部云服务的前提下快速构建专属的智能知识中枢真正迈向 AI 原生工作流。创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考