Jsiphon - Trình phân tích JSON cho streaming LLM hỗ trợ theo dõi delta và phát hiện tính mơ hồ
(github.com/webtoon-today)Xin chào, mình xin giới thiệu Jsiphon. Thư viện này giải quyết một vấn đề rất thường gặp khi dùng phản hồi có cấu trúc với LLM streaming.
Khi dùng phản hồi có cấu trúc (chế độ JSON) của LLM cùng với streaming, ta thường vấp phải bài toán phân tích các phản hồi từng phần. Trong trường hợp này không thể просто dùng JSON.parse(), nên thường phải dùng cách khôi phục JSON chưa hoàn chỉnh lặp đi lặp lại.
Tuy nhiên, nếu tận dụng đặc tính của phản hồi LLM là "chỉ nối thêm mà không đảo lại thứ tự (append-only)", thì có thể giải bài toán này gọn gàng hơn, và Jsiphon cung cấp ba tính năng sau:
-
Phân tích append-only — Khi nhận được một phản hồi từng phần như
{"msg": "Hel, thư viện sẽ ngay lập tức trả về một phản hồi hoàn chỉnh như{msg: "Hel"}. Với schema đứng trước trườngmsgtrong ví dụ này, thư viện xem chúng là đã hoàn tất. -
Theo dõi delta — Mỗi phản hồi được xuất ra ngoài việc có snapshot đầy đủ còn cung cấp riêng phần mới được thêm gần nhất. Ví dụ, nếu đang vẽ nhiều bong bóng chat của chatbot, bạn không cần vẽ lại toàn bộ mà chỉ cần vẽ phần tăng thêm của bong bóng cuối cùng. Nếu trong ví dụ trên LLM tiếp tục xuất
lo, World!, bạn có thể tìm ngay{msg: "lo, World!"}dướideltacủa phản hồi. Nhờ vậy không cần khôi phục/phân tích JSON và làm diff mỗi khi nhận một snapshot mới. -
Phát hiện tính mơ hồ — Thư viện trả về một ambiguity tree có cấu trúc cây hoàn toàn giống với phản hồi. Nó cho biết dữ liệu trong snapshot đã được chốt hay vẫn đang tiếp tục được đọc ở nhiều cấp độ khác nhau. Ví dụ khi đang streaming dữ liệu sau
{"header":{"title": "abcdefghijk","date": "..."},"body": "..."}
Khi dùng
isAmbiguous(ambiguous.header.title), bạn có thể sử dụngtitlemột cách an toàn ngay từ thời điểm nó hoàn tất (phản hồi số 3), mà không cần chờ các trường phía sau hoàn thành. Vì thư viện cung cấp trạng thái hoàn tất từng phần ở mọi tầng, nênisAmbiguous(ambiguous.header)chỉ trả vềisAmbiguous = falsekhi toàn bộ các node con củaheaderđều đã hoàn tất.
Đã có khá nhiều thư viện khôi phục/phân tích JSON từng phần (partial-json, gjp-4-gpt, v.v.) giải quyết tốt bài toán phân tích cốt lõi. Tuy nhiên, Jsiphon tận dụng đặc tính LLM được streaming theo kiểu append-only để không chỉ cung cấp snapshot, mà còn cung cấp delta theo từng trường và cho phép xác định trường nào đã hoàn tất ở mỗi vòng lặp.
Nếu bạn cũng đang giải quyết một bài toán tương tự, có lẽ bạn sẽ thấy đồng cảm với vấn đề này. Mình hiện đang kết hợp Jsiphon với multi-type SSE để chatbot vừa streaming văn bản vừa đồng thời xác định nhiều cờ như is_adult, need_admin theo thời gian thực.
Ngoài ra, về mặt thực dụng, thư viện còn có các tiện ích như zero-dependency, không ném lỗi ngay cả khi phản hồi sai, và loại bỏ văn bản vô nghĩa ở trước/sau JSON.
GitHub: https://github.com/webtoon-today/jsiphon
npm install jsiphon
Nếu thấy hữu ích, mong bạn dùng thử và cho mình ý kiến.
Mình nghĩ ambiguity tree là một thiết kế khá thử thách, nên cũng muốn biết liệu có cách nào tốt hơn không. Mình sẽ rất cảm kích nếu bạn góp ý về thiết kế API.
Chưa có bình luận nào.