ChatGPT APIの使い方・文字制限の突破方法について解説
業務効率化公開日:2023年10月17日 更新日:2023年11月2日
2023年3月にChatGPTのAPIがベータ版でリリースされました。※正確にはOpenAIのChat APIですが、本記事では「ChatGPT API」と呼びます。
これによりChatGPTのサービスサイト外でも、ChatGPTと同じような対話が可能になり、様々なサービスでの活用が期待できます。
今回は、ChatGPTのAPIの導入方法、対話の仕方、文字数制限の突破方法について解説します
目次
ChatGPT APIの導入方法・使い方
APIの実行環境の準備
ChatGPTのAPIを使用するためには、OpenAIで発行できるAPIキーを用意する必要があります。
APIキーの発行は、こちらのページからログインし、画面右上の設定画面からAPI発行画面に遷移します。
「Create new secret key」というボタンがあるので、そちらをクリックします。
すると任意の名前を入力するウィンドウが表示されるので、わかりやすい名前をつけます。
最後に「Create secret key」というボタンを押すと、APIキーが発行されます。
続いて、Pythonの環境で実行するためにはOpenAIのライブラリをインストールする必要があります。
以下のコマンドでライブラリをインストールできます。
pip install openai
インストールができたら、APIキーを指定しChatGPTを動かしてみます。
以下のコードは非常に簡易的な、ChatGPTとの対話になります。
import openai
openai.api_key = '----------API Key----------'
response = openai.ChatCompletion.create(
model='gpt-3.5-turbo',
messages=[
{'role': 'system', 'content': 'あなたは登山愛好家です'},
{'role': 'user', 'content': '山梨県にある、初心者におすすめな山を教えてください'},
]
)
print(response.choices[0]['message']['content'].strip())
これで問題なく返答があれば、ChatGPT APIのセットアップは完了です。
APIの「role」と「content」
続いて、今回の検証のための対話を実装していきます。
具体的なコードの紹介の前に、ChatGPT APIに用意されている「role」と「content」について紹介します。
APIに投げるデータはroleとcontentで構成された辞書データをリスト化したものです。
roleにはuser・system・assistantを設定し、それぞれ以下のような役割になります。
- user:ChatGPTにテキストを投げかける時に使う
- system:対話相手の役割を指定する時に使う
- assistant:前提条件を指定する時に使う
またcontentは、サービスサイトと同様、テキストを直接入力します。
先述のコード例だと、
messages=[
{'role': 'system', 'content': '登山愛好家です'},
{'role': 'user', 'content': '山梨県にある、初心者におすすめな山を教えてください'},
]
なので、対話相手の役割は「登山愛好家」で、投げかけたテキストは「山梨県にある、初心者におすすめな山を教えてください」となっています。
また回答は以下のようなコードで取り出すことができます。
response.choices[0]['message']['content'].strip()
上記サンプルコードでは、以下のような回答を得ることができました。
山梨県に初心者におすすめの山としては、以下のような山があります。
1. 釈迦岳(しゃかだけ)
富士山の麓に位置し、初心者でも比較的簡単に登ることができる山です。山頂からは富士山をはじめ、南アルプスや八ヶ岳を望むことができます。
2. 御坂山(みさかやま)
御坂峠にある山で、山頂からは甲府盆地や富士山を眺めることができます。トレッキング感覚で楽しめる山です。
3. 縞枯山(しまかられさん)
南アルプスの中でも比較的低く、初心者にも登りやすい山です。山頂からは南アルプスや八ヶ岳、甲府盆地を眺めることができます。
以上の三つの山は、初心者でも登りやすく景色も素晴らしいです。登山前には必ず天気と装備の確認を行い、安全に登山を楽しんでください。
「assistant」の使い方
次にこの回答をもとに、「他におすすめはありますか?」と聞きたい場合に、assistantのroleを活用します。その理由はChatGPT APIではChatGPTのサービスサイトのように対話の履歴が残らないためです。
イメージとしてはAPIのリクエストごとに、サービスサイト上のNew Chatが作成されるイメージです。
試しにassistantを使わずに、「他におすすめはありますか?」と聞いてみたところ、以下のような回答になりました。
以下に私がおすすめする山や山岳地帯を挙げてみます。
1. 北アルプス – 空気が澄んでおり、山の大きさや雄大さが感じられる場所として知られています。
2. 富士山 – 世界的に有名な山であり、登山家にとっては必修の山でもあります。
3. 縞枯山系 – 関東地方にあり、季節ごとに美しい景色を見せてくれる山岳地帯です。
4. 飛騨山脈 – 長野県と岐阜県にまたがる山岳地帯で、「日本アルプス東山脈」とも呼ばれています。
5. 八ヶ岳 – 長野県と山梨県にまたがる山岳地帯で、四季折々の美しい景色が楽しめます。
これらの山や山岳地帯は、それぞれ魅力的な登山ルートがあります。また、地形や難易度も異なるため、初心者から上級者まで、様々なレベルの登山者が楽しむことができます。
systemのroleで「登山愛好家です」と定義していたおかげで、おすすめの山を紹介してくれましたが、最初の条件である「山梨県」や、2つめの条件である「他に」は無視されてしまいました。
ではassistantのroleに、最初の回答を格納した上で、同じように「他におすすめはありますか?」と聞いた場合、どのような結果になるか確認してみましょう。
以下の例では、最初の回答をanswerという変数に格納しています。
response = openai.ChatCompletion.create(
model='gpt-3.5-turbo',
messages=[
{'role': 'system', 'content': 'あなたは登山愛好家です'},
{'role': 'user', 'content': '山梨県にある、初心者におすすめな山を教えてください'},
]
)
answer = response.choices[0]['message']['content'].strip() ##answerに格納
print(answer)
response = openai.ChatCompletion.create(
model='gpt-3.5-turbo',
messages=[
{'role': 'system', 'content': 'あなたは登山愛好家です'},
{'role': 'user', 'content': '山梨県にある、初心者におすすめな山を教えてください'},
{'role': 'assistant', 'content': answer},
{'role': 'user', 'content': '他におすすめはありますか?'}
]
)
print(response.choices[0]['message']['content'].strip())
こちらのコードで実行した結果が以下です。まずは1つめの回答。
はい、山梨県に初心者におすすめの山はいくつかありますが、以下はその中でも特におすすめの山です。
1. 釈迦ヶ岳(しゃかがたけ):標高1982メートル。山頂から富士山や南アルプスを望むことができ、初心者にも比較的アクセスしや すい山です。
2. 大菩薩嶺(だいぼさつれい):標高2225メートル。一般的な登山コース以外にも、ロープウェイやリフトを利用して手軽に登るこ とができます。
3. 岳南山(がくなんさん):標高1603メートル。山頂からは南アルプスや八ヶ岳が一望できます。特に春の花々が美しいことで知ら れています。
4. 金峰山(きんぽうざん):標高1455メートル。紅葉の時期には美しい紅葉が楽しめることでも有名です。
これらの山は初心者でも比較的安全に登れる山であり、美しい景色や自然を満喫することができます。ただし、登山には十分な準備と安全対策が必要ですので、登山前には必ず情報収集を行い、適切な準備をしていただくようお勧めいたします。
次に2つめの回答です。
はい、他にもおすすめの山があります。
5. 横手山(よこてやま):標高2149メートル。山頂からは富士山や南アルプス、八ヶ岳が一望でき、特に秋の紅葉は美しいことで知 られています。
6. 高尾山(たかおさん):標高599メートル。東京からもアクセスしやすく、初心者にも人気のある山です。山頂にはお寺や神社があり、お参りをすることもできます。
7. 丹沢山地:関東地方の山岳公園であり、初心者から経験者まで楽しめる山が多数あります。代表的な山には相模湖、丹沢大山、奥 多摩などがあります。
8. 富士山(ふじさん):標高3776メートル。初心者から挑戦できるコースもあり、世界遺産に登録されている富士山は、日本を代表 する山の一つです。
これらの山々は、それぞれに魅力的な景色や雰囲気を持っています。初心者でも楽しめる山が多いですが、無理な登山はせず、必ず適切な準備や装備を整えるようにしましょう。
2つめの回答では、最初の条件である「山梨県」が無視されてしまいましたが、「他にもおすすめの山があります」という書き出しや、連番が5から始まっていることから、前回の対話が継承されていることがわかります。
文字制限の突破方法
ChatGPT APIの文字制限
ChatGPTへのプロンプト(投げかけ・命令)や、ChatGPTからの返答には文字制限があります。
プロンプトの文字数制限は4,097トークンで、ChatGPTからの返答と合わせて4,097トークンである必要があります。
文字とトークンの違いですが、文字はそのまま句読点も含めた文字数という理解で問題ありません。
一方でトークンとは、分かりやすく言えば「単語」のことです。
例えば以下の例の場合、「今日」「は」「良い」「天気」「です」で、トークン数は5になります。
このような文字制限は、長文の翻訳や、記事の作成において障壁になってしまうのです。
文字制限の突破方法(プロンプト)
ChatGPTのサービスサイト上では、これらの文字制限を突破する方法がすでにハックされており、同じような方法をコード上で実装することによって、APIを使用しながらでも文字制限を突破することができます。
まずはサービスサイト上での突破方法について紹介します。
プロンプトの制限については、文章を分割した上で冒頭に以下のような一文を追加します。
この一文によって、ChatGPTの返答は「次の入力を待っています」となるので、2048文字を超えた文章をChatGPTに渡すことができるようになります。
これをAPIに落とし込むと以下のようなコードになります。
response = openai.ChatCompletion.create(
model='gpt-3.5-turbo',
messages=[
{'role': 'system', 'content': 'あなたは文章要約のプロですです'},
{'role': 'user', 'content': 'これから文章を渡すので、~(略)~代わりに「次の入力を待っています」と回答してください。※※※本文※※※'},
{'role': 'assistant', 'content': '次の入力を待っています'},
{'role': 'user', 'content': ※※※本文※※※'},
{'role': 'assistant', 'content': '次の入力を待っています'},
{'role': 'user', 'content': ※※※本文※※※ 作業してください'},
]
)
print(response.choices[0]['message']['content'].strip())
プロンプトによって上手くいったり、失敗したりするので、上記の例を参考にプロンプトをカスタマイズしてみてください。
文字制限の突破方法(ChatGPTからの回答)
次にChatGPTからの回答における文字制限を突破する方法を紹介します。
同様に、サービスサイト上での突破方法から紹介します。
サービスサイト上での突破方法は非常にシンプルで、以下のようなプロンプトを追加すればよいのです。
ではこの動作をAPIで実行するためにはどうすればよいでしょうか。
サービスサイト上では文章の終わり方が不自然だと「まだ続きがあるに違いない」と人間の感覚で分かりますが、APIは都度新しいチャットが起動するような仕様であるため、「続きがある場合は◯◯する」という実装をするためには工夫が必要です。
ChatGPTからの回答が文字制限にかかってしまう場合は、次のステップで対処をしていきます。
- 続きがある場合は「続きがあります」と明示させる
- 回答に「続きがあります」という文章があるか確認する
- 続きがある場合はループさせ、ない場合はループを終了する
このステップを実装すると以下のようなコードになります。
ask = '「山梨県の観光地」というテーマで、観光客向けの記事を、見出しを【】でくくり、本文が5000文字以上になるように書いてください。'
ask += 'またもしChatGPTの文字数制限ですべての文章を記述できない場合、「☆続きがあります☆」と最後に一文追加してください。'
msg_list = [
{'role': 'system', 'content': 'あなたは優秀な記事ライターです'},
{'role': 'user', 'content': ask},
]
def askArticle(msg_list):
response = openai.ChatCompletion.create(
model='gpt-3.5-turbo',
messages=msg_list,
)
result = response.choices[0]['message']['content'].strip()
return result
article = ''
While True:
output = askArticle(msg_list)
if re.search(r'☆続きがあります☆', output):
continued = re.sub('☆続きがあります☆', '', output)
article += continued
msg_list.append({'role':'assistant', 'content': continued})
msg_list.append({'role':'user', 'content': '続きを書いてください'})
else:
article += output
break
print(article)
流れとしてはmessagesのリストを引数とした関数を作成し、Whileで「☆続きがあります☆」という文章があるか否かでループを継続させます。
ただしこの方法でも、続きがありそうであるにも関わらず、ChatGPTが「☆続きがあります☆」と記述しない場合もあるので、プロンプトと同様、様々な命令を試してみるのが良いと思います。
まとめ
ChatGPTのAPIが公開されたことによって、更にChatGPTの活用が拡大することが期待されます。
またAPIが利用できるようになったことによって
- 自然な対話システムの開発が進む
- コンテンツ生成の自動化が進む
- 人工知能の普及が進む
など、様々な副次的な効果がありそうです。
企業が導入しているチャットボットも、裏側は全てChatGPTという世界も間もなくなのではないでしょうか。