Open24

GPT-4のAPIを試してみる

kurehajimekurehajime

日頃の行いが良かったのか先月OpenAIに5千円以上お布施したことで功徳が積まれたのか、GPT-4のAPIの限定プレビューの順番がまわってきたので、さっそく試してみる。

環境:Google Colab(Python)

kurehajimekurehajime

共通する下準備

APIキーを読み込んで

from getpass import getpass
secret = getpass('Enter the secret value: ')

ライブラリインストールして

!pip install openai 

ライブラリ読み込んで

import openai
openai.api_key = secret
kurehajimekurehajime

俳句で比較

俳句の生成で比較してみる。

kurehajimekurehajime

gpt-3.5-turbo

まずは従来からあるgpt-3.5-turbo

for i in range(0,5):
  completion = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
          {"role": "system", "content": """あなたは俳句で喜怒哀楽や季節感を表現する詩人です。
  俳句とは、5・7・5という音節数の文章を作ることを指します。
  俳句の例として以下のようなものがあります。

  * 古池や 蛙飛びこむ 水の音
  * 若草や つわものどもが 夢の跡
  * 柿食えば 鐘が鳴るなり 法隆寺
  * 梅一輪 一輪ほどの あたたかさ
  * 静かさや 岩にしみ入る 蝉の声
          """},
          {"role": "user", "content": "犬をテーマにして俳句を作ってください。"},
          {"role": "assistant", "content": "古来から 人と寄り添う 頼れる相棒"},
          {"role": "user", "content": "猫をテーマにして俳句を作ってください。"}
      ]
  )
  for cho in completion.choices:
    print(cho.message.content)

夕暮れや 猫舌なめる 空の色
夜更けに 踊る猫の影 微笑む月
縮こまり 日向ぼっこする 黒猫かな
日向ぼこ 眠る猫の背中 ふわりと揺れ
猫の目に 映るは虫の 光さえも

kurehajimekurehajime

gpt-4

gpt-4では改善されるかな

for i in range(0,5):
  completion = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[
          {"role": "system", "content": """あなたは俳句で喜怒哀楽や季節感を表現する詩人です。
  俳句とは、5・7・5という音節数の文章を作ることを指します。
  俳句の例として以下のようなものがあります。

  * 古池や 蛙飛びこむ 水の音
  * 若草や つわものどもが 夢の跡
  * 柿食えば 鐘が鳴るなり 法隆寺
  * 梅一輪 一輪ほどの あたたかさ
  * 静かさや 岩にしみ入る 蝉の声
          """},
          {"role": "user", "content": "犬をテーマにして俳句を作ってください。"},
          {"role": "assistant", "content": "古来から 人と寄り添う 頼れる相棒"},
          {"role": "user", "content": "猫をテーマにして俳句を作ってください。"}
      ]
  )
  for cho in completion.choices:
    print(cho.message.content)

月夜に 猫の声聞く 窓の霧
春の夜 猫潜む影 桜舞う
月夜見る 猫の後ろ姿 遊ぶ影
月夜見れば 猫の影潜む ひそやかに
春の夜 猫がのびやか 月見けり

kurehajimekurehajime

所感

平気で字余りするのはあまり変わらず。
内部的に英語(または謎言語)で思考しているのか、文字カウントタスクはやはりまだ結構苦手な印象。

kurehajimekurehajime

幻覚テスト

ChatGPTは平気で嘘を言う。そのへんをテストしてみる。
テストする文章は

スティーブ・ジョブズと縁の深い三国志の武将を教えて下さい

自分が調べた限りでは、スティーブ・ジョブズが三国志の武将の末裔だとか、三国志を好きだったとか、三国志を読んだことがあるという情報はネット上にない。
スティーブ・ジョブズの伝記や関連本も何冊か読んだことあるけど、そんなことは書いてなかった。

でもChatGPTは平気でエピソードをでっち上げる。

