😸
Function callingでダジャレ評価関数を作る
Function callingについて
Chat Completions APIにFunction callingという機能が追加されて、入力テキストから実行する関数とパラメーターを生成できるようになった。
これによって開発者は
- Completions API(1回目)から返された関数とパラメーターを使って独自の処理を実行する
- 処理結果をCompletions API(2回目)に
role=function
にJSONでシリアライズして送信する - APIからの応答テキストをユーザーに返す
というフローが可能になる。
なので、ヘッドレスなChatGPT pluginsのように機能する(LangChainなどで連携方法を試行錯誤していた部分が一部取り込まれたともいえる)。
他の用途としては、「関数とパラメーターを生成」の部分のパラメーターをJSON Schemaとして指定できるので、プロンプトから構造化されたJSONデータで結果を取得できるようになった。
天気情報を応答するサンプル
公式ガイドでは天気情報を取得する外部呼び出しAPIを想定した連携のサンプルがある
1回目のChat Completion APIで
get_current_weather("Glasgow, Scotland", "celsius")
を取得して、外部呼び出し。
2回目のChat Completion APIで結果を
{ "location": "Glasgow, Scotland", "temperature": "72", "unit": "celsius", "forecast": ["sunny", "windy"] }
として送信することで「Glasgowのtemperature 72です」というテキストを返してくれるようになる。
蛇足: 現時点ではドキュメントのコードにミスがあり、以下のようにStep 3を修正すると動作するはず
arguments = json.loads(message["function_call"]["arguments"])
# Step 3, call the function
# Note: the JSON response from the model may not be valid JSON
function_response = get_current_weather(
location=arguments.get("location"),
unit=arguments.get("unit"),
)
DBに実行するSQLを取得して応答するサンプル
またCookbookリポジトリではテキストからSQLを生成して実行するサンプルがある
ダジャレ評価関数
自分は「プロンプトから構造化されたJSONデータで結果を取得できる」という部分を便利に使いたいので、ダジャレを送ると採点と評価をしてくれるプログラムを作ってみた。
(正確には「GPTでダジャレを評価した結果を処理するための関数」ではある)
def run_conversation(input):
content = f"""
ダジャレの面白さをAからEに評価して、評価の理由を論理的にコメントします。
ダジャレ:{input}
"""
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
temperature=0.0,
messages=[
{"role": "user", "content": content}],
functions=[
{
"name": "send_dajare_result",
"description": "ダジャレの面白さをAからEに評価してコメントします",
"parameters": {
"type": "object",
"properties": {
"comment": {
"type": "string",
"description": "コメント内容",
},
"rank": {
"type": "string",
"enum": ["A", "B", "C", "D", "E"],
"description": "評価ラベルです。Aが最高、Eが最低です",
},
},
"required": ["comment", "rank"],
},
}
],
function_call={"name": "send_dajare_result"},
)
message = response["choices"][0]["message"]
result = json.loads(message["function_call"]["arguments"])
print("評価:"+result["rank"])
print("コメント:"+result["comment"])
以下のように実行する。ダジャレはダジャレ・ステーションというサイトに投稿されたものを使わせてもらった。
❯ python main.py こっから近いし、国家拉致開始
評価:A
コメント:このダジャレは、言葉の響きを利用して面白さを生み出しています。『こっから近いし、国家拉致開始』というフレーズは、『こっから近い』という言葉が『国家拉致開始』と韻を踏んでいるため、聞いた人に驚きや笑いを与える効果があります。また、国家拉致という言葉が意外性を持っているため、さらに面白さが増しています。全体的に言葉の組み合わせが巧妙で、聞いた人に印象に残るダジャレです。
References
-
https://platform.openai.com/docs/api-reference/chat/create
- APIに追加されたパラメータの説明が載っている
Discussion