小程序接入大模型,这几条路各有什么坑

1 阅读7分钟

想给小程序加个 AI 对话功能,第一反应一般是:直接在前端调大模型 API 不就行了?

然后你去翻微信小程序的网络文档,发现好几个地方让人停下来想一想。

这篇文章就是把我自己踩过的几个坑整理出来,帮你在选方案之前,先把坑数清楚。


直接在前端调 API,行不行?

技术上不是不行,但有两个问题绕不过去。

第一个是 API Key 泄露。

小程序最终打包成 .wxapkg 文件,这个格式可以被反编译。硬编码在前端 JS 里的任何字符串,包括 API Key,都是明文可读的。真有人想薅你的 Token 配额,成本很低。

第二个是域名白名单。

小程序的 wx.request 只能访问在后台配置过、且完成了 ICP 备案的 HTTPS 域名。api.openai.com 这类境外域名,不在 ICP 备案范围内,实际上是没法通过审核的。

所以直连方案,在国产大模型上理论上能跑(域名备案了),但 Key 泄露风险还在。涉及境外模型,连域名这关都过不了。


四条路,都有什么限制

把常见方案列出来,每条路的核心限制直接说。

方案API Key 安全流式输出主要代价
前端直连❌ Key 暴露在前端需要 enableChunked安全风险,境外域名不可用
自建后端代理✅ Key 在服务端最灵活要自己搭服务器、维护、续费域名
云函数代理✅ Key 在函数里不支持流式冷启动延迟 + 无法做打字机效果
wx.cloud.extend.AI✅ Key 由平台托管✅ 原生 streamText()需要基础库 ≥ 3.7.1

重点说一下云函数代理这个坑。

很多人选云函数的出发点是:省得自己维护服务器,成本低。这个判断是对的,但有个限制没注意——云函数是标准的 Request/Response 模型,调用一次,等大模型跑完,返回完整结果,然后连接断开。

这就意味着,你没法用云函数做"打字机效果"(逐字流式输出)。用户提交问题之后,要等大模型跑完所有 token,才能看到回答,等待时间可能是十几秒甚至更长。

另外,云函数的默认超时是 3 秒。大模型响应根本不够。要用的话,得去控制台手动把超时改到至少 30 秒,甚至更长(上限是 900 秒)。不然用户发一条消息,大概率看到超时报错。

还有冷启动。函数长时间没调用,第一次请求会有额外的启动延迟,叠上大模型本身的响应时间,体验会比较难看。


流式输出怎么做

如果你选自建后端或者前端直连,流式输出需要自己实现。

浏览器里常用的 EventSourcefetch-event-source 库,在小程序里不可用。小程序的 wx.request 也没有 responseType: 'stream' 这个选项。

目前社区里公认最稳的方式是用 enableChunked

const requestTask = wx.request({
  url: 'https://your-server.com/chat',
  method: 'POST',
  data: { message: userInput },
  responseType: 'arraybuffer',   // 必须是 arraybuffer
  enableChunked: true,           // 开启分块接收
  success(res) { /* 完整响应,一般不用 */ },
  fail(err) { console.error(err) }
})

const decoder = new TextDecoder('utf-8')
let buffer = ''

requestTask.onChunkReceived((res) => {
  buffer += decoder.decode(res.data, { stream: true })
  // 解析 SSE 格式的 data: 字段,拼接到界面
  processSSEBuffer(buffer)
})

几个坑要提前知道:

Nginx 要设 proxy_buffering off 如果你的后端用 Nginx 做反代,默认配置会把大模型的分块响应缓存起来,等凑够了再一起发。加上这行配置,数据才会实时透传。

HTTP/2 兼容问题。 wx.request 的 chunked 传输和 HTTP/2 之间有兼容性问题,实测可能导致收不到分块数据。需要在请求参数里加 enableHttp2: false

