0. 時間とコストを節約するデータセットの構築: ChatGPTを使用してデータラベリングする
人工知能モデルをトレーニングするためには、'問題'と'答え'のペアで構成されたデータセットが必要です(教師あり学習の基準)。
このとき、データに答え、つまりラベルを付けることを 'ラベリング' と呼びます。
1. データの重要性、良質なデータとは?
直接AIモデルを開発している方々はおそらく、"データがすべてだ"と感じることが多いでしょう。
もちろん、優れたAIモデルを作るためには最新のアルゴリズム、高性能コンピューティングなど重要な要素がさまざまあります。
しかし、読者がAIおよびデータ関連のジュニアである場合、まずデータの価値に注目することが賢明な選択だと思います。高品質のデータのようなものです。
'質の良い' データとは何でしょうか?なぜ重要なのでしょうか?
最新のAI技術はほとんどが人工ニューラルネットワークベースのディープラーニングモデルであると見なしてもよいでしょう。
この人工ニューラルネットワークは人間の学習方法を模倣しています。
生まれたばかりの赤ちゃんが 'ママ' という言葉を口にするまで
ママをママと呼ぶこと -> 質の良いデータ(正確なラベリング)
何度も目撃したことでしょう。 -> 多くのデータ
ママをパパと呼ぶ場合 -> 質の悪いデータ(不正確なラベリング)
赤ちゃんは非常に混乱するでしょう。
時間が経つにつれ、赤ちゃんは '私を生んでくれて世話をしてくれて、抱っこしてくれるこの人' を 'ママ' と呼ぶべきだと学ぶ。 -> パターン学習
データから意味のあるパターンを学習すること、これが人工知能モデルの学習の核心です。
これを容易にするのが、まさに良質のデータです。
良質のデータはAIモデルにとって優れた先生です。
2. ChatGPTにラベリングを任せる理由
先ほど、データの量と質が重要であると述べました。
ただし、多くのデータに良いラベルを付けることは継続的に神経を使う反復作業であり、単調で退屈な作業です。
そのため、政府機関をはじめ多くの企業は外部業者や短期パートタイマーにデータラベリング業務を委託することがよくあります。
ここでハッシュスクラッパーが経験したところ、さまざまな問題に必然的に直面することになります。
**第一に、質の良いデータを保証できない。
**AIモデル開発者が描くAIモデルの方向性があり、
その方向に適したデータラベリングの基準があります。
この基準をラベラーに詳細に伝えても、ラベラーごとにばらつきがあるかもしれず、
1人のラベラーがひとりで作業をしていても、反復作業中に集中力が落ちることもあります。
人間なので完璧な一貫性を持つことは難しいでしょう。 (*ヒューマンエラー発生)
*第二に、多額のコストがかかる。
*加工しなければならないデータの量が多いほど、短時間でデータセットを構築しなければならないほど、より熟練された、より多くの労働力が必要になるでしょう。
ChatGPTを使用したデータラベリングも完璧ではないだけでなく、問題が厄介なほどプロンプトの作成に苦労することもあります。
しかし、コスト削減、時間短縮、一貫性の観点から非常に効果的であることは誰もが認めるでしょう。
また、関連する職種の従事者であれば、巨大な言語モデルと親しみ、言語モデルと対話する方法を必ず習得する必要があると考えます。
今後、プロンプトエンジニアリングは業務効率のための基本的なスキルとなることが予測されています。
3. ChatGPTでデータラベリングする
感情分析データセットを作成すると仮定してみましょう。
3.1 OpenAIのAPIキーを取得する
この投稿ではウェブでラベリングを行わず、ChatGPTのAPIを活用してみます。
まず、以下のリンクからOpenAIにログインし、API呼び出しの支払い方法を登録する必要があります。
https://platform.openai.com/
その後、APIキーをダウンロードする必要があります。
APIキーを生成したら、必ず別途保存しておく必要があります。
一度しか表示されないため、忘れると再生成する必要があるため、注意が必要です。
3.2 プロンプトの作成
text = '맛있는 거 먹어서 기분이 너무 좋다.' # 감정 분석 대상 텍스트
prompt = f'''You're an assistant, labeling data on a consistent basis.
Label the given text with one of the following sentiments: Positive, Negative, or Neutral.
If you can't determine a sentiment, label the text as Neutral.
Do not enclose your output in double or single quotes, just the label.
Follow the example to analyze the sentiment.
given text: 나 너무 우울해
sentiment: Negative
given text: 오늘 아침 일찍 출근했다.
sentiment: Neutral
given text: {text}
sentiment: '''
ここでいくつかのプロンプトの作成に関するヒントがあります。
- 英語で作成
2023年8月時点では、言語モデルにはトークン数の制約があります。
無制限に長い質問をすることはできず、トークン数が増えるほどコストがかかります。
ChatGPTは英語に対するトークン効率が最も良いです。
簡単に言えば、同じ質問をしても英語で質問するとコストが少なくなります。
また、結果を比較したとき、ChatGPTは英語に対する性能が最も優れていることが証明されています。
- ChatGPTに役割を与える
プロンプトを作成する前に、ChatGPTに従うべき指示を与える
- 例を提供する
出力の形式や方法に関するガイドを提供すること
これはFew-shot Learningとも呼ばれます。
- 詳細でありながら、明確に記述する
これはトークン効率を向上させるためと同時に正確な回答を促すためで、
詳細な説明をしつつ、できるだけ簡潔で明確に記述します。
上記の内容を参考にしてプロンプトを作成してください。
3.3 API応答をリクエストする(パラメータ設定)
response = openai.ChatCompletion.create(
model='gpt-3.5-turbo',
temperature=0,
messages=[
{"role": "user", "content": prompt}
]
)
sentiment = response.choices[0].message['content']
print(f'문장: {text}\n감정: {sentiment}')
문장: 맛있는 거 먹어서 기분이 너무 좋다.
감정: Positive
コードをそのまま実行すると同じ結果が確認できるでしょう。
いくつかのパラメータについて以下の説明を参照すると良いでしょう。
- temperature
最も重要なパラメータです。
このパラメータはモデルの応答の多様性を制御します。
temperatureが高いほど多様で創造的な回答をし、temperatureが低いほど一貫した回答をします。
私たちは 'データラベリング' を行うので、これを0(最低値)に設定してみましょう。
言語モデルは回答を生成する際、さまざまな回答に対して確率を計算します。
'temperature=0' とは、生成された回答の中から最も確率の高い回答を選択することを意味します。より複雑な他の質問を繰り返してみれば、理解できるでしょう。 'temperature=0' だと、同じ回答しか繰り返すことになります。
また、私たちが ウェブでデータラベリングを行わなかった理由 は以下の通りです。
1) 多くのデータをラベリングするには反復作業のためのコーディングが必要です。
2) 私たちが使用するChatGPTのtemperatureは特定の値に設定されており調整できません。
- messagesのrole: user, assistant, system
ここでは 'user' メッセージのみを作成しましたが、実際には 'user', 'assistant', 'system' の3つがあります。
'user' メッセージには、ユーザーがChatGPTにしたい質問や指示を記入してください。
'assistant' メッセージは、ChatGPTが以前の会話内容を参照するためのメッセージです。
私たちがウェブでChatGPTと会話していると、ChatGPTが前の会話内容を覚えながら会話していることがわかります。これが可能なのは、ユーザーが質問する際に前の会話内容もChatGPTに一緒に伝えられるためです。したがって、データラベリング作業では不要です。
'system' メッセージは、ChatGPTの行動形式を指定します。
私たちは 'user' メッセージでChatGPTの役割を与えましたが、この内容は 'system' メッセージに書いても構いません。ただし、このような簡単なラベリング作業では、別途systemメッセージを書く必要はありません。
3.4 大量のデータをラベリングする場合は?
ここまでの手順では、1つのデータに対するラベリングを示しました。開発力がある程度あれば、大量のデータを繰り返しラベリングすることは大きな難しさではないでしょう。
ただし、注意すべき点は API呼び出し時のエラーに対する例外処理 をうまく行うことです。
短時間で過剰な呼び出しがあったり、ネットワーク接続が良くない場合など、エラーが頻繁に発生するため、これらを例外処理することで安定したラベリングを行うことができます。
def sentiment_analyze(text):
prompt = f'''You're an assistant, labeling data on a consistent basis.
Label the given text with one of the following sentiments: Positive, Negative, or Neutral.
If you can't determine a sentiment, label the text as Neutral.
Do not enclose your output in double or single quotes, just the label.
Follow the example to analyze the sentiment.
given text: 나 너무 우울해
sentiment: Negative
given text: 오늘 아침 일찍 출근했다.
sentiment: Neutral
given text: {text}
sentiment: '''
try:
response = openai.ChatCompletion.create(
model='gpt-3.5-turbo',
temperature=0,
messages=[
{"role": "user", "content": prompt}
]
)
sentiment = response.choices[0].message['content']
return sentiment
except:
sentiment = 'error'
return sentiment
df['label'] = df['text'].apply(sentiment_analyze)
4. コストはいくらか?
2023年8月時点で、主に使用されているモデルは 'gpt-3.5-turbo' と 'gpt-4' です。
例示した感情分析のような単純な分類データセットを作成するには、3.5モデルで十分です。
'gpt-3.5-turbo' では、ユーザーの質問の場合、1,000トークンあたり0.0015ドル、
gptの応答の場合、1,000トークンあたり0.002ドルのコストがかかります。
上記の例で使用したプロンプトの場合、約200トークン程度しかありません。
簡単な計算で、3ドルで約1万件の感情分析データセットをラベリングできます。
ただし、より複雑な問題を扱う場合は、プロンプトもより具体的で複雑になり、3.5モデルを使用することには限界があるかもしれません。
このとき、gpt4モデルを活用して解決できることが多いですが、コストが20〜30倍かかることを考えると、慎重な決定が必要でしょう。
5. 結論
単純な反復作業のラベリングであれば、コストとパフォーマンスを考慮すると、ChatGPTの使用にためらう必要はありません。ただし、GPT4モデルを使用するほど複雑な業務を任せる場合は、コストについて十分な検討が必要です。
テキストデータに限定される方法であること、OpenAIの価格政策に依存する必要があること、ラベリングされたデータでGPTモデルのパフォーマンスを上回るAIモデルを作ることが難しいことなど、欠点もあります。
しかし、オープンソースコミュニティでも急速に進化しており、これらの欠点は近い将来解決される可能性があると予測されます。
テキストデータセットを構築する際、今では




