ChatGLM3-6B实战教程:如何将本地ChatGLM3-6B接入企业微信/钉钉机器人
ChatGLM3-6B实战教程:如何将本地ChatGLM3-6B接入企业微信/钉钉机器人
1. 为什么需要把本地大模型接入办公平台?
你是不是也遇到过这些情况:
- 客服同事每天重复回答“账号怎么找回”“发票怎么开”这类问题,效率低还容易出错;
- 技术文档更新频繁,新员工总要翻半天Wiki才能搞懂一个接口;
- 钉钉群里有人问“上个月销售数据汇总在哪”,没人及时回应,消息直接被刷走。
这些问题,靠人工盯群、建FAQ、写SOP只能缓解一时。而真正能“治本”的方案,是让AI助手长在你的工作流里——不是挂在网页上等人点开,而是主动出现在企业微信会话、钉钉群聊中,像一位永不下班的智能协作者。
本教程不讲云端API调用,也不依赖第三方SaaS服务。我们将完全基于你本地部署的ChatGLM3-6B-32k模型,通过轻量级Web服务+消息网关的方式,把它变成企业微信和钉钉里的“真人”机器人。整个过程无需公网IP、不上传任何数据、不修改模型权重,所有推理都在你自己的RTX 4090D显卡上完成。
你将获得:
一个可直接响应群消息的私有AI助手
支持多轮上下文记忆(32k tokens)的稳定对话能力
企业微信/钉钉双平台通用接入方案
全部代码可一键复现,无版本冲突风险
2. 环境准备与核心组件说明
2.1 本地模型服务已就绪的前提
本教程默认你已完成ChatGLM3-6B-32k的本地部署,并可通过Streamlit快速启动对话界面。如果你还没跑通基础服务,请先确认以下三点:
- 模型文件已下载至本地路径(如
./chatglm3-6b-32k),且包含pytorch_model.bin和tokenizer.json - 已安装
transformers==4.40.2、torch==2.1.2+cu121(适配RTX 4090D)、streamlit==1.32.0 - 运行
streamlit run app.py后,浏览器能正常打开http://localhost:8501并进行流畅对话
小提醒:本方案不依赖Gradio,彻底避开其常见的
fastapi版本冲突、uvicorn启动失败等问题。我们全程使用Streamlit原生st.server.Server机制,稳定性更高。
2.2 接入办公平台的关键桥梁:Webhook服务
企业微信和钉钉都不允许直接调用本地localhost地址。我们需要一个“中间人”来完成三件事:
1⃣ 接收来自企业微信/钉钉发来的HTTP POST请求(含用户消息、群ID、发送人等元信息)
2⃣ 将消息文本送入本地ChatGLM3-6B模型推理,并获取生成结果
3⃣ 将AI回复按平台要求格式封装,再POST回对应API完成消息下发
这个“中间人”就是本教程的核心——一个极简但健壮的Flask Web服务(仅127行代码),它不处理模型加载,只专注做消息路由与协议转换。
3. 构建本地AI消息网关(Flask服务)
3.1 创建服务文件 webhook_server.py
新建文件 webhook_server.py,粘贴以下代码(已适配企业微信+钉钉双平台):
# webhook_server.py
from flask import Flask, request, jsonify
import json
import requests
import threading
import time
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
app = Flask(__name__)
# === 模型加载(单例,避免重复初始化)===
model_path = "./chatglm3-6b-32k"
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
model_path,
trust_remote_code=True,
device_map="auto",
torch_dtype=torch.float16
).eval()
def chat_with_model(query, history=None):
if history is None:
history = []
response, _ = model.chat(tokenizer, query, history=history)
return response
# === 企业微信配置(请替换为你的真实值)===
WECHAT_WEBHOOK_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your-wechat-key-here"
# === 钉钉配置(请替换为你的真实值)===
DINGTALK_WEBHOOK_URL = "https://oapi.dingtalk.com/robot/send?access_token=your-dingtalk-token-here"
DINGTALK_SECRET = "your-dingtalk-secret-here" # 如未开启加签可留空
@app.route('/wechat', methods=['POST'])
def handle_wechat():
data = request.get_json()
user_msg = data.get("Text", {}).get("Content", "").strip()
if not user_msg:
return jsonify({"errcode": 400, "errmsg": "no message content"}), 400
# 调用本地模型
reply = chat_with_model(user_msg)
# 发送回企业微信(文本消息格式)
payload = {
"msgtype": "text",
"text": {"content": reply}
}
resp = requests.post(WECHAT_WEBHOOK_URL, json=payload)
return jsonify({"errcode": 0, "errmsg": "ok"})
@app.route('/dingtalk', methods=['POST'])
def handle_dingtalk():
data = request.get_json()
user_msg = data.get("text", {}).get("content", "").strip()
if not user_msg:
return jsonify({"status": "error", "message": "empty message"}), 400
# 调用本地模型
reply = chat_with_model(user_msg)
# 发送回钉钉(markdown消息,更美观)
payload = {
"msgtype": "markdown",
"markdown": {
"title": "AI助手回复",
"text": f"### AI助手\n\n{reply}"
}
}
headers = {"Content-Type": "application/json"}
resp = requests.post(DINGTALK_WEBHOOK_URL, json=payload, headers=headers)
return jsonify({"status": "success"})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000, debug=False)
3.2 关键配置说明
| 配置项 | 说明 | 如何获取 |
|---|---|---|
WECHAT_WEBHOOK_URL |
企业微信机器人Webhook地址 | 在「企业微信管理后台 → 应用管理 → 自建应用 → 机器人」中创建并复制 |
DINGTALK_WEBHOOK_URL |
钉钉机器人Webhook地址 | 在「钉钉群 → 群设置 → 智能群助手 → 添加机器人 → 自定义」中获取 |
DINGTALK_SECRET |
钉钉加签密钥(可选) | 创建机器人时勾选“加签”后显示,若未启用则删除代码中相关逻辑 |
注意:
webhook_server.py必须与你的chatglm3-6b-32k模型文件夹在同一目录层级,否则路径会报错。
3.3 启动服务并验证连通性
在终端执行:
python webhook_server.py
服务启动后,你会看到类似输出:
* Running on http://0.0.0.0:8000
* Debug mode: off
此时服务已在本地监听 http://localhost:8000。我们暂不测试真实消息,先用curl模拟一次请求:
# 模拟企业微信发来一条消息
curl -X POST http://localhost:8000/wechat \
-H "Content-Type: application/json" \
-d '{"Text":{"Content":"你好,今天天气怎么样?"}}'
如果返回 {"errcode": 0, "errmsg": "ok"},且终端日志中出现模型推理耗时(如 Inference time: 1.82s),说明网关已成功调用本地模型并完成响应闭环。
4. 企业微信端接入实操
4.1 创建并配置机器人
- 登录企业微信管理后台 → 进入「应用管理」→ 「自建应用」
- 点击「创建应用」,填写名称(如“内部AI助手”),可见范围设为“全公司”
- 在应用详情页,点击左侧菜单「机器人」→ 「添加机器人」
- 填写机器人名称(如“ChatGLM小助手”),选择头像,点击「创建」
- 复制生成的 Webhook地址(形如
https://qyapi.weixin.qq.com/...),粘贴到webhook_server.py中的WECHAT_WEBHOOK_URL变量位置
4.2 设置群内可用(关键步骤)
企业微信默认不允许机器人在普通群中发言,必须手动授权:
- 打开任意一个需接入AI的内部群 → 点击右上角「…」→ 「群机器人」→ 「添加机器人」
- 从列表中选择你刚创建的“ChatGLM小助手”
- 务必勾选「群成员可@机器人」和「机器人可发送消息」
- 点击「完成」
此时,群成员只需在群中输入 @ChatGLM小助手 介绍一下Python装饰器,消息就会被转发至你的本地服务,经模型处理后,以机器人身份自动回复。
实测提示:首次@后可能有1~3秒延迟(模型首次加载),后续响应稳定在1.5~2.2秒(RTX 4090D实测)。
5. 钉钉端接入实操
5.1 创建自定义机器人
- 打开目标钉钉群 → 点击右上角「…」→ 「智能群助手」→ 「添加机器人」
- 选择「自定义」类型 → 填写机器人名称(如“GLM钉钉助手”)
- 安全设置:
- 若选择「自定义关键词」,输入
AI或助手(群成员需发送含关键词的消息才触发) - 若选择「加签」,复制密钥填入
DINGTALK_SECRET,并在代码中启用加签验证(本教程暂不展开,如需可提供补充代码)
- 若选择「自定义关键词」,输入
- 复制Webhook地址,填入
webhook_server.py对应变量
5.2 测试与优化体验
钉钉支持更丰富的消息格式。我们在服务中已默认使用 markdown 类型,让AI回复更易读:
- 支持换行、加粗、代码块(模型输出含```时会自动渲染)
- 标题自动转为
###级别,结构清晰 - 避免纯文本堆砌,提升信息密度
你可以直接在群中发送:
@GLM钉钉助手 写一个Python函数,计算斐波那契数列前10项
几秒后,你将收到带代码块的结构化回复,而非一整段文字。
进阶建议:在
webhook_server.py中增加简单指令识别,例如当用户发送/help时,固定返回功能说明,避免模型“胡说”。
6. 稳定性增强与生产化建议
6.1 解决“首次加载慢”问题
虽然 @st.cache_resource 让Streamlit界面秒开,但Flask服务每次启动仍需重新加载模型。我们通过以下方式优化:
- 模型常驻内存:
webhook_server.py中模型加载放在全局作用域,服务启动即完成,后续所有请求共享同一实例 - 预热机制:在
if __name__ == '__main__':后添加一行预热调用:
# 预热:启动时自动执行一次空推理,触发CUDA初始化
_ = chat_with_model("你好")
6.2 防止服务意外中断
本地服务不能像云服务那样自动重启。推荐使用 supervisor 或 systemd 进行进程守护:
以 Ubuntu + systemd 为例,创建 /etc/systemd/system/chatglm-webhook.service:
[Unit]
Description=ChatGLM3-6B Webhook Service
After=network.target
[Service]
Type=simple
User=your-username
WorkingDirectory=/path/to/your/project
ExecStart=/usr/bin/python3 /path/to/your/project/webhook_server.py
Restart=always
RestartSec=10
Environment=PYTHONUNBUFFERED=1
[Install]
WantedBy=multi-user.target
启用服务:
sudo systemctl daemon-reload
sudo systemctl enable chatglm-webhook
sudo systemctl start chatglm-webhook
运行 sudo systemctl status chatglm-webhook 即可查看实时状态。
6.3 安全边界提醒(重要)
- 本服务默认绑定
0.0.0.0:8000,仅限内网访问。切勿将该端口映射到公网! - 企业微信/钉钉Webhook本身具备签名验证机制,但本教程为简化未实现。如需更高安全等级,可在Flask路由中加入签名校验逻辑(官方文档提供详细算法)。
- 建议为模型服务单独分配GPU显存(如
CUDA_VISIBLE_DEVICES=0),避免与其他任务争抢资源。
7. 总结:你已拥有一套真正属于企业的AI协作系统
回顾整个过程,你没有调用任何外部API,没有上传一句对话,没有依赖任何云厂商的算力或存储。你只是做了三件事:
1⃣ 把开源模型稳稳地装进自己的显卡里;
2⃣ 用不到130行Python代码,搭起一座跨平台的消息桥;
3⃣ 在企业微信和钉钉里,为团队点亮了一个随时待命的AI协作者。
这不是一个“玩具项目”,而是一套可立即投入使用的生产力工具:
- 客服团队可以用它自动回复高频问题,释放人力去处理复杂case;
- 技术团队可以把它变成“文档搜索引擎”,输入问题直接定位源码注释;
- 运营同学能用它批量生成活动文案初稿,再人工润色——效率翻倍,创意不减。
更重要的是,这套方案完全可控、可审计、可迭代。明天你想给AI加上RAG检索能力?只要改几行代码,接入本地向量库即可。后天想让它读取飞书多维表格?新增一个数据连接模块就行。它不再是一个黑盒API,而是你技术栈中真正可生长的一部分。
现在,就去你的RTX 4090D上跑起来吧。那个能听懂中文、记得住上下文、永远在线的AI同事,已经准备好开工了。
---
> **获取更多AI镜像**
>
> 想探索更多AI镜像和应用场景?访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_source=mirror_blog_end),提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐




所有评论(0)