ChatGLM-6B实战教程:对接企业微信/钉钉机器人实现IM端智能问答
1. 为什么需要把ChatGLM-6B接入企业IM?
你有没有遇到过这些场景:
- 客服团队每天重复回答“账号怎么找回”“订单多久发货”这类问题,人力成本高、响应慢;
- 新员工入职要花好几天熟悉内部知识库,而老员工又总被各种流程问题打断工作;
- 部门群里频繁刷屏问“会议室怎么预约”“报销单模板在哪”,信息沉没在聊天记录里,没人整理也没人归档。
这些问题背后,其实只需要一个能“听懂人话、答得准、接得上”的智能助手。而ChatGLM-6B——这个由清华大学KEG实验室与智谱AI联合推出的开源双语大模型,正适合做这件事的“大脑”。它参数量适中(62亿)、中文理解强、部署轻量、响应快,不追求炫技,但足够靠谱。
本教程不讲模型训练、不调参、不搭GPU集群,只聚焦一件事:如何把已部署好的ChatGLM-6B服务,快速、稳定、安全地接入你每天都在用的企业微信或钉钉机器人,让AI真正走进工作流。全程无需修改模型代码,不碰CUDA配置,所有操作基于标准HTTP接口和官方机器人协议,小白也能照着跑通。
2. 镜像基础能力与服务就绪确认
2.1 镜像核心特性再确认
本镜像是CSDN星图镜像广场提供的开箱即用型部署方案,已预装全部依赖与权重,关键能力如下:
- 开箱即用:模型权重文件(
model_weights/)已内置,启动即推理,无需联网下载,避免因网络波动导致初始化失败; - 生产级稳定:通过Supervisor守护
chatglm-service进程,异常崩溃后3秒内自动重启,保障7×24小时在线; - 交互友好:内置Gradio WebUI(默认端口7860),支持中英文双语输入、温度(temperature)与top-p实时调节、多轮上下文记忆,方便调试与效果验证。
动手前请先确认服务已正常运行:
执行supervisorctl status chatglm-service,输出应为RUNNING;
访问http://127.0.0.1:7860(需先建立SSH隧道)能打开对话界面,并成功完成一次中英文提问。
2.2 技术栈与接口就绪检查
| 组件 | 当前状态 | 说明 |
|---|---|---|
| 推理服务 | 已就绪 | app.py启动的FastAPI服务监听0.0.0.0:8000(非Gradio端口),提供标准/chat接口 |
| API文档 | 可访问 | http://127.0.0.1:8000/docs查看Swagger交互式文档 |
| 请求示例 | 支持JSON | POST /chat,Body含{"query": "你好", "history": []},返回{"response": "...", "history": [...]} |
注意:Gradio(7860端口)用于人工调试,对接机器人必须调用8000端口的FastAPI接口。这是生产集成的关键分界点。
3. 对接企业微信机器人:三步上线
企业微信机器人采用「关键词触发 + 回复消息」模式,无需用户添加好友,适合内部知识问答场景。
3.1 创建并获取机器人Webhook地址
- 进入企业微信管理后台 → 「应用管理」→ 「自建应用」→ 创建新应用(如命名为“AI知识助手”);
- 在应用详情页,找到「机器人」模块 → 点击「添加机器人」→ 填写名称(如“ChatGLM小助手”)、设置头像;
- 复制生成的Webhook地址(形如
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxx),此为唯一通信凭证,务必保密。
3.2 编写轻量级转发服务(Python Flask)
我们不直接让机器人调用ChatGLM,而是加一层转发服务,负责:
解析企业微信消息格式 → 提取用户提问 → 调用ChatGLM-6B API → 将结果按微信格式封装返回
新建文件wechat_forward.py:
from flask import Flask, request, jsonify import requests import json app = Flask(__name__) # 配置:替换为你实际的ChatGLM服务地址和企业微信Webhook CHATGLM_API = "http://127.0.0.1:8000/chat" WECHAT_WEBHOOK = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的key" @app.route('/wechat', methods=['POST']) def handle_wechat(): try: data = request.get_json() # 企业微信消息体结构:text.content 是用户发送的文本 if 'text' not in data or 'content' not in data['text']: return jsonify({'errcode': 400, 'errmsg': 'Invalid message format'}), 400 user_input = data['text']['content'].strip() if not user_input: return jsonify({'errcode': 400, 'errmsg': 'Empty input'}), 400 # 调用ChatGLM-6B服务(简化版:无历史上下文,适合单轮问答) glm_resp = requests.post( CHATGLM_API, json={"query": user_input, "history": []}, timeout=30 ) if glm_resp.status_code != 200: raise Exception(f"ChatGLM API error: {glm_resp.status_code}") glm_data = glm_resp.json() answer = glm_data.get("response", "抱歉,我暂时无法回答这个问题。") # 构造企业微信文本消息格式 wechat_msg = { "msgtype": "text", "text": { "content": answer[:2000] # 企业微信限制2000字符 } } # 发送回复给群聊 requests.post(WECHAT_WEBHOOK, json=wechat_msg, timeout=10) return jsonify({'errcode': 0, 'errmsg': 'ok'}) except Exception as e: print(f"[Error] {e}") return jsonify({'errcode': 500, 'errmsg': 'Internal server error'}), 500 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=False)3.3 部署转发服务并配置企业微信
安装依赖:
pip install flask requests启动服务:
nohup python wechat_forward.py > wechat.log 2>&1 &配置企业微信机器人触发:
- 回到企业微信机器人设置页,找到「机器人接收消息」→ 开启「接收消息」;
- 在「机器人回复」中,填写你的转发服务地址:
https://你的服务器公网IP:5000/wechat(若无域名,需配置HTTPS或使用内网穿透工具如frp); - 设置关键词(如“问AI”“查知识”),或选择「@机器人」触发,确保消息能准确送达。
测试:在群中发送
@ChatGLM小助手 今天天气怎么样?,几秒内应收到ChatGLM生成的回答。
4. 对接钉钉机器人:支持更灵活的交互方式
钉钉机器人支持关键词、@、富文本卡片等多种触发方式,且对中文生态更友好,适合需要结构化反馈的场景(如查询工单状态、展示FAQ列表)。
4.1 创建自定义机器人并获取Token
- 进入钉钉群 → 右上角「…」→ 「智能群助手」→ 「添加机器人」→ 「自定义」;
- 填写机器人名称(如“钉钉ChatGLM”),勾选「加签」(提升安全性);
- 复制生成的Webhook地址和加签密钥(secret)—— 加签是必选项,否则消息会被拒绝。
4.2 支持加签的转发服务(升级版)
钉钉要求每次请求携带时间戳+签名,需在上一节代码基础上增加加签逻辑。更新dingtalk_forward.py:
import time import hmac import base64 import hashlib from flask import Flask, request, jsonify import requests import json app = Flask(__name__) # 替换为你的实际值 DINGTALK_WEBHOOK = "https://oapi.dingtalk.com/robot/send?access_token=xxx" DINGTALK_SECRET = "your_secret" def get_dingtalk_signature(): timestamp = str(round(time.time() * 1000)) secret_enc = DINGTALK_SECRET.encode('utf-8') string_to_sign = f'{timestamp}\n{DINGTALK_SECRET}' string_to_sign_enc = string_to_sign.encode('utf-8') hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest() sign = base64.b64encode(hmac_code).decode('utf-8') return timestamp, sign @app.route('/dingtalk', methods=['POST']) def handle_dingtalk(): try: data = request.get_json() # 钉钉消息体:text.content 或 msgtype=text时的content字段 if 'text' not in data or 'content' not in data['text']: return jsonify({'errcode': 400}), 400 user_input = data['text']['content'].strip() if not user_input: return jsonify({'errcode': 400}), 400 # 调用ChatGLM glm_resp = requests.post( "http://127.0.0.1:8000/chat", json={"query": user_input, "history": []}, timeout=30 ) answer = glm_resp.json().get("response", "我还在学习中,请稍后再试。") # 构造钉钉文本消息(支持markdown) ding_msg = { "msgtype": "text", "text": { "content": f" AI助手:{answer}" }, "at": { "isAtAll": False } } # 生成加签参数 timestamp, sign = get_dingtalk_signature() full_url = f"{DINGTALK_WEBHOOK}×tamp={timestamp}&sign={sign}" # 发送 requests.post(full_url, json=ding_msg, timeout=10) return jsonify({'errcode': 0}) except Exception as e: print(f"[DingTalk Error] {e}") return jsonify({'errcode': 500}), 500 if __name__ == '__main__': app.run(host='0.0.0.0', port=5001, debug=False)4.3 部署与测试要点
- 启动命令:
nohup python dingtalk_forward.py > dingtalk.log 2>&1 & - 钉钉群设置:在机器人详情页,将「安全设置」中的加签方式设为「自定义关键词」或「@机器人」,关闭「IP地址段」限制(或填入服务器出口IP);
- 首次测试建议用
@机器人 什么是Transformer?,观察是否返回结构化回答。
进阶提示:如需支持多轮对话,可在转发服务中为每个用户ID维护简化的
history缓存(如Redis),避免每次清空上下文。
5. 实战优化与避坑指南
5.1 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 机器人无响应 | Webhook地址未配置或网络不通 | curl -X POST <webhook> -H "Content-Type: application/json" -d '{"msgtype":"text","text":{"content":"test"}}'测试连通性 |
| ChatGLM返回超时 | 模型首次加载慢或GPU显存不足 | 启动后等待30秒再测试;检查nvidia-smi显存占用,必要时降低--max_length参数 |
| 企业微信提示“消息格式错误” | 未按规范返回JSON或字段缺失 | 确保转发服务返回{"errcode":0},且响应头为Content-Type: application/json |
| 钉钉提示“签名错误” | 时间戳偏差>1小时或secret错误 | 用date命令校准服务器时间;重新复制secret,注意末尾空格 |
5.2 生产环境加固建议
- 限流保护:在Flask层添加简单限流(如每分钟5次/用户),防止恶意刷请求;
- 日志追踪:在转发服务中记录
user_id、input、answer、latency,便于问题回溯; - 降级策略:当ChatGLM服务不可用时,自动返回预设兜底话术(如“AI助手正在小憩,请稍后重试”);
- 敏感词过滤:在转发服务中前置过滤违禁词,避免AI生成内容风险外溢。
5.3 效果提升小技巧
- 提示词工程(Prompt Engineering):在调用ChatGLM时,固定注入系统指令,例如:
可显著提升回答一致性;{ "query": "请用简洁、专业的中文回答以下问题,不要使用Markdown格式:今天天气怎么样?", "history": [] } - 结果截断处理:ChatGLM偶有生成长段落,建议在转发服务中用句号/换行符截取前2-3句,保证消息可读性;
- 冷启动优化:在
app.py中增加预热逻辑,服务启动后主动执行一次空推理,避免首问延迟过高。
6. 总结:从技术Demo到业务价值闭环
你已经完成了三件关键事:
确认了ChatGLM-6B服务稳定就绪;
实现了企业微信机器人的关键词触发式问答;
构建了支持加签的钉钉机器人转发服务,并完成端到端测试。
但这不是终点,而是智能办公落地的起点。下一步,你可以:
- 将问答范围从通用知识扩展到公司专属知识库(接入RAG);
- 在回复中嵌入链接、按钮(钉钉支持ActionCard),一键跳转审批系统;
- 结合用户身份(企业微信/钉钉的
userid),实现个性化应答(如“张经理,您部门的Q3预算已批复”)。
真正的AI价值,不在于模型多大,而在于它能否无声融入工作流,把人从重复劳动中解放出来。而今天这一步——让ChatGLM-6B开口说话,正是最实在的第一步。
--- > **获取更多AI镜像** > > 想探索更多AI镜像和应用场景?访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_source=mirror_blog_end),提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。