بنقرة واحدة
xx-backend
最小后端技能。当产品需要调用 AI API(或第三方 API)但不想搞复杂后端时使用。只讲最小三件套:API 代理(隐藏 key)、key 管理、简单缓存降本。不碰微服务、不碰数据库设计。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
最小后端技能。当产品需要调用 AI API(或第三方 API)但不想搞复杂后端时使用。只讲最小三件套:API 代理(隐藏 key)、key 管理、简单缓存降本。不碰微服务、不碰数据库设计。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
小象AI产品Builder技能包主入口。双模式:任务前路由(你的想法该用哪个 skill)+ 任务后导航(刚做完一个 skill,下一步该干什么)。帮助用户用好 AI Agent 把想法做成上线的产品,覆盖想清楚/做出来/跑起来三阶段。触发方式:/xxskill、"帮我做产品"、"我不知道从哪开始"、"下一步怎么走"。
判断产品里要不要内置 AI 能力。当用户的产品想法已经过需求澄清,在决定要不要给产品加 AI 功能时使用。通过 4 个问题的决策链,15 分钟内给出"加 AI 功能 / 用规则功能 / 混合 / 不加"的结论,附判断标准与 AI 执行约束。
性能优化技能。当产品在低端机卡顿、接口等待白屏、历史列表滚动掉帧、或需要优化帧循环计算、运动交互时使用。覆盖典型性能场景(含 AI 调用的流式渲染、长等待、长列表、冷启动、节流防抖)和零体验降级原则,按P0/P1/P2分级优化,输出可直接应用的参考实现。
数据中心与AI评估方法论技能。当产品的 AI 能力需要提升输出质量、用户只靠改prompt碰运气、或缺乏系统化的评估方法时使用。基于Andrew Ng的Data-Centric AI思想,建立评估集、做离线/在线评估、绑定prompt与数据版本,用数据迭代而非盲目调prompt。输出数据迭代日志。AI 按本规范维护评估集与日志,用户按判断标准判断质量好坏。
安全与合规技能。当产品收集用户数据、涉及 AI 输出内容、准备提交微信小程序审核时使用。覆盖通用合规(隐私、备案、类目资质)和 AI 专属合规(内容审核、AI 输出安全),输出上线前合规检查清单。
微信小程序数据埋点与 WeAnalysis 后台配置全流程:事件命名规范、五阶段埋点事件表、转化漏斗分析、数据驱动决策8步框架、wx.reportEvent 代码示例、批量创建JSON模板、元事件配置陷阱、AI 质量监控。主要给 AI 执行埋点规范,给人判断埋点是否覆盖核心旅程。
| name | xx-backend |
| description | 最小后端技能。当产品需要调用 AI API(或第三方 API)但不想搞复杂后端时使用。只讲最小三件套:API 代理(隐藏 key)、key 管理、简单缓存降本。不碰微服务、不碰数据库设计。 |
前端直接调 API = 把 key 写在公网上。先用一个云函数挡住。
帮你用微信云开发搭一个够用的最小后端,覆盖三件套:API 代理 + key 管理 + 简单缓存。再加一个限流防滥用。以 AI API 代理为核心场景,但 key 管理、缓存、限流的模式对调任何第三方 API 都适用。
读者说明: 本 skill 主要给 AI 执行后端代码(云函数、key 轮询、缓存逻辑),次要给人判断标准(拿到结果能确认 key 没泄露、缓存生效了)。用户不需要自己写云函数,只需要会按判断标准确认"key 安全吗、缓存起作用了吗"。
明确边界: 本 skill 不教数据库设计、不教微服务、不教 Docker、不教消息队列。只够让产品跑起来且 key 不泄露。需要更复杂后端时见第 7 节"什么时候该升级"。
| 问题 | 后果 |
|---|---|
| key 写在前端代码 | 反编译可拿走,等于公开,被人盗刷你买单 |
| 跨域 | AI 服务商一般不允许小程序域名直接调 |
| 无法鉴权计费 | 任何人都能用你的 key 调用,你没法定额 |
| 无法限流 | 一个用户狂调把你的额度烧光 |
| 无法缓存 | 相同输入重复调,浪费钱 |
铁律:key 写死在小程序前端 = 公开。 任何前端代码都可以被反编译。
正确架构:
小程序前端 → 云函数(API 代理)→ AI API
↑
key 在这里
| 组件 | 解决什么 | 复杂度 |
|---|---|---|
| API 代理 | 隐藏 key + 统一错误处理 | 低 |
| key 管理 | 多 key 轮询降本 + 不写死 | 低 |
| 简单缓存 | 相同输入复用结果,降本提速 | 低 |
| 限流(附加) | 防 openid 滥用 | 低 |
四个加起来一个云函数就能装下。
AI 参考实现(cloudfunctions/aiProxy/index.js):
const cloud = require('wx-server-sdk');
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV });
const AI_API_URL = 'https://ai.example.com/v1/chat';
const TIMEOUT_MS = 15000;
exports.main = async (event, context) => {
const openid = cloud.getWXContext().OPENID;
if (!event.userInput) {
return { code: 400, msg: '缺少输入' };
}
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
try {
const res = await fetch(AI_API_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.AI_API_KEY}`
},
body: JSON.stringify({
model: 'hunyuan-pro',
messages: [
{ role: 'system', content: event.systemPrompt || '你是助手' },
{ role: 'user', content: event.userInput }
]
}),
signal: controller.signal
});
clearTimeout(timer);
if (!res.ok) {
console.error('AI API 错误', res.status, await res.text());
return { code: 500, msg: 'AI 服务暂时不可用' };
}
const data = await res.json();
return { code: 0, data: data.choices[0].message.content };
} catch (e) {
clearTimeout(timer);
if (e.name === 'AbortError') {
return { code: 504, msg: 'AI 响应超时' };
}
console.error('云函数异常', e);
return { code: 500, msg: '服务异常' };
}
};
AI 执行约束:
process.env.AI_API_KEY 读,不写死前端调用:
wx.cloud.callFunction({
name: 'aiProxy',
data: { userInput: '故宫红', systemPrompt: '你是中式颜色命名助手...' },
success: res => console.log(res.result)
});
云函数后台 → 函数配置 → 环境变量,加 AI_API_KEY。代码里只读 process.env.AI_API_KEY。
判断标准: 代码里搜不到 key 明文 = 合格。
单个 key 有 QPS 限制 / 额度限制。多 key 轮询能突破单 key 上限 + 分散成本。
AI 参考实现:
const KEY_POOL = [
process.env.AI_KEY_1,
process.env.AI_KEY_2,
process.env.AI_KEY_3
].filter(Boolean);
let keyIndex = 0;
function getNextKey() {
if (KEY_POOL.length === 0) {
throw new Error('无可用 key');
}
const key = KEY_POOL[keyIndex % KEY_POOL.length];
keyIndex++;
return key;
}
exports.main = async (event) => {
const key = getNextKey();
return callAIWithKey(key, event);
};
AI 执行约束: 单 key 失败要自动切下一个 key 重试,重试次数 ≤ key 总数。
相同输入复用结果,降本 + 提速。AI 命名这类任务特别适合缓存(同一种颜色命名结果稳定)。
缓存 key 设计: 对 systemPrompt + userInput 做哈希,作为缓存 key。
AI 参考实现(云函数 + 简单 KV,用云开发数据库当缓存):
const cloud = require('wx-server-sdk');
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV });
const db = cloud.database();
const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
function hashKey(text) {
let h = 0;
for (let i = 0; i < text.length; i++) {
h = ((h << 5) - h + text.charCodeAt(i)) | 0;
}
return 'cache_' + Math.abs(h).toString(36);
}
async function getCache(cacheKey) {
const res = await db.collection('ai_cache').where({
_id: cacheKey,
expireAt: db.command.gt(new Date())
}).get();
return res.data.length > 0 ? res.data[0].result : null;
}
async function setCache(cacheKey, result) {
await db.collection('ai_cache').doc(cacheKey).set({
data: {
result,
expireAt: new Date(Date.now() + CACHE_TTL_MS)
}
});
}
exports.main = async (event) => {
const cacheKey = hashKey((event.systemPrompt || '') + '|' + event.userInput);
const cached = await getCache(cacheKey);
if (cached) {
return { code: 0, data: cached, fromCache: true };
}
const aiResult = await callAI(event);
try {
await setCache(cacheKey, aiResult);
} catch (e) {
console.error('缓存写入失败', e);
}
return { code: 0, data: aiResult, fromCache: false };
};
AI 执行约束:
按 openid 简单限流,防一个人把额度烧光。
AI 参考实现(基于云开发数据库计数):
const cloud = require('wx-server-sdk');
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV });
const db = cloud.database();
const RATE_LIMIT = 20;
const RATE_WINDOW_MS = 60 * 60 * 1000;
async function checkRateLimit(openid) {
const now = Date.now();
const since = new Date(now - RATE_WINDOW_MS);
const res = await db.collection('rate_limit').where({
openid,
createdAt: db.command.gt(since)
}).count();
if (res.total >= RATE_LIMIT) {
return { pass: false, msg: '调用过于频繁,请稍后再试' };
}
await db.collection('rate_limit').add({
data: { openid, createdAt: new Date(now) }
});
return { pass: true };
}
exports.main = async (event, context) => {
const openid = cloud.getWXContext().OPENID;
const limit = await checkRateLimit(openid);
if (!limit.pass) {
return { code: 429, msg: limit.msg };
}
return callAI(event);
};
判断标准: 限流维度按业务选——普通用户按 openid / 小时,付费用户放宽或按套餐。
本 skill 的方案能撑到一定规模。出现以下任一信号,该找后端工程师或换方案:
| 信号 | 阈值 | 升级方向 |
|---|---|---|
| QPS 过高 | > 50 | 独立后端服务(Node/Go) |
| 需要持久化业务数据 | 用户 / 订单 / 内容 | 引入正式数据库设计 |
| 需要异步任务 | 生成长视频 / 批量处理 | 消息队列 + Worker |
| 需要多端共享 | 小程序 + App + Web | 独立 API 服务 |
| 云函数冷启动严重 | 首次调用 > 3s | 常驻后端服务 |
AI 执行约束: 没到阈值不要提前优化,先把三件套跑稳。
小程序(取色 → 显示颜色)
↓ wx.cloud.callFunction
云函数 aiNameColor
├─ 限流:openid 每小时 20 次
├─ 缓存:hashKey(systemPrompt + 颜色hex) → 命名结果,TTL 24h
├─ key 轮询:3 个混元 key 轮换
└─ 调混元 API → 返回中式色名
典型调用:用户取到 #8B0000 → 云函数查缓存(首次没有)→ 调混元 → 返回"故宫红"→ 写缓存。下一个用户取到同样的色,直接命中缓存,0 成本。
把你的 AI 调用场景告诉我,我帮你生成云函数代码、配置 key、加缓存和限流。
对话示例: