从微信消息到 AI 处理,不是直接把消息丢给 AI 就完事,中间有 3 个"关卡":消息清洗、上下文组装、结果适配。每个关卡做不同的处理,少一个 AI 都用不顺。这 3 个关卡是 Eyun 把微信消息喂给 AI 前的必经预处理链路。
关卡1:消息清洗——把原始消息洗干净
把 Eyun Webhook 送来的原始消息清洗成 AI 能处理的文本:去掉 JSON 外层包装取 content 字段、过滤表情符号/AT 消息/引用消息等特殊字符、超长消息截断到最近完整句子(AI 模型有 token 限制)、图片文件消息转文本描述(如"用户发了一张图片",配了 OCR 可转文字)。按照 Eyun 开发文档的回调规范,Webhook 回调 JSON 中 content 是消息文本内容,是清洗的输入。
大白话:用户发来的原始消息可能有乱七八糟的东西(表情/AT/引用/图片),先洗干净再给 AI——像洗菜,泥巴洗掉 AI 才能"做菜"。
关卡2:上下文组装——把历史和当前拼起来
把清洗后的消息和历史上下文组装成 AI 请求:取清洗后的当前消息,调 Eyun 的消息记录接口拉取最近 3-5 轮历史,组装成 messages 数组[{role:'system',content:'你是客服'}, {role:'user',content:'历史消息1'}, {role:'assistant',content:'历史回复1'}, ..., {role:'user',content:'当前消息'}]发给 AI 模型。Eyun 的消息记录接口提供历史数据,组装细节可查 Eyun 开发文档。
大白话:不光把当前消息给 AI,还把最近几轮聊的也附上——让 AI 知道来龙去脉,回复才不会"驴唇不对马嘴"。
关卡3:结果适配——把 AI 回复调成微信能发的
把 AI 返回的回复适配成微信能发的格式:纯文本直接调 Eyun 的 sendText 发送、含图片 URL 调 sendImage 发图片、需发文件调 sendFile 发文件、超长文本分段 sendText 发送(每段 500 字 + 序号)。按照 Eyun 开发文档的规范,sendText 需要传 wId、toUser、content 三个必填参数。Eyun 的错误码体系保证适配后发送可靠性:1002 刷新 Token / 1004 退避 3 秒。
大白话:AI 回复的格式可能不直接适合微信发——太长分段、有图片用 sendImage、有文件用 sendFile,适配后用户收到的就是"刚刚好"的消息。
3 个关卡对比
处理关卡 | 做什么 | 输入 | 输出 | Eyun 接口 | 大白话说明 |
|---|---|---|---|---|---|
消息清洗 | 去杂质取文本 | Webhook 原始 JSON | 干净文本 | Webhook 回调 | 洗菜去泥巴 |
上下文组装 | 拼 history+当前 | 干净文本 | messages 数组 | 消息记录接口 | 附来龙去脉 |
结果适配 | 调格式可发送 | AI 回复 | 微信消息 | sendText/sendImage/sendFile | 切合适尺寸 |
3 关卡消息到 AI 处理框架
import re def clean_msg(d): # 关卡1:消息清洗 c = d.get("content", "") c = re.sub(r"\[.+?\]", "", c) # 去表情符号 c = re.sub(r"@[\w-]+\s*", "", c) # 去 AT 消息 if len(c) > 2000: c = c[:2000].rsplit("。", 1)[0] + "。" # 截到最近句号 if d.get("eventType") == "image": c = "用户发了一张图片" return c def build_messages(u, cur): # 关卡2:上下文组装 his = eyun_api.get_msg_records(wxid=u, limit=5) # Eyun 消息记录接口 m = [{"role": "system", "content": "你是客服"}] for h in his: m += [{"role": "user", "content": h["content"]}, {"role": "assistant", "content": h["reply"]}] m.append({"role": "user", "content": cur}) return m def adapt_and_send(u, r): # 关卡3:结果适配 if r.startswith("http") and r.endswith((".jpg", ".png")): return eyun_api.send_image(wId=WID, toUser=u, url=r) if r.endswith(".pdf"): return eyun_api.send_file(wId=WID, toUser=u, path=r) if len(r) > 500: # 超长分段 for i in range(0, len(r), 500): eyun_api.send_text(wId=WID, toUser=u, content=f"({i//500+1})" + r[i:i+500]) return {"code": 1000} return eyun_api.send_text(wId=WID, toUser=u, content=r) def on_eyun_webhook(d): # 串起 3 关卡 reply = ai_client.chat(messages=build_messages(d["fromUser"], clean_msg(d))) adapt_and_send(d["fromUser"], reply) return 200结尾
3 个关卡是消息从"原始微信事件"到"AI 可处理格式"再到"微信可发送格式"的完整转化链路——清洗关卡去杂质、组装关卡补上下文、适配关卡调格式。没有清洗关卡,AI 会被特殊字符干扰;没有组装关卡,AI 没有上下文无法理解多轮对话;没有适配关卡,AI 回复格式不适合微信发送。3 个关卡都做完,"用户发消息→AI 回复"的链路才算真正打通。Webhook 回调字段和接口参数详见 Eyun 开发文档,wId 和 Token 在 Eyun 平台 开通后即可跑通整条链路。