OpenAI APIの新機能をNode.jsから使ってみる

2023.11.09

はじめに

吉川@広島です。

OpenAIの新機能が盛り上がっていますね!

OpenAI DevDayで発表された様々な機能について、公式ドキュメントを見ながら少しだけ詳細を確認してみた | DevelopersIO

いまのところ弊社記事はPythonコードが多い印象がありますので、いくつかの新規機能についてNode.js組である自分もサンプルコードを上げてみます。

環境

  • node v18.14.2
  • typescript 5.0.2
  • openai 4.16.1

[共通] OpenAIクライアントの初期化

openai パッケージをインストールします。

npm i openai

クライアントを初期化します。

const openAi = new OpenAI({
  apiKey: "xxxxxxxxxxxxxxxxxxxxxx",
});

DALL·E 3 API

[アップデート]DALL·E 3にAPI経由でアクセスできるようになりました | DevelopersIO

今までは、ChatGPT PlusとEnterpriseユーザーにGUI経由で提供されていました。 API経由でDALL·E 3にアクセスできることにより、プログラムを通じて画像生成ができるようになります。 これにより、いろいろなアプリやウェブサイトに簡単に組み込むことが可能になり、特別な操作をしなくても自動で新しいイラストを作ることができるようになります。

const generated = await openAi.images.generate({
  model: "dall-e-3",
  prompt: "かわいいゴリラの画像",
  size: "1024x1024",    
  quality: "standard",
  n: 1,
});

const url = generated.data[0]!.url!;
const res = await fetch(url);
const arrayBuffer = await res.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
writeFileSync("output.png", buffer);

実行すると以下の画像を得られました。

実装的にはURLから画像をダウンロードし、 Buffer に変換してからローカルファイルとして書き出しています。

なお size について、型定義的には "256x256" | "512x512" | "1024x1024" | "1792x1024" | "1024x1792" が指定できるようだったのですが、実際に "256x256" "512x512" を指定するとモデルが対応していないというエラーが返ってきました(2023/11時点)。少し注意が必要そうです。

gpt-4-vision-preview

OpenAI DevDayで発表された様々な機能について、公式ドキュメントを見ながら少しだけ詳細を確認してみた | DevelopersIO

GPT-4 Turboからは画像入力が使用可能になりました。 別モデル名としてgpt-4-1106-vision-previewを指定することで利用可能となっています。

ということで先程のかわいいゴリラの画像を与えてみます。

const image = readFileSync("./output.png");
const base64Str = image.toString("base64");
const completion = await openAi.chat.completions.create({
  model: "gpt-4-vision-preview",
  messages: [
    {
      role: "user",
      content: [
        {
          type: "text",
          text: "この画像を説明して",
        },
        {
          type: "image_url",
          image_url: {
            url: `data:image/jpeg;base64,${base64Str}`,
            detail: "high",
          },
        },
      ],
    },
  ],
});
console.log(completion.choices[0]?.message.content);

実行すると以下の出力が得られました。

この画像には、愛らしいカートゥー

「言いたいことは・・・わかる!」という感じですね(あたえた題材がちょっと難しかったかもしれません)。

GPT-4 Turbo

[速報]OpenAI DevDayの発表内容をまとめる!GPT VisionのAPI提供やGPT-4 turboのリリースなど | DevelopersIO

GPTより高度なモデルであるGPT-4 Turboがリリースました。主な違いとしては、アクセス可能な情報が2023年4月までの情報に対応されるようになりました。さらに、Context Lengthが長くなり128,000トークンまでサポートされるようになりました。

現時点(2023/11)では model: "gpt-4-1106-preview" を指定することで扱えます。

const completion = await openAi.chat.completions.create({
  model: "gpt-4-1106-preview",
  messages: [
    {
      role: "user",
      content: "こんにちは",
    },
  ],
});

JSON Mode

OpenAI DevDayで発表された様々な機能について、公式ドキュメントを見ながら少しだけ詳細を確認してみた | DevelopersIO

GPT-4 Turboはフォーマットの指示により厳密に従ってくれるようにパフォーマンスが改善しました。 またそれとは別に、モデルが有効なJSONで応答することを保証する新しいJSONモードもサポートしています。

type: "json_object" が指定できるようになり、今までよりもJSONを出力させやすくなりました。

現時点(2023/11)では gpt-4-1106-preview gpt-3.5-turbo-1106 で使用可能です。

const completion = await openAi.chat.completions.create({
  model: "gpt-4-1106-preview",
  messages: [
    {
      role: "user",
      content: "適当なフルーツをJSONの配列でください",
    },
  ],
  response_format: {
    type: "json_object", // json_objectを指定
  },
});
console.log(completion.choices[0]?.message.content);

実行すると以下が出力されました。

{
  "fruits": [
    {"name": "Apple", "color": "Red"},
    {"name": "Banana", "color": "Yellow"},
    {"name": "Cherry", "color": "Red"},
    {"name": "Date", "color": "Brown"},
    {"name": "Elderberry", "color": "Black"},
    {"name": "Fig", "color": "Purple"},
    {"name": "Grape", "color": "Green"}
  ]
}

ちなみに、

-適当なフルーツをJSONの配列でください
+適当なフルーツを配列でください

とJSON形式であることを明示せず話しかけると

'messages' must contain the word 'json' in some form, to use 'response_format' of type 'json_object'.

とエラーが返ってきました。 type: "json_object" に留まらず、指示メッセージの中にもJSONを明示する文言が必要なようです。

おわりに

いくつかの新機能をNode.jsで扱うサンプルコードを紹介しました。

以上、参考になれば幸いです。

参考