共计 1817 个字符,预计需要花费 5 分钟才能阅读完成。
背景与痛点
最近在开发一个需要智能对话功能的微信小程序时,发现直接集成 ChatGPT 知识库会遇到几个典型问题:

- API 调用复杂度高,特别是处理长对话上下文时
- 网络延迟导致用户体验不佳
- 敏感数据如何安全传输和存储
- 微信小程序的环境限制(如域名白名单、请求大小限制等)
这些痛点让很多开发者在尝试 AI 功能时望而却步。经过多次实践,我总结出一套相对成熟的解决方案。
技术选型
目前主流的接入方案有三种:
- 直接调用 OpenAI API
- 优点:响应快,功能全
-
缺点:需要处理翻墙问题,有地域限制
-
通过云函数中转
- 优点:规避地域限制,可以添加业务逻辑
-
缺点:增加了一层网络延迟
-
自建代理服务
- 优点:完全可控,可以做深度定制
- 缺点:维护成本高
综合考虑后,我选择了 云函数中转 方案,既保证了可用性,又不需要太高维护成本。
核心实现
前端部分(小程序端)
// pages/chat/chat.js
Page({
data: {messages: [],
inputValue: ''
},
sendMessage: function() {
const that = this;
wx.request({
url: 'https://your-domain.com/api/chat',
method: 'POST',
data: {
question: this.data.inputValue,
history: this.data.messages
},
success(res) {
that.setData({
messages: [...that.data.messages,
{role: 'user', content: that.data.inputValue},
{role: 'assistant', content: res.data.answer}
],
inputValue: ''
});
}
});
}
});
后端部分(Node.js 示例)
// server/api/chat.js
const axios = require('axios');
exports.main = async (event, context) => {
try {
const response = await axios.post(
'https://api.openai.com/v1/chat/completions',
{
model: "gpt-3.5-turbo",
messages: prepareMessages(event.history, event.question)
},
{
headers: {'Authorization': `Bearer ${process.env.OPENAI_KEY}`,
'Content-Type': 'application/json'
}
}
);
return {answer: response.data.choices[0].message.content
};
} catch (error) {console.error(error);
return {error: 'AI 服务暂时不可用'};
}
};
function prepareMessages(history, newQuestion) {
// 处理历史消息,避免超过 token 限制
const messages = [...history];
messages.push({role: 'user', content: newQuestion});
return messages.slice(-6); // 保留最近 6 条消息
}
性能优化
- 消息缓存:在本地存储对话历史,减少重复请求
- 流式响应:使用 SSE 技术实现逐字返回效果
- 预加载:提前初始化 AI 模型
- 精简上下文:控制发送给 API 的历史消息数量
安全性考量
- 所有请求必须走 HTTPS
- 敏感配置放在环境变量中
- 用户输入内容需要做 XSS 过滤
- 设置合理的 API 调用频率限制
避坑指南
- 域名备案问题
- 微信小程序要求所有请求域名必须备案
-
解决方案:使用已备案的云服务商域名
-
内容安全审核
- ChatGPT 可能返回不合规内容
-
解决方案:后端添加内容过滤层
-
长文本处理
- 小程序有 1MB 的请求限制
-
解决方案:大文本分块处理
-
冷启动延迟
- 云函数冷启动可能需要 2 - 3 秒
- 解决方案:定时预热函数
进一步优化方向
- 结合微信的客服消息接口,实现 7 ×24 小时自动回复
- 增加多轮对话状态管理
- 集成知识图谱,提供更精准的回答
- 添加用户反馈机制,持续优化回答质量
经过这次实践,我发现最大的挑战不在于技术实现,而在于如何平衡功能、性能和用户体验。希望这些经验能帮助你少走弯路。如果有更好的解决方案,欢迎一起探讨交流。
正文完
