Ollama 구조화된 출력 실전 활용
로컬 LLM을 실행하다 보면 JSON 파싱 오류가 발생하는 경우가 많습니다. 모델에게 JSON만 반환하라고 지시해도, 여전히 마크다운 펜스(markdown fences)나 추가 텍스트를 덧붙이곤 합니다. 이는 코드를 망가뜨리는 원인이 됩니다.
Ollama 0.3.0 버전부터는 format 파라미터를 사용하여 이 문제를 해결할 수 있습니다. 이 기능은 모델이 JSON 스키마를 따르도록 강제합니다. 이를 통해 모델이 추가 텍스트나 마크다운을 덧붙이는 것을 물리적으로 불가능하게 만듭니다.
Gemma4와 Ollama 0.30.7을 사용하여 테스트를 진행했습니다. 결과는 다음과 같습니다.
자연어 텍스트의 문제점
모델은 대화를 하도록 학습되었습니다. 그래서 "여기 JSON이 있습니다"와 같은 말을 하고 싶어 합니다. 엄격한 프롬프트를 사용하더라도 응답을 코드 블록으로 감싸는 경우가 많습니다. Python의 json.loads()는 해당 블록을 만나면 오류를 일으킵니다.
속도 이점
format 파라미터를 사용하는 것이 훨씬 빠릅니다.
- 구조화된 출력 미사용 시: 32초
- 구조화된 출력 사용 시: 5초
이는 6.4배의 속도 향상입니다. 모델이 텍스트 형식을 어떻게 결정할지 고민하며 시간을 낭비하지 않기 때문입니다. 모델은 오직 스키마에 부합하는 토큰만 생성합니다.
타입 안정성을 위한 Pydantic 활용 JSON 스키마를 직접 작성할 필요가 없습니다. Pydantic 모델을 사용하여 자동으로 생성할 수 있습니다.
- Pydantic 모델을 정의합니다.
model_json_schema()를 사용하여 스키마를 생성합니다.- 생성된 스키마를 Ollama에 전달합니다.
model_validate_json()을 사용하여 데이터를 한 번에 파싱하고 검증합니다.
이 방식은 AI 에이전트에게 완벽합니다. 에이전트가 다음에 어떤 도구(tool)를 호출해야 할지 결정하는 데 사용할 수 있습니다. 만약 모델이 존재하지 않는 도구 이름을 지어내려 한다면, Pydantic이 즉시 이를 잡아냅니다.
현재의 한계점
- 깊게 중첩된 스키마의 경우, 작은 모델에서는 때때로 빈 배열을 반환할 수 있습니다.
- 선택적 필드(Optional fields)가
null대신 빈 문자열을 반환할 수 있습니다. - 큰 스키마는 컨텍스트 윈도우(context window)를 더 많이 사용합니다.
권장 사항
- 작은 모델에는 단순한 추출 방식을 사용하세요.
- 검증 및 에이전트 도구 선택에는 Pydantic을 사용하세요.
- 복잡하고 중첩된 데이터에는 더 큰 모델을 사용하세요.
- Pydantic이 검증 오류를 발생시킬 경우를 대비해 재시도(retry) 로직을 추가하세요.
프롬프트가 잘 작동하기만을 바라지 마세요. 구조화된 출력을 사용하여 로컬 LLM 파이프라인을 신뢰할 수 있게 만드세요.
Optional learning community: https://t.me/GyaanSetuAi