多模态模型的威力:使用OpenAI实现看图写话

151 阅读4分钟

引言

相信绝大部分人都记得几年前柯洁输给AlphaGO,被传道心破碎,围棋已死等言论,可你知道吗AlphaGO终究只是一个单模态模型,它只会下围棋,你让它下个象棋都做不到,更别说同时处理图片、视频、音频等这些高操作了,而今天我们要聊的就是多模态模型了,多模型需要同时处理和理解多种类型的数据,如文本、图像、音频和视频等。本文将详细介绍如何使用openai来达到看图写话的能力。

配置环境

在写代码之前,我们首先需要用npm init -y来初始化一个项目,然后用npm i openai来安装OpenAI的官方SDK,以便调用其API。如果安装的慢的话可以使用npm config set registry https://registry.npmmirror.com 这条命令,这个是阿里在国内的镜像网站,能够有效提速,最后我们还需要用npm i -g pnpm来安装一个包管理器,安装完成后,确保pnpm已经添加到系统的环境变量中,以便于命令行直接调用。如果遇到无法调用的情况,可能需要手动将pnpm的安装路径添加至PATH环境变量。

代码

import dotenv from 'dotenv';
import OpenAI from "openai";
dotenv.config();
console.log(process.env.OPENAI_API_KEY, '////');
// 实例化OpenAI 客户端
const client = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
  baseURL: 'https://api.302.ai/v1' // 转发
})

const main = async () => {

  try {
    const response = await client.chat.completions.create({
      model: 'gpt-4o',
      // 对话列表
      messages: [
        {
          role: 'user', // 角色
          content: [
            {
              type: 'text',
              'text': '请描述一下图片的内容'
            },
            {
              type: 'image_url',
              'image_url': {
                'url': 'https://img.huxiucdn.com/img/minitopic/202406/25/084826659075.jpg?imageView2/1/w/512/h/512/|imageMogr2/strip/interlace/1/quality/85'
              }
            }
          ]
        }
      ],
      max_tokens: 300,
    })
    console.log(response.choices[0].message.content);
  } catch (err) {
    console.log(err);
  }
}

main()

创建一个env 文件用以存放key,因为key 不能提交到github上,有人可能专门在github上捡些这种东西然后转手去卖掉,据说有些程序员靠这个赚了上百万【doge】,当然了我下面的key各位看官老爷也是用不了的,只是展示一下如何操作

OPENAI_API_KEY=sk-nwDEG8UhIM78Da5xcPLwsRv0vj83yCVviIxegcYLHlqGFkAe

调用时的注意事项

  • 加载环境变量: 使用dotenv库加载环境变量,确保API密钥的安全。dotenv.config()会读取.env文件中的变量,并将其添加到process.env中。

  • 实例化OpenAI客户端: 使用OpenAI类创建一个客户端实例,并传入API密钥和基础URL。基础URL可以根据实际情况进行调整,例如使用代理或转发服务。

  • 调用API: 使用client.chat.completions.create方法调用OpenAI的聊天完成API。在这个例子中,我们传递了一个包含文本和图片URL的消息列表,请求模型生成对图片的描述。

  • 处理响应: 使用await关键字等待API调用的响应,并输出生成的描述。如果调用失败,捕获并打印错误信息。

  • 错误捕获: 使用try...catch结构捕获并处理可能出现的异常。这可以确保应用程序在遇到错误时不会崩溃,并提供有用的错误信息。

  • 环境变量管理: 将敏感信息(如API密钥)存储在.env文件中,并确保该文件被添加到.gitignore列表中,防止意外提交。

展示效果

这样我们就能用openai让它根据图片来为我们介绍了场景,详情请看下图:

3d2210415848739a9b49ccbf3cdc48d.png

image.png

补充

有小伙伴可能发现了在第11行用了一个函数的异步调用const main = async () => {},这是一个典型的异步调用,下面一起去看看异步调用和普通函数调用的区别

  • 执行方式

普通函数调用: 普通函数调用是同步的,即函数在调用时立即执行,并且在函数返回之前,程序会一直等待。 如果函数执行时间较长,会阻塞后续代码的执行,导致程序暂停。

异步调用不会立即执行,而是将任务放入事件队列中,等待当前任务执行完毕后再执行。 它不会阻塞后续代码的执行,允许程序继续处理其他任务。

  • 返回值

普通函数调用会立即返回一个结果或值,返回值在函数执行完毕后立即可用。 异步调用的结果不会立即可用,通常通过回调函数、Promises 或 Async/Await 来处理。返回值在未来的某个时间点才可用。

c224676594aae6804009e3fe521b122.jpg