PythonとChatGPT APIを使ったプログラムを書いてみたので、備忘録として残しておきます。
何を作ったの?
PythonとChatGPT APIを使って、簡単な対話や要約を作成(共に1往復のやりとり)するプログラムを作りました。
回答作成後、自動でMarkdownのデイリーノートに追記する形で保存しています。
Web版のChatGPTじゃダメだったの?
回答をメモ帳に貼り付けるのが面倒だったので、API版で手間を減らすようにしました。
また、Web版だと最初と最後に余計なコメントがあるのもネックでした。
API版だと最低限の回答しか来ないので、コメントを削除する手間が省けます。
プログラム概要
ORGANIZATION = "Organization_Keyを入れる"
API_KEY = "API_Keyを入れる"
from dotenv import load_dotenv
import os
load_dotenv()
ORGANIZATION = os.getenv("ORGANIZATION")
API_KEY = os.getenv("API_KEY")
import openai
import os
import datetime
import setting
# Open AIキー
openai.organization = setting.ORGANIZATION
openai.api_key = setting.API_KEY
# OpenAi呼び出し
def open_ai(q):
message = [
{"role": "user", "content": q},
]
response = openai.ChatCompletion.create(
# model="gpt-3.5-turbo",
model="gpt-4",
messages=message,
max_tokens=1000,
n=1,
)
return response
# ファイル書き込み
def write_file(ra):
with open(file_path, mode="a", encoding="UTF-8") as f:
timestamp = datetime.datetime.now()
body = question + "\n" + ra.choices[0]["message"]["content"].strip()
f.write(template.format(timestamp, body))
# 基本設定
save_dir = f"{os.environ['GoogleDrive']}\\Knowledge\\Lifelog\\journals"
file_name = f"{datetime.date.today():%Y-%m-%d}.md"
file_path = os.path.join(save_dir, file_name)
timestamp_format = "%H:%M"
template = "\n**{:" + timestamp_format + "}**\n\t{}"
# 実行
question = input()
result_ai = open_ai(question)
write_file(result_ai)
大まかな流れ
pip install python-dotenv
でdotenvをインストール- .envファイルに設定してあるOpen AIキーをsetting.pyで読み込み→反映
- 保存ディレクトリ・メモ帳に保存するフォーマット(私はLogseqのデイリーノートを指定)を決める
- 質問を書き込む
- Open AIを起動
- テキストファイルに書き込む
プログラム詳細説明
Open AIのAPI取得
下記のサイトから、API接続に必要なキーを入手します。
入手したら.env
ファイルに書き込み、settingファイルを経由して本プログラムに送るようにします。
この形式だと.env
ファイルのみgitignoreすれば漏れないのと、他のChatGPTプログラムと設定を共有できるので(修正が1か所に済む)こちらを採用しました。
ついでにこの時点でOpenAIに課金しておくと後々スムーズになるかもしれません。
トークンは事前購入式(オートチャージ・上限設定あり)なので注意してください。
Billing overview OpenAI API
ファイル保存ディレクトリ・記載フォーマットを決める
この部分はお好みでどうぞ。
私はGoogleドライブにあるLogseqのデイリーファイルに保管しているのと、保存時に時刻も一緒に挿入しています。
詳しくは同じファイル・形式を採用しているメモアプリの記事を見てもらえると非常に助かります。
質問を書く
input()で質問を手動で書く形式にしています。
ここで入力した質問は、後述するopen_ai
関数に引き渡すようにします。
Open AI呼び出し
open_ai
関数で実行しています。
変数message
で質問者(ユーザー)もしくは回答者(ChatGPT)のテキストとロールを決める必要がある点に注意。
今回は回答が1往復であること・回答者の回答テンプレが不要なので、ユーザー側のみ設定を行っています。
(最低でもユーザー側の設定しないとエラーを吐きます)
inputで書いた質問をmessage変数に引き渡し、openai.ChatCompletion.create()
でChatGPT APIを実行します。
openai.ChatCompletion.create()の設定項目
- model:ChatGPTのバージョンモデルの指定(3.5と4の両方を記載、片方をコメントで消去)
- messages:変数messegeの設定を読み込む
- max_tokens:回答の上限文字数
- n:回答のバリエーション・ここを2以上にすると、回答のバリエーションを2以上にする
回答を変数response
に入れて、それを変数result_ai
にreturnします。
Markdownファイルに保存
ファイルを開いて書き込みます。
「時刻+質問内容+回答」の形式で書き込む設定にしてあるので、ここはお好みで変更してください。
ra.choices[0]["message"]["content"].strip()
で返答コンテンツのみ取得し、ファイルに保存します。