📶

gptのFunction calling streamの時どうするの問題を解決するため立ち上がった

2023/06/16に公開

Function calling便利〜

function callingはめちゃ便利です、どのように便利なのかはこちらの記事がすごくわかりやすいので紹介しておきます。
https://zenn.dev/codehex/articles/4b22a01e0b7592

Function callingのstreamはどうするの?

ストリーミングAPIや大規模なデータフィードを扱う際に、しばしば部分的なJSONデータに対応する必要が生じます。これは、データがチャンク単位で送られてくることから起こる問題で、その結果として完全にフォーマットされていないJSONが発生します。例えば、完全なJSONオブジェクトではなく、その一部だけが送られてくる場合です。こういった問題を解決するためには、部分的なJSONデータを適切に処理する能力が求められます。

そこで、私たちはPythonで部分的なJSONを扱うための関数force_parse_jsonを作りました。この関数は、部分的なJSONを完結するための手法と、それを解析してPythonの辞書に変換する機能を提供します。
https://github.com/furnqse/gpt-stream-json-parser

補足:私が公開しちゃってますが実際に実装してくださったのは、llm無職の私を拾ってくださった
norami氏です。
https://twitter.com/norami_dream

使い方

以下に、OpenAIのAPIと組み合わせてforce_parse_json関数を利用する一例を紹介します。

import openai
from gpt_stream_parser import force_parse_json

# チャットの完了を作成
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo-0613",
    messages=[{"role": "user", "content": "What's the weather like in Boston?"}],
    functions=[
        {
            "name": "get_current_weather",
            "description": "Get the current weather in a given location",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city and state, e.g. San Francisco, CA",
                    },
                    "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
                },
                "required": ["location"],
            },
        }
    ],
    function_call="auto",
    stream=True,
)

# 各チャンクのデータを解析し、出力
output = ""
for chunk in response:
    output += chunk.choices[0].delta.function_call.arguments
    data = force_parse_json(output)
    if data:
        print(data)
	
	
# {'location': 'Boston'}
# {'location': 'Boston,'}
# {'location': 'Boston, MA'}
# {'location': 'Boston, MA'}
# {'location': 'Boston, MA'}

このコードは、OpenAIのFunction calling exsampleを使っています。
レスポンスはストリーミングとして取得され、force_parse_json関数を用いて各チャンクのデータを解析します。その結果得られるデータ(Pythonの辞書)があれば、それを出力します。

このように、force_parse_json関数はfunction callingをstreamで扱う際の頼れるツールとなるでしょう。部分的なJSONデータを適切に処理することで、これまでとは比べ物にならないほどスムーズなデータ処理が実現可能です。

なぜこの関数が嬉しいのか

force_parse_json関数は大規模なデータストリームを取り扱う際の困難を大幅に緩和します。部分的なJSONがエラーを引き起こす可能性を解消し、ストリーミングAPIから継続的にデータを受け取り続けることが可能になります。

この関数の存在により、開発者は部分的なJSONをどのように処理すればよいかについての心配をすることなく、アプリケーションの主要な機能開発に集中できます。さらに、エラーレポートの機能や辞書のクリーンアップといったオプションも提供されているため、より一層の柔軟性が提供されます。

Discussion