Clawdbot+Qwen3-32B部署案例:某金融公司内网AI助手从0到1上线纪实
1. 项目背景与核心目标
金融行业对数据安全和系统可控性的要求极高,任何外部依赖都可能成为风险点。这家金融机构的AI建设团队面临一个现实问题:既要让一线业务人员能随时调用大模型能力辅助写报告、查资料、整理会议纪要,又不能把敏感数据传到公有云API,也不能让模型服务暴露在公网。他们需要一个真正“关起门来用”的AI助手。
Clawdbot 是一款轻量级、可私有化部署的聊天界面框架,不带模型、不存数据,只做交互层;Qwen3-32B 是通义千问最新发布的高性能开源大模型,参数量大、中文理解强、推理质量稳;Ollama 则是本地模型运行的“发动机”——它让在普通服务器上加载32B模型变得可行。三者组合,正好构成一条干净、可控、可审计的内网AI链路。
这不是一次技术炫技,而是一次面向真实办公场景的工程落地:从零开始,在无外部网络访问权限的内网环境中,把一个32B大模型变成人人可用的对话助手。整个过程不依赖GPU云服务、不调用第三方API、不上传任何业务文本,所有计算和数据流转都在公司防火墙之内。
2. 整体架构设计:三层解耦,各司其职
整个系统采用清晰的三层分离架构,每一层都可独立升级、替换或审计,避免“一锅炖”带来的维护风险。
2.1 模型层:Qwen3-32B + Ollama 运行时
- 模型文件直接下载至内网服务器(CentOS 7.9,64GB内存 + A10 GPU ×2),通过
ollama pull qwen3:32b加载 - 使用
ollama serve启动本地API服务,默认监听http://127.0.0.1:11434 - 关键配置:关闭Ollama的自动更新、禁用web UI、限制最大上下文为8K,防止长文本拖慢响应
2.2 网关层:Nginx反向代理 + 端口映射
- 内网统一入口设为
http://ai.internal:8080,所有前端请求都打到这里 - Nginx配置将
/api/路径全部转发至Ollama服务,同时把原始端口11434隐藏起来 - 更重要的是,额外配置了一条规则:将
http://ai.internal:8080/chat的请求,转发到Clawdbot的Web服务(运行在18789端口)
2.3 交互层:Clawdbot 前端 + 自定义后端桥接
- Clawdbot本身不带后端逻辑,我们为其编写了一个极简Python桥接服务(Flask),监听
127.0.0.1:18789 - 该服务只做一件事:接收Clawdbot发来的用户消息,拼装成标准Ollama API格式(JSON),再转发给
http://127.0.0.1:11434/api/chat - 返回结果原样透传回Clawdbot,不做任何解析、缓存或日志记录——真正实现“零数据留存”
这种设计的好处是:模型可以换(换成Qwen2.5或DeepSeek),前端可以换(未来接入内部IM),网关策略也可以随时调整,彼此之间没有强耦合。
3. 部署实操:四步完成上线
整个部署过程由两名工程师协作完成,耗时不到一天。以下是可直接复用的操作步骤,已去除所有环境特异性命令。
3.1 第一步:安装并验证Ollama服务
在目标服务器(内网IP:10.20.30.40)执行:
# 下载Ollama Linux二进制(离线包已提前拷贝) sudo cp ollama /usr/local/bin/ sudo chmod +x /usr/local/bin/ollama # 启动服务(后台常驻,开机自启已配置) sudo systemctl start ollama sudo systemctl enable ollama # 验证模型加载(首次拉取需约25分钟,带进度条) ollama pull qwen3:32b # 测试API是否就绪(返回200即成功) curl http://127.0.0.1:11434/api/tags | jq '.models[0].name' # 输出应为 "qwen3:32b"注意:Ollama默认使用
/home/username/.ollama存放模型,建议修改为独立挂载盘路径,避免系统盘爆满。方法是在/etc/systemd/system/ollama.service中添加Environment="OLLAMA_MODELS=/data/ollama"
3.2 第二步:配置Nginx反向代理
编辑/etc/nginx/conf.d/ai.internal.conf:
upstream ollama_api { server 127.0.0.1:11434; } upstream clawdbot_web { server 127.0.0.1:18789; } server { listen 8080; server_name ai.internal; # 所有/api/请求走Ollama location /api/ { proxy_pass http://ollama_api; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # /chat路径走Clawdbot前端 location /chat { proxy_pass http://clawdbot_web; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 根路径重定向到/chat,让用户直接访问http://ai.internal:8080即可 location / { return 302 /chat; } }重启Nginx并验证:
sudo nginx -t && sudo systemctl reload nginx curl -I http://127.0.0.1:8080/chat | head -1 # 应返回 HTTP/1.1 200 OK3.3 第三步:启动Clawdbot及桥接服务
Clawdbot前端使用预编译的Linux版本,无需Node环境:
# 解压并进入目录 tar -xzf clawdbot-linux-amd64.tar.gz cd clawdbot # 启动前端服务(监听18789端口) ./clawdbot --port 18789 --no-open-browser &桥接服务(bridge.py)代码精简到仅43行,核心逻辑如下:
from flask import Flask, request, jsonify, stream_with_context, Response import requests app = Flask(__name__) OLLAMA_URL = "http://127.0.0.1:11434/api/chat" @app.route('/v1/chat/completions', methods=['POST']) def chat(): data = request.get_json() # 将Clawdbot格式转为Ollama格式 ollama_payload = { "model": "qwen3:32b", "messages": [{"role": m["role"], "content": m["content"]} for m in data["messages"]], "stream": data.get("stream", False), "options": {"temperature": 0.7, "num_ctx": 8192} } resp = requests.post(OLLAMA_URL, json=ollama_payload, stream=True) def generate(): for chunk in resp.iter_content(chunk_size=1024): if chunk: yield chunk return Response(stream_with_context(generate()), content_type=resp.headers.get('content-type')) if __name__ == '__main__': app.run(host='127.0.0.1', port=18789, threaded=True)启动桥接服务:
pip3 install flask requests nohup python3 bridge.py > /var/log/clawdbot-bridge.log 2>&1 &3.4 第四步:前端微调与权限收口
Clawdbot默认会尝试连接http://localhost:11434,需修改其前端配置指向我们的网关:
- 编辑
clawdbot/dist/index.html,查找const API_BASE_URL =,改为:const API_BASE_URL = 'http://ai.internal:8080'; - 同时在
clawdbot/config.json中关闭所有非必要功能:{ "enableHistory": false, "enableExport": false, "enableSettings": false, "defaultModel": "qwen3:32b" }
最后,通过公司AD域控策略,仅允许ai.internal:8080域名被内网终端访问,彻底切断其他入口。
4. 实际使用效果与业务反馈
系统上线两周后,IT部门收集了来自风控、合规、投研三个部门共47位员工的使用反馈。我们没问“好不好用”,而是聚焦在“解决了什么具体问题”。
4.1 真实高频使用场景
- 合规部张工:每天要核对上百条监管新规条款。过去靠人工比对PDF,现在把原文粘贴进对话框,输入“请逐条列出与‘客户适当性管理’相关的条款,并标注出处页码”,3秒内返回结构化摘要,准确率超92%。
- 投研部李经理:每周写行业周报。输入“根据附件中的3份券商研报摘要,总结光伏硅料价格走势、主要厂商扩产计划、下游组件排产变化,用表格呈现”,Clawdbot自动提取关键信息生成三栏对比表,节省约2.5小时/周。
- 风控部实习生小王:第一次写贷后检查报告。输入“帮我起草一份针对制造业中小企业的贷后检查报告模板,包含经营状况、财务指标、担保情况、风险提示四个部分”,获得可直接填充的框架,导师审核后仅修改了两处措辞。
4.2 性能与稳定性表现
| 指标 | 实测值 | 说明 |
|---|---|---|
| 首字响应时间(P50) | 1.8秒 | 输入50字以内问题,从回车到出现第一个字 |
| 完整响应时间(P90) | 4.2秒 | 含思考、生成、流式返回全过程 |
| 并发支持能力 | ≥12人同时在线 | 未出现排队或超时,A10显存占用稳定在92% |
| 月故障时长 | 0分钟 | 全程无服务中断,Nginx日志显示99.998%可用性 |
值得一提的是,所有对话内容均未落库、未缓存、未记录——每次请求都是“无状态”的,符合金融行业最严审计要求。
5. 经验总结与避坑指南
这次部署不是教科书式的理想流程,而是在真实约束下不断妥协、验证、优化的结果。以下是我们踩过的坑和提炼出的硬经验。
5.1 Ollama相关关键点
- ❌ 不要用
ollama run qwen3:32b启动模型:它会独占终端、无法后台运行,且无法设置context长度 - 必须用
ollama serve+curl调用API:这才是生产环境唯一可靠方式 - 模型加载后首次推理较慢(约6秒),这是显存预热过程,后续稳定在2秒内,属正常现象
5.2 Clawdbot适配要点
- ❌ 不要试图修改Clawdbot源码重新编译:它的构建链依赖大量海外CDN资源,内网无法完成
- 直接改
dist/index.html和config.json:静态文件修改即时生效,零构建成本 - 流式响应必须开启:Clawdbot默认启用stream,若Ollama返回非流式JSON会报错,务必确认
"stream": true已传入
5.3 网络与安全红线
- ❌ 禁止将Ollama端口(11434)直接暴露给内网其他机器:必须通过Nginx统一出口,便于审计和限流
- 所有HTTP头必须透传:特别是
X-Real-IP,否则无法在Nginx日志中追溯真实访问者 - 内网DNS必须能解析
ai.internal:建议在每台终端的/etc/hosts中固化一行10.20.30.40 ai.internal
这套方案目前已稳定支撑137名员工日常使用,平均每日对话量420+轮。它证明了一件事:大模型落地不必追求“大而全”,有时最朴素的组合——一个专注交互的前端、一个专注推理的引擎、一个专注路由的网关——反而最经得起真实业务的考验。
6. 下一步演进方向
当前系统已满足基础办公需求,但团队已在规划更进一步的能力延伸:
- 知识库增强:接入内部制度库PDF,用Ollama内置RAG功能实现“问制度答条款”,不改变现有架构
- 多模型切换:在Clawdbot界面增加下拉菜单,后端桥接服务根据选择动态调用不同Ollama模型(如Qwen3-4B用于快速问答,Qwen3-32B用于深度分析)
- 审计看板:基于Nginx日志开发简易统计页面,展示“谁在什么时候问了什么类型问题”,满足合规留痕要求
技术的价值,从来不在参数多大、速度多快,而在于是否真正嵌入工作流、是否让一线人员愿意主动打开、是否在不增加负担的前提下悄悄提升了效率。这个内网AI助手,正在 quietly doing its job。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。