使用 Node.js 和 OpenAI API 实现“多模态”数据处理

191 阅读6分钟

面向对象 OpenAI 接口编程

随着人工智能技术的不断发展,多模态模型逐渐成为研究和应用的热点。OpenAI 提供的多模态模型不仅可以处理纯文本数据,还能理解和生成图像、视频和音频等内容。本文将详细介绍如何使用 Node.js 和 OpenAI API 实现多模态数据的处理,并分享一些最佳实践和注意事项。

多模态模型简介

单模态 vs 多模态

  • 单模态:传统的自然语言处理模型主要处理文本数据,例如 ChatGPT。
  • 多模态:现代模型可以处理多种类型的数据,包括文本、图像、视频和音频。例如,OpenAI 的多模态模型可以生成对图像的描述。

环境准备

创建项目

首先,创建一个新的 Node.js 项目并初始化:

mkdir openai-multimodal
cd openai-multimodal
npm init -y

安装依赖

安装 OpenAI SDK 和其他必要的依赖:

npm install openai
npm install dotenv

为了加快国内的安装速度,可以设置 npm 的镜像源:

npm config set registry https://registry.npmmirror.com

使用 pnpm

pnpm 是一个高性能的包管理器,具有以下优点:

  • 节省磁盘空间:通过创建符号链接来共享依赖,避免重复下载和存储相同的依赖包。
  • 快速安装:由于共享依赖,安装速度通常比 npm 和 yarn 更快。
  • 严格的依赖管理:确保每个项目使用的依赖版本完全一致,避免版本冲突。

安装 pnpm:

npm install -g pnpm

使用 pnpm 安装依赖:

pnpm install openai
pnpm install dotenv

使用 pnpm 进行依赖管理,既可以避免重复安装,又不会污染全局环境。通过创建符号链接来共享依赖,节省磁盘空间并提高安装速度。

调试能力

在开发过程中,调试能力非常重要。可以通过 console.log 输出中间结果来帮助调试:

console.log('Response:', response);

查看 response 的 JSON 结构,确保数据符合预期。

安全性和最佳实践

环境变量管理

不要将敏感信息硬编码在代码中,而是通过环境变量来管理。使用 .env 文件可以方便地管理这些变量。这样可以防止APIKey等重要信息泄露。

错误处理

在实际应用中,错误处理是非常重要的。使用 try...catch 结构来捕获并处理可能的错误:

try {
  // 异步操作
} catch (error) {
  console.error('Error:', error.message);
}

代码实现

1. 导入环境变量管理库 dotenv

import dotenv from 'dotenv'
dotenv.config()
  • import dotenv from 'dotenv':导入 dotenv 库,该库用于从 .env 文件中读取环境变量。
  • dotenv.config():调用 dotenv.config() 方法,加载 .env 文件中的环境变量到 process.env 对象中。

2. 导入 OpenAI 客户端库

import OpenAI from "openai";
  • import OpenAI from "openai":导入 OpenAI 客户端库,用于与 OpenAI API 进行交互。

3. 初始化 OpenAI 客户端

const client = new OpenAI({
  apiKey: 'Your apiKey', 
  // apiKey: process.env.OpenAI_API_KEY  这个值是从环境变量中获取的
  baseURL: 'https://api.302.ai/v1' // 转发 
})
  • const client = new OpenAI({...}):创建一个新的 OpenAI 客户端实例。

    • apiKey: 'You APIKey':API 密钥,用于身份验证。注释部分说明了也可以从环境变量中获取 API 密钥。
    • baseURL: 'https://api.302.ai/v1':API 的基础 URL,这里指定了一个转发地址。

4. 定义主函数 main

const main = async () => {
  // openai 的调用是异步的 
  // client 是对象 调用方法
  // 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": "example_img_URL"
              }
            }
          ]
        }
      ],
      max_tokens: 300
    })
    console.log(response.choices[0].message.content)
    // choices[0] 数组的第一个元素 取一条数据
    // message 消息
    // content 内容
  } catch (err) {
    console.log(err)
  }
}
  • const main = async () => { ... }:定义一个异步函数 main,作为程序的入口点。

    • try { ... } catch (err) { ... }:使用 try...catch 结构来捕获并处理异步操作中可能出现的错误。

    • const response = await client.chat.completions.create({...}):调用 OpenAI 客户端的 chat.completions.create 方法,发送一个聊天请求。

      • model: 'gpt-4o':指定使用的模型名称。

      • messages: [...]:定义消息数组,包含用户的消息。

      • role: 'user':指定消息的角色为用户。

      • content: [...]:消息内容是一个数组,包含文本和图片 URL。

      • { type: 'text', 'text': '请描述以下图片的内容' }:文本消息。

      • { type: 'image_url', "image_url": { "url": "..."} }:图片 URL 消息。

      • max_tokens: 300:指定生成的回复的最大长度。

    • console.log(response.choices[0].message.content):从响应中提取第一个选择的消息内容并打印出来。

5. 调用主函数

main()
  • main():调用主函数 main,开始执行程序。

什么是异步函数?

在 JavaScript 中,异步函数是一种特殊的函数,它总是返回一个 Promise。异步函数允许我们在函数体内使用 await 关键字,从而简化异步操作的编写和阅读。

语法异步函数的基本语法如下:

async function functionName() {
  // 函数体
}

或者使用箭头函数的语法:

const functionName = async () => {
  // 函数体
};

我们来看一个简单的例子:

const main = async () => {
  console.log('Start');
  await new Promise((resolve) => setTimeout(resolve, 2000)); // 模拟异步操作,等待2秒
  console.log('End');
};

main(); // 调用异步函数

详细解释

async 关键字

async 关键字用于声明一个函数为异步函数。 异步函数总是返回一个 Promise。如果函数的返回值不是 Promise,它会被隐式地包装成一个 Promise。

async function foo() {
  return 'Hello, World!';
}

foo().then(result => {
  console.log(result); // 输出: Hello, World!
});

await 关键字

await 关键字只能在异步函数内部使用。 await 用于等待一个 Promise 解析(完成)。如果 Promise 成功解析,await 表达式的值将是 Promise 的解析值;如果 Promise 被拒绝,await 表达式会抛出一个异常。

async function foo() {
  const result = await new Promise((resolve) => {
    setTimeout(() => resolve('Resolved!'), 2000);
  });
  console.log(result); // 输出: Resolved!
}

foo();

总结

这段代码的主要流程如下:

  1. 从环境变量文件中加载 API 密钥。
  2. 初始化 OpenAI 客户端。
  3. 定义一个异步主函数 main,在该函数中调用 OpenAI 的聊天完成接口,发送包含文本和图片 URL 的消息。
  4. 处理 API 响应,提取并打印生成的回复内容。
  5. 调用主函数 main 开始执行程序。

通过本文,我们详细介绍了如何使用 Node.js 和 OpenAI API 实现多模态数据的处理。我们讨论了多模态模型的特点、环境准备、代码实现、调试能力和最佳实践。希望本文能帮助你在项目中快速集成这一功能。如果你有任何问题或建议,欢迎留言交流!