渲染不要每块都 setState。 大模型吐 token 很快,如果每收到一块数据就更新组件状态,渲染频率会太高,在低端机上会有明显卡顿。建议维护一个字符缓冲区,用 setInterval 每 120ms 左右统一刷新一次界面。

真机测。 模拟器和真机在流式行为上有差异,HTTP/2 的问题在真机上尤其容易复现。功能跑通之后,上真机验一遍。


wx.cloud.extend.AI 是什么

如果你用的是微信云开发(CloudBase),有一个更省事的方案:wx.cloud.extend.AI

这个 API 基础库 3.7.1 之后可用,但要注意版本和模型支持的对应关系:3.7.1 只能调用免费的 hunyuan-exp 体验模型;要用 DeepSeek、混元、GLM、Kimi、MiniMax 这些售卖模型,基础库得升到 3.15.1 及以上。

调用方式是先 createModel("cloudbase") 拿到 provider,再通过 provider 调用 streamText

const ai = wx.cloud.extend.AI
const provider = ai.createModel('cloudbase')

const res = await provider.streamText({
  data: {
    model: 'deepseek-v4-flash',  // 或 deepseek-v4-pro、hy3-preview(混元)等
    messages: [
      { role: 'user', content: userInput }
    ]
  }
})

let result = ''
for await (const chunk of res.textStream) {
  result += chunk
  this.setData({ answer: result })  // 逐步更新界面
}

它帮你处理了几个麻烦的事:

  • API Key 不需要暴露在前端,由云开发平台托管
  • 不需要配域名白名单(走云开发内部通道)
  • 流式输出是原生支持的,不用自己处理 ArrayBuffer 和 SSE 解析
  • 支持自定义模型:只要是兼容 OpenAI 协议的接口(硅基流动、阿里百炼、百度千帆等),都可以配进来

不足的地方也要说:体验模型(hunyuan-exp)是免费的,但单个环境并发上限是 5。正式上线的应用在用量大的时候可能需要升级套餐,Token 费用怎么算,跟直连大模型平台有没有差价,目前官方没有公开的横向对比数据,建议实际用量起来之后自己算一遍。

官方文档在这里:微信云开发 AI 模型调用


上线之前,合规这关

这是很多独立开发者没想到会卡住自己的地方。

微信对"AI 问答类"功能有明确的类目要求:需要申请深度合成-AI 问答服务类目,而且只有企业主体才能申请。个人主体是不行的。

申请这个类目,需要提供算法备案证明。

自主备案的成本很高(3–13 万元),小团队基本不会走这条路。有两个成本低一些的选项:

一是注册个体工商户,大概 300–800 元/年,可以用企业主体资质申请类目。

二是借用云服务商的算法备案资质,百度智能云和阿里云的算法备案证书据说可以免费申请,再凭这个材料去申请微信类目。(这个信息来源是第三方服务商,不是官方文档,有变化的可能,实际操作前建议去微信开放社区确认最新要求。)

如果用的是 CloudBase 方案,还有个便利:算法备案证明可以在云开发控制台的 AI 板块直接生成,不用自己去走备案流程。

另外,审核时还有几个容易被驳回的点:

  • 界面上没有标注"由 AI 生成"之类的提示
  • 用户协议里没有 AI 相关的免责条款
  • 没有接入输入内容安全过滤(微信云开发的 msgSecCheck 可以做这件事)

这几个不是大改动,但漏了某一个就容易被打回来,提前做好省得白等审核时间。


选哪个

根据场景来。

想快速出原型、接国内模型、省运维的,wx.cloud.extend.AI 是最直接的起点,免费体验模型先跑通逻辑,后面再评估是否需要升级。

需要接境外模型、精细控制成本、或者已经有现成后端的,自建后端代理更灵活。流式输出、并发控制、模型切换都可以在自己的服务层里做。

云函数代理适合非流式的场景:比如后台批量摘要、定时任务调大模型处理数据,不需要给用户实时展示输出的情况。

前端直连的方案,除非是内部工具或者测试环境,上生产还是别用。

参考资料: