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.bintokenizer.json
  • 已安装 transformers==4.40.2torch==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 创建并配置机器人

  1. 登录企业微信管理后台 → 进入「应用管理」→ 「自建应用」
  2. 点击「创建应用」,填写名称(如“内部AI助手”),可见范围设为“全公司”
  3. 在应用详情页,点击左侧菜单「机器人」→ 「添加机器人」
  4. 填写机器人名称(如“ChatGLM小助手”),选择头像,点击「创建」
  5. 复制生成的 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 创建自定义机器人

  1. 打开目标钉钉群 → 点击右上角「…」→ 「智能群助手」→ 「添加机器人」
  2. 选择「自定义」类型 → 填写机器人名称(如“GLM钉钉助手”)
  3. 安全设置
    • 若选择「自定义关键词」,输入 AI助手(群成员需发送含关键词的消息才触发)
    • 若选择「加签」,复制密钥填入 DINGTALK_SECRET,并在代码中启用加签验证(本教程暂不展开,如需可提供补充代码)
  4. 复制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 防止服务意外中断

本地服务不能像云服务那样自动重启。推荐使用 supervisorsystemd 进行进程守护:

以 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),提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