LoginSignup
2
10

ChatGPT API + Function Callingで学習データ不要のカテゴリ推定

Last updated at Posted at 2023-06-27

ChatGPT API の Function Calling機能

OpenAIが提供しているChatGPT APIに、Function Calling機能が実装されました。

説明によると、Function Callingは、他のAPIとの連携を想定して、その(json)フォーマットのパラメータを入力テキストから推定してくれる、というものであるとされています。しかし、エンジニアリング・テキスト処理の観点からみると、あるフォーマットを与えると、それに即したいくつかの変数をChatGPT APIが返してくれるという、出力の形式が安定するというところにこそ、この機能の大きな価値があるように思えます。

今までのChatGPTでは、(APIを使ったとしても)出力される文字列の形式を指定することはできませんでした。プロンプトの工夫によって、多くの場合にこちらが返してほしい形式で出力されるようにする様々なノウハウが考案されてきましたが(いわゆるプロンプト・エンジニアリングの一部)、ChatGPTが本質的には大規模言語モデル(LLM)である以上、それが行っているのはあくまで次に来る文字列の推定であり、確率的な挙動を排除することはできませんでした。この点、(恐らくOpenAIが開発したChatGPTの外側の機能によって)定形出力が可能になったことで、後続のシステムに繋げる安定性が格段に向上しました。

学習データ不要のカテゴリ推定

前置きが長くなってしまいましたが、Function Calling機能の中でも enum という型を利用することで指定した文字列の中から出力することができ、これを利用してカテゴリ推定機能の作成が可能です。

categorize.py
import openai

openai.api_key = YOUR_API_KEY

schema = {
    "type": "object",
    "properties": {
        "mode": {
            "type": "string",
            "enum": ["国内", "国際", "経済", "エンタメ", "スポーツ", "IT", "科学", "地域"],
            "description": "ニュースが属するカテゴリ",
        },
    },
    "required": ["mode"]
}

completion = openai.ChatCompletion.create(
    model="gpt-3.5-turbo-0613",
    messages=[
        {"role": "user", "content": "ニュース:国交省、航空局長を戒告処分"}
    ],
    functions=[
        {
            "name": "categorize_news",
            "description": "ニュースのカテゴリを推定",
            "parameters": schema
        }
    ],
    function_call={"name": "categorize_news"},
    temperature=0.9,
)

print(completion.choices[0].message.function_call.arguments)

出力

{
  "mode": "国内"
}

簡単なサンプルとして、Yahoo!ニューストピックスの見出し(タイトル)から、そのトピックスのカテゴリを推定する推定器を作成してみました。"messages"の"content"にタイトルを入力すると、"schema"中の"enum"に列挙した文字列の中からそれらしいものを推定してくれます。

通常こういったカテゴリ推定器を作成するにはデータ(コーパス)が大量に必要だったり、独自のカテゴリ(ラベル)を定義したい場合には人手でアノテーションしていく必要がありますが、ChatGPT APIに投げることでデータ不要でこうした機能を作成することができました。しかも、"enum"で列挙したラベルについて特に補足説明はありませんが、ChatGPTがその文字を読み取って、「いい感じに」分類してくれていることになかなか驚かされます。

今回は手軽にカテゴリ推定器を作る方法の紹介のため、厳密な精度検証は行いませんが、最後にいくつかの入力・推定カテゴリ・正解カテゴリの例を記載します。学習データ不要でこれだけ簡単に、かつどんなカテゴリにも適用できてしまう(少なくとも機能としては)という自由度の高さを考えても、悪くない性能なのではないかと思いますがいかがでしょう。

トピックスタイトル 推定カテゴリ 正解カテゴリ
国交省、航空局長を戒告処分 国内 国内
スウェーデンのNATO加盟 協議へ 国際 国際
退職者は戦力 人手不足に企業活路 経済 経済
モバイルSuicaの障害 原因明かす IT IT
日中に熱が蓄積 夜の熱中症に注意 国内 科学
トラックにはねられ2人死傷 千葉 国内 地域
大谷「三塁打王」も射程圏内に スポーツ スポーツ
モー娘。新メンバーにファン歓声 エンタメ エンタメ

お気付きの点がありましたらコメントにてよろしくお願いします。

2
10
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
10