前言
在人工智能日益渗透我们生活的今天,OpenAI 作为行业的领头羊,其提供的强大 API 接口为开发者们带来了无限的想象空间。我们今天来使用多模态交互(包括文本、图片、视频、音频)方面的应用,以及如何通过 npm 初始化后端项目并集成 OpenAI SDK。同时,我们还将探讨如何优化依赖管理、确保代码调试效率,并处理敏感信息的安全问题。干货满满哟!
多模态交互:从单模态到多模态的跨越
首先我们来一起了解一下单模态和多模块
。
-
单模态交互:ChatGPT 文本
ChatGPT 作为 OpenAI 的明星产品,以其强大的文本生成和理解能力赢得了广泛的关注。通过调用 ChatGPT API,我们可以实现各种文本交互场景,如问答、对话生成、文本创作等。
-
多模态交互:图片、视频、音频
随着技术的发展,多模态交互逐渐成为人工智能领域的新趋势。OpenAI 的 GPT-4 等多模态模型已经具备了处理图片、视频和音频的能力。这意味着我们可以通过文本指令与这些模型进行交互,让它们理解并处理非文本信息。例如,通过输入一张图片的地址和相应的文本指令,GPT-4 可以生成与图片相关的文本描述或进行图像识别。
后端项目初始化与 OpenAI SDK 集成
Node.js 的出现极大地扩展了 JavaScript 的应用场景,使其不再局限于浏览器端,而是可以用于构建高性能的网络应用程序和服务。让我们前端不再是切图崽了!😭
-
使用 npm 初始化后端项目
首先,我们需要使用 npm(Node Package Management)包管理工具,去初始化一个后端项目。通过执行
npm init -y
命令,我们可以快速生成一个包含默认配置的项目文件package.json
。 -
安装 OpenAI SDK
接下来,我们需要安装 OpenAI 的官方 SDK,以便在项目中调用 OpenAI 的 API。由于 npm 的官方源在国外,可能会导致下载速度较慢。因此,我们可以将 npm 的源设置为阿里云的镜像源,以提高下载速度。执行以下命令来设置 npm 源:
npm config set registry https://registry.npmmirror.com
然后,使用以下命令安装 OpenAI SDK:
npm install openai
-
优化依赖管理
在安装依赖时,我们可能会遇到以下问题:重复安装、全局污染、占用空间大等。这就是npm 安装依赖的局限
npm 安装依赖的局限
使用 npm 安装依赖时,可能会遇到以下问题:
-
重复安装:每个项目都会在其
node_modules
文件夹中安装一份完整的依赖副本,即使这些依赖在多个项目中是共享的。这导致了磁盘空间的浪费和安装时间的增加。 -
全局污染:全局安装的依赖可能会与项目中的依赖发生冲突,或者因为版本不兼容而导致问题。此外,全局安装的依赖也可能因为权限问题而无法在某些环境中正常工作。
-
占用空间大:由于每个项目都有自己的
node_modules
文件夹,且每个文件夹中都包含了完整的依赖树,因此随着项目数量的增加,磁盘空间占用也会迅速增长。为了解决这些问题,我们可以使用 pnpm(Performant npm)作为包管理工具。pnpm 通过符号链接和硬链接的方式,实现了依赖的共享和去重,从而提高了安装速度和节省了磁盘空间。
安装 pnpm 后,我们可以使用它来安装 OpenAI SDK 和其他依赖:
pnpm install openai
搭建好了之后我们如何去使用它呢?
入口文件
我们需要一个主入口文件,所以我们在项目根目录下创建main.mjs
,mjs
后缀代表它是一个使用ES6 模块语法编写的。
下面代码奉上,我写上了详细的注释给大家,方便大家理解
import OpenAI from "openai";
import dotenv from 'dotenv'
dotenv.config()
// 从环境变量中读取 API Key
const apiKey = process.env.OPENAI_API_KEY;
if (!apiKey) {
throw new Error("OPENAI_API_KEY environment variable is not set");
}
// 实例化 OpenAI 客户端
const client = new OpenAI({
apiKey,
baseURL: 'https://api.302.ai/v1' // 如果需要转发,请确保这个地址是安全的
});
// 良好的编程风格
// 主函数 执行的入口, 单点
// 函数申明
// function main() {
// console.log('ai 全栈开始了 ')
// }
// es6 箭头函数 传统函数更简洁
// 赋值语句
// 函数也是对象
// 函数表达式
// async 是函数修饰符,+ await 一对
const main = async () => {
// openai 的调用是异步的
// await 等会儿
// chat 聊天的方式调用
// completions 完成问答
// create 创建
try {
const response = await client.chat.completions.create({
model: 'gpt-4o',
// 对话列表
messages: [
{
role: 'user', //角色
content: [
{
type: 'text',
'text': '请描述以下图片的内容'
},
{
type: 'image_url',
"image_url": {
"url": "任意图片地址"
}
}
]
}
],
max_tokens: 300
})
console.log(response.choices[0].message.content)
}
catch (err) {
console.log(err)
}
}
main()
一起来抓细节
这里面有两个细节,一个是try catch, 另一个是 dotenv,我们来给大家介绍一下
try catch
try catch
是 JavaScript 中的错误处理机制。try
块包含可能会抛出异常的代码,而 catch
块则处理这些异常。如果 try
块中的代码抛出异常(使用 throw
语句),程序将立即停止执行 try
块中的剩余代码,并跳转到 catch
块。
- try:包含可能会出错的代码。
- catch:当
try
块中的代码抛出异常时,catch
块将捕获该异常,并允许你处理它。
在上面的代码中,try catch
用于处理 client.chat.completions.create
方法调用时可能发生的任何错误。例如,如果 API 请求失败(可能是因为网络问题、API 密钥无效或请求参数不正确),catch
块将捕获异常并打印错误信息。
dotenv
dotenv
是一个零依赖的模块,它加载 .env
文件中的环境变量到 process.env
。.env
文件通常包含敏感信息,如 API 密钥、数据库密码等,这些信息不应该硬编码到源代码中。
使用 dotenv
的步骤:
- 在项目根目录创建一个
.env
文件。 - 在
.env
文件中添加环境变量,格式为KEY=value
。 - 在你的 JavaScript 文件中,使用
require('dotenv').config()
来加载这些环境变量。
在上面的代码中,dotenv.config()
被调用以加载 .env
文件中的环境变量。然后,代码从 process.env
中读取 OPENAI_API_KEY
环境变量,并将其用于实例化 OpenAI 客户端。
不用它的话,你的openai
,可能就被别人用爬虫爬走了,然后全部使用完啦,openai
是需要付费使用的!!
END
通过本文的介绍,你已经学会了如何使用 Node.js 和 OpenAI SDK 构建一个多模态应用。从项目的初始化到环境变量的管理,再到实际调用 OpenAI API 的过程,每一步都经过了详细的解释和演示。相信大家一定都有所收获,可以自己再去深入了解,让我们一起拥抱大模型!!