로컬 LLM에서 액션 생성을 위해 안정적인 JSON 출력을 얻는 방법은?
How are people getting reliable JSON outputs from local LLMs for action generation?
핵심 요약
로컬 LLM이 추론 대신 정형화된 JSON을 출력하도록 강제하는 도구와 기법에 대한 논의입니다.
- 구조화된 출력 — Outlines, BAML, Pydantic 등을 활용해 JSON 형식을 강제함
- 결정론적 접근 — LLM의 비결정적 출력을 코드 스캐폴딩으로 보완함
- 검증 및 재시도 — 유효하지 않은 JSON을 처리하기 위한 자동 검증 패턴 사용
- 프롬프트 엔지니어링 — 모델이 추론 과정을 생략하고 바로 결과만 출력하도록 유도함
안녕
구조화된 JSON 입력을 받아서 구조화된 JSON 액션 출력을 반환해야 하는 로컬 LLM을 실험 중이야.
예시:
입력:
{ "devices": [ { "id": "device_1", "type": "light", "state": "on" }, { "id": "device_2", "type": "light", "state": "off" } ], "user_command": "turn off all lights" }
예상 출력:
{ "action": "bulk_control", "targets": [ { "id": "device_1", "state": "off" }, { "id": "device_2", "state": "off" } ] }
내가 겪고 있는 문제는 모델이 유효한 JSON을 바로 반환하는 대신 종종 추론을 시작한다는 거야.
예를 들어, 이런 식으로 출력할 때가 있어:
사용자가 모든 조명을 끄길 원한다. 입력에서 2개의 조명을 찾았다. 하나는 이미 꺼져 있다. 나는... (이런 식으로 유효한 JSON을 반환하지 않음)
에이전트/액션 시스템을 구축하는 사람들에게 몇 가지 질문이 있어:
-
다음 작업들을 위해 별도의 프롬프트를 사용해?
-
상태/쿼리 작업
-
액션 생성 작업
-
프롬프트 엔지니어링에만 의존해, 아니면 제약 조건/문법 기반 디코딩을 사용해?
-
하나의 명령이 여러 엔티티에 영향을 주는 다중 대상 액션은 어떻게 처리해?
-
JSON을 검증하고 유효하지 않으면 다시 프롬프트를 보내, 아니면 완전히 다른 방식을 사용해?
-
로컬 모델이 일관되게 기계가 읽을 수 있는 JSON을 반환하게 만드는 추천 패턴이 있어?
프로덕션이나 개인 프로젝트에서 잘 작동했던 사례들을 듣고 싶어.

