ちょっと話題の記事

[初心者向き] OpenAI APIを使ってPythonでChatGPT遊びするための最初の三歩くらい

とりあえずChatGPTで遊びたい人がPythonでちょっとだけコードを書いたよ
2023.03.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ChatGPT面白いですね! あんなことやこんなことできるんじゃないかと夢想して楽しんでいます。 そんなわけで、OpenAIのAPIキーを発行できたんだけれども、そのあとどうすればいいの? という過去の自分のために、Pythonでの超基本的な使い方をまとめておきたいと思います。

結論から言うと、 Pythonのコード15行程度でChatGPTを使ったアプリが出来上がりました!

(APIキーを発行するやり方は他の記事をご参照ください)

準備

Python3でOpenAIのライブラリを使うので、pipでインストールしておきます。

pip install openai

また、最小限のコードとはいえ、環境変数はハードコードしたくないので、 コマンドラインの環境変数に設定します。

export OPENAI_API_KEY="sk-xxxx"

コード

Pythonのコードを書いていきます。 ここに書いたコードをそのままコピペしてファイルとして保存して、実行すれば動くはずです。 検証にはPython3.10を用いました。

単発の質問

いきなりですが、最小限のコードはこんな感じです。

import os

import openai

# APIキーの設定
openai.api_key = os.environ["OPENAI_API_KEY"]


response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "大谷翔平について教えて"},
    ],
)
print(response.choices[0]["message"]["content"].strip())
$ python openai_test.py
日本のプロ野球選手であり、メジャーリーグ(MLB)のロサンゼルス・エンゼルスに所属する投手と designated hitter(DH)の両方をこなす二刀流選手です。
2018年にMLBデビューし、日米通算で2021年シーズン終了時点で通算115本塁打、86盗塁、41勝30敗、ERA3.65を記録しています。
2021年にはホームランダービーで優勝し、オールスターゲームでも先発出場を果たすなど、メジャーリーグでもその才能を発揮しています。
また、彼は高校時代には投打に優れ、日本プロ野球の日本ハムファイターズで投手としてプロデビューしました。

(改行は読みやすさのために挿入)

これで単純に質問をするということができます。 モデル名の指定があるだけで、あとはほとんど質問文を渡しているだけですね。 これだけでこの精度の回答!すごい。(語彙力

単発でない会話

上記の聞き方だけでは、会話はできません。 APIとしては、聞かれた質問にただ単独で答えるだけなので、 前の質問のことは全て忘れてしまいます。

文脈を理解させるためには以下のようにします。

import os

import openai

# APIキーの設定
openai.api_key = os.environ["OPENAI_API_KEY"]


response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "大谷翔平について教えて"},
        {"role": "assistant", "content": "日本のプロ野球選手であり、メジャーリーグ(MLB)のロサンゼルス・エンゼルスに所属する投手と designated hitter(DH)の両方をこなす二刀流選手です。2018年にMLBデビューし、日米通算で2021年シーズン終了時点で通算115本塁打、86盗塁、41勝30敗、ERA3.65を記録しています。2021年にはホームランダービーで優勝し、オールスターゲームでも先発出場を果たすなど、メジャーリーグでもその才能を発揮しています。また、彼は高校時代には投打に優れ、日本プロ野球の日本ハムファイターズで投手としてプロデビューしました。"},
        {"role": "user", "content": "具体的な記録は?"},
    ],
)
print(response.choices[0]["message"]["content"].strip())

前との違いとしては、messagesの配列要素が増えただけです。

  • user: 人間からの問い合わせ1を書く
  • assistant: GPTからの返答1を書く
  • user: 人間からの問い合わせ2を書く

プログラム的には、単純にそこまでの会話を全部配列で突っ込むだけというとても単純明快な作りになっています。 assistantには、先ほどの質問の回答をそのまま書いています。 プログラムでは前回の回答を変数に入れておいて配列に追加していく感じですね。

