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