본문 바로가기
행복바이러스 행복바이러스

LLM 환각(Hallucination) 제어를 위한 System Prompt Constraints 및 Structured Output(JSON) 강제 기법

읽는 시간 약 8분

LLM 환각 현상의 이해와 신뢰성 확보 전략

인공지능 기술이 비약적으로 발전하면서 대규모 언어 모델(LLM)은 우리 일상의 필수 도구가 되었습니다. 하지만 LLM을 사용하다 보면 모델이 매우 자신감 있게 틀린 정보를 말하는 ‘환각(Hallucination)’ 현상을 종종 경험하게 됩니다. 이는 모델이 학습 데이터의 패턴을 기반으로 확률적으로 가장 그럴듯한 다음 단어를 선택하기 때문에 발생하는 구조적 한계입니다. 환각은 단순히 오류를 넘어 기업의 신뢰도 하락이나 잘못된 의사결정으로 이어질 수 있어, 이를 제어하는 기술은 이제 AI 활용의 핵심 역량이 되었습니다.

시스템 프롬프트 제약 조건을 활용한 환각 방지

시스템 프롬프트는 모델의 정체성과 행동 강령을 정의하는 가장 강력한 도구입니다. 단순히 지시사항을 나열하는 것을 넘어, 모델이 정보의 출처를 확인하고 모르는 것은 모른다고 답하게 만드는 구체적인 제약 조건을 설정해야 합니다.

  • 정보의 출처 명시: 모델에게 답변의 근거가 되는 문서나 데이터 내에서만 답변하도록 강제합니다. 외부 지식을 임의로 사용하지 않도록 지시하는 것이 핵심입니다.
  • 모르는 것에 대한 솔직함: 모델이 모르는 질문을 받았을 때 거짓 정보를 생성하는 대신 “제공된 문서에서는 해당 정보를 찾을 수 없습니다”와 같이 정해진 문구로 응답하도록 설정합니다.
  • 단계별 추론 강제: 복잡한 질문에 대해서는 곧바로 답을 내놓지 말고, 먼저 문제를 분석하고 근거를 수집한 뒤 결론을 내리도록 유도하는 ‘생각의 사슬(Chain of Thought)’ 기법을 적용합니다.

효과적인 시스템 프롬프트 작성 예시

모델에게 다음과 같은 규칙을 시스템 메시지에 포함해보세요. “당신은 전문 자료 분석가입니다. 제공된 텍스트 이외의 지식은 사용하지 마세요. 질문에 대한 답이 텍스트에 없다면 반드시 ‘정보 부족’이라고 답변하십시오. 추측은 절대 금지입니다.” 이러한 제약은 모델의 창의성을 억제하는 대신 논리적 엄밀함을 높여줍니다.

구조화된 출력 강제 기법의 중요성

LLM은 자연어 생성에 최적화되어 있어, 때로는 원하는 형식의 데이터를 얻기가 어렵습니다. 특히 시스템 연동을 위해 JSON 형식이 필요할 때, 모델이 서술형 문장을 섞어서 출력하면 파싱 오류가 발생합니다. ‘구조화된 출력(Structured Output)’은 모델이 오직 정해진 스키마(Schema)에 맞춰 JSON 데이터만을 반환하도록 강제하는 기술입니다.

JSON 모드와 스키마 정의

최근 오픈AI나 앤스로픽 같은 주요 모델 제공사들은 ‘JSON 모드’나 ‘함수 호출(Function Calling)’ 기능을 통해 특정 구조의 결과물을 보장합니다. 이를 활용하면 환각을 제어하는 데 다음과 같은 이점이 있습니다.

  • 데이터 정형화: 결과물이 항상 동일한 구조를 가지므로, 개발자는 데이터가 누락되었는지 혹은 형식이 잘못되었는지 즉각적으로 검증할 수 있습니다.
  • 불필요한 문장 제거: 모델이 답변을 장황하게 설명하는 대신, 핵심 키값만 출력하게 함으로써 환각이 섞일 틈을 줄입니다.
  • 자동화 파이프라인 구축: 구조화된 데이터를 데이터베이스에 즉시 저장하거나 다른 애플리케이션의 입력값으로 바로 사용할 수 있습니다.

구조화된 출력의 예시

사용자 질문에 대해 단순히 답변을 받는 대신, 다음과 같은 JSON 스키마를 모델에 전달하십시오.


{

  "status": "success",

  "answer": "해당 내용에 대한 답변",

  "confidence_score": 0.95,

  "cited_sources": ["문서1", "문서2"]

}

