4 poin oleh sugeuljin 2026-02-16 | Belum ada komentar. | Bagikan ke WhatsApp

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": "Hel masuk, ia segera mengembalikan respons lengkap seperti {msg: "Hel"}. Untuk skema sebelum field msg pada 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 bawah delta pada respons. Jadi tidak perlu lagi melakukan parsing pemulihan JSON dan diff setiap 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

    1. {"header":
    2. {"title": "abcd
    3. efghijk",
    4. "date": "..."
    5. },
    6. "body": "..."}

    Dengan menggunakan isAmbiguous(ambiguous.header.title), title bisa digunakan dengan aman sejak saat title selesai (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 mengembalikan false hanya ketika semua turunan dari header sudah 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.

Belum ada komentar.