gptのFunction calling streamの時どうするの問題を解決するため立ち上がった
Function calling便利〜
function callingはめちゃ便利です、どのように便利なのかはこちらの記事がすごくわかりやすいので紹介しておきます。
Function callingのstreamはどうするの?
ストリーミングAPIや大規模なデータフィードを扱う際に、しばしば部分的なJSONデータに対応する必要が生じます。これは、データがチャンク単位で送られてくることから起こる問題で、その結果として完全にフォーマットされていないJSONが発生します。例えば、完全なJSONオブジェクトではなく、その一部だけが送られてくる場合です。こういった問題を解決するためには、部分的なJSONデータを適切に処理する能力が求められます。
そこで、私たちはPythonで部分的なJSONを扱うための関数force_parse_json
を作りました。この関数は、部分的なJSONを完結するための手法と、それを解析してPythonの辞書に変換する機能を提供します。
補足:私が公開しちゃってますが実際に実装してくださったのは、llm無職の私を拾ってくださった
norami氏です。
使い方
以下に、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