ChatGPT いろんな書き方で動かす

`gpt-3.5-turbo`と`gpt-3.5-turbo-0301`はどちらを使えば良いのか？

`gpt-3.5-turbo`を使いましょう
上位互換だと思ってください

公式のクイックスタートは現状`gpt-3.5-turbo-0301`を利用されているのでちょっと混乱しました

公式のchatgptを利用するためのmoduleはNodeとPythonで存在します。
これらを使わずともエンドポイントをPOSTで叩くことで利用可能です。

実装方法を見ていきます。

---


PythonからChatGPTを利用する
```python
import openai
from dotenv import load_dotenv
import os

# .envファイルのパスを指定して環境変数をして読み込む
load_dotenv('.env')
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')

openai.api_key = OPENAI_API_KEY

res = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {
            "role": "system", # 役割
            "content": "日本語で返答してください。"
        },
        {
            "role": "user", # ユーザーからのメッセージ
            "content": "月はなぜ満ち欠けするのですか？"
        },
        {
		    "role": "assistant", # chatgptが返答したmessage
            "content": "chatgptからの返答？"
        },
        {
		    "role": "user",
            "content": "もう少し、簡潔に教えてください"
        },
    ],
)
print(res["choices"][0]["message"]["content"])

```

NodeからChatGPTを利用する
```js
import { Configuration, OpenAIApi } from "openai";
import * as dotenv from "dotenv";
dotenv.config();

// API_KEYからインスタンスを作成
const configuration = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
});

// ChatGPTにアクセスするためのインスタンス作成
const openai = new OpenAIApi(configuration);

// APIを叩く
const res = await openai.createChatCompletion({
  model: "gpt-3.5-turbo",
  messages: [
        {
            role: "system", // 役割
            content: "日本語で返答してください。"
        },
        {
            role: "user", // ユーザーからのメッセージ
            content: "月はなぜ満ち欠けするのですか？"
        },
    ],
});

console.log(res.data.choices[0].message);
```

---
*chat/completions endpointを利用する書き方*
```js
import * as dotenv from "dotenv";
dotenv.config();

const endpoint = "https://api.openai.com/v1/chat/completions";

// チャットの初期メッセージを定義
const messages = [
  {
    role: "system", //役割
    content: "hello",
  },
  {
    role: "user", // ユーザーからのメッセージ
    content: "マクドナルドの1番人気は？",
  },
];

const res = await fetch(endpoint, {
  method: "POST",
  headers: {
    "Content-Type": "application/json", // API_KEY
    Authorization: `Bearer ${process.env.OPENAI_API_KEY}`,
  },
  body: JSON.stringify({
    model: "gpt-3.5-turbo",
    messages: messages,
    max_tokens: 700,
  }),
});

const data = await res.json();

console.log(data.choices[0].message.content);
```

*request objectでtry catchを見やすくする*
```js
import * as dotenv from "dotenv";
dotenv.config();

// チャットの初期メッセージを定義
const messages = [
  { role: "system", content: "hello" },
  { role: "user", content: "マクドナルドの1番人気は？" },
];

const RequestURI = "https://api.openai.com/v1/chat/completions";
const RequestOptions = {
  method: "POST",
  headers: {
    "Content-Type": "application/json", // API_KEY
    Authorization: `Bearer ${process.env.OPENAI_API_KEY}`,
  },
  body: JSON.stringify({
    model: "gpt-3.5-turbo",
    messages: messages,
    max_tokens: 700,
  }),
};

// Requestオブジェクト作成
const request = new Request(RequestURI, RequestOptions);

try {
  const res = await fetch(request);
  const data = await res.json();
  console.log(data.choices[0].message.content);
} catch (err) {
  console.log(err);
}
```

*過去のmessageを踏まえて会話する*
```js
import { Configuration, OpenAIApi } from "openai";
import * as dotenv from "dotenv";
dotenv.config();

const configuration = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);

const pastMessage = [{ role: "system", content: "日本語で返答してください。" }];

const chat = async (content) => {
  pastMessage.push({ role: "user", content });

  const res = await openai.createChatCompletion({
    model: "gpt-3.5-turbo",
    messages: pastMessage,
  });

  pastMessage.push(res.data.choices[0].message);

  console.log(res.data.choices[0].message.content);
};

await chat("日本で一番人気なアニメは？");
await chat("それが人気な理由は？");

```

## 終わりに
chatGPTには複数のModelが用意されており、チャット以外にも画像生成や音声会話用に最適化されたものも存在します。
主に使われているのは今回紹介した`gpt-3.5-turbo`です。
`gpt-3.5-turbo`だけに絞れば、公式ドキュメントで読むべき箇所もかなり少なく、覚えることもほとんどありません。

## 参考

https://platform.openai.com/docs/guides/completion

https://www.youtube.com/watch?v=kodz6fzbAUA

https://zenn.dev/k_kind/articles/chatgpt-api-q-and-a

https://qiita.com/sakasegawa/items/db2cff79bd14faf2c8e0