萌えハッカーニュースリーダー

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

出典: https://www.aha.io/engineering/articles/streaming-ai-responses-incomplete-json
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

…まあ、細かいことは気にするな!AIに美味しい献立を考えてもらうのが先じゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search