kurehajimekurehajime

gpt-3.5-turbo

gpt-3.5-turboを試してみる

for i in range(0,5):
  completion = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
          {"role": "user", "content": "スティーブ・ジョブズと縁の深い三国志の武将を教えて下さい"},
      ]
  )
  for cho in completion.choices:
    print(cho.message.content)

  print("--------")
  1. 諸葛亮(孔明)- スティーブ・ジョブズは、諸葛亮(孔明)を自身のモデルとして挙げており、彼の知恵と創造力に多大な影響を受けています。ジョブズは、自身が戦略的なリーダーシップと視野を持つビジョンを持っていたことを認め、これらの特質を孔明に帰することもあった。

  2. 劉備- 劉備は、三国時代の主要な統一指導者であり、多くの戦略的な戦いに勝利を収めました。ジョブズは、自身の経歴の中で多くの統合的な業績を残しており、その意味では、劉備と同様にビジネス戦略に優れた人物と言えます。

  3. 曹操- スティーブ・ジョブズは、曹操に対して複雑な感情を抱いていたと言われています。彼は曹操を、「優秀だが偽善的」と評価しており、そのような特徴が自身のビジネス上の敵としての姿勢につながっていたかもしれません。しかし、ジョブズは曹操の戦略性とフットワークの軽さを認めており、これらの特長は彼のビジネス戦略にも反映されていたと思われます。


  1. 诸葛亮 (Zhuge Liang): Known for his intelligence and strategic planning skills, Zhuge Liang was a key figure in the Three Kingdoms period. He was often compared to Steve Jobs for his creative problem-solving abilities.

  2. 孙权 (Sun Quan): The founder of the Eastern Wu kingdom, Sun Quan was a skilled leader and administrator. He was known for his ability to delegate responsibilities and recruit talented individuals to his team, much like Steve Jobs did at Apple.

  3. 赵云 (Zhao Yun): A brave and loyal warrior, Zhao Yun was a key general for Liu Bei's Shu kingdom. He was famously known for rescuing Liu Bei's son during battle, showing his selflessness and devotion to his leader. This attribute is similar to the way Steve Jobs was revered by his loyal colleagues and employees.


スティーブ・ジョブズと直接的な関係を持つわけではありませんが、Apple社が発売したゲーム「三国志大戦」のキャラクターとして、以下の武将が登場しています。

  1. 呂布 - 「最強の武将」として知られ、三国時代に中国を代表する武将の1人です。スティーブ・ジョブズが「最強のビジネスマン」として知られていたのと似た意味が込められているとされています。

  2. 張飛 - 呂布の部下で、勇猛果敢な武将として知られています。曹操との戦い(赤壁の戦い)での活躍が特に有名です。

  3. 劉備 - 蜀漢の創始者で、華陽の老蔡や博学の諸葛亮を得て、天下統一を目指します。スティーブ・ジョブズがリーダーとして取り組んだテクノロジー産業の発展と、劉備が蜀漢を興すための統一戦争とを掛け合わせた象徴とされています。


スティーブ・ジョブズと縁の深い三国志の武将は、以下の通りです。

  1. 劉備(りゅうび)

スティーブ・ジョブズは、劉備の人生にインスパイアされ、Apple社のコンピューターに「Macintosh」の名を付けました。また、彼は自らも「Zen Master of Business」という異名を持ち、劉備の経営手腕に共感していたといわれています。

  1. 孫権(そんけん)

スティーブ・ジョブズは、孫権が自分のビジョンを実現するために困難を乗り越えた姿勢に共感し、Apple社のiPodやiPhoneの開発に彼の功績を称える意味で、「M4A」「SUN V」「K84」といったコードネームを使用していました。

  1. 諸葛亮(しょかつりょう)

スティーブ・ジョブズは、諸葛亮の戦略眼や創造力に影響を受け、Apple社のトップに就任した後、会社を再生するために彼の手法を採用しました。彼はまた、諸葛亮が愛用したといわれる羽扇を所有していたといわれています。


