AI 스트리밍 응답 시 불완전한 JSON 처리 최적화: O(n) 점진적 파싱의 중요성

Show HN: Incremental JSON parser for streaming LLM tool calls in Ruby

작성자
HackerNews
발행일
2025년 10월 22일

핵심 요약

  • 1 AI 스트리밍 응답에서 툴 호출 시 불완전한 JSON이 실시간으로 전송되어 사용자 경험 저하를 유발하는 문제를 다룹니다.
  • 2 기존의 O(n²) 방식(전체 문자열 재파싱)은 응답 길이가 길어질수록 성능이 급격히 저하되어 UI 지연을 초래합니다.
  • 3 상태 기반의 O(n) 점진적 파싱(`JsonCompleter` Gem 활용)은 새로운 데이터만 처리하여 불완전한 JSON을 즉시 완성, 부드러운 실시간 UI 업데이트를 가능하게 합니다.

도입

최신 LLM(대규모 언어 모델) 제공자들은 응답을 스트리밍하여 사용자 경험을 향상시키며, 외부 함수(툴) 호출 시 JSON 형태로 인자를 반환합니다. 그러나 이러한 스트리밍 과정에서 JSON이 불완전한 상태로 도착하여 즉시 파싱하기 어렵습니다. 완전한 JSON을 기다려 파싱하는 기존 방식은 사용자에게 로딩 스피너만 보여주게 되어 실시간 피드백의 이점을 상실하게 됩니다. 본 글은 이 문제를 해결하기 위해 불완전한 JSON 스트림을 효율적으로 처리하여 사용자에게 실시간으로 툴 호출 인자 미리보기를 제공하는 방법을 제시합니다.

불완전한 JSON 처리의 비효율성

AI 툴 호출 인자가 JSON 형태로 스트리밍될 때, 대부분의 청크는 불완전한 JSON 문자열을 형성합니다. 초기에는 완전한 JSON이 도착할 때까지 기다린 후 파싱하는 방식이 사용되었으나, 이는 수 초에서 수 분에 이르는 로딩 스피너로 인해 사용자에게 진행 상황을 알 수 없게 만들었습니다. 이 문제를 해결하기 위해 불완전한 JSON을 프로그래밍 방식으로 완성하는 json-repair와 같은 라이브러리들이 검토되었으나, 이러한 라이브러리들은 매번 전체 JSON 문자열을 처음부터 다시 파싱하는 O(n²) 동작 특성을 가집니다.

예를 들어, 12KB의 툴 인자가 5자 청크로 스트리밍될 경우, 총 1,500만 문자를 처리해야 하는 비효율성이 발생하며, 응답 길이가 길어질수록 성능 저하가 가시적으로 나타나 UI 지연을 초래합니다.

O(n) 상태 기반 점진적 파싱의 도입

이러한 O(n²) 문제의 해결책은 호출 간 파싱 상태를 유지하여 새로운 청크가 도착하면 중단된 지점부터 새 문자만 처리하는 O(n) 점진적 파싱 방식입니다. 이 방식의 핵심은 다음 상태 정보를 유지하는 것입니다:

  • 파싱을 중단한 마지막 인덱스

  • 현재 컨텍스트(객체, 배열, 중첩 깊이)

  • 구성 중인 불완전한 토큰(문자열, 숫자)

  • 유니코드 및 특수 문자를 위한 이스케이프 시퀀스 상태

JsonCompleter와 같은 라이브러리는 이러한 상태를 활용하여 각 호출에서 오직 새로운 데이터(delta)만을 처리합니다. 예를 들어, completer.complete('{"users": [{"name": "') 호출 후, 다음 호출 completer.complete('{"users": [{"name": "Alice"}')에서는 이전 호출에서 처리된 인덱스 21까지의 데이터를 건너뛰고 인덱스 21-28의 새로운 문자만 처리합니다. 이는 진정한 O(n) 동작으로, n은 오직 새로운 데이터의 크기만을 의미합니다.

복잡한 엣지 케이스 처리

JSON 파싱에는 여러 엣지 케이스가 존재합니다. 예를 들어, `

결론

AI 인터페이스에서 스트리밍은 미래의 사용자 경험 표준이며, 사용자들은 응답이 실시간으로 나타나기를 기대합니다. 툴 호출의 경우, 이는 불완전한 JSON을 응답당 수백 번 파싱해야 함을 의미합니다. O(n²) 방식과 O(n) 방식의 차이는 단순한 성능 최적화를 넘어섭니다. O(n²) 방식은 시스템이 멈춘 듯한 사용자 경험을 제공하는 반면, O(n) 상태 기반 점진적 파싱 방식은 AI가 실시간으로 작동하는 모습을 보여주어 마법 같은 경험을 선사합니다. 이러한 핵심 기능은 오픈 소스 Ruby Gem인 `JsonCompleter`로 제공되어 AI 어시스턴트의 사용자 경험을 혁신하는 데 기여하고 있습니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!