💾

OpenAIのAPIをPythonのコードに組み込みやすいようにしてみた

2024/11/24に公開

はじめに

OpenAIのAPIを呼び出し方についての記事はいくつか発見できましたが、会話の流れをOpenAI側で考慮した返答ができるように連続したAPI呼び出しの記事は見つかりませんでした。自分のような経験値の少ないエンジニアかつAIを組み込んだ開発に興味がある人の参考になればとても嬉しいです。

参考サイト

【作成するチャットボットの特徴】

OpenAIのAPIを使用して以下のような特徴を持ったチャットボットを作成します。

  • ターミナル上でChatGPTへの質問を入力し、返答が得られる。
  • 返答を表示した後は再び入力待ちになる。
  • 今までのやり取りを考慮したChatGPTの返答が得られる。
  • コードを実行してからのChatGPTとの会話はJSON形式で保存される。

【OpenAIAPIの呼び出し方】

import openai

client = openai.OpenAI(api_key = os.environ["OPENAI_API_KEY"])
res = client.chat.completions.create(
      model="gpt-4o-mini",
      messages=[
		       {"role": "system","content": "日本語で返答してください。"}
					 {"role": "user","content": "火星について教えてください"}
			],
)

上記の記述方法でOpenAIAPIを呼び出します。
様々なOpenAIAPIの呼び出し方の記事を読ませてもらいましたが、一番わかりやすかった記事を参考サイトに添付しています。そちらを見ていただけるともっと詳しく説明されているためわかりやすいと思います。

【連続したAPI呼び出しの実現方法】

import os
import openai
import json

data = []

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

client = openai.OpenAI(api_key = os.environ["OPENAI_API_KEY"])

while(True):
    # ファイルを読み込んでJSONとしてパース
    with open('tmp.json', 'r', encoding='utf-8') as pre_ans:
        history = json.load(pre_ans)
        prompt.extend(history)

    msg = input()

    prompt.append({"role":"user","content":str(msg)})

    res = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=prompt,
    )

    print(res.choices[0].message.content)

    # 辞書データの作成
    data.append({"role":"user","content":str(msg)})
    data.append({"role":"assistant","content":str(res.choices[0].message.content)})

    # JSONファイルに書き込む
    with open('tmp.json', 'w', encoding='utf-8') as json_file:
        json.dump(data, json_file, ensure_ascii=False, indent=4)
  • JSONファイルに質問と回答を保存する
  • 保存した履歴をpromptへ追加し、次回のAPI呼び出しで使用する
  • 新しい会話内容をJSONファイルに保存する
    これにより、ChatGPTは過去の会話の文脈を考慮した返答が可能になります。
    このように実装することで、会話の履歴を保持しながら連続したAPI呼び出しを実現できます。
    今回の方法ではJSONファイルを介して会話履歴の保持を行いましたが、コード内の変数dataを使用することでJSONファイルを使用せずに連続したAPI呼び出しを実現することも可能です。

まとめ

ChatGPTの強みでもある会話の文脈を考慮した返答がプログラムに組み込みやすい形にできたので、今度ChatGPTを面白い使い方をしたアプリケーションを作成していきたいと思っています。

Discussion