スティーブ・ジョブズと縁の深い三国志の武将はいません。スティーブ・ジョブズが三国志と縁を持っているという情報はありません。


kurehajimekurehajime

結構適当なことを言っている。

Apple社が発売したゲーム「三国志大戦」

Apple社のiPodやiPhoneの開発に彼の功績を称える意味で、「M4A」「SUN V」「K84」といったコードネームを使用していました。

彼はまた、諸葛亮が愛用したといわれる羽扇を所有していたといわれています。

ただ1回だけまともな回答もしてる。

スティーブ・ジョブズと縁の深い三国志の武将はいません。スティーブ・ジョブズが三国志と縁を持っているという情報はありません。

kurehajimekurehajime

gpt-4

ではgpt-4はどうか。

for i in range(0,5):
  completion = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[
          {"role": "user", "content": "スティーブ・ジョブズと縁の深い三国志の武将を教えて下さい"},
      ]
  )
  for cho in completion.choices:
    print(cho.message.content)

  print("--------")

スティーブ・ジョブズと縁の深い三国志の武将は、「諸葛亮 」です。 スティーブ・ジョブズは彼の戦術や戦略、人間性などを尊敬し、ことあるごとに彼の教えや名言を引用していました。


スティーブ・ジョブズが縁の深い三国志の武将は「劉備」です。スティーブ・ジョブズはアップルでのリーダーシップや経営において、三国志に登場する劉備から多くのインスピレーションを得ていたとされています。特に劉備の経営哲学や人材選びの一部はジョブズの経営方針にも通じると言われています。


スティーブ・ジョブズと縁の深い三国志の武将は諸葛亮(しょかつりょう)です。諸葛亮は、中国の戦国時代(紀元前475年~221年)に生きた武将であり、戦略家としても有名です。 スティーブ・ジョブズは、彼の戦術や目標に対する情熱に感銘を受け、自分のビジネスモデルに活かしました。 またジョブズは、自分のバイオグラフィーの中で、三国志や諸葛亮に言及しています。彼は、諸葛亮の知恵や戦術が、経営戦術やリーダーシップに直接的な影響を与えたと語っています。


スティーブ・ジョブズと縁の深い三国志の武将は「諸葛亮(しょかつりょう)」です。彼は戦術家であり、魏(ぎ)・蜀(しょく)・呉(ご)という三つの国が激しく争った時代において、蜀漢(しょっかん)を統べる盧组(れきせい)として活躍しました。カリスマや才能を持つ指導者であり、兵器の開発や農業・治水への取り組みなど、様々な分野で名を成した武将です。

スティーブ・ジョブズは、諸葛亮の賢能を非常に尊敬しており、彼の考え方やリーダーシップを研究していました。また、日本版の三国志にあたる「信長の野望」のゲームをプレイすることでも、三国志に親しんでいました。


スティーブ・ジョブズは、呉の名将である周瑜と縁が深いと関連性が指摘されることがあります。周瑜は、三国志時代の中国の将軍であり、合肥攻防戦、赤壁の戦いで呉の勝利に大きく貢献したことで知られています。スティーブ・ジョブズは、自分を再雇用したアップルCEOギル・アメリオを下手人に楚漢春秋を彷彿させる夜襲で追放し、アップルのCEOに返り咲いた。これは周瑜の英勇伝が非常にジョブズに通じる部分があるからだが、いわばジョブズの静思録なのであろう。 また、スティーブ・ジョブズは、自身の伝記の中で周瑜の古典「孫子美」を愛読書の1つとして挙げており、その戦術および哲学からインスピレーションを受けていたとされています。


kurehajimekurehajime

勝手に愛読書にしたり尊敬してるとか言い出したり、嘘つきなのはあまり変わらない。
でもすぐバレるような嘘は少なくなったような気がする。
これは改善なのか、それとも余計厄介になったのか…。

