企业微信 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 在各自平台申请。