news 2026/10/23 22:05:30

企业微信 Webhook 接入 OpenAI / Claude API,打造群内 AI 助手

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
企业微信 Webhook 接入 OpenAI / Claude API,打造群内 AI 助手

群里接 AI 助手,和单聊最大的区别是:群里人多嘴杂,AI 不能见话就接,得知道什么时候该开口,什么时候该闭嘴。

先定规矩:AI 在群里什么时候说话

被 @ 的时候:群里有人 @ 机器人,这是明确的求助信号,必须回。

包含关键词的时候:"怎么"、"请问"、"求助"这类词,大概率是问题。

连续讨论的时候:同一件事被讨论了三轮以上还没结论,AI 可以总结一下。

绝对不接的话:闲聊、表情包、已解决的问题、明显在吵架。

def should_reply(msg, bot_uin): text = msg["content"] # 被 @ 了 if f"@{bot_uin}" in text or "@机器人" in text: return True # 包含求助关键词 if any(k in text for k in ["怎么", "请问", "求助", "谁知道"]): return True return False

上下文组装:群聊不是单聊

群聊的上下文是一堆人交叉发言,直接全塞给模型,模型会被绕晕。要做过滤:

  • 只取最近 15 条

  • 标记发言人,让模型知道谁在说什么

  • 排除机器人自己发的

  • 排除明显无关的闲聊

def build_context(messages, limit=15): context = [] for msg in messages[-limit:]: if msg["senderUin"] == BOT_UIN: continue if len(msg["content"]) < 3: # 过滤表情和短回复 continue context.append(f"{msg['senderName']}: {msg['content']}") return "\n".join(context)

调 OpenAI / Claude

两家 API 的调用方式差不多,都是 messages 数组,但模型名和参数有差异。

def call_openai(messages): return requests.post( "https://api.openai.com/v1/chat/completions", headers={"Authorization": f"Bearer {OPENAI_KEY}"}, json={ "model": "gpt-4", "messages": messages, "max_tokens": 500, "temperature": 0.7, } ).json()["choices"][0]["message"]["content"] def call_claude(messages): return requests.post( "https://api.anthropic.com/v1/messages", headers={ "x-api-key": CLAUDE_KEY, "anthropic-version": "2023-06-01", }, json={ "model": "claude-3-sonnet-20240229", "max_tokens": 500, "messages": messages, } ).json()["content"][0]["text"]

系统 Prompt:让 AI 知道自己在群里

群聊的 system prompt 和单聊不一样,要明确告诉 AI:

  • 你在一个群里,不是私聊

  • 回复要简洁,别长篇大论

  • 不确定就说不确定,别瞎编

  • 涉及敏感信息就拒绝

SYSTEM_PROMPT = """你是一个企业微信群里的 AI 助手。规则: 1. 回复要简洁,不超过 200 字 2. 不确定的问题说"我不确定,建议查文档或问相关人员" 3. 不要编造信息 4. 涉及公司内部敏感信息(薪资、人事、财务数据)一律拒绝回答 5. 如果问题已经被其他人回答过了,不要重复回答"""

频控:别刷屏

单群每分钟 AI 回复不超过 3 条,是安全线。超过就静默,或者合并成一条。

def reply_with_limit(room_id, text): key = f"ai_reply:{room_id}:{datetime.now():%Y%m%d%H%M}" count = redis.incr(key) redis.expire(key, 60) if count > 3: return False return send_text(conv_id_of(room_id), text)

一个真实场景

某技术团队的内部群,之前新人问问题要等老员工有空才回。接了 AI 助手后,常见问题秒回,复杂问题 AI 先给思路,老员工再补充。群里的技术讨论效率明显提升。

关键是 AI 知道什么时候该说话,什么时候该闭嘴。

企微回调和发送的字段在Eyun 开发文档里能查到,OpenAI 和 Claude 的 API Key 在各自平台申请。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 21:28:13

Python批量处理Word:自动插入图片和表格的办公自动化脚本

简介&#xff1a;这份资源面向需要批量处理Word文档的Python学习者与办公自动化从业者&#xff0c;聚焦用python-docx库把图片和表格高效写入.docx文件&#xff0c;解决手动逐份编辑重复文档的痛点&#xff0c;属于入门到进阶的实用技能练习。压缩包共12个文件&#xff0c;约36…

作者头像 李华
网站建设 2026/10/23 21:26:04

从陪读到放手:一个初三家长记录孩子背单词方式的调整过程

去年秋天&#xff0c;一个初三孩子的妈妈跟我聊起她家的晚间日常。孩子英语成绩不算差&#xff0c;但每天背单词的环节总是拖到最晚&#xff0c;书桌前坐半小时&#xff0c;翻来覆去还是那几页。她说得很实在&#xff1a;不是孩子懒&#xff0c;是背了忘、忘了背&#xff0c;看…

作者头像 李华
网站建设 2026/10/23 21:07:20

vtstscripts.tgz:Linux系统级诊断脚本集实战指南

简介&#xff1a;vtstscripts.tgz 是一套面向Linux运维工程师与服务器管理员的轻量级自动化脚本工具集&#xff0c;聚焦系统监控、日志分析、服务管理、备份恢复及安全巡检等高频运维场景&#xff0c;助力中初级运维人员提升日常操作效率与故障响应能力。压缩包共152个文件&…

作者头像 李华
网站建设 2026/10/23 21:06:08

东芝200swin7X64驱动手动安装指南:绿色版驱动包实战与避坑

简介&#xff1a;这份资源是专为东芝200S笔记本在Windows 7 64位系统下准备的驱动合集&#xff0c;面向需要重装系统或修复硬件识别问题的用户&#xff0c;尤其适合习惯手动逐项安装、希望自主掌控驱动版本的中级操作者。压缩包共119个文件&#xff0c;约5.06MB&#xff0c;以d…

作者头像 李华
网站建设 2026/10/23 21:03:29

aos 文件包拆解:CSS3 滚动动画与 IntersectionObserver 实践

简介&#xff1a;这是一份面向前端开发者与网页设计师的 AOS 滚动动画库文件包&#xff0c;基于 JavaScript 与 CSS3 实现&#xff0c;用于为 H5 页面元素添加随滚动触发的动态效果&#xff0c;提升页面互动性与视觉吸引力。包内共 2 个文件&#xff0c;分别为 1 个 css 样式文…

作者头像 李华
网站建设 2026/10/23 21:03:26

VBM与临床量表关联分析:从体素统计到临床解释的完整技术链

1. 这不是“跑个相关系数”那么简单&#xff1a;VBM与临床量表关联分析的真实战场你是不是也见过这样的论文标题&#xff1a;“XX疾病患者灰质体积减少与抑郁评分呈显著负相关&#xff08;r -0.42, p < 0.05&#xff09;”&#xff0c;然后翻到方法部分&#xff0c;只看到一…

作者头像 李华