これでGPTはそこまでの会話の流れを理解した上での返答を返すようになりますので、 「それ」とかの指示語でも話を進められるようになります。 入力体系はこんな単純なのに、あたかもそこに人間がいるような会話になるというのが面白いですね。 人格というものも所詮は過去データの積み重ねから人が思い描いてる幻覚なのか? なんてことを考えてしまいます。

$ python sample.py
以下は、大谷翔平の主な記録です。

- 日央大三高では、投手として最速160km/h以上の速球と、打者としても長打力を持ち合わせ、2年時には春夏連続で甲子園に出場しています。
- 2013年にプロ入りし、新人王を獲得。当時の最速は162km/hを記録しています。
- 2016年には日本プロ野球史上初のシーズン20本塁打、15勝を達成し、「二刀流」としての才能を発揮しました。
- 2017年シーズンは故障により出場機会が限られますが、8試合に投手として登板し3勝2敗、防御率3.20の成績を残しました。
- 2018年にはMLBデビューを果たし、最速101.1mph(約162.6km/h)のストレートを投げるなど、投手としても才能を発揮しました。打者としても通算22本塁打を放ち、新人王投票でも2位につける活躍をしました。
- 2021年は、開幕から打撃・投手ともに好調で、通算46本塁打・100打点を記録し、ア・リーグMVP投票でも2位に選ばれました。また、シーズン中には初の完封勝利を挙げています。

このように、大谷翔平は投手・打者としてともに非常に優れた才能を持った選手であり、その記録は日米を問わず非常に注目されています。

日央大三高とは?ってか日大三高ですらないよね?

言い回しなどの調整

最後に、言い回しの調整方法です。 こちらは、userの質問文の中で都度指定することなども可能ですが、 それとは別に、会話に含めずにデフォルト設定として組み込むというイメージの操作になります。

import os

import openai

# APIキーの設定
openai.api_key = os.environ["OPENAI_API_KEY"]


response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "system", "content": "関西弁で話して"},
        {"role": "system", "content": "発言の最後に「知らんけど。」をつけて"},
        {"role": "user", "content": "大谷翔平について教えて"},
    ],
)
print(response.choices[0]["message"]["content"].strip())

systemがそれに当たります。 複数の指定をすることもできます。

何回か試してみるとわかるのですが、 この指定は、無視されることも結構あるみたいです。 systemで指定したものとuserで指定したものがどのような重みで反映されるのか、 またどんな文言で指定するとより厳格にルール通りとなるのかなど、 ユーザはうかがい知ることができない(多分開発者もわからない)ので、 思ったような調教をしたい場合は試行錯誤が必要そうです。

$ python sample.py
大谷翔平っていうのは、日本のプロ野球選手で、現在はアメリカのロサンゼルス・エンゼルスでプレーしているで。
二刀流として知られておって、投手としても打者としても活躍する選手やねん。
でも最近は投手としての活躍が目立っておって、去年のシーズンではリーグ最多勝で最優秀投手に選ばれたで。知らんけど。

(改行は読みやすさのために挿入)

関西人じゃないので、関西弁として正しいのかはわかりません。

以上のように、userassistantsystemの指定をしつつ、 文章を配列で渡してあげるだけで、会話ができるアプリができてしまいました!簡単!!

この最低限コードができるまでの道のり

蛇足ですが、このコードでやりたいことができた、という流れを書いていきたいと思います。 APIキーの発行までは完了している前提です。

ChatGPTに聞け

APIキーは手に入ったぞ。さあどうする? そもそも何ができるのかすらよく知らないよね?

こんな時どうするか、そうChatGPTに聞くべきですよね。 こんな感じで質問して見ました。

OpenAI APIを使ってChatGPTのように質問への回答を返すアプリケーションをPythonで書いて

回答は

OpenAI APIを使用して、質問に答えるアプリケーションをPythonで作成する方法について、以下に示します。

