TL;DR
로컬 모델 에이전트는 JSON 같은 구조화된 출력에서 중괄호 누락이나 임의 텍스트 삽입 등 형식 오류를 자주 일으킨다는 문제가 제기됐다. 이를 해결하기 위해 글쓴이는 llama.cpp의 GBNF grammars를 활용해 각 툴의 스키마를 문법 규칙으로 컴파일하고 모델의 토큰 생성 단계에서 그 문법만 허용하는 방식으로 처리했다고 보고했다. 추가로 턴별로 관련 툴만 선택해 문법을 3~5개 툴 수준으로 축소하는 전략을 도입했으며 구현은 Eris라는 Rust 기반 로컬 에이전트 레포지토리로 공개돼 재현 가능함이 확인됐다.
주요 논점
문법 기반 제약은 모델이 형식적으로 올바르지 않은 출력을 내는 것을 근본적으로 방지하며 실전에서 JSON 불일치 문제를 제거할 수 있다는 주장이다.
툴 스키마를 문법 규칙으로 컴파일하고 턴별로 문법을 좁히는 구현은 작동 메커니즘을 명확히 제시하지만 성능 영향과 통합 복잡도에 대한 수치는 원문에 포함되지 않아 추가 검증이 필요하다는 입장이다.
실용적 조언
- llama.cpp가 제공하는 GBNF grammars 기능을 사용하라는 권고가 명확히 제시됐다. 구현 절차는 각 도구의 스키마를 입력으로 받아 이를 GBNF 규칙으로 컴파일하는 처리 파이프라인을 만드는 것이며 출력은 모델에 적용 가능한 문법 정의 파일이다. 그렇게 하면 모델은 문법 외 토큰을 생성하지 못해 구조화된 출력의 무결성을 보장할 수 있다.
- 턴별로 참조할 도구 집합을 3~5개로 좁혀 문법을 축소하는 방식이 권장됐다. 이 방법은 입력(현재 턴의 컨텍스트)에서 관련 툴을 선별하고 그 툴들의 스키마만 합쳐 문법을 생성하는 처리를 포함하며 출력은 축소된 문법 범위에서만 모델 토큰이 허용되는 것이다. 이렇게 하면 전체 50개 툴을 항상 노출할 때보다 생성 공간이 줄어들어 오류 리스크를 낮출 수 있다.
섹션별 상세
이미지 분석

이미지는 프로젝트명이 Eris임과 이 프로젝트가 로컬 우선 방식의 'vault agent'임을 시각적으로 표시한다는 점에서 정보성이 있다. 로고 우측의 회로도 스타일 일러스트는 툴 연동과 토큰 흐름 제어 같은 내부 구조적 접근을 은유적으로 나타내는 디자인으로 보인다. 블로그나 레포지토리와 함께 보면 프로젝트의 정체성과 기술적 초점이 일치함이 확인됐다.
Eris 브랜드 로고와 'local-first vault agent' 문구가 포함된 그래픽이다.
용어 해설
- 로컬 퍼스트 볼트 에이전트(local-first vault agent)
- — 로컬에서 실행되며 사용자의 노트를 로컬 저장소(볼트)로 관리하는 에이전트 구현을 가리킨다. 이 글에서는 Eris라는 Rust 기반 단일 바이너리 프로젝트가 해당 역할을 수행한다고 명시됐다. Eris는 Markdown 메모리를 에이전트의 장기 기억으로 사용하는 구조임이 확인됐다.
- 구조화된 출력(structured output)
- — JSON과 같이 엄격한 문법을 요구하는 출력 형식을 의미한다. 원문은 로컬 모델 에이전트가 JSON 출력에서 중괄호 누락, 도구명 발명, 객체 뒤의 임의 텍스트 삽입 오류를 일으킨다고 지적했다. 이러한 오류를 서버측에서 방지하는 Hosted API와 달리 로컬 실행 환경에서는 별도 대책이 필요하다고 서술됐다.
- 문법 제약 도구(Grammar-enforced tools)
- — 모델의 토큰 생성 범위를 문법 규칙으로 제한해 올바른 형식의 출력만 허용하는 기법을 뜻한다. 원문은 llama.cpp의 GBNF grammars 기능을 이용해 각 툴의 스키마를 문법 규칙으로 컴파일했다고 기술했다. 그렇게 하면 모델이 잘못된 JSON을 생성할 수 없게 된다고 주장했다.
- Markdown 기반 메모리(Markdown memory)
- — 에이전트가 장기 기억으로 로컬의 Markdown 노트를 활용하는 방식이다. 원문은 Eris가 Markdown 메모리를 에이전트의 메모리로 사용한다고 명시했다. 이 구조는 로컬 데이터 일관성과 파일 기반 저장소 활용 측면에서 유용함이 암시됐다.
- 턴별 문법 축소(per-turn grammar narrowing)
- — 대화의 각 턴에서 모델이 참조해야 할 도구 집합을 3~5개 수준으로 좁혀 전체 문법을 축소하는 방법이다. 원문은 전체 50개 도구 대신 턴별 관련 도구만 보이게 하여 생성 가능한 토큰을 제한한다고 설명했다. 이 방법은 출력 공간을 줄여 문법 강제의 비용 대비 효율을 높이는 의도임이 드러났다.
언급된 도구
로컬에서 실행되는 vault 스타일 에이전트로 Rust 단일 바이너리이며 Markdown 노트를 메모리로 사용한다.
로컬 모델 실행을 위한 런타임으로 GBNF grammars를 통해 토큰 생성 범위를 문법으로 제약하는 기능을 제공한다.
언급된 리소스
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.