ChatGPT APIにDeepL APIを組み込んでトークンを節約する

ChatGPT APIにDeepL APIを組み込んでトークンを節約する

こんにちは!TechJourneyを運営している学生エンジニアの今井宏輔と申します。

今回は、ChatGPT APIを使用する際にDeepL APIも組み込むことで、コストを削減する仕組みついてまとめていきます。

そして、私が実際に個人開発でPythonとDjangoを用いて実装している一部分も後半に載せているので、ぜひ最後までご覧ください!

ChatGPTにDeepLを組み込んでコストを削減

ChatGPT APIは、どんなアプリケーションに組み込むのか、使用方法などによってコストが変わってきます。

まずは、ChatGPT APIの使用料金の計算方法と、なぜDeepL APIを採用したのかを解説していきます。

ChatGPT APIの使用料金の計算方法

ChatGPT APIの使用料金の計算方法

ChatGPT APIの料金は、主に使用するトークンの数に基づいています。

トークンとは、単語や句読点などのテキスト単位を指し、APIへのクエリや応答の長さが多ければ多いほど、消費されるトークンの数も増えます。

料金計算の基礎は、APIを通じて処理されるトークンの総数に依存するため、効率的なクエリの構築と適切な応答の長さの設定がコスト削減の鍵となります。

ChatGPT APIのトークンの計算

英語は1単語1トークンとして計算できます。

ひらがなとカタカナも1文字1トークンです。

しかし、漢字は1文字に対して2、3トークンを使用します。

なぜDeepL APIを組み込むのか

DeepL APIを組み込む理由は、ChatGPT APIのプロセスを日本語ではなく英語で行った方がコストを削減することができるからです。

ChatGPT APIのトークンの計算

例えば、「今日は天気がいいですね」(英語:”The Weather is nice today”)というフレーズを考えてみましょう。

日本語でトークンを計算した場合は15トークンですが、英語の場合は5トークンになります。

このように英語の方が言語の構造上、アルファベットで全て表現ができるので、結果としてトークンの使用量が減少する傾向にあります。

この具体例では、とても短い文章でしたが、実際に使用していったときのトークン量の差を考えるだけで恐ろしいです。

実装前の準備

ChatGPTとDeepLを組み合わせて使用する前に、いくつかの準備が必要です。これらのステップを慎重に実行することで、開発プロセスがスムーズに進行し、後で予期せぬ問題が発生するリスクを減らすことができます。

APIキーの取得

これらのAPIキーは、後の実装で必要となるので、安全な場所に保管します。

  • OpenAI APIキーの取得: ChatGPT機能を使用するためには、OpenAIからAPIキーを取得する必要があります。OpenAIの公式ウェブサイトにアクセスし、アカウントを作成した後、APIキーを発行してください。
  • DeepL APIキーの取得: 同様に、DeepLの翻訳機能を利用するためにはDeepLのAPIキーが必要です。DeepLの公式ウェブサイトでアカウントを作成し、APIセクションからキーを取得します。

環境の設定

本プロジェクトはPythonを使用して開発しています。pipを使用して必要なライブラリ(django, openai, deepl)をインストールします。

pip install django openai deepl

ChatGPTにDeeoLを組み込んで実装

ChatGPTにDeepLを組み合わせることで、トークンを節約できます。

実際に、Djangoフレームワークを使用して、この組み合わせを実現する方法を詳しく説明します。

ユーザーからのメッセージを受け取り、それを英語に翻訳してChatGPTに送信し、得られた応答を日本語に戻して返送するAPIを実装します。

APIキーのセットアップ

まず、OpenAIとDeepLのクライアントを初期化します。これには、事前に取得したAPIキーを使用して、各APIクライアントのインスタンスを作成します。

client = OpenAI(api_key=settings.OPENAI_API_KEY)
translator = deepl.Translator(settings.DEEPL_AUTH_KEY)

ここで、settings.OPENAI_API_KEYsettings.DEEPL_AUTH_KEYは、Djangoのsettings.pyファイルに保存されたAPIキーを指します。これにより、APIキーをコード内に直接書くリスクを避け、セキュリティを強化しています。

メッセージの受信と翻訳

Djangoビューは、@csrf_exempt@require_http_methods(["POST"])デコレータを使用して定義されます。これにより、外部からのPOSTリクエストを受け取ることができ、CSRF保護を無効にすることが可能になります。

@csrf_exempt
@require_http_methods(["POST"])
def gpt_query(request):

リクエストボディからユーザーメッセージを取得し、それをDeepL APIを使用して英語に翻訳します。これにより、ChatGPTが理解しやすい形式に変換されます。

data = json.loads(request.body)
user_message = data.get('message')
translated_message_to_english = translator.translate_text(user_message, target_lang="EN-US")

ChatGPTへのクエリ送信

翻訳されたメッセージを使用して、ChatGPT APIにクエリを送信します。ここでは、model="gpt-3.5-turbo"としてモデルを指定し、トークンの最大数を15に制限しています。

response = client.chat.completions.create(model="gpt-3.5-turbo",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": translated_message_to_english.text}
    ])

応答の翻訳と返送

ChatGPTからの応答を受け取った後、それを再びDeepLを使用して日本語に翻訳し、最終的な応答をJSON形式でクライアントに返送します。

translated_response_to_japanese = translator.translate_text(response.choices[0].message.content, target_lang="JA")
return JsonResponse({"reply": translated_response_to_japanese.text})

エラーハンドリング

プロセス中に何らかの例外が発生した場合、エラーメッセージを含むJSONレスポンスをクライアントに返送します。

except Exception as e:
    return JsonResponse({"error": str(e)}, status=400)

この実装により、ChatGPT APIに送信するクエリは英語でありトークンを節約しながら、実際のアプリケーション上では日本語でコミュニケーションすることが可能になります。

コード全体

以上のことを踏まえると、ChatGPT APIとの通信にDeepL APIを組み込んだコードの全体は次のようになりました。

from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
from django.conf import settings
import json
from openai import OpenAI
import deepl

client = OpenAI(api_key=settings.OPENAI_API_KEY)
translator = deepl.Translator(settings.DEEPL_AUTH_KEY)

@csrf_exempt
@require_http_methods(["POST"])
def gpt_query(request):
    try:
        # リクエストボディからクエリを取得
        data = json.loads(request.body)
        user_message = data.get('message')

        if user_message is None:
            return JsonResponse({"error": "Message key is missing from request."}, status=400)

        translated_message_to_english = translator.translate_text(user_message, target_lang="EN-US")

        # OpenAI APIにクエリを送信
        response = client.chat.completions.create(model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": translated_message_to_english.text}
        ])

        translated_response_to_japanese = translator.translate_text(response.choices[0].message.content, target_lang="JA")

        # 応答メッセージを取得して返送
        return JsonResponse({"reply": translated_response_to_japanese.text})
    except Exception as e:
        return JsonResponse({"error": str(e)}, status=400)

まとめ

この記事では、ChatGPT APIの使用料金の計算方法を理解し、特にトークン使用量の重要性について触れていきました。

そして、実際にDeepL APIを組み込んだ実装について、そのプロセスを解説したのでイメージが湧いたんじゃないかなと勝手ながら思っています。

ChatGPT APIについての情報がどんどん更新されており、自分自身この実装ができるのにも数日かかってしまいました。

私は引き続き、LLMを有効活用したWebアプリケーションの個人開発に取り組んでいきます。