GPT4 TurboのUnicodeバグの対処法

本記事では、Azure OpenAI のGPT4 Turbo(1106-preview)バージョンで発生するUnicodeバグについて検証を行い、解決策について解説しています。

はじめに

検証目的

GPT4 Turboの1106-previewバージョンで、function callingを使用したときにおかしな挙動に遭遇したので、検証してみました。

バグが発生するモデル

Microsoftのドキュメントによると、1106-previewの次のモデルである0125-previewは「英語以外の言語の UTF-8 処理に関する gpt-4-1106-preview のバグにも対処しています。」と記載があります。

そのため、GPT4の1106-previewバージョンは英語以外の言語を使用した場合の動作に問題がある可能性があります。 learn.microsoft.com

検証環境

  • 使用言語
    • Python:3.10
  • パッケージ

検証内容

GPT4(1106-preview)でfunction callingを使用してみて、どのようなプロンプトでバグが発生するのかを検証していきます。 具体的には以下のような条件で検証してみます。

  • 日本語のプロンプト
  • 英語のプロンプト
  • その他の言語のプロンプト
  • function callingを使用しない

検証に使用するコード

function calling

プロンプトからキーワードを抽出するfunction callingを検証に使用します。

tools = [
    {
        "type": "function",
        "function":
        {
            "name": "search_content",
            "description": "キーワードからドキュメントを検索する",
            "parameters": {
                "type": "object",
                "properties": {
                    "keywords": {
                        "type": "string",
                        "description": "ドキュメント検索に使用するキーワード。必ず単語に分割される。例: 'Azure 使い方 サーバーレス'",
                    }
                },
                "required": ["keywords"],
            },
        }
    }
]

messages

GPTに送信するプロンプトです。質問文の箇所を変更して検証を行います。

messages=[
    {"role": "system", "content": "You are an AI assistant that helps people find information."},
    {"role": "user", "content": "質問文"}
]

リクエスト送信

completionにGPTからの回答が格納されます。

completion = client.chat.completions.create(
    model = "gpt-4-turbo",
    messages = messages,
    temperature=0.7,
    n=1,
    tools=tools,
    tool_choice={"type": "function", "function": {"name":"search_content"} }
)

検証

上記のコードを使用してGPTにリクエストを送信し、どのような挙動をするのか検証をしていきます。

日本語のプロンプト

日本の首都はどこですか?

全て日本語のプロンプトを送信してみます。期待する動作としては、functionのargumentsには「日本 首都」のようにキーワードが出てきてほしいのですが、「\n」が大量に出てきました。

{
    "finish_reason": "stop",
    "index": 0,
    "message": {
        "content": null,
        "role": "assistant",
        "function_call": null,
        "tool_calls": [
            {
                "id": "call_kFlSHYfNvQoCTmltTvAc72wK",
                "function": {
                    "arguments": "{\\"keywords\\":\\"\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\"}",
                    "name": "search_content"
                },
                "type": "function"
            }
        ]
    },
    "content_filter_results": {},
    "logprobs": null
}
Azure OpenAIの使い方を教えて

英語が含まれる日本語のプロンプトを送信してみます。「Azure OpenAI」までは取得できていますが、「使い方」をキーワードとして取得できていません。

{
    "finish_reason": "stop",
    "index": 0,
    "message": {
        "content": null,
        "role": "assistant",
        "function_call": null,
        "tool_calls": [
            {
                "id": "call_lx5MSkUGLwiXA1kswRGsojBN",
                "function": {
                    "arguments": "{\\"keywords\\":\\"Azure OpenAI \\\\n\\"}",
                    "name": "search_content"
                },
                "type": "function"
            }
        ]
    },
    "content_filter_results": {},
    "logprobs": null
}
2024年3月1日の東京の天気を教えて

数字が含まれる日本語のプロンプトを送信してみます。一応キーワードを取得することはできていますが、間に「\n」が入ってしまっています。

{
    "finish_reason": "stop",
    "index": 0,
    "message": {
        "content": null,
        "role": "assistant",
        "function_call": null,
        "tool_calls": [
            {
                "id": "call_UjrBSriK3P608kzrCoo9WgAd",
                "function": {
                    "arguments": "{\\"keywords\\":\\"2024 \\n3\\n1\\n\\n\\n東京\\n天気\\"}",
                    "name": "search_content"
                },
                "type": "function"
            }
        ]
    },
    "content_filter_results": {},
    "logprobs": null
}

