如何掌握在NestJS中调用OpenAI功能:使用AI集成自动化您的后端
学习如何将OpenAI函数调用集成到NestJS中,自动化后端任务,如下订单和检索数据。这份实践指南将帮助你使用人工智能来优化你的工作流程。
通过本文的学习,你将能够构建能够处理实际任务(如下订单、检索数据和查看订单状态)的人工智能工作流程,实现自动化。让我们开始吧!
为何这个指南与众不同😎:
与其他在不相关类比(如苹果、芒果和香蕉)中岔开话题的教程不同,本指南直截了当。我们专注于重要的事情:通过真实、实用的例子将OpenAI功能调用集成到您的后端。没有干扰——只有可行的步骤,让您的系统高效运行起来。
目录
- OpenAI功能调用概述
- 为什么对于任何技术堆栈而言,函数调用是重要的?
- 设置OpenAI API访问
- 一步一步与NestJS集成
- 处理用户请求
- 定义函数
- 构建订单服务
- 与OpenAI互动
5. 适应其他技术堆栈6. 常见问题和错误处理7. 实际应用案例8. 结论:构建更智能的AI工作流程
1. OpenAI 功能调用概述
OpenAI的功能调用功能使其能够直接与API、数据库和外部功能进行交互。这使得人工智能能够根据用户提示触发特定操作,自动化工作流程,使您的应用程序更加智能和互动。
在本指南中,我们将带您了解如何将OpenAI功能调用集成到NestJS后端中,但相同的逻辑也适用于其他技术堆栈,比如Node.js和Python。最终,您将拥有构建强大的AI集成工作流程所需的工具,这些工具可以自动处理诸如下订单或检查订单状态等事项。
2. 为何函数调用对任何技术堆栈都很重要
无论您使用哪种技术,无论是Node.js、Python还是NestJS,都可以轻松集成OpenAI的函数调用。您将用户输入传递给模型,接收结构化数据,并触发诸如实际行动等内容。
- 在一个电子商务系统中下订单
- 从数据库中检索数据
- 在日历中安排活动
一旦你理解了核心步骤,你就可以将这种方法应用到任何用例或技术堆栈中。
3. 设置 OpenAI API 访问
首先, 在将OpenAI集成到您的应用程序之前, 您需要设置API访问。
步骤1:注册并从OpenAI的API仪表板获取您的API密钥。
步骤2:将您的密钥添加到环境变量中以保障安全。
export OPENAI_API_KEY=your-api-key-here
这对与OpenAI的API进行交互至关重要。现在,你已经准备好将OpenAI的函数调用集成到你的系统中。
4. 逐步集成NestJS
让我们来看一下在NestJS中调用OpenAI功能集成的过程。相同的逻辑也适用于其他后端框架。
处理用户请求
在这个例子中,我们将构建一个AIRequestHandlerService来处理用户请求,触发OpenAI调用,并执行后端操作(如下订单)。
这是你的AIRequestHandlerService可能如何看起来:
//aIRequestHandlerService.ts
import { Injectable } from '@nestjs/common';
import { OpenAIFunctionService } from './openAI.functions.service';
import { OpenAIService } from './openAI.service';
import { AIOrderService } from './ai-services/order.service';
@Injectable()
export class AIRequestHandlerService {
constructor(
private readonly functionsService: AIFunctionsService,
private readonly aiService: AIService,
private readonly orderService: OrderService,
) {}
async handleUserRequest(prompt: string) {
const functions = await this.functionsService.getFunctions();
const response = await this.aiService.sendRequest(prompt, functions);
const returnedFunction = response.choices[0]?.message?.function_call;
if (returnedFunction) {
const { name, arguments: args } = returnedFunction;
const argsObject = JSON.parse(args);
if (name === 'create_order') {
return this.orderService.createOrder(argsObject);
} else if (name === 'get_order_status') {
return this.orderService.getOrderStatus(orderId);
}
} else {
return response.choices[0].message.content || 'No function was called.';
}
}
}
定义函数
接下来,我们定义 OpenAI 在我们后端将要识别的函数。以下是一个使用 create_order 和 get_order_status 的示例:
//ai-functions.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class AIFunctionsService {
getFunctions() {
return [
{
name: 'create_order',
description: 'Place a new order with product details and shipping information.',
parameters: {
type: 'object',
properties: {
productId: { type: 'string', description: 'The ID of the product to order.' },
quantity: { type: 'integer', description: 'The quantity to order.' },
shippingAddress: { type: 'string', description: 'The shipping address.' },
},
required: ['productId', 'quantity', 'shippingAddress'],
},
},
{
name: 'get_order_status',
description: 'Check the status of an existing order.',
parameters: {
type: 'object',
properties: {
orderId: { type: 'string', description: 'The ID of the order to check.' },
},
required: ['orderId'],
},
},
];
}
}
构建订单服务
订单服务(OrderService)负责实际创建订单和检查订单状态。以下是它处理订单的示例:
//order.service.ts
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Order } from '@crm/models';
import { Model } from 'mongoose';
@Injectable()
export class OrderService {
constructor(
@InjectModel(Order.name) private readonly orderModel: Model<Order>,
) {}
async createOrder({ productId, quantity, shippingAddress }) {
const newOrder = await this.orderModel.create({
productId,
quantity,
shippingAddress,
});
return `Order created successfully for ${quantity} units of ${productId}, shipping to ${shippingAddress}.`;
}
async getOrderStatus(orderId: string) {
const order = await this.orderModel.findById(orderId);
return `The status of order #${orderId} is: ${order.status}.`;
}
}
与OpenAI互动
OpenAIService 负责向 OpenAI 发送用户提示和功能定义,处理响应,并将其传递回 AIRequestHandlerService。
//openai.service.ts
import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { firstValueFrom } from 'rxjs';
@Injectable()
export class OpenAIService {
private readonly openAiUrl = 'https://api.openai.com/v1/chat/completions';
constructor(private readonly httpService: HttpService) {}
async sendRequest(prompt: string, functions: any[]) {
const requestBody = {
model: 'gpt-4-0613',
messages: [{ role: 'user', content: prompt }],
functions: functions,
};
try {
const response = await firstValueFrom(
this.httpService.post(this.openAiUrl, requestBody, {
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.OPENAI_API_KEY}`,
},
}),
);
return response.data;
} catch (error) {
console.error('Error calling OpenAI:', error.message);
}
}
}
这项服务将提示和可用功能发送到OpenAI,接收响应,并将其传递回AIRequestHandlerService。 您可以在诸如Node.js和Python之类的技术堆栈中重用此服务,逻辑保持不变。
不要忘记在模块中注册您的服务!
在您的服务可以正常工作之前,您需要在您的NestJS模块中注册它们。这一步确保NestJS可以在需要的地方注入服务。以下是如何操作的:
在您的app.module.ts或任何相关的模块文件中,导入并将您的服务添加到模块的providers数组中。
import { Module } from '@nestjs/common';
import { AIRequestHandlerService } from './ai-request-handler.service';
import { AIFunctionsService } from './ai-functions.service';
import { OrderService } from './order.service';
import { OpenAIService } from './openai.service';
@Module({
imports: [], // Add any other modules you may need
providers: [AIRequestHandlerService, AIFunctionsService, OrderService, OpenAIService],
})
export class AppModule {}
通过这样做,您可以确保NestJS可以在需要的地方注入这些服务,使您的应用程序完全可用。
5. 适应其他技术栈
无论您是使用Node.js、Python还是其他任何技术栈,逻辑保持一致:
关键步骤仍然保持不变:
- 将提示和功能发送给OpenAI。
- 解析响应并检查是否有函数调用。
- 触发相应的后端操作。
对于 Node.js,您可以使用 Axios 进行 HTTP 请求。对于 Python,您可以使用 Requests。 在各种技术栈中,发送输入、接收结构化数据和触发真实世界动作的核心逻辑保持不变。
6. 常见问题和错误处理
重要的是处理常见的错误,例如无效的提示或 API 调用频率限制。以下是如何实现基本错误处理的方法:
try {
const response = await openAiService.sendRequest(prompt, functions);
} catch (error) {
console.error('Error:', error.message);
}
这样可以确保您的系统能够优雅地处理OpenAI的API的任何问题。
7. 实际应用案例
OpenAI 功能调用可以自动化常见的后端任务。以下是两个示例:
- 创建订单定义一个create_order函数,根据用户输入下达新订单。参数可能包括:
- 产品编号:要订购的产品。
- 数量:数量。
- 送货地址:订单的收货地址。
示例用户提示:“我想订购2个产品编号为1234的单位,运送到456 Elm St.”
检查订单状态 实现一个get_order_status函数,使用它可以获取订单的当前状态。
- 订单编号:订单的ID。
示例用户提示:“您能帮我查一下我的订单#98765的状态吗?”
8. 结论:建立更智能的人工智能工作流程
OpenAI的函数调用使得构建智能的、人工智能驱动的后台自动化工作流比以往任何时候都更容易。无论您是使用NestJS、Node.js还是Python,本指南中的步骤都可以进行调整以满足您的需求,并使您的系统更智能、更高效。
您的挑战:现在轮到您了-在您的应用程序中实现一个自定义函数调用,并查看它在后端的工作方式。别忘了在下面的评论中分享您的经验和挑战。我在这里可以帮助您!
学分
在这篇博客文章中,我们汇编了来自各种信息源的资料,包括研究论文、技术博客、官方文件等。每个信息源都已经得到了适当的来源认可,并且提供了来源链接。
以下是一个综合的参考列表:
- 请访问以下网站链接:https://platform.openai.com/docs/guides/function-calling
- https://docs.nestjs.com/
展现你的支持
如果这个指南对您有帮助,请通过给它一个掌声👏来表示一下爱意!您的掌声激励我继续为开发者社区创造有价值的内容。欢迎与其他后端开发人员或自动化爱好者分享这个指南,他们可以从基于AI的自动化中受益。
和我联系!
阿玛尔·古普塔