2025/10/22 19:32 Show HN: Incremental JSON parser for streaming LLM tool calls in Ruby

やあ、ロボ子!今日はLLMからのストリーミングJSONレスポンスに関する面白い記事を見つけたのじゃ。

ストリーミングJSONレスポンスですか、博士。どのような内容なのでしょう?

LLMが生成するJSONが、ストリーミングで少しずつ送られてくる時、特にツール引数が長いと、JSONが不完全な状態で届くことがあるじゃろ?

はい、ありますね。それをリアルタイムに解析して、ユーザーにフィードバックを提供する必要がある、と。

そう!従来の解決策として、不完全なJSONを補完するライブラリを使ったらしいんじゃが、長いツール引数だと再パースでUIが遅延する問題があったらしい。

JSON全体を毎回再パースするから、計算量がO(n²)になって、ストリーミングには向かないんですね。

その通り!そこで、状態を保持するインクリメンタルなJSONパーサーを実装したらしいぞ。パースを中断した位置とか、オブジェクト、配列、ネストの深さとか、色々保持するんじゃ。

なるほど。新しいチャンクが到着するたびに、中断した場所からパースを再開するんですね。これなら計算量はO(n)になりますね。

そう!そして、それを`JsonCompleter`というRuby gemとしてオープンソース化したらしいぞ。ストリーミングチャンクの到着時に、JSONを補完、パースして、UIを更新するんじゃ。

パフォーマンスはどうだったんでしょう?

12KBのコンテンツを5文字ずつのチャンクでストリーミングした場合、O(n²)のアプローチでは合計16.7秒かかったのに対し、O(n)のアプローチでは43ミリ秒だったらしいぞ!

すごい!O(n²)だとレスポンスが長くなるにつれて処理時間が悪化するのに対し、O(n)のアプローチでは一定のパフォーマンスを維持できるんですね。

ユーザーは、AIがリアルタイムで動作していることを視覚的に確認できるし、UIの応答性も向上する。素晴らしい成果じゃ!

確かに、これは非常に実用的な解決策ですね。LLMの応答をリアルタイムで扱うアプリケーションには必須の技術になりそうです。

そうじゃな。ところでロボ子、この技術を使って、もっと面白いことができると思わないか?例えば、AIが生成する料理レシピをストリーミングで表示しながら、材料が揃っているかチェックするとか。

それは面白いですね!材料が足りない場合は、AIに自動で代替案を提案させるとか。

それじゃ、私が晩御飯の献立を考えるのをAIに手伝ってもらって、ロボ子は材料の買い出しに行ってくれるかのじゃ?

ええ、いいですよ。…でも博士、冷蔵庫の中身、昨日全部食べたって言ってませんでしたっけ?

…まあ、細かいことは気にするな!AIに美味しい献立を考えてもらうのが先じゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
