公司动态
基于AI Agent的智能监督小程序:从理念到工程实践
1. 这篇文章真正要解决的问题你有没有过这样的经历年初立下Flag要每天学习、健身、读书结果不到一个月就抛之脑后。或者你是一个团队负责人想知道成员的任务进度却不好意思频繁催促怕影响关系。又或者你开发了一个工具希望用户能坚持使用但传统的“打卡”和“提醒”功能用户要么觉得烦要么干脆无视。这正是“监督”类应用的核心痛点如何在不引起用户反感的前提下有效促进目标的达成传统的解决方案无论是粗暴的定时提醒还是冰冷的进度条都缺乏“人性化”的考量最终导致用户流失。最近我在B站AI创造公开赛中看到一个项目标题叫“我做了个监督小程序却不想催你”。这个标题本身就很有意思它暗示了一种全新的设计思路将监督的主动权交还给用户用“陪伴”和“激励”替代“催促”和“惩罚”。这背后是AI Agent技术与产品思维的结合。本文将深入拆解这个项目背后的技术实现与产品逻辑。我们不仅要探讨如何用AI Agent构建一个智能的“监督伙伴”更要分析这种“非侵入式”监督模式背后的技术架构、实现难点以及它给开发者带来的启示。无论你是想学习AI Agent的落地实践还是对构建人性化工具感兴趣这篇文章都将为你提供一个从0到1的完整视角。2. 基础概念与核心原理什么是“不催人”的监督在深入代码之前我们需要先理解这个项目的核心理念。它不是一个简单的待办事项清单也不是一个社交打卡应用。它的核心在于“智能体Agent”和“行为引导”。2.1 传统监督 vs. AI Agent监督我们可以用一个表格来快速对比两者的区别维度传统监督工具AI Agent监督工具交互模式单向通知定时弹窗、消息推送。双向对话基于自然语言的交流与协商。决策逻辑规则驱动固定时间、固定内容。目标驱动理解用户意图动态调整策略。情感维度机械、冰冷、可能引发抵触。拟人化、有同理心、更像一个伙伴。适应性差。规则一旦设定难以改变。强。可根据用户反馈和历史行为学习调整。核心目标确保任务被执行过程。帮助用户养成习惯、达成目标结果。这个项目的“不想催你”正是通过AI Agent来实现的。Agent不再是一个发号施令的“监工”而是一个懂得观察、建议、鼓励甚至共情的“教练”。2.2 核心组件拆解要实现这样一个Agent至少需要三个核心层记忆与状态层记录用户的目标、历史完成情况、偏好、甚至情绪状态。这是Agent了解用户的“大脑”。推理与决策层基于当前状态和用户输入决定下一步行动。是发送一个温和的提醒分享一个相关的小知识还是建议用户休息这通常由大语言模型LLM驱动。行动与执行层将决策转化为具体动作。例如发送一条定制化的消息、更新一个进度动画、或调用一个外部API如获取天气信息来建议户外运动时间。这个项目的技术挑战就在于如何优雅地将这三层整合进一个小程序框架中并保证响应速度和用户体验。3. 环境准备与前置条件在开始动手复现或借鉴这个思路之前你需要准备好以下环境。请注意本文不会提供该参赛项目的具体源码通常不公开但会基于通用技术栈给出实现方案。核心技术栈选择前端/客户端微信小程序原项目载体。你需要安装微信开发者工具。后端服务Node.js (Express/Koa) 或 Python (FastAPI/Flask)。用于处理业务逻辑和与AI服务通信。AI能力核心大语言模型API。国内可选择智谱AI(ChatGLMAPI)百度千帆(ERNIE-BotAPI)阿里云灵积(通义千问API)月之暗面(KimiAPI)数据存储根据复杂度选择。简单场景云开发数据库如微信云开发、腾讯云开发。复杂场景独立的云数据库如 MySQL (RDS)、MongoDB (用于存储非结构化的对话历史)。其他工具项目管理npm或yarn(Node.js)pip(Python)。API测试Postman 或 Insomnia。代码管理Git。环境配置步骤注册开发者账号前往微信公众平台注册小程序账号获取AppID。安装开发工具下载并安装微信开发者工具。创建小程序项目# 使用微信开发者工具GUI创建即可选择JavaScript基础模板。 # 项目目录结构大致如下 project-root/ ├── pages/ # 页面文件 │ ├── index/ # 首页 │ └── goal/ # 目标详情页 ├── utils/ # 工具函数 ├── app.js # 小程序入口 ├── app.json # 全局配置 ├── app.wxss # 全局样式 └── project.config.json # 项目配置搭建后端服务以Node.js Express为例mkdir supervision-agent-server cd supervision-agent-server npm init -y npm install express axios dotenv # 创建必要的文件app.js, .env等获取AI API密钥前往你选择的AI平台如智谱AI开放平台创建应用获取API Key和Secret妥善保存在后端环境的.env文件中。4. 核心流程拆解Agent如何工作让我们把这个智能监督小程序的运行流程拆解成几个关键步骤理解数据是如何流动的。步骤一目标设定与用户画像初始化用户首次进入小程序不是直接添加任务而是与Agent进行一场“入职对话”。Agent会引导用户描述目标如“我想每周读一本书”、期望的监督强度、偏好时间等。这些信息被结构化后存入数据库形成初始用户画像。步骤二日常交互与状态更新用户每天可以与Agent对话报告进度“今天我读了30页”、倾诉困难“今天加班好累没动力”。Agent不仅记录进度更通过LLM分析文本情绪和上下文更新用户的“状态向量”如能量值、坚持天数、近期波动。步骤三智能决策与干预这是核心。Agent的决策层LLM会定期或由事件触发运行一个推理流程输入当前用户画像 历史对话 目标信息 当前时间/上下文。提示词工程设计一个系统提示词System Prompt定义Agent的角色、目标和行为边界。例如“你是一个温和、善于鼓励的成长伙伴。你的目标是帮助用户XXX达成[目标]。请根据他的历史记录和当前状态选择最合适的互动方式。禁止使用命令式语气。可选动作发送鼓励话语、分享相关小知识、建议微调计划、询问是否需要帮助。请以JSON格式输出{“action”: “encourage” “message”: “…”}”调用LLM API将组装好的提示词发送给LLM获取结构化的决策输出。执行动作后端根据LLM返回的action类型执行相应操作如生成一条消息推送给小程序。步骤四反馈学习与策略优化用户的后续互动如对消息的回复、任务完成情况会作为反馈循环到步骤二的“状态更新”中。长期来看可以引入简单的强化学习思路让Agent的策略适应用户的个性。5. 完整示例与代码实现下面我们将用代码片段来展示几个关键环节的实现。我们假设后端使用Node.js ExpressAI服务使用智谱AI的ChatGLM API。5.1 后端服务Express服务器与AI路由文件server/app.jsconst express require(express); const axios require(axios); const dotenv require(dotenv); dotenv.config(); const app express(); app.use(express.json()); const PORT process.env.PORT || 3000; const API_KEY process.env.CHATGLM_API_KEY; const API_SECRET process.env.CHATGLM_API_SECRET; // 假设通过API_KEY和SECRET获取token的函数是 getAccessToken() let accessToken ; // 模拟用户记忆存储生产环境请用数据库 const userMemory {}; // 系统提示词模板 const SYSTEM_PROMPT_TEMPLATE (userName, goal) 你是一个名为“小督”的智能成长伙伴。你的用户是${userName}TA的当前目标是${goal}。 你的核心原则是陪伴而非催促鼓励而非施压。 请根据对话历史和用户当前状态选择最合适的互动方式。请用温暖、简洁、口语化的中文回复。 请严格按以下JSON格式输出不要有任何其他内容 { action: encourage | suggest | question | share, // 鼓励、建议、提问、分享知识 message: 根据action生成的具体文本内容, intensity: 0.5 // 干预强度0-1之间0.1最轻柔1最直接 } ; // 路由处理用户消息返回Agent响应 app.post(/api/agent/chat, async (req, res) { const { userId, userMessage, userGoal } req.body; // 1. 获取或初始化用户记忆 if (!userMemory[userId]) { userMemory[userId] { conversationHistory: [], goal: userGoal, lastActive: new Date(), state: { motivation: 0.7, consistency: 0 } }; } const memory userMemory[userId]; memory.conversationHistory.push({ role: user, content: userMessage }); // 2. 构建LLM请求的对话历史 const messages [ { role: system, content: SYSTEM_PROMPT_TEMPLATE(用户${userId}, memory.goal) }, ...memory.conversationHistory.slice(-6).map(msg ({ // 只保留最近6轮对话作为上下文 role: msg.role, content: msg.content })) ]; // 3. 调用智谱AI API (示例实际参数请参考官方文档) try { const response await axios.post(https://open.bigmodel.cn/api/paas/v4/chat/completions, { model: glm-4, // 使用GLM-4模型 messages: messages, temperature: 0.8, // 创造性稍高回复更自然 max_tokens: 500, }, { headers: { Authorization: Bearer ${accessToken}, Content-Type: application/json } }); const aiResponse response.data.choices[0].message.content; // 4. 解析AI返回的JSON let parsedResponse; try { parsedResponse JSON.parse(aiResponse); } catch (e) { // 如果AI没有返回标准JSON降级处理 parsedResponse { action: encourage, message: aiResponse, intensity: 0.3 }; } // 5. 更新用户记忆 memory.conversationHistory.push({ role: assistant, content: aiResponse }); memory.lastActive new Date(); // 根据action和用户反馈简单更新状态示例逻辑 if (parsedResponse.action encourage) { memory.state.motivation Math.min(1, memory.state.motivation 0.05); } // 6. 返回响应给前端 res.json({ success: true, data: { reply: parsedResponse.message, action: parsedResponse.action, state: memory.state // 可选前端可用于更新UI } }); } catch (error) { console.error(AI API调用失败:, error); res.status(500).json({ success: false, message: Agent暂时开小差了请稍后再试。 }); } }); app.listen(PORT, () { console.log(Agent后端服务运行在 http://localhost:${PORT}); // 初始化获取token // initializeToken(); });5.2 小程序前端与Agent对话页面文件miniprogram/pages/chat/chat.js// pages/chat/chat.js Page({ data: { messages: [], // 对话列表 {role: user/assistant, content: } inputValue: , isLoading: false, userGoal: 每周健身三次 // 应从全局或上一页传入 }, onLoad: function(options) { // 初始化可以加载历史对话 this.sendSystemMessage(你好我是你的伙伴小督。我们的目标是${this.data.userGoal}。随时可以和我聊聊进度或心情哦~); }, // 发送用户消息 onSendMessage: function() { const msg this.data.inputValue.trim(); if (!msg) return; this.addMessage(user, msg); this.setData({ inputValue: , isLoading: true }); // 调用后端API wx.request({ url: https://your-server.com/api/agent/chat, // 替换为你的后端地址 method: POST, data: { userId: wx.getStorageSync(userId) || anonymous_ Date.now(), userMessage: msg, userGoal: this.data.userGoal }, success: (res) { if (res.data.success) { this.addMessage(assistant, res.data.data.reply); // 可以根据res.data.data.action更新UI例如显示不同的气泡样式 } else { this.addMessage(system, 抱歉小督好像没听清请再说一次); } }, fail: () { this.addMessage(system, 网络好像不太稳定请检查连接。); }, complete: () { this.setData({ isLoading: false }); this.scrollToBottom(); } }); }, // 添加消息到列表 addMessage: function(role, content) { const newMsg { role, content, id: Date.now() }; this.setData({ messages: [...this.data.messages, newMsg] }); }, sendSystemMessage: function(content) { this.addMessage(assistant, content); }, scrollToBottom: function() { wx.createSelectorQuery().select(#chat-scroll-view).context(function(res) { res.context.scrollToBottom(); }).exec(); }, onInputChange: function(e) { this.setData({ inputValue: e.detail.value }); } })文件miniprogram/pages/chat/chat.wxml!-- pages/chat/chat.wxml -- view classchat-container scroll-view idchat-scroll-view scroll-y scroll-with-animation scroll-top{{scrollTop}} classmessage-list block wx:for{{messages}} wx:keyid view classmessage-item message-{{item.role}} view classavatar{{item.role user ? 我 : 督}}/view view classbubble{{item.content}}/view /view /block view wx:if{{isLoading}} classmessage-item message-assistant view classavatar督/view view classbubble typing正在思考.../view /view /scroll-view view classinput-area input value{{inputValue}} bindinputonInputChange bindconfirmonSendMessage placeholder和小督聊聊今天的状态... confirm-typesend / button bindtaponSendMessage disabled{{isLoading || !inputValue}}发送/button /view /view5.3 提示词工程定义Agent人格与行为这是项目的灵魂。一个糟糕的提示词会让AI变得啰嗦、偏离主题或过于机械。文件server/prompts/supervisor_agent.js(一个更复杂的版本)// 这是一个更精细的系统提示词模块 function getSupervisorPrompt(userProfile) { const { name, goal, preferredStyle } userProfile; // preferredStyle: gentle | strict | funny const styleMap { gentle: 你的语气要像一位知心朋友充满共情。多用“是不是感觉...”、“我们可以试试...”这样的句式。, strict: 你的语气可以更坚定、直接一些但出发点依然是帮助。可以多用“根据我们的计划...”、“今天的关键是...”这样的句式。, funny: 你的语气可以轻松幽默一些可以用一些可爱的表情包用文字描述和网络用语拉近距离。 }; return # 角色设定 你是“小督”一个专属于${name}的智能成长伙伴。你的唯一使命是帮助TA更好地达成目标${goal}。 # 核心原则 1. **永远支持永不否定**即使TA今天毫无进展你的第一反应也应是理解“今天一定很忙吧”而非责备。 2. **聚焦解决方案而非问题本身**当TA遇到困难时引导TA思考“下一步可以做什么微小改变”而不是沉溺于困难。 3. **主动提供价值**除了回应你可以主动分享与目标相关的碎片知识、成功案例或一个放松技巧。 4. **保持简洁**每次发言尽量控制在3句话以内避免长篇大论。 # 行为模式 根据对话上下文和用户状态从以下模式中选择最合适的一种行动 - **鼓励 (encourage)**当用户报告进展或表达积极情绪时。重点肯定具体行为而非空泛表扬。 - **建议 (suggest)**当用户遇到瓶颈或寻求帮助时。重点提供1个极其简单、可立即执行的“微行动”。 - **提问 (question)**当用户状态模糊或沉默时。重点提出开放式问题引导用户自我觉察例如“你觉得哪一部分最容易让你分心”。 - **分享 (share)**在对话间隙或用户需要激励时。重点分享一个与目标相关的有趣事实、名言或方法。 - **共情 (empathize)**当用户表达疲惫、沮丧等负面情绪时。重点先认可情绪再轻推行动。 # 输出格式 你必须严格按照以下JSON格式回应不要有任何其他前缀或后缀。 { action: encourage | suggest | question | share | empathize, message: 你的回复内容请使用温暖、自然的口语化中文。, intensity: 0.2, // 干预强度0.1-1.0根据情况调整。情绪低落时用低强度0.1-0.3需要推动时用中高强度0.6-0.8。 nextCheckInHours: 24 // 建议下次主动发起对话的间隔小时可动态调整。 } # 对话风格 ${styleMap[preferredStyle] || styleMap.gentle} 现在请开始和${name}对话吧 ; } module.exports { getSupervisorPrompt };6. 运行结果与效果验证将上述前后端代码部署后你可以进行以下验证启动后端服务cd supervision-agent-server node app.js控制台应输出Agent后端服务运行在 http://localhost:3000配置小程序在微信开发者工具中将app.js中网络请求的域名https://your-server.com替换为你的后端服务地址本地调试需在微信公众平台配置合法域名或开启开发环境不校验域名。模拟用户对话场景一报告进展用户输入“今天终于去健身房了练了半小时”预期Agent回复action为encourage “太棒了迈出第一步就是胜利。半小时的专注训练已经为你这周开了个好头记得补充水分哦~” (intensity: 0.7)场景二表达困难用户输入“晚上总想玩手机书一点都看不进去。”预期Agent回复action为suggest “我懂手机吸引力太大了。要不试试‘五分钟起步法’现在就告诉自己只看五分钟书五分钟后允许自己玩。很多时候开始就好了。” (intensity: 0.5)场景三无输入Agent主动关怀 后端可以设置定时任务根据nextCheckInHours对长时间未互动的用户由系统触发一次Agent的主动问候action为question例如“嗨一周过去了关于[目标]最近有什么新感受或小进展吗”验证成功的关键API连通性前端能收到后端返回的JSON数据。LLM响应格式后端能正确解析AI返回的JSON并提取action和message。状态持久化用户的对话历史能被记录并在下次对话时作为上下文传入。UI交互小程序能正确显示对话流区分用户和Agent消息。如果失败首先检查网络请求是否成功查看微信开发者工具Console或Network面板。后端API Key和Token是否正确AI服务额度是否充足。LLM返回的内容是否是合法JSON查看后端日志。7. 常见问题与排查思路在开发此类AI Agent应用时你一定会遇到以下典型问题问题现象可能原因排查方式解决方案小程序请求后端API报错403或域名不在合法列表中未配置服务器域名或未开启开发环境不校验。1. 查看微信开发者工具Console错误信息。2. 检查微信公众平台「开发管理」-「开发设置」-「服务器域名」。1. 将后端API域名加入request合法域名列表。2. 本地开发时在微信开发者工具详情中勾选「不校验合法域名…」。AI返回的内容不是JSON导致解析失败1. 提示词未严格约束输出格式。2. LLM的temperature参数过高导致输出随机。3. 上下文过长或混乱导致LLM“失忆”。1. 在后端打印出AI返回的原始内容。2. 检查系统提示词中关于输出格式的指令是否清晰、强硬。1. 在提示词中用“必须”、“严格”等词强调JSON格式并给出更具体的示例。2. 降低temperature值如从0.8调到0.3。3. 精简对话历史上下文只保留最近最相关的几轮。Agent的回复机械、重复或偏离主题1. 系统提示词不够具体未定义好人设和边界。2. 用户记忆状态未有效利用每次对话像初次见面。3. 缺乏对长期目标的追踪和提醒。1. 分析多轮对话日志看偏离发生在哪里。2. 检查传入LLM的messages数组内容。1. 细化提示词增加具体的行为范例和禁止项。2. 加强用户状态管理将关键信息如目标、累计打卡天数显式地放入系统提示词或用户消息中。3. 引入“目标进度”模块让Agent的发言能关联到宏观进展。响应速度慢用户体验卡顿1. LLM API调用本身有延迟几百毫秒到几秒。2. 后端处理逻辑复杂或数据库查询慢。3. 网络延迟。1. 使用开发者工具监测API响应时间。2. 对后端进行性能分析。1. 前端添加“正在思考”的加载状态管理用户预期。2. 后端考虑异步处理或队列对于非实时反馈的动作如每日总结可以离线生成。3. 使用更轻量的模型或优化提示词以减少生成token数。用户状态如motivation更新逻辑不准确状态更新规则过于简单或武断。模拟多种对话场景检查状态变化是否符合预期。设计更精细的状态机。例如结合action类型、用户消息的情感分析结果、距离上次完成的时间等综合计算状态值。不要仅依赖单一规则。8. 最佳实践与工程建议如果你想将这样一个“监督Agent”投入实际使用或进行更深度的开发以下建议至关重要提示词工程是核心需要持续迭代分角色设计不要将所有指令堆在一个提示词里。可以为Agent设计多个“子人格”如鼓励者、分析师、知识库根据场景调用。A/B测试准备不同风格的提示词在小范围用户中测试收集反馈看哪种风格留存率更高。防御性设计在提示词中明确加入“禁止谈论政治、色情、暴力等敏感话题”、“禁止提供医疗、金融等专业建议”等安全护栏。数据存储与隐私敏感信息脱敏用户的对话记录包含大量个人信息。存储时考虑加密或至少进行匿名化处理。数据最小化只存储实现功能所必需的数据。考虑定期清理过旧的对话历史。明确告知在小程序的隐私政策中清晰说明如何收集、使用用户的对话数据。性能与成本优化上下文长度管理LLM API按Token收费上下文越长越贵。需要设计智能的“记忆摘要”机制将长篇对话历史总结成几个关键点再输入给LLM而不是无脑拼接全部历史。缓存策略对于常见、通用的问候或建议可以构建一个本地缓存库命中时直接返回无需调用昂贵的LLM API。异步与队列非实时性的任务如生成每周报告放入消息队列异步处理避免阻塞主交互流程。评估与改进定义成功指标对于监督类应用核心指标不是“日活”而是“目标达成率”、“用户主动互动频率”、“平均会话轮次”等。建立反馈循环在对话中可以偶尔让Agent询问“我这样的提醒方式对你有帮助吗”收集直接反馈。人工审核样本定期抽样检查Agent的对话记录发现不良模式如总是建议休息、变得啰嗦等及时调整提示词。扩展性设计技能Skills插件化将“提醒”、“知识分享”、“进度可视化”等功能模块化。Agent的核心决策层只需决定“调用哪个技能”由技能模块执行具体操作。这使系统更容易扩展和维护。多模态支持未来可以考虑接入文生图、语音合成等API让Agent的互动形式更丰富例如生成一张鼓励卡片或说一段语音。9. 总结与后续学习方向通过拆解这个“不想催你”的监督小程序项目我们可以看到一个优秀的AI应用不仅仅是接入了大模型API更是产品理念、用户体验与工程化能力的结合。它的价值在于将冷冰冰的技术转化为有温度的、个性化的陪伴。本文的核心价值在于厘清了构建此类应用的完整路径理念层面从“监督”转向“陪伴”这是产品成功的起点。技术层面以LLM为大脑构建记忆、推理、行动三层架构这是实现理念的骨架。实现层面通过精心设计的提示词、前后端分离的工程架构、以及人性化的交互设计将骨架填充为有血有肉的产品。你的下一步可以是什么深化提示词尝试为你的Agent赋予更独特的人格比如“像历史老师一样引经据典的监督者”或“像健身教练一样充满活力的伙伴”。研究更高级的提示技巧如思维链Chain-of-Thought、少样本学习Few-Shot。探索开源框架使用像LangChain、LlamaIndex、Semantic Kernel这样的AI应用框架它们提供了更便捷的记忆管理、工具调用和链式编排能力能让你更专注于业务逻辑。集成实际工具让Agent的能力不止于对话。例如连接日历API帮你安排计划连接笔记API帮你保存灵感甚至连接智能家居API在你学习时调节灯光。这才是Agent走向“智能体”的关键。关注本地化模型随着Qwen、DeepSeek、Yi等优秀开源模型的涌现考虑在成本、隐私和延迟敏感的场景下将部分能力部署到本地或私有云。技术的终点是服务于人。这个项目给我们最大的启发或许是在追求效率的时代给予用户选择“不被催促”的权利本身就是一种更高级的关怀。作为开发者我们手中的代码也可以充满这种关怀。建议收藏本文当你准备开始自己的AI Agent项目时这里的架构思路、代码示例和避坑指南或许能为你省下不少摸索的时间。