まず、OpenAI APIの利用には、APIキーが必要です。OpenAIのウェブサイトでAPIキーを生成することができます。

APIキーを取得したら、OpenAI APIをインストールする必要があります。Pythonのpipを使用して、次のコマンドを実行してください。

```python
pip install openai
```

これにより、OpenAI APIのPythonライブラリがインストールされます。

次に、Pythonスクリプトを作成しましょう。以下のコードを使用して、ユーザーから質問を受け取り、OpenAI APIを使用して回答を生成するプログラムを作成できます。

```python
import openai
openai.api_key = "YOUR_API_KEY"

def generate_answer(prompt):
    response = openai.Completion.create(
      engine="davinci",
      prompt=prompt,
      temperature=0.7,
      max_tokens=1024,
      top_p=1,
      frequency_penalty=0,
      presence_penalty=0
    )

    answer = response.choices[0].text.strip()
    return answer

while True:
    prompt = input("質問を入力してください:")
    answer = generate_answer(prompt)
    print(answer)
```

このスクリプトでは、OpenAI APIキーを設定し、generate_answer関数を使用して、ユーザーが入力したプロンプトを使用して回答を生成します。生成された回答は、コンソールに出力されます。

このスクリプトを実行すると、ユーザーが質問を入力することができます。入力された質問に対して、OpenAI APIが回答を生成し、コンソールに出力されます。

こんな回答が来ました。 Pythonでの実装例を示してくれましたので、それをペタッと貼り付けます。 質問は直書きでこんな感じにしました。

import openai
openai.api_key = "sk-xxxx"

def generate_answer(prompt):
    response = openai.Completion.create(
      engine="davinci",
      prompt=prompt,
      temperature=0.7,
      max_tokens=1024,
      top_p=1,
      frequency_penalty=0,
      presence_penalty=0
    )

    answer = response.choices[0].text.strip()
    return answer

while True:
    prompt = "日本の都道府県で面積が20番目に大きいのはどこですか?"
    answer = generate_answer(prompt)
    print(answer)

このプログラムの出力はこんな出力結果でした。

(クリックで全文を開く)

北海道、それに次いで福岡県です。

では、20番目に小さいのは? それが山形県です。

なるほど。

そして、山形県で暮らしていたとします。

面積が20番目に小さいなら、常に人々や商売は集まるのでしょうか? 全くそんなことはないんですよ。
(以下、なぜか山形県の話が延々と続く)
北海道、それに次いで福岡県です。

では、20番目に小さいのは? それが山形県です。

なるほど。

そして、山形県で暮らしていたとします。

面積が20番目に小さいなら、常に人々や商売は集まるのでしょうか? 全くそんなことはないんですよ。

なぜなら、山形県の人々は今まで集う場所がなかったからです。

今まで、山形県の人々は集う場所もないし、集う場所を作る人もいないからです。

ですから、山形県の人々はずっと外に集まる場所を探してきました。

それは、長野県の山中で昔からやってきたことですので、山形県の人々はみんな選択肢が少ないのです。

では、山形県の人々はどうすれば良いのでしょうか?

それは、集う場所を作ることです。

そして、その為の財産も持っていなければなりません。

では、その為の財産とは何でしょうか?

それは、「組織」です。

これは、そうやって自分の組織を持っていくことです。

そして、その組織に出来るだけ人を集めることです。

それは、山形県の中で集う場所を持ったことになります。

そして、それが山形県の人々を元気にしてくれるはずです。

こうやって、山形県の人々は自分の組織を作って、自分の組織を修正して、自分の組織を経営して、自分の組織に商 売を仕込むことで、自分の組織を大きくしていくことができるようになるのです。

それで、山形県の人々は自分の組織を大きくしていけば、自分の組織の人々に商売を仕込んでいけば、山形県の人々 は自分の組織を大きくしていけるのです。

そうやって、山形県の人々は自分の組織を大きくしていきます。

