AI
2023/11/17
上田 裕大

Whisper、ChatGPT、Google DriveのAPIを使って議事録を自動生成してみた(part1: ChatGPT APIの導入編)

chatGPTのロゴ

音声データから議事録を自動生成するアプリケーションを複数のapiを組み合わせて実装を行っています。今回はその中で使用したGPTのAPIを使う部分について紹介します。

はじめに

今回は複数のAPIを使って議事録の自動生成を行いました。Whisper編は以下のページで紹介しているので参照してください。今回はWhisperによって音声をそのまま文字起こししたテキストデータができた後の内容について扱います。この記事では議事録生成に対する使用方法ではなく、あくまでAPIの使い方というところに焦点を合わせて紹介します

ChatGPT APIについて

ChatGPT APIは、先日(2023年11月)新しいモデルが出たことで話題のChatGPTを手元のコードから実行できるサービスです。料金体系は以下のようになっています。使用するモデルごとに費用と取り扱える文書のサイズに違いがあります。



トークンとは

ChatGPT APIは、文章の長さがトークンと呼ばれる単位でカウントされ、その量を基準に料金が算出されます。単位単語あたりのトークンは言語によって大きく異なり、英語の場合は1つの単語で1トークンですが日本語では1文字に対して複数のトークンがかかることもあります。下記のような短い文章でもtoken数が変動してしまうことがあるので注意しましょう。




最大トークン数

その名の通り、そのモデルに送ることのできる最大トークン数です。注意しなければいけないのは、入出力の合計の最大値ということになります。つまり、不用意にモデルに合わないような大きなサイズのプロンプトを入力として与えてしまうと、出力が意図せず短くなってしまうことになるので注意しましょう。APIを使用する時は必ず入力トークン数を計算してからモデルが適切かを考える必要があります。


なお、上記の画像のようにWebアプリケーションを使用する他にもpython内で数える方法もあります(後述)。

準備

下記のようにモジュールのインストールを行い、OpenAIのAPIキーを用意します。



import openai
import tiktoken
openai.api_key = "Your API key"

プロンプトのフォーマット

プロンプトはroleとcontentという鍵を持った辞書のリストとして与えます。roleはその辞書がどのような機能を果たすのか、contentは内容を表します。roleは3種類で機能は以下のようになります。



  1. system: 与えるプロンプト全体がどのようなフレームワークを持てばいいのかを記述します。例えば、議事録生成の場合では生成する議事録のフォーマット等がここで記述します。

  2. user: 我々がChatGPTに投げかけたい質問をここに記述します。このため、プロンプトの最後はこのroleのメッセージとなります。

  3. assistant: このロールはuserと対となっていて、ChatGPTによる返答を記述します。返答の具体的な例や考え方などをChatGPTに示すために使用します。



system_messages = [
{
"role": "system",
"content": "You are a professional translator.",
},
{
"role": "system",
"content": "You translate English to Japanese with correct grammer.",
},
{
"role": "user",
"content": "The sky was blue.",
}
]


この例ではassistantメッセージについては使用せず、最低限の構成となっています。


プロンプトをどれだけ上手く作るかがChatGPTに所望の返答を生成させられるかの全てです。以下では、精度向上のよく知られた手法について軽く説明します。


 


精度を上げるためには


1. アシスタントメッセージの利用


欲しい出力をシステムメッセージのみで表現することは現実的ではありません。モデルの解釈と我々の解釈が一致していない場合も多くあります。そのような場合に、具体的に質問とその回答のサンプルをモデルに与えることで性能が向上する可能性があります。


2. 回答の生成を段階的に行う


入力から出力を構成する過程が複雑であるような場合などでは、具体的にどのような過程を踏めばいいかをユーザー側で指示することで性能が向上する可能性があります。出力を作る過程の部分を人間側で決めることで出力の幅を抑えているということです。よく計算問題をChatGPTが苦手であるという議論において、解決する方法として知られています。数学という広い枠組みの中で使うものの指定は人間がある程度行うことで、正しい答えを導きやすいということです。

プロンプトをChatGPTに渡して答えを出力する

出力生成


作成したプロンプトと使用するChatGPTのモデル名を以下の関数の引数に与えるだけです。


モデル名についてはOpenAIのページを参照してください。



def text_to_minutes_gpt(gpt_prompt, gpt_model):
response = openai.ChatCompletion.create(model=gpt_model, messages=gpt_prompt)

return response["choices"][0]["message"]["content"]


 


API使用時のトークン数について


モデルを最大限活かした出力を生成するには十分なトークン数を残す必要があり、入力トークン数をあらかじめ数えた上でモデルを選択することが好ましいです。冒頭の画像のようにWebアプリケーションを使って数える他にも以下のようにpythonのtiktokensモジュールを使って計算することもできます。


ここでは最大トークンの7割以上のトークン数の場合にエラーをはくような形にしています。




import tiktokens
import sys

def count_input_tokens(model, messages):
max_tokens = {"gpt-3.5-turbo-16k": 16384, "gpt-4": 8192}
tiktoken_encoding = tiktoken.encoding_for_model(model)
input_text = "\n".join([f"{msg['role']}:{msg['content']}" for msg in messages])
token_num = len(tiktoken_encoding.encode(input_text))

if token_num > max_tokens[model] * 0.7:
print("Too much input for this model.\n")
sys.exit(1)

最後に

今回はChatGPTのAPIの使い方を説明しました。ここまで、音声データから議事録を生成する部分までできました。次回はこの入出力をGoogle Drive APIを使ってGoogle Driveから音声データをとってきて、アップロードするという部分について紹介します。

New call-to-action