共计 2545 个字符,预计需要花费 7 分钟才能阅读完成。
背景痛点:小程序集成 AI 的天然障碍
微信小程序因其轻量级特性,在集成 ChatGPT 这类第三方服务时面临几个典型问题:

- 网络隔离限制:小程序要求所有请求域名必须备案,而 OpenAI 的 API 域名无法直接调用
- 冷启动延迟:云函数首次调用需要初始化,可能导致 2 - 3 秒额外延迟
- 上下文丢失:小程序关闭后进程终止,传统会话管理方案失效
- 内容安全风险 :用户生成内容(UGC) 需符合平台审核要求
技术选型:三种方案对比
方案 1:云函数直连
- 优点:开发简单,直接调用微信云函数转发请求
- 缺点:API 密钥暴露风险,无法做请求预处理
方案 2:自建代理服务器
- 优点:完全控制请求流程,可添加缓存层
- 缺点:需要维护服务器,增加成本
方案 3:云开发 + 云函数
- 优点:无需管理基础设施,自动扩容
- 缺点:冷启动问题明显
最终选择:云开发方案(综合成本与维护性考虑)
核心实现:从 API 对接到会话管理
云函数对接 OpenAI API
// cloudfunctions/chatgpt/index.js
const axios = require('axios');
const db = cloud.database();
// 重试机制配置
const retryConfig = {
maxAttempts: 3,
delay: 1000
};
exports.main = async (event, context) => {
// 参数校验
if (!event.content) {return { code: 400, msg: '缺少 content 参数'};
}
// 构建请求体
const payload = {
model: "gpt-3.5-turbo",
messages: await getHistory(event.openid),
temperature: 0.7
};
// 带重试的请求
return requestWithRetry(payload, event.openid);
};
async function requestWithRetry(payload, openid) {for (let i = 0; i < retryConfig.maxAttempts; i++) {
try {
const res = await axios.post(
'https://api.openai.com/v1/chat/completions',
payload,
{
headers: {'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json'
},
timeout: 10000 // 10 秒超时
}
);
// 保存对话历史
await saveHistory(openid, payload.messages, res.data.choices[0].message);
return {
code: 200,
data: res.data
};
} catch (err) {if (i === retryConfig.maxAttempts - 1) {console.error('最终请求失败:', err);
return {code: 500, msg: '服务繁忙'};
}
await new Promise(r => setTimeout(r, retryConfig.delay));
}
}
}
会话上下文管理
// 获取历史对话
async function getHistory(openid) {const res = await db.collection('chat_history')
.where({openid})
.orderBy('createTime', 'desc')
.limit(5)
.get();
return res.data.map(item => ({
role: item.role,
content: item.content
}));
}
// 保存新对话
async function saveHistory(openid, messages, newMessage) {const batch = db.startBatch();
// 用户消息
batch.add({
collection: 'chat_history',
data: {
openid,
role: 'user',
content: messages.slice(-1)[0].content,
createTime: db.serverDate()}
});
// AI 回复
batch.add({
collection: 'chat_history',
data: {
openid,
role: 'assistant',
content: newMessage.content,
createTime: db.serverDate()}
});
await batch.commit();}
性能优化关键策略
流式响应处理
通过分块传输减少 TTFB(首字节时间):
- 修改云函数返回类型为
application/x-ndjson - 小程序端使用
wx.request的onChunkReceived事件 - 每收到数据块立即渲染,无需等待完整响应
敏感词过滤双保险
- 前端过滤 :使用
wx.cloud.callFunction前先过基础词库 - 云函数过滤:调用内容安全 API 二次校验
// 敏感词检查示例
async function checkSensitive(content) {
const res = await cloud.openapi.security.msgSecCheck({content});
return res.errCode === 0;
}
避坑指南:血泪经验总结
频率限制应对
- 每个 openid 每分钟不超过 5 次请求
- 错误码 429 时自动退避重试
- 高峰期启用请求队列
合规性注意事项
- 用户协议中明确说明 AI 生成内容标识
- 不存储 API 密钥在小程序端
- 对话历史加密存储
延伸思考
- 如何实现对话历史的智能压缩?(保留关键上下文)
- 怎样设计付费对话的额度控制体系?
- 语音交互场景下如何优化提示词工程?
结语
经过 3 次迭代,我们的智能客服小程序平均响应时间从 4.2 秒优化到 1.8 秒。最关键的经验是:
- 会话状态一定要持久化到云端
- 流式响应比完整返回体验提升明显
- 内容安全审核要前置处理
建议初次接入时先实现基础版本,再逐步添加高级功能。完整示例代码已放在 GitHub(伪地址:github.com/example/chatgpt-miniprogram-demo)
正文完
