Jsiphon - delta tracking और ambiguity detection को सपोर्ट करने वाला LLM streaming के लिए JSON parser
(github.com/webtoon-today)नमस्ते, Jsiphon का परिचय कराता हूँ। यह LLM streaming में structured responses इस्तेमाल करते समय अक्सर आने वाली समस्याओं को हल करता है.
जब LLM के structured response (JSON mode) को streaming के साथ इस्तेमाल किया जाता है, तब अक्सर partial responses को parse करने की समस्या आती है। ऐसे में सीधे JSON.parse() नहीं किया जा सकता, इसलिए बार-बार incomplete JSON को recover करने का तरीका अपनाया जाता है।
लेकिन LLM response की 'क्रम उलटे बिना सिर्फ append होने वाली (append-only)' विशेषता का उपयोग करें तो इस समस्या को और साफ़ तरीके से हल किया जा सकता है, और Jsiphon इसके लिए नीचे दिए गए तीन फीचर देता है।
-
Append-only parsing — जब
{"msg": "Helजैसी partial response आती है, तो यह तुरंत{msg: "Hel"}जैसी complete response लौटा देता है। उदाहरण मेंmsgfield से पहले वाले schema को यह पहले से complete मानता है। -
Delta tracking — हर बार output होने वाली response में full snapshot के साथ-साथ अभी जो नया जोड़ा गया है, उसे अलग से देता है। उदाहरण के लिए, अगर आप chatbot के कई speech bubbles बना रहे हैं, तो पूरे UI को फिर से render करने के बजाय सिर्फ आख़िरी bubble की बढ़ी हुई content को render किया जा सकता है। ऊपर के उदाहरण में अगर LLM आगे
"lo, World!"आउटपुट करता है, तो उसे response केdeltaके नीचे तुरंत{msg: "lo, World!"}के रूप में पाया जा सकता है। इससे हर snapshot पर JSON recovery parsing और diff करने की ज़रूरत नहीं रहती। -
Ambiguity detection — यह response के बिल्कुल समान tree structure वाला ambiguity tree लौटाता है। इससे snapshot में शामिल data final हो चुका है या अभी response पढ़ा जा रहा है, यह कई depth स्तरों पर पता चलता है। उदाहरण के लिए, जब नीचे दिया गया data stream हो रहा हो
- {"header":
- {"title": "abcd
- efghijk",
- "date": "..."
- },
- "body": "..."}
तब
isAmbiguous(ambiguous.header.title)का इस्तेमाल करकेtitleपूरा होते ही (response number 3) उसे सुरक्षित रूप से इस्तेमाल किया जा सकता है, बिना बाद के fields के पूरा होने का इंतज़ार किए। यह सिर्फ full completion नहीं, बल्कि हर layer पर partial completion भी देता है, इसलिएisAmbiguous(ambiguous.header)तभीisAmbiguous = falseलौटाएगा जबheaderके सभी child complete हो जाएँ।
partial JSON recovery/parsing के लिए पहले से कई libraries हैं (partial-json, gjp-4-gpt आदि), और वे parsing की मूल समस्या को अच्छी तरह हल करती हैं। लेकिन Jsiphon, LLM के append-only streaming होने की विशेषता का उपयोग करके सिर्फ snapshots ही नहीं देता, बल्कि field-wise increments (delta) भी देता है, और हर iteration पर कौन से fields complete हो चुके हैं, यह भी पहचानने देता है।
अगर आप पहले से इसी तरह की समस्या हल कर रहे हैं, तो शायद यह बात आपसे जुड़ सके। मैं Jsiphon को multi-type SSE के साथ जोड़कर ऐसा इस्तेमाल कर रहा हूँ कि chatbot text को stream करते हुए साथ-साथ कई flags (is_adult, need_admin आदि) को भी real time में पहचान सके.
इसके अलावा practical usage के लिहाज़ से इसमें zero dependency है, invalid response पर error throw नहीं करता, और JSON के आगे-पीछे मौजूद बेकार text को हटाने जैसी सुविधाएँ भी शामिल हैं।
GitHub: https://github.com/webtoon-today/jsiphon
npm install jsiphon
अगर यह उपयोगी लगे तो इसे इस्तेमाल करके देखें और अपनी राय ज़रूर दें।
ambiguity tree मुझे अपने हिसाब से थोड़ा challenging design लगता है; इससे बेहतर तरीका हो सकता है क्या, यह भी जानने की उत्सुकता है। API design पर feedback देंगे तो आभारी रहूँगा.
अभी कोई टिप्पणी नहीं है.