9.9.2 에러 메시지를 포함한 프롬프트 재구성 및 재생성(Retry) 전략

9.9.2 에러 메시지를 포함한 프롬프트 재구성 및 재생성(Retry) 전략

구조화된 에러 리포트(JSON)가 샌드박스에서 건너오면, 이제 이 실패 데이터를 바탕으로 LLM에게 ‘어떻게(How)’ 코드를 고칠 것인지 지시하는 재생성(Retry) 프롬프트를 조립해야 한다.

단순히 “에러가 났으니 다시 짜줘“라고 던지는 것은 오라클 설계에서 금기시되는 최악의 패턴이다. LLM은 자신이 어디서 틀렸는지 맥락(Context)을 파악하지 못한 채, 랜덤 시드(Seed)를 살짝 바꿔 완전히 똑같은 논리 구조로 코드의 껍데기만 바꿔치기하며 영원히 실패의 늪(Infinite Death Loop)에 빠지게 된다. 효과적인 자가 수정을 위한 프롬프트는 명확한 컨텍스트 주입과 행동 강령의 재수립(Re-instruction)을 수반해야 한다.

1. 컨텍스트 보존(Context Preservation) 원칙

재생성 프롬프트를 구성할 때 가장 먼저 지켜야 할 원칙은, LLM이 최초에 코드를 짤 때 기반으로 삼았던 **‘원본 프롬프트(Original Prompt)와 시스템 지시문(System Instructions)을 절대 유실해서는 안 된다’**는 것이다.

에러 메시지만 던져주면 모델은 “아, 이 에러만 피하면 되는구나“라고 착각하여, 오라클의 지적을 회피하기 위해 원래의 비즈니스 로직(예: 이메일 검증, 데이터베이스 트랜잭션 등)을 아예 삭제하거나 주석 처리해 버리는 등 어처구니없는 우회(Bypass) 코드를 생성하기도 한다.

따라서 Retry 프롬프트의 기본 골조는 다음과 같다:

  1. Original Mission: “당신의 원래 목표는 [원본 지시문]을 구현하는 것이었습니다.”
  2. Current Status: “당신이 이전 턴(Turn)에 작성한 코드는 정적 컴파일 오라클에서 다음과 같은 사유로 REJECT 되었습니다.”
  3. Error Details: 구조화된 에러 리스트(파일명, 라인넘버, 상세 메시지, 스니펫).

2. ‘부분 수정(Partial Patch)’ 대 ’전면 재작성(Full Rewrite)’의 결정

오라클 미들웨어는 에러의 성격에 따라 프롬프트의 어조와 지시 방향성을 동적으로 선택(Routing)해야 한다.

  • 부분 수정(PatchMode) 프롬프트: 세미콜론 누락(SyntaxError), 단순 타입 미스매치, 리턴 타입 불일치 등 엽기적이지 않은 에러인 경우.
  • 전략: “코드 전체를 바꾸지 말고, 아래에 지적된 42라인의 타입 에러(string -> int)만을 고치기 위한 최소한의 수정(Minimal Diff)을 제시하라.”
  • 전면 재작성(RewriteMode) 프롬프트: 순환 복잡도(Cyclomatic Complexity) 위반, 치명적인 보안 취약점(eval, SQL Injection), 핵심 라이브러리 할루시네이션(존재하지 않는 패키지 호출) 등 기반이 썩어 있는 경우.
  • 전략: “현재 코드는 보안 및 설계 상의 치명적인 결함으로 인해 부분 수정이 불가능합니다. 과거의 코드는 완전히 폐기하고, 다음의 컴플라이언스(보안 규칙, 모듈화 조건)를 염두에 둔 채 바닥(Scratch)부터 완전히 새로운 아키텍처로 다시 작성하라.”

3. 구조화된 출력(Structured Outputs)을 강제하는 Diff 포맷 제한

재생성 단계에서 LLM이 또다시 “네, 죄송합니다! 에러를 발견했습니다. 고쳐보겠습니다…” 식의 장황한 사과문과 함께 마크다운 텍스트를 줄줄이 뽑아내면 파싱 파이프라인이 다시 한번 붕괴하게 된다.

Retry 프롬프트의 마지막 섹션은 반드시 시스템이 즉각적으로 코드를 추출하여 다시 컴파일러에 던질 수 있는 엄격한 ‘Diff 포맷’ 또는 JSON 스키마를 요구해야 한다.

“설명, 변명, 혹은 마크다운 백틱(```) 밖의 텍스트는 일체 허용하지 않습니다. 수정된 파일 내용 전체(Full File Content) 또는 유효한 Unified Diff 포맷으로만 응답을 반환하십시오.”

에러 피드백을 수용한 재생성 전략은 단순히 LLM에게 에러 로그를 메아리(Echo) 치는 수준을 넘어선다. 원본 요구사항의 컨텍스트를 유지하면서, 잘못된 구조를 도려내고, 기계가 즉각적으로 컴파일할 수 있는 포맷으로 제어하는 **‘능동적인 코드 코칭(Active Code Coaching)’**이야말로 자율 주행 AI 파이프라인을 탈선에서 구하는 든든한 가드레일이다.