そして、山形県の人々は自分の組織の人々に商売を仕込んでいく
A:北海道です

Q14.淡水棲魚が普通に生息しているのはどこですか?

A:石狩川、苫小牧川、苫小牧川、日本海、ほぼ全国です

Q15.日本の釣竿の起源はどこから来ていますか?

A:西洋から来たと考えられている

Q16.魚探は日本では非常に高い技術なのではないですか?

A:最初は長崎の漁師が自分たちの時間が有効に使えるように万能な品を作っただけです

Q17.日本の漁師にとっては釣りとは何ですか?

A:しだいに釣りは単なる趣味とは違うものになっています。

Q18.鮭と鼈を釣りたいと思っているのですが、鮭は冬がおいしいのですか?

A:冬は鮭にとっては弱い季節ですが、鮭は冬でも釣れます

Q19.日本の釣り船で一番美しいのはどこですか?

A:沖縄のかまくら船

Q20.日本で一番裕福な漁師は誰ですか?

A:沖縄の漁師ではないでしょうか

Q21.長崎の船長が日本海に行きました。そこでどんな船を見ましたか?

A:高度な工芸品の船です

Q22.世界で一番美しい船はどこの船ですか?

A:日本の舟(遊船)です

Q23.日本の釣り船で一番大きいのはどこですか?

A:沖縄ではないでしょうか

Q24.日本の釣り船で一番小さいのはどこですか?

A:沖縄ではないでしょうか

Q25.日本の釣り船で一番老いているのはどこですか?

A:沖縄ではないでしょうか

Q26.日本の釣り船の中で一番
A.山形県 B.山梨県 C.長野県 D.岐阜県 E.静岡県 C.長野県 【解説】

山梨県と山形県の間にある面積が20番目に大きいのは長野県です。 19.【クイズ】日本の都道府県で都会であるのはどこですか? A.大阪府 B.東京都 C.愛知県 D.福岡県 E.長崎県 D.福岡県 【解説】

日本の都道府県で都会であるのは福岡県です。 20.【クイズ】日本の都道府県で面積が5番目に小さいのはどこです か? A.岩手県 B.福井県 C.静岡県 D.山形県 E.埼玉県 C.静岡県 【解説】

日本の都道府県で面積が5番目に小さいのは静岡県です。 21.【クイズ】日本の都道府県で面積が4番目に大きいのはどこですか? A.大阪府 B.神奈川県 C.東京都 D.福岡県 E.北海道 B.神奈川県 【解説】

日本の都道府県で面積が4番目に大きいのは神奈川県です。 22.【クイズ】日本の都道府県で都会であるのはどこで すか? A.岩手県 B.山形県 C.長野県 D.静岡県 E.埼玉県 B.長野県 【解説】

日本の都道府県で都会であるのは長野県です。 23.【クイズ】日本の都道府県で都会であるのはどこですか? A. 山形県 B.東京都 C.群馬県 D.長崎県 E.山口県 B.東京都 【解説】

日本の都道府県で都会であるのは東京都です。 24.【クイズ】日本の都道府県で都会である
宮城県

茨城県

青森県

栃木県

広島県

群馬県

山形県

埼玉県

山梨県

石川県

長野県

山口県

山梨県

福島県

新潟県

石川県

福島県

長崎県

青森県

岩手県

山形県

新潟県

福島県

群馬県

長崎県

岩手県

山梨県

山口県

福島県

東京都

石川県

長野県

山口県

岩手県

山梨県

青森県

青森県

山形県

福岡県

岩手県

山形県

福島県

長崎県

青森県

青森県

長野県

福島県

山形県

岩手県

福島県

石川県

長崎県

山梨県

長崎県

青森県

山形県

福島県

宮城県

福島県

山形県

長野県

青森県

山口県

山梨県

福島県

福島県

長崎県

福島県

秋田県

福島県

新潟県

長崎県

山形県

長崎県

山梨県

長野県

東京都

福島県

福島県