이러한 형식을 강제하면 모델은 자연스럽게 답변의 근거(cited_sources)와 신뢰도(confidence_score)를 스스로 평가하게 되며, 이는 결과적으로 환각을 억제하는 강력한 심리적/기술적 장치가 됩니다.

환각 제어를 위한 전문가의 조언

많은 사용자가 범하는 실수 중 하나는 모델에게 너무 많은 것을 한 번에 요구하는 것입니다. 전문가들은 ‘복잡한 작업의 분해’를 강조합니다. 환각을 줄이기 위해서는 하나의 프롬프트에 모든 논리를 담기보다, 작업을 단계별로 나누어 각 단계에서 검증을 거치는 ‘에이전트 워크플로우’를 구성하는 것이 좋습니다.

또한, 검색 증강 생성(RAG, Retrieval-Augmented Generation)은 환각을 제어하는 가장 실용적인 방법입니다. 모델의 내부 지식에만 의존하지 말고, 신뢰할 수 있는 외부 문서 검색 엔진을 연결하여 모델이 검색된 내용을 기반으로만 답변하게 하세요. 이때 시스템 프롬프트로 “검색 결과에 근거가 없을 경우, 검색 결과를 무시하지 말고 답변을 거부하라”는 조건을 명확히 하는 것이 필수입니다.

비용 효율적인 활용 방법과 흔한 오해

환각 제어를 위해 무조건 가장 큰 모델(예: GPT-4o, Claude 3.5 Sonnet)을 사용하는 것이 정답은 아닙니다. 오히려 특정 작업에 특화된 경량 모델에 정교한 프롬프트 제약과 JSON 스키마를 적용하는 것이 비용과 성능 면에서 훨씬 효율적일 수 있습니다. 모델의 크기보다는 ‘입력 데이터의 품질’과 ‘프롬프트의 논리적 구조’가 결과의 품질을 결정합니다.

흔한 오해 바로잡기

  • 오해 1: 모델이 환각을 일으키는 것은 지능이 낮아서다.
  • 사실: 환각은 모델의 확률적 생성 방식 때문이며, 고지능 모델일수록 그럴듯한 거짓말을 더 정교하게 만들어냅니다. 따라서 지능과 상관없이 제약 조건은 필수입니다.
  • 오해 2: 프롬프트만 잘 짜면 환각을 100% 제거할 수 있다.
  • 사실: 환각을 0%로 만드는 것은 현재 기술로 불가능합니다. 다만, 99% 수준까지 제어하고 오류를 검출하는 시스템을 만드는 것이 목표가 되어야 합니다.

자주 묻는 질문

Q: 시스템 프롬프트가 길어지면 모델 성능이 떨어지나요?

A: 지나치게 긴 시스템 프롬프트는 모델의 주의력을 분산시킬 수 있습니다. 핵심 제약 사항은 상단에 배치하고, JSON 스키마 정의는 별도의 도구 호출(Function Calling) 기능을 통해 전달하는 것이 모델의 집중력을 유지하는 데 유리합니다.

Q: JSON 강제 출력을 해도 모델이 가끔 문법 오류를 냅니다. 어떻게 하나요?

A: 모델이 생성하는 텍스트 자체에만 의존하지 마세요. 출력된 결과가 유효한 JSON인지 확인하는 파이썬 코드 레벨의 검증 로직을 반드시 포함해야 합니다. 파싱에 실패할 경우, 해당 에러 메시지를 다시 모델에게 전달하여 ‘재시도(Retry)’를 유도하는 로직을 구현하는 것이 좋습니다.

Q: RAG를 사용해도 환각이 발생합니다. 해결책은 무엇인가요?

A: RAG에서 환각이 발생하는 주된 이유는 검색된 문서가 질문과 관련이 없거나, 검색 품질이 낮기 때문입니다. 검색 결과를 모델에게 넘기기 전에 관련성이 높은지 평가하는 ‘리랭킹(Re-ranking)’ 단계를 추가하면 환각을 대폭 줄일 수 있습니다.

결국 환각 제어는 기술적 완성도와 운영의 묘미가 결합된 과정입니다. 시스템 프롬프트로 모델의 사고방식을 틀에 가두고, 구조화된 출력으로 결과물의 형식을 고정하며, RAG와 검증 로직으로 신뢰성을 검증하는 3단계 접근법을 실천해 보시기 바랍니다. 이러한 체계적인 접근은 AI가 단순한 실험 도구를 넘어 실무 환경에서 신뢰할 수 있는 비즈니스 파트너로 거듭나게 하는 밑거름이 될 것입니다.

youngji
함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.