小程序功能
识别用户上传的图片中的动物,给出识别结果,以及小百科
项目目的
解答自己经常发出的 这是什么猫?这是什么狗?的疑问
成本清单
| 成本项 | 费用 | 说明 |
|---|---|---|
| 小程序认证 | 个人 30/年 | 淘宝有一些商家似乎可以把价格做更低 |
| 大模型 | 按量收费 | 刚性支出,目前模型的费用其实挺便宜的,比如通义千问 |
| 服务器 | 0成本 | vercel,大模型服务转发,方便无发版调整prompt,保护调用key |
| 长期图床 | 0成本 | vercel,项目功能需要的配图等长期存储 |
| 短期图床 | 0成本 | PicGo,用户上传的识别图片,临时存储 |
| 域名 | 看域名后缀 | 为了在国内能访问到vercel服务 |
当前预估总成本,大概100/年
简易流程
graph LR
小程序 -- 01.上传要识别图像 --> 短期图床
小程序 -- 02.提交识别请求 --> 接口服务
接口服务 -- 03.转发识别请求 --> 大模型
流程细节
vercel服务在国内可访问配置
模型Stream返回
模型的返回在不开启Stream的等待时长是无法忍受的
接口服务
async function getQwenResult(res) {
const completion = await openai.chat.completions.create({
model: "qwen-vl-max",
messages: [prompt提示词],
stream: true,
});
res.setHeader("Content-Type", "text/plain; charset=utf-8");
res.setHeader("Transfer-Encoding", "chunked");
res.setHeader("Cache-Control", "no-cache");
for await (const chunk of completion) {
res.write(chunk.choices[0].delta.content);
}
res.end();
}
小程序
import { TextDecoder } from "text-encoding";
function getResult() {
const req = wx.request({
url: 请求地址,
dataType: "其他",
enableChunked: true,
});
req.onChunkReceived((res) => {
const decoder = new TextDecoder();
setResult((prev) => {
return `${prev}${decoder.decode(res.data)}`;
});
});
}
vercel oss存储
在vercel上部署的服务虽然在国内不能直接访问,但是oss存储没问题 github.com/vercel/stor…
接口安全
模型成本是按量收费,如果不想自己的token被人免费刷,可以加一个简单的接口请求校验
md5(${req.query.filename}${salt})
后续
功能迭代
成本转移
埋点分析
小程序运营