山梨県

青森県

長崎県

青森県

山口県

山梨県

福島県

福島県

福島県

長崎県

新潟県

山形県

山形県

青森県

長野県

長崎県

山梨県

東京都

福岡県

福島県

山梨県

長崎県

山口県

山形県

青森県

山梨県

長崎県

山梨県
(投票結果)



1位 山形県



2位 兵庫県



3位 宮城県

4位 秋田県

5位 岩手県

6位 兵庫県

7位 栃木県

8位 宮城県

9位 鳥取県

10位 宮崎県



山形県について

(Wikipedia)

山形県は、日本の山形県である。面積は2万2,780平方キロメートルで、日本第20位である。

山形県の地図

山形県の地図

山形県の写真

山形県の写真

山形県の写真

山形県の写真

山形県の写真

山形県の写真

山形県の写真

山形県の写真

山形県の写真

山形県の写真

山形県の写真

山形県の写真

山形県の写真

山形県の写真

山形県の写真

山形県の写真

山形県の写真

山形県の写真

山形県の写真

山形県の写真

山形県の写真

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍

山形県の書籍
6. 日本の都道府県で面積が若干小さいのはどこですか?

7. 日本の都道府県で最も人口が多いのはどこですか?

8. 日本の都道府県で最も人口が少ないのはどこですか?

9. 日本の都道府県で主要な産業について、どのような事業が行われているのか調べました。

10. 日本の都道府県で主要な交通標識について、文字や形状、色などを見てみました。

11. 日本の都道府県で主要な交通標識について、記号や文字の取り扱い方を調べました。

12. 日本の都道府県について、政令市(都市・管理組合)の位置を書き留めました。

13. 日本の都道府県について、県立大学の位置を書き留めました。

14. 日本の都道府県について、県立病院の位置を書き留めました。

15. 日本の都道府県について、小学校の位置を書き留めました。

16. 日本の都道府県について、中学校の位置を書き留めました。

17. 日本の都道府県について、中学校の位置を書き留めました。

18. 日本の都道府県について、大学の位置を書き留めました。

19. 日本の都道府県について、高校の位置を書き留めました。

20. 日本の都道府県について、病院の位置を書き留めました。

21. 上記の文字や色などを使って、どのような絵文字を作りましたか?

22. 日本について、従量制について調べました。

23. 日本について、経産省について調べました。

24. 日本について、自動車について調べました。

25. 日本について、福祉について調べました。

26. 日本について、通信衛星について調べました。

27. 日本につい
埼玉県です。



Q.面積の2倍の面積を持つ国はどこですか?

サウジアラビアです。



Q.日本の面積が2倍の面積を持つ国はどこですか?

インドです。



Q.日本の面積の2倍の面積を持つ国はどこですか?

中国です。



Q.日本の面積の10倍の面積を持つ国はどこですか?

アメリカです。



Q.日本の面積の120倍の面積を持つ国はどこですか?

ロシアと中国です。



Q.日本と中国の面積の合計は?

1020万4000平方キロメートルです。



Q.日本の県の120倍の面積を持つ国はどこですか?

中国です。



Q.日本の国土の面積の2倍の面積を持つ国はどこですか?

インドです。



Q.日本の国土の面積の10倍の面積を持つ国はどこですか?

アメリカです。



Q.日本の国土の面積の120倍の面積を持つ国はどこですか?

ロシアと中国です。



Q.日本を含む日本列島の面積は?

7680万8000平方キロメートルです。



Q.日本列島面積の10倍の面積を持つ国はどこですか?

インドです。



Q.日本列島の120倍の面積を持つ国はどこですか?

ロシアと中国です。



Q.日本列島の面積の2倍の面積を持つ国はどこですか?

アルバニアです。



Q.日本列島の面積の10倍の面積を持つ国はどこですか?

インドネシアです。



Q.日本列島の面積の120倍の面積を持つ国はどこですか?

ロシアと中国です。



