2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PythonでちょっとChatGPT APIを使いたい時にちょうどいいclassを作った

Posted at

 まだChatGPT APIを使っていろいろ試してるんですが、そろそろAPI呼び出し部分をちゃんとclassでまとめるかと思って作ったコードをChatGPTにコードレビューさせて以下の形になりました。

 なお、このClassは単発の会話用なので、会話のラリーをしたい場合は適切に会話履歴を保存するようにして下さい。(そのメソッドも作ろうとしたけど、面倒くさくなって辞めちゃった。)

ソースコード

secret.json
{
    "OPENAI_API_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
chatgpt_text_gen.py
# ChatGPT APIを呼び出してテキストを生成するプログラム
import json
import openai
from typing import Optional

# ChatGPT APIを呼び出してテキストを生成するクラス
class ChatGPT:
    # 初期化時にはAPIキーをJSONファイルから読み込む
    def __init__(self, secret_file: str = "secret.json") -> None:
        # JSONファイルからAPIキーを読み込む
        try:
            with open(secret_file) as f:
                secrets = json.load(f)
                openai.api_key: str = secrets.get("OPENAI_API_KEY")
        except Exception as e:
            print(f"Error loading API key: {e}")
            return
        # 使用するモデルを指定
        self.model = "gpt-3.5-turbo"

    # プロンプトからテキストを生成
    def generate_text(
            self, 
            prompt: str, 
            max_tokens: Optional[int] = 100
            ) -> str:
        # messagesを作成
        messages = [{"role": "user", "content": prompt}]
        # OpenAI APIを呼び出してテキストを生成
        try:
            response = openai.ChatCompletion.create(
                model=self.model, 
                messages=messages, 
                max_tokens=max_tokens)
            return response.choices[0].message.content
        except Exception as e:
            print(f"Error generating text: {e}")
            return ""
        
    # ファイルから固定部分のプロンプトを読み込み、追加のテキストと結合してテキストを生成
    def generate_from_file(
            self, 
            filepath: str, 
            additional_text: str, 
            max_tokens: Optional[int] = 100
            ) -> str:
        # ファイルからプロンプトを読み込む
        try:
            with open(filepath, 'r', encoding="utf-8") as f:
                file_prompt = f.read()
        except Exception as e:
            print(f"Error loading file: {e}")
            return ""
        # ファイルの内容と追加のテキストを結合
        full_prompt = file_prompt + additional_text
        # 結合したプロンプトを使ってテキストを生成
        return self.generate_text(full_prompt, max_tokens)

 私はAPIキーはsecret.jsonで保存する派なので、環境変数から読み込む派の人はその辺書き換えてください。(環境変数から読み込む方がセキュリティ的に良いです。)

使い方

 入力文章をそのままChatGPT APIに送る場合はgenerate_textメソッドを使う。

from chatgpt_text_gen import ChatGPT

chat_gpt = ChatGPT()
print(chat_gpt.generate_text("AIについて30文字以内で説明して下さい"))
AIは人工知能のことで、機械が自ら学習や判断を行い人間に代わってタスクを遂行する技術の総称です。

 ChatGPT APIの役割が決まっている場合は読み込むファイルに役割を書いてgenerate_from_fileメソッドを使う。

prompt.txt
次の文章を日本語訳してください:
from chatgpt_text_gen import ChatGPT

chat_gpt = ChatGPT()
additional_text = "Hello, how are you?"
print(chat_gpt.generate_from_file('prompt.txt', additional_text))
こんにちは、お元気ですか?

 近々このclassを使って作ったクソアプリの記事を書きます。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?