API方式开发AI应用的三点总结

1. 编程式prompt

让 AI 具备类似程序的运行逻辑。把大模型当CLR使用。与传统的角色扮演提示prompt相比,此方式所需的tokens数量更少,且输出结果的准确性更高 。示例如下:

2. 语音对话(STT/TTS)

因为如今碎片化的时代,没多少人愿意看完一大篇文字内容,所以需要将AI生成的内容转换为语音输出,不仅符合用户对AI的认知还能增强用户对应用的依赖与喜爱。要实现语音对话就需要用到 TTS(文本转语音)和 STT(语音转文本),目前已经有很多开源大模型可以实现,还有很多python库可以离线实现

3. sse/ws发送消息先发后到问题

使用 Server-Sent Events(SSE)或者 WebSocket(ws)来转发 AI 的流式输出时,由于用户端网络环境的不确定性,这就导致原本应该先到达的消息,可能因为网络问题而滞后,后发送的消息反而先被接收,最终造成内容错乱。最简单的解决方法是在后端采用队列发送机制,同时,为每个消息添加唯一的序号。在前端接收消息时,不再依据消息到达的先后顺序处理,而是按照消息的序号进行排序处理。代码如下

复制代码
// 后端代码
 const req = https.request(options, async (res) => {
        if (res.statusCode !== 200) console.log(res.statusCode);
        let seq_num = 0;
        res.on('data', async (d) => {
          const data = d.toString().replace(/data: /g, '').replace(/\n/g, '').replace('[DONE]', '');
          const str = extractAndConcatenateContent(data);
          if (str.length > 0) {
            seq_num += 1;
            messageQueue.push({
              'd': str,
              'seq': seq_num
            });
            await processQueue(ws, event.connectionId);
          }
        });
// 前端代码
socketTask.onMessage((msg) => {
                    const {
                        d,
                        seq
                    } = JSON.parse(msg.data);
                        if (seq == _this.seqNum) {
                            _this.processMsg(d);
                            _this.seqNum++;
                            // 检查后续缓存数据
                            while (_this.oldMsg.has(_this.seqNum)) {
                                _this.processMsg(_this.oldMsg.get(_this.seqNum));
                                _this.oldMsg.delete(_this.seqNum);
                                _this.seqNum++;
                            }
                        } else {
                            _this.oldMsg.set(seq, d); // 缓存乱序到达的数据
                        }

View Code