Q.日本列島と日本
(2010年のデータです)

A 大阪府

B 東京都

C 埼玉県

D 新潟県

E 富山県

正解は・・・

D 新潟県です。

日本の都道府県で面積が20番目に大きいのは、埼玉県ではなく、新潟県です。(2010年のデータです)

日本の都道府県で面積が20番目に小さいのはどこですか?(2010年のデータです)

A 香川県

B 徳島県

C 長崎県

D 福島県

E 浦河市

正解は・・・

C 長崎県です。

日本の都道府県で面積が20番目に小さいのは、竹島ではなく、長崎県です。(2010年のデータです)

日本の都道府県で面積が全体の0.5%に相当するのはどこですか?

A 静岡県

B 埼玉県

C 宮城県

D 青森県

E 千葉県

正解は・・・

D 青森県です。

日本の都道府県で面積が全体の0.5%に相当するのは、北海道ではなく、青森県です。(2010年のデータです)

日本の都道府県で面積が全体の0.5%に相当するのはどこですか?

A 鳥取県

B 宮崎県

C 北海道

D 佐賀県

E 栃木県

正解は・・・

C 北海道です。

日本の都道府県で面積が全体の0.5%に相当するのは、群馬ではなく、北海道です。(2010年のデータです)

日本の都道府県で面積が全体の0.5%に相当するのはどこですか?

A 長野県

B 富山県

C 栃木県

D 静岡県

E 佐賀県

正解は・・・

E 佐賀県です。

日本の都道府県で面積が全体の0.5%に相当するのは、山形ではなく、佐賀県です。(2010年のデータです)

日本の都道府県で面積が全体の0.5

よく見たらプログラムがwhileで無限ループしてるのですが、それを差し置いても、 なんかWeb版のChatGPTで見たような返答じゃないですね。 何がまずかったのか?

いわゆるChatGPTを使う

ここからはChatGPTに頼らず、ブログを漁ります。

[ChatGPT API][AWSサーバーレス]ChatGPT APIであなたとの会話・文脈を覚えてくれるLINEボットを作る方法まとめ

こちらのブログを読んでみると、 TypeScriptとPythonという違いがあるものの、

const completion = await openAiApi.createChatCompletion({
    model: "gpt-3.5-turbo",

というような記述になっていることに気づきました。 上でChatGPTが教えてくれたのは↓こんな感じでした。

response = openai.Completion.create(
  engine="davinci",

openAiApi.createChatCompletionなどで検索してみると、 どうやらこちらがいわゆるChatGPT(の中のもの)のようです。 実際にこれに変えて質問を投げてみると、Web版のChatGPTで見るような返答になりました。 (回答の的確さ的にも、文章量的にも。)

ChatGPTに教えてもらったものの方は、少なくとも別のモデルが使われているようです。 temperatureなど、いかにも言語モデルっぽいチューニング項目もいっぱいありますし、 ChatGPTができるまでにいろいろな試行錯誤があったことが伺えます。

ChatGPTはその辺のチューニング項目が(表向きは)一切なく、 「質問を投げると返答返すよ」だけのインターフェイスであそこまでの精度になっているのが凄すぎます!

で、実際に出来上がったのがこの記事の最初の方に書いたコードになります。

まとめ

OpenAIのAPIキー発行までできたけど、そこから先どうするの? という過去の自分への簡単なまとめを書いてみました。

これだけわかれば、あとはプログラムの書き方次第で以下のようなこともできそうです。 (レスポンスにかかる時間などは別の話)

  • あらかじめ予備知識を色々吹き込んだ後での回答をするようにする
  • 複数の回答結果を得て、さらにそれを合議して結果を出す
    • 名前はメルキオール、バルタザール、カスパールにしないとですね

あとはアイディア次第で色々遊べるんじゃないでしょうか! 夢が広がります。

(この文章はChatGPTより貧弱な脳みそで書かれました。)

参照リンク