我正在尝试制作一个 Whatsapp 机器人,通过其 API 为 OpenAI 的 GPT3.5 提供 Twilio 的 Whatsapp 消息服务。我正在使用以下无服务器功能:
const fetch = require('node-fetch');
exports.handler = async(context, event, callback) => {
const history = [{"role": "system",
"content": "Eres un asistente educativo para estudiantes de una escuela primaria"}, {'role': 'user', 'content': event.message}];
try{
const response = await fetch('https://api.openai.com/v1/chat/completions', {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${context.OPENAI_KEY}`
},
body: JSON.stringify({
"model": "gpt-3.5-turbo",
"max_tokens": 750,
"n": 1,
"temperature": 0,
"messages": history
})
});
const data = await response.json();
return callback(null, data.choices[0].message.content);
}catch(error){
console.log(error);
return callback(error);
}
}
但是,执行通常需要超过 10 秒,并且会被 Twilio 自动停止。我需要专门使用一个函数,因为我需要将 API 密钥作为标头发送,而流 HTTP 请求小部件不允许自定义标头。
我已经精简并去掉了多余的功能,但是功能还是需要很长时间,是我做错了什么还是有办法进一步优化功能?
恐怕无服务器环境无法解决您所描述的问题。无服务器函数通常有最大执行时间。例如,Twilio 无服务器函数的最大执行时间为10 秒。同样,许多其他也有最大执行时间。对于等待 OpenAI 响应等长时间运行的进程来说,这本质上是不够的。
PS:即使您找到了一个无服务器运行时,其最大执行时间正好适合您的需求,但使用无服务器可能是不可行的,因为您是按执行时间付费的。
我建议在传统(非无服务器环境)上运行此过程。也许有一天,您将能够向 OpenAI 提供回调 URL,该 URL 指向另一个 Twilio 无服务器函数。这样,您可以继续在 Twilio 无服务器上拥有所有 Twilio 逻辑,并且仅在其他地方托管其他代码。但同样,截至今天,这是不可能的。