OpenAI功能:如何在JavaScript中使用GPT API功能

介绍OpenAI的API中的功能代表了它们聊天模型能力的显着发展。截至目前,此功能可在gpt-3.5-turbo-0613 API和gpt-4-0613中使用。

随着功能的增加,GPT现在具有更复杂地与服务器端操作进行交互的能力,打开了一整个新的可能应用的范围。从从数据库获取数据,与其他API进行交互,或执行由开发人员定义的自定义逻辑,添加功能有效地将AI的能力扩展到“仅仅是一个聊天机器人”之外。

以前,这是通过 Toolformer 模型或使用带有 LangChain 等库的代理来实现的。

ChatGPT中文站

OpenAI 中的功能是什么?

在OpenAI的背景下,“函数”指的是AI在对话过程中可以利用的自定义操作或例程。它们允许开发人员将其业务逻辑直接集成到聊天模型中,在某些应用程序领域中可能至关重要。

例如,考虑一个情况:人工智能被委托提供一个组织中员工的信息。没有功能,开发者需要预加载人工智能所有相关数据,这可能会对数据量和机密性构成重大挑战。

函数提供了一种更加灵活的选择,让AI可以“询问”它所需的数据。当聊天模型需要某些信息(比如一个员工的联系方式)时,它可以发出一个函数调用。然后服务器执行该函数(比如在数据库中查找),并将结果返回给AI模型,然后根据返回的数据继续对话。

这个特性显著增强了AI模型的潜在用例,使它能更深入地与它嵌入的系统进行交互,同时提高了数据安全性和效率。这就像给AI除了“说话”的能力外,还赋予了“行动”的能力。

让我们深入一个例子!

前提条件

在我们开始之前,请确保您拥有以下物品:

  • JavaScript基础知识
  • 在您的电脑上安装Node.js和npm。
  • 一个OpenAI API密钥

如果您是OpenAI API的新用户,请查看我的入门教程,使用Remix。

设置

在开始之前,您需要确保通过运行 npm install openai 安装了 OpenAI 库。

如何使用函数(一步一步)

初始化API:

OpenAI API 是使用 OpenAI 包中的 OpenAIApi 类进行初始化的。 (需要 API 密钥才能进行此初始化)

const conf = new Configuration({
apiKey: [your-super-secret-key-here]
});
const openai = new OpenAIApi(conf);

创建您的函数:

当GPT认为必要时(请参见下一步),将请求此功能。

现在,让我们超级简化一下——编写一个返回包含工作人员姓名和电子邮件的对象的函数,并提供无用户的备用选项。

const getStaffInfo = (staffPosition) => {
switch (staffPosition) {
case 'author':
return {
name: 'Rebecca',
email: 'rebecca@company.com'
};
case 'owner':
return {
name: 'Josh',
email: 'josh@company.com'
};
default:
return {
name: 'No name found',
email: 'Not found'
};
}
}

创建一个聊天结束标识:

createChatCompletion方法用于创建聊天提示。该方法需要几个参数,包括要使用的AI模型、初始系统消息、一系列消息记录和用于对话的新功能数组。这里我们将引用getStaffInfo函数。

查看文档以获取更多信息,但基本上函数数组中的每个函数都需要描述,并且我们还需要指定GPT需要传递哪些参数以便使用该函数。在我们的getStaffInfo函数中,我们需要GPT传入staffPosition作为必填字段,以便我们返回员工信息。然后我们将function_call设置为auto。这使GPT能够确定何时使用函数。

const systemPrompt = `You are a helpful directory assistant. 
Users will ask questions about staff and you will reply in a friendly tone
with the name and email of the person. If you receive a "no name found"
response, politelty let the user know there is no one by that title who
works here. Do not make up people. The email should be a link
(e.g. [person@email.com](person@email.com)`;

const chat = await openai.createChatCompletion({
model: 'gpt-3.5-turbo-0613',
temperature: 0.2, // setting this lower to reduce hallucinations
messages: [
{
role: 'system',
content: systemPrompt,
},
...chatHistory, // An array of messages sent previously in the same session
{
role: 'user',
content: message, // the user's latest message
},
],
functions: [
{
name: "getStaffInfo",
description: "Get the contact info of a staff member",
parameters: {
type: "object",
properties: {
staffPosition: {
type: "string",
description: 'The position of the desired staff member. E.g. "author" or "owner"',
},
},
required: ["staffPosition"],
},
},
],
function_call: 'auto',
});

// setting as let since we will overwrite later
let answer = chat.data.choices[0].message?.content;

检查GPT是否要使用函数:

作为API返回的一部分,stop_reason包含在内。在将消息发送回用户之前,您可以检查stop_reason是否等于function_call。

const wantsToUseFunction = 
chat.data.choices[0].finish_reason === 'function_call';

现在,如果我们的人工智能感觉需要使用一个函数(即,如果 wantsToUseFunction 是“真”的),我们可以检查它正在调用哪个函数。我们可以通过检查在其消息中返回的对象函数调用 function_call 来实现这一点。它将包含名称作为字符串以及它想要传递给函数的参数作为 JSON。

我们可以调用我们的函数,然后将返回的数据和用户原始消息传回GPT。通过将函数指定为新消息的角色,GPT将理解这是它需要用来回答用户问题的上下文。

注意:如果我们有多于一个函数,那么在聊天使用了连续两个函数时,我们必须在这里使用递归函数。

if (wantsToUseFunction) {
const functionToUse = chat.data.choices[0].message?.function_call;
let dataToReturn = {};

if (functionToUse.name === 'getStaffInfo') {
const args = JSON.parse(functionToUse.arguments) as any;
dataToReturn = getStaffInfo(args.staffPosition);
}

// new completion API call
const chatWithFunction = await openai.createChatCompletion({
model: 'gpt-3.5-turbo-0613',
messages: [
{
role: 'system',
content: context,
},
...chatHistory,
{
role: 'user',
content: message,
},
{
role: "function",
name: functionToUse.name,
content: JSON.stringify(dataToReturn), // needs to be JSON encoded
},
],
} as any);

// overwrite the answer we will return to the user
answer = chatWithFunction.data.choices[0].message?.content;
}

成功!我们现在已经赋予了聊天窗口查找工作人员的能力!

ChatGPT中文站

把所有东西放在一起。

以下为我们员工信息功能示例的最终代码。虽然这可能不是完全适合生产的代码,但您可以看到如何使用OpenAI函数的关键概念!

export async function action({request}) {
const body = await request.formData();

// the user's message
const message = body.get('message') as string;

// the chat history (saved as a hidden input field)
const chatHistory = JSON.parse(body.get('chat-history') as string) || [];

const systemPrompt = `You are a helpful directory assistant.
Users will ask questions about staff and you will reply in a friendly tone
with the name and email of the person. If you receive a "no name found"
response, politelty let the user know there is no one by that title who
works here. Do not make up people. The email should be a link
(e.g. [person@email.com](person@email.com)`;

// initial API call
const chat = await openai.createChatCompletion({
model: 'gpt-3.5-turbo-0613',
temperature: 0.2,
messages: [
{
role: 'system',
content: systemPrompt,
},
...chatHistory,
{
role: 'user',
content: message,
},
],
functions: [
{
name: "getStaffInfo",
description: "Get the contact info of a staff member",
parameters: {
type: "object",
properties: {
staffPosition: {
type: "string",
description: 'The position of the desired staff member. E.g. "author" or "owner"',
},
},
required: ["staffPosition"],
},
},
],
function_call: 'auto',
});

let answer = chat.data.choices[0].message?.content;
const wantsToUseFunction =
chat.data.choices[0].finish_reason === 'function_call';

if (wantsToUseFunction) {
const functionToUse = chat.data.choices[0].message?.function_call;
let dataToReturn = {};

if (functionToUse.name === 'getStaffInfo') {
const args = JSON.parse(functionToUse.arguments) as any;
dataToReturn = getStaffInfo(args.staffPosition);
}

// new completion API call
const chatWithFunction = await openai.createChatCompletion({
model: 'gpt-3.5-turbo-0613',
messages: [
{
role: 'system',
content: context,
},
...chatHistory,
{
role: 'user',
content: message,
},
{
role: "function",
name: functionToUse.name,
content: JSON.stringify(dataToReturn),
},
],
} as any);

// overwrite the answer we will return to the user
answer = chatWithFunction.data.choices[0].message?.content;
}

return answer;
}

结束了!

现在,我们已经通过JavaScript使用GPT API探索了OpenAI函数。我们从对OpenAI函数的目的和实用性的基本解释开始,进入了创建函数并将其集成到聊天模型中的实践方面。

总结一下,这些是我们走过的步骤:

  • 解释了OpenAI功能的重要性。
  • 设置OpenAI和JavaScript的先决条件。
  • 初始化OpenAI API。
  • 创建一个函数,并将其集成到聊天模型中。
  • 检查AI是否想使用功能。
  • 处理来自函数的响应,并根据情况继续聊天。

所有剩下的只需要您扩展和实验OpenAI功能的能力了!

OpenAI的功能潜力可以拓展到你的创造力所能及之处——从个人助手应用到智能AI驱动的导师,到数据库管理系统等等。可能性无限。

由Josh Sanger制作 ❤️

2023-10-20 16:57:07 AI中文站翻译自原文