企业微信 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, limit15): 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: fBearer {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 fai_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 在各自平台申请。