您的代码包含两个问题:

  1. 该代码不处理 GPT 想要调用您指定的函数的情况。在这种情况下,响应不包含“content”属性,因此您会收到运行时错误。
  2. LookupTime 函数的函数签名对我来说没有意义,并且与 JavaScript 实现的定义不匹配。实际函数不带参数,但您提供的 GPT 签名描述了一个参数。

我已经更正了您的代码并对其进行了一些更改,以便它可以完成有用的工作。然而,实现仍然不完整,并且缺乏任何严重的错误处理等。

新的lookupTime函数需要一个城市作为参数并返回该城市的时间。请注意,它只接受与美洲地区的时区数据库名称匹配的少数城市(例如凤凰城)。

异步函数lookupTime(城市){尝试{const响应=等待获取(`http://worldtimeapi.org/api/timezone/America/${city}`); const data =等待response.json(); const currentTime = new Date(data.datetime); const timeString = currentTime.toLocaleTimeString();控制台.log(时间字符串);返回时间字符串; } catch (error) { console.error("获取时间错误:", error); } }

然后更改可供 GPT 使用的函数签名以反映新参数:

异步函数 sendRequest() { const apiUrl = 'https://api.openai.com/v1/chat/completions'; const apiKey = '您的 API 密钥'; const userInput = document.getElementById('userInput').value; let Payload = { model: 'gpt-3.5-turbo-0613', messages: [{ role: 'system', content: '你是一个有用的助手。' }, { role: 'user', content: userInput }], Functions: [{ name: "lookupTime", description: "获取当前时间",parameters: { type: "object",properties: { city: { type :“string”,描述:“要检索当前时间的城市。” } },必需:["city"] } }],max_tokens:100,温度:0.7 };

最后,我们需要更改与 GPT 通信的处理方式。首先,我们需要发送初始请求。然后我们需要响应GPT的响应。如果它想要调用一个函数,我们必须解释该响应,调用该函数,然后使用 (a) 先前的消息和 (b) 包含函数调用响应的新消息再次调用 GPT。只有这样 GPT 才会知道结果并返回预期的响应。

与Gpt聊天
    异步函数 chatWithGpt() { console.log(payload); const response = wait fetch(apiUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${apiKey}` }, body: JSON.stringify(payload ) }); const data =等待response.json();控制台.log(数据);常量选择 = data.choices[0]; if (choice.finish_reason === 'function_call' && choice.message.function_call.name === 'lookupTime') { const 参数 = JSON.parse(choice.message.function_call.arguments); const timeString =等待lookupTime(arguments.city); Payload.messages.push({ 角色: "function", 名称: "lookupTime", 内容: JSON.stringify({ time: timeString }) });返回 chatWithGpt(); } else { const outputElement = document.getElementById('output'); outputElement.textContent = data.choices[0].message.content; } } 尝试 { chatWithGpt(); } catch (错误) { console.error(错误); } }

为了更好的重现性,我将温度更改为 0。然后您将收到给定问题的以下答案:

问:在凤凰城现在几点了?

答: 凤凰城的当前时间是 02:11:08。

调用该函数来获取上下文信息甚至是明智的:

问:我现在在凤凰城需要带手电筒吗?

答:根据凤凰城的当前时间(凌晨 02:13),现在是夜间。如果您打算外出,建议携带手电筒,以便在黑暗中获得更好的视野。

如需进一步说明,我建议阅读 OpenAI 关于新函数 API 的博客文章以及 API 文档。