Jsiphon - parser JSON untuk streaming LLM yang mendukung pelacakan delta dan deteksi ambiguitas
(github.com/webtoon-today)Halo, saya ingin memperkenalkan Jsiphon. Ini menyelesaikan masalah yang sering muncul saat menggunakan respons terstruktur dalam streaming LLM.
Saat respons terstruktur (mode JSON) dari LLM digunakan bersama streaming, kita sering menghadapi masalah saat mem-parsing respons parsial. Dalam kasus seperti ini, kita tidak bisa begitu saja memakai JSON.parse(), sehingga biasanya digunakan pendekatan memulihkan JSON yang belum lengkap secara berulang.
Namun, jika memanfaatkan sifat respons LLM yang 'hanya ditambahkan tanpa pembalikan urutan (append-only)', masalah ini bisa diselesaikan dengan lebih rapi, dan Jsiphon menyediakan tiga fitur berikut.
-
Parsing append-only — saat respons parsial seperti
{"msg": "Helmasuk, ia segera mengembalikan respons lengkap seperti{msg: "Hel"}. Untuk skema sebelum fieldmsgpada contoh ini, field-field tersebut sudah dianggap selesai. -
Pelacakan delta — setiap respons yang dihasilkan menyediakan tambahan terbaru secara terpisah selain snapshot penuh. Misalnya, jika sedang menggambar beberapa balon percakapan chatbot, ini membantu agar kita tidak perlu menggambar ulang semuanya, melainkan hanya menggambar pertambahan pada balon terakhir. Dalam contoh sebelumnya, jika LLM melanjutkan dengan
lo, World!, maka Anda bisa langsung menemukannya sebagai{msg: "lo, World!"}di bawahdeltapada respons. Jadi tidak perlu lagi melakukan parsing pemulihan JSON dandiffsetiap kali menerima snapshot. -
Deteksi ambiguitas — mengembalikan ambiguity tree yang memiliki struktur pohon yang sepenuhnya sama dengan respons. Ini memberi tahu pada berbagai kedalaman apakah data yang ada di snapshot sudah final, atau apakah respons masih terus dibaca. Misalnya saat data berikut sedang di-streaming
{"header":{"title": "abcdefghijk","date": "..."},"body": "..."}
Dengan menggunakan
isAmbiguous(ambiguous.header.title),titlebisa digunakan dengan aman sejak saattitleselesai (respons nomor 3), tanpa perlu menunggu field berikutnya selesai. Karena yang disediakan bukan hanya penyelesaian total melainkan juga penyelesaian parsial di semua level,isAmbiguous(ambiguous.header)akan mengembalikanfalsehanya ketika semua turunan dariheadersudah selesai.
Sudah ada banyak library pemulihan/parsing JSON parsial (partial-json, gjp-4-gpt, dll.) yang menyelesaikan masalah parsing dasarnya dengan baik. Namun, Jsiphon memanfaatkan karakteristik bahwa LLM di-streaming secara append-only, sehingga bukan hanya menyediakan snapshot, tetapi juga delta per field, serta memungkinkan penentuan field yang sudah selesai pada setiap iterasi.
Jika Anda juga sedang menyelesaikan masalah serupa, mungkin ini akan terasa relevan. Saya sendiri menggabungkan multi-type SSE dengan Jsiphon agar chatbot bisa melakukan streaming teks sambil sekaligus menentukan beberapa flag (is_adult, need_admin, dll.) secara real-time.
Selain itu, dari sisi praktis ada juga fitur zero-dependency, tidak melempar error pada respons yang salah, serta penghapusan teks tidak bermakna di depan dan belakang JSON.
GitHub: https://github.com/webtoon-today/jsiphon
npm install jsiphon
Kalau ini membantu, silakan dicoba dan saya akan senang menerima masukan.
Saya juga penasaran apakah ada pendekatan yang lebih baik untuk ambiguity tree, karena menurut saya ini desain yang cukup menantang. Saya akan sangat berterima kasih atas feedback terkait desain API-nya.
Belum ada komentar.