微信 AI 助手
没人会否认,当你遇到一个难题或者完成一个项目时,要去LLM页面询问或上Coding Agent解决。但如果只是在聊天的时候,一个突然蹦出来的小疑惑呢?切换App,输入问题,等待结果,这个繁琐的流程本身就会消耗掉我们的好奇心,浪费掉一个可能的有趣灵感。
于是我想做一个更直接的东西:
如果 AI 本身就是我的一个微信联系人呢?
不需要打开额外的软件,也不需要改变原来的聊天习惯。私聊它,或者在微信群里 @ 它,它就能直接理解问题、调用需要的模型与工具,然后把答案重新发回微信。
微信 AI 助手就是在这个想法下做出来的一个 Windows 微信个人 AI 助手。
是什么
微信 AI 助手运行在 Windows 微信客户端旁边,通过桌面 UI Automation 观察微信中的新消息。
目前支持两种主要触发方式:
- 私聊机器人账号
- 在微信群中明确
@机器人
收到符合条件的新消息后,程序会先进行消息身份与安全检查,再根据问题类型决定使用哪个模型以及是否调用外部工具。
最终生成的回答会重新写入微信输入框并发送出去。
因此从使用者的角度来看,它和普通微信联系人没有太大区别:
发消息 → 等待几秒 → 收到 AI 回复。
整个模型调用、工具检索和微信操作过程都在后台完成。
为什么不是只接一个大模型 API
这个项目后来逐渐变成了一套双模型协作架构。
我没有让所有问题都固定交给同一个模型,而是根据问题类型自动路由。
OpenAI ChatGPT 5.6 Luna
OpenAI ChatGPT 5.6 Luna 是默认模型,主要负责:
- 普通聊天
- 工作与学习
- 写作与翻译
- 编程
- 一般专业问题
- 天气、资讯与 Web 信息
DeepSeek V4 Pro Thinking
对于更需要推理或专业判断的领域,则自动切换到 DeepSeek V4 Pro Thinking,目前主要包括:
- 金融
- 医疗与健康
- 健身、营养与运动
- 其他需要给出详细建议的领域
例如普通聊天会直接进入 Luna,而股票分析会自动进入 DeepSeek Pro。
微信用户主动选择用什么模型回答问题,程序会根据问题自动选择对应的模型。
Tools
模型并不只能依靠自身已有知识回答。
我另外做了一层统一的 Skill / Tool 系统。
- 实时市场报价
- 历史 K 线数据
- 基本面数据
- Web Search
例如在微信里询问某只股票最近的走势时,系统可以先识别证券代码,再获取真实行情数据,并让 DeepSeek 根据这些数据完成分析。
用户问题 → Agent 判断需要什么数据 → 调用工具 → 获取结果 → 模型分析 → 微信回复
而不是简单地把一句话转发给模型。
微信桌面自动化
这个项目比较麻烦的部分其实不在模型,而在微信本身。
我使用的是普通 Windows 微信客户端,而不是专门为机器人设计的消息接口。
因此程序需要真正处理桌面 UI:
识别
- 识别当前微信会话
- 判断新消息还是历史消息
- 识别群聊中的
@SELF - 防止机器人回复自己的消息
定位与写入
- 切换到正确会话
- 找到输入区域
- 写入回答
发送与校验
- 找到发送按钮
- 执行发送
- 再确认消息是否真正发送成功
实际开发过程中甚至遇到过一个很典型的 UI Automation 问题:
微信发送按钮内部的文字子控件覆盖了原本的点击命中区域,导致程序已经生成回答、甚至已经把文字写入输入框,却无法安全确认发送按钮的实际点击面。
最后通过重新设计发送按钮 hit-test 和 transaction 机制才把整条真实发送链路跑通。
这类问题也是这个项目和普通“调用一次 LLM API”的 Demo 最大的区别。
SEND_VERIFIED
我没有让程序采用“按一下发送键就默认成功”的方式。
每次发送都会作为一个独立 transaction 管理。
如果能够确认发送成功:
SEND_VERIFIED
事务结束。
如果明确知道没有执行发送动作,则可以安全失败并继续处理下一次请求。
但如果已经执行过一次真实 UI 发送动作,却无法判断微信究竟有没有成功发送,则会进入:
SEND_AMBIGUOUS
此时系统不会自动重试。
漏发一条消息通常比把同一条消息重复发送两次更容易接受。
因此遇到不确定发送状态时,我更倾向于停止并等待人工确认,而不是冒险重复操作微信。
单工模式
这个项目没有追求同时处理大量用户。
因为最终输出依赖真实 Windows UI,稳定性比并发吞吐量更重要。
因此后来我加入了一个全局 BUSY 单工机制。
机器人空闲时,只接受第一条符合条件的新请求。
一旦开始处理:
BUSY
期间即使其他用户继续私聊,或者其他微信群再次 @ 它,程序仍然会看到这些新消息并推进消息游标,但不会把它们加入待处理队列。
这些消息会被直接丢弃,也不会在上一条回答结束后重新追溯。
当前请求结束以后:
BUSY → IDLE
机器人再从此后出现的下一条新消息开始工作。
这牺牲了一部分并发能力,但大幅降低了桌面自动化环境下排队、错会话、旧消息补答和 UI 状态变化带来的风险。
安全边界
因为程序拥有操作真实微信客户端的能力,所以我给发送链路保留了比较严格的边界。
触发边界
- 群聊必须明确
@机器人本身 - 启动前已存在的历史消息不会被重新回答
- 群聊必须明确
去重与回声隔离
- 同一条消息不会重复 materialize
- 机器人自己发送的消息不会再次触发自己
会话与 UI 控制
- UI 操作保持串行
- 发送前重新确认目标会话
发送事务保护
- 不确定是否成功发送时禁止盲目重试
- unresolved transaction 会阻止新的危险发送动作
这些机制会牺牲一些“什么情况都尽量回复”的便利性,但对于一个真正控制微信账号的程序来说,我更在意它:
不要发错人、不要重复发送,也不要因为 UI 状态变化而失控。
当前状态
目前已经完成真实微信环境下的完整链路验证。
实际测试过:
普通聊天
微信 → Luna → 回复生成 → 微信发送
金融问题
微信 → DeepSeek V4 Pro Thinking → 市场数据 Skills → 分析 → 微信发送
健身 / 营养问题
微信 → DeepSeek V4 Pro Thinking → 微信发送
并已经验证:
消息入口与保护
- 群聊
@SELF - 私聊自动回复
- 消息去重
- 历史消息保护
- 群聊
模型与工具
- 模型自动路由
- Tool Calling
- Web Search
- 市场行情数据调用
发送与并发
- 发送 transaction
SEND_VERIFIED- 未决事务保护
- 全局 BUSY 单工处理
仍待解决
Skills 扩展
现有的 Skill / Tool 体系已经覆盖了一部分常用能力,后续还希望继续增加更多 Skills,让微信端能够处理更多类型的任务,而不只停留在回答问题本身。
相对日期
当问题使用“今天”“明天”等相对日期,而不是明确日期时,偶尔会出现无法正常回答的情况。现有排查暂未发现本地程序本身存在对应故障,但目前仍无法确认究竟来自 DeepSeek API 的调度、模型侧对时间语境的处理,还是其他外部因素,问题尚待进一步定位。
复杂复合指令
当一次消息同时包含过多互相关联的要求时,也可能出现无法正常回答的情况;如果将同一任务拆成几个步骤,通常又可以正常完成。目前这一问题同样尚未被准确定位,仍需要继续判断它究竟发生在模型、API 调度还是更复杂的上下文与工具调用组合中。
现在的微信 AI 助手已经不是一个只存在于测试代码里的 Demo,而是一个能够实际运行在 Windows 微信客户端旁边、接收问题并完成真实回复的个人 AI Agent。