英語のプロンプト

Let me know what the weather will be like tomorrow in Los Angeles.

英語のみのプロンプトを送信してみます。正常にキーワードが抽出できていることがわかります。

{
    "finish_reason": "stop",
    "index": 0,
    "message": {
        "content": null,
        "role": "assistant",
        "function_call": null,
        "tool_calls": [
            {
                "id": "call_8WoibQa174XPZFTTJ1Cz1xJH",
                "function": {
                    "arguments": "{\\"keywords\\":\\"Los Angeles weather forecast tomorrow\\"}",
                    "name": "search_content"
                },
                "type": "function"
            }
        ]
    },
    "content_filter_results": {},
    "logprobs": null
}
Tell me the weather in Tokyo on March 1, 2024

数字が含まれる英語のプロンプトを送信してみます。こちらも正常にキーワードを抽出できています。

{
    "finish_reason": "stop",
    "index": 0,
    "message": {
        "content": null,
        "role": "assistant",
        "function_call": null,
        "tool_calls": [
            {
                "id": "call_09PB4kso2pvQ6AhU2QnsLm05",
                "function": {
                    "arguments": "{\\"keywords\\":\\"Tokyo weather March 1, 2024\\"}",
                    "name": "search_content"
                },
                "type": "function"
            }
        ]
    },
    "content_filter_results": {},
    "logprobs": null
}

その他の言語

日本首都在哪里?

中国語のプロンプトを送信してみます。日本語と同様に「\n」が出力されました。

{
    "finish_reason": "stop",
    "index": 0,
    "message": {
        "content": null,
        "role": "assistant",
        "function_call": null,
        "tool_calls": [
            {
                "id": "call_llsRXCFDyZxSNEgrtsrEyHze",
                "function": {
                    "arguments": "{\\"keywords\\":\\"\\\\n\\\\n\\\\n\\"}",
                    "name": "search_content"
                },
                "type": "function"
            }
        ]
    },
    "content_filter_results": {},
    "logprobs": null
}
일본의 수도는 어디인가요?

韓国語のプロンプトを送信してみます。こちらも「\n」が出力されました。

{
    "finish_reason": "stop",
    "index": 0,
    "message": {
        "content": null,
        "role": "assistant",
        "function_call": null,
        "tool_calls": [
            {
                "id": "call_J9YDWGWIt6OfOR4oWTtQNIxa",
                "function": {
                    "arguments": "{\\"keywords\\":\\"\\\\n\\"}",
                    "name": "search_content"
                },
                "type": "function"
            }
        ]
    },
    "content_filter_results": {},
    "logprobs": null
}
Где находится столица Японии?

ロシア語のプロンプトを送信してみます。30分ほど掛かり、タイムアウトでエラーになりました。

function callingを使用しない

日本の首都はどこですか?

function callingを使用しない通常のリクエストでは、Unicodeバグは発生しませんでした。

{
    "finish_reason": "stop",
    "index": 0,
    "message": {
        "content": "日本の首都は東京(とうきょう)です。",
        "role": "assistant",
        "function_call": null,
        "tool_calls": null
    },
    "content_filter_results": {
        "hate": {
            "filtered": false,
            "severity": "safe"
        },
        "self_harm": {
            "filtered": false,
            "severity": "safe"
        },
        "sexual": {
            "filtered": false,
            "severity": "safe"
        },
        "violence": {
            "filtered": false,
            "severity": "safe"
        }
    },
    "logprobs": null
}

結果

まとめると、GPT4 Turbo(1106-preview)でfunction callingを使用するときは英語のプロンプトでないと「\n」が出力されてしまうという結果でした。

解決策としては、1106-previewではなく、0125-previewバージョンを使用することでこのバグは発生しなくなります。

また、Microsoftのドキュメントによると、これらのバージョンは今後安定板にアップグレードされる旨の記載があるため、バグも解消されると考えられます。

learn.microsoft.com

おわりに

本記事では、Azure OpenAIのGPT4 Turbo(1106-preview)で発生するUnicodeバグについて検証、解決策を解説しました。

インターネットでもあまり触れられていない内容ですので、本記事が参考になれば幸いです。

執筆担当者プロフィール
髙野 雄哉

髙野 雄哉(日本ビジネスシステムズ株式会社)

2023年新卒入社。BS事業本部 先端技術部に所属。AI関連の技術に興味があります。

担当記事一覧