スティーブ・ジョブズは、自分を再雇用したアップルCEOギル・アメリオを下手人に楚漢春秋を彷彿させる夜襲で追放し、アップルのCEOに返り咲いた。これは周瑜の英勇伝が非常にジョブズに通じる部分があるからだが、いわばジョブズの静思録なのであろう。

これは面白い。

kurehajimekurehajime

systemプロンプトによる幻視の制御

systemプロンプトで『知らないことについては「知りません」と答えてください』と釘を差すことで、適当なことを言うのを制御する。

{"role": "system", "content": "知ってることだけに答え、知らないことについては「知りません」と答えてください"},
 {"role": "user", "content": "スティーブ・ジョブズと縁の深い三国志の武将を教えて下さい"},
kurehajimekurehajime

gpt-3

for i in range(0,5):
  completion = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
          {"role": "system", "content": "知ってることだけに答え、知らないことについては「知りません」と答えてください"},
          {"role": "user", "content": "スティーブ・ジョブズと縁の深い三国志の武将を教えて下さい"},
      ]
  )
  for cho in completion.choices:
    print(cho.message.content)

  print("--------")

知りません。スティーブ・ジョブズと三国志の武将についての縁は知られていません。


スティーブ・ジョブズと縁の深い三国志の武将は知りません。彼は中国文化に興味を持っていたことは知られていますが、特定の武将との縁は知られていません。


「赤壁の戦い」を指揮した曹操が、スティーブ・ジョブズの好きな武将だったことが知られています。


スティーブ・ジョブズと縁の深い三国志の武将はいません。知りません。


スティーブ・ジョブズと縁の深い三国志の武将はいません。彼は中国文化に非常に興味を持っていましたが、三国志とは特別なつながりがあるわけではありません。


kurehajimekurehajime

優秀。

「赤壁の戦い」を指揮した曹操が、スティーブ・ジョブズの好きな武将だったことが知られています。

一回だけ適当なことを言っているが、4回はまともな回答もしてる。
スティーブ・ジョブズが中国文化に非常に興味を持っていたかは知らない。日本文化好きではあったけど、中国文化好きかどうかは否定も肯定も難しい。

kurehajimekurehajime

gpt-4

for i in range(0,5):
  completion = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[
          {"role": "system", "content": "知ってることだけに答え、知らないことについては「知りません」と答えてください"},
          {"role": "user", "content": "スティーブ・ジョブズと縁の深い三国志の武将を教えて下さい"},
      ]
  )
  for cho in completion.choices:
    print(cho.message.content)

  print("--------")

私は知りません。


スティーブ・ジョブズと縁の深い三国志の武将については、知りません。


知りません。


知りません


知りません


kurehajimekurehajime

所感

どちらも良い結果だった。
前のテストが散々だったことを考えれば、モデルの賢さよりプロンプトでの制御のほうが重要と言えるかも知れない。

gpt-4の方が優秀だが、その正答率だけでなく「余計なことは言わない」という点で回答にだいぶ違いがあったように見える。
gpt-3.5-turboは「中国文化に興味を持っていた」とちょっとでも回答して部分点を貰おうとする傾向があるが、gpt-4は言われたことを忠実に守ろうとしている。

これは「頭の良さ」だけでなく「制御しやすさ」でもgpt-4が優れていることが言えそう。

kurehajimekurehajime

書式指定

生成系AIで厳密な制御をするのは難しく、

別システム -> 生成系AI
の連携はできても
生成系AI -> 別システム
の連携はファジーな出力を受け付ける必要があって結構つらいなーと感じている。

生成系AIが進歩すればそのへんも解決するのかも知れないけど、現時点でどうなのか確認したい。

以下のプロンプトを投げる。

ペットの情報を以下のようなjson形式で3つ作ってください。
---
{
  name:ポチ,
  type:犬,
  age:3,
}
kurehajimekurehajime

gpt-3

for i in range(0,5):
  completion = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
          {"role": "user", "content": """
ペットの情報を以下のようなjson形式で3つ作ってください。
---
{
  name:ポチ,
  type:犬,
  age:3,
}
          """},
      ]
  )
  for cho in completion.choices:
    print(cho.message.content)
  print("---")

{
"name": "タマ",
"type": "猫",
"age": 5
}

{
"name": "チロ",
"type": "ウサギ",
"age": 2
}

{
"name": "リンゴ",
"type": "ハムスター",
"age": 1
}


{
"name": "たま",
"type": "猫",
"age": 2
}

{
"name": "フクロウ",
"type": "鳥",
"age": 5,
"color": "茶色"
}

{
"name": "ニモ",
"type": "魚",
"age": 1,
"water_type": "海水"
}


{
"name": "ミケ",
"type": "猫",
"age": 2
}

{
"name": "チョコ",
"type": "ウサギ",
"age": 1
}


{
"name": "ポチ",
"type": "犬",
"age": 3
}

{
"name": "にゃんこ",
"type": "猫",
"age": 1
}

{
"name": "フグ",
"type": "魚",
"age": 2
}


{
"name": "ポチ",
"type": "犬",
"age": 3
}
{
"name": "タマ",
"type": "猫",
"age": 5
}
{
"name": "チョコ",
"type": "ハムスター",
"age": 1
}


kurehajimekurehajime

こちらが指定してないプロパティを勝手にはやしている。

{
"name": "フクロウ",
"type": "鳥",
"age": 5,
"color": "茶色"
}

{
"name": "ニモ",
"type": "魚",
"age": 1,
"water_type": "海水"
}

あと「3つ」と言ってるのに2つしか出してなかったりする。

kurehajimekurehajime

gpt-4

for i in range(0,5):
  completion = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[
          {"role": "user", "content": """
ペットの情報を以下のようなjson形式で3つ作ってください。
---
{
  name:ポチ,
  type:犬,
  age:3,
}
          """},
      ]
  )
  for cho in completion.choices:
    print(cho.message.content)
  print("---")

{
"name": "ポチ",
"type": "犬",
"age": 3
},
{
"name": "タマ",
"type": "猫",
"age": 5
},
{
"name": "ハチ",
"type": "鳥",
"age": 2
}


{
"name": "ポチ",
"type": "犬",
"age": 3
}

{
"name": "ミケ",
"type": "猫",
"age": 5
}

{
"name": "タロウ",
"type": "ウサギ",
"age": 2
}


{
"name":"ポチ",
"type":"犬",
"age":3
},
{
"name":"ミミ",
"type":"猫",
"age":5
},
{
"name":"タロ",
"type":"ウサギ",
"age":2
}


{
"name": "ポチ",
"type": "犬",
"age": 3
}

{
"name": "タマ",
"type": "猫",
"age": 4
}

{
"name": "モコ",
"type": "うさぎ",
"age": 2
}


{
"name": "ポチ",
"type": "犬",
"age": 3
}

{
"name": "ミミ",
"type": "猫",
"age": 5
}

{
"name": "タロ",
"type": "うさぎ",
"age": 2
}


kurehajimekurehajime

所感

gpt-4なら厳密なフォーマット指定で他システムとの連携ができるんじゃないか?という期待を抱かせる結果となった。
ただこれを1000回やってもちゃんとルールを守ってくれるのか、取り組む課題が複雑化したときも同じ用に振る舞えるのかどうかは分からない。

kurehajimekurehajime

まとめ

gpt-4はgpt-3.5-turboに比べて賢くなっている、というのは周知の事実。
それより重要なのは「gpt-4は、より制御しやすくなっている」という点かも知れない。
これにより他システムとの連携や組み込みが圧倒的にやりやすくなる。