9.9.1 정적 분석 및 컴파일 에러 로그의 파싱과 구조화
컴파일러나 린터(Linter)가 터뜨리는 날것(Raw)의 stderr 로그는 터미널에 익숙한 인간 엔지니어에게는 직관적일지 모르나, LLM에게 그대로 긁어서(Copy & Paste) 던져주면 엄청난 혼란을 야기할 수 있다.
ANSI 색상 코드(Escape Sequence)가 섞여 있어 토큰이 오염되고, 수백 줄에 달하는 장황한 스택 트레이스(Stack Trace)는 LLM의 컨텍스트 윈도우(Context Window)를 낭비할 뿐만 아니라 정작 집중해야 할 핵심 발화점(Origin of Error)으로부터 모델의 주의력(Attention)을 분산시킨다. 따라서 오라클 파이프라인의 첫 번째 임무는 기계가 토해낸 비정형 에러 로그를 AI가 가장 잘 소화할 수 있는 구조화된(Structured) 형태의 메타데이터로 파싱(Parsing)하고 정제하는 것이다.
1. 노이즈 제거와 핵심 정보의 추출(Extraction)
컴파일 실패나 정적 분석 거부(Reject)가 발생하면, 오라클 러너(Runner)는 stdout과 stderr 스트림을 낚아채어 정규표현식(Regex)과 에러 포맷 파서(Parser)를 돌린다. 목적은 단 하나, 다음의 핵심 4요소를 추출하는 것이다.
- 에러 종류(Error Classification):
SyntaxError,TypeError,UnusedVariable,SecurityVulnerability등. - 발생 위치(Location): 파일명(
filename.ts), 라인 번호(line: 42), 그리고 가능하면 문제의 컬럼 위치(column: 15). - 컴파일러/도구의 원본 메시지(Original Message): “Cannot read properties of undefined (reading ‘map’)”
- 문제의 코드 스니펫(Code Context): 에러가 발생한 라인을 중심으로 위아래 2~3줄의 코드 문맥. (이것이 가장 중요하다. 단순히 ’42번째 줄’이라고 말하는 것보다 코드 자체를 보여주는 것이 환각을 줄인다.)
에러 로그에 섞여 있는 불필요한 빌드 시스템 안내문(Building module... done, Time elapsed: 2.3s)이나 색상 해시태그(\u001b[31m) 등은 철저히 잘라내어(Strip) 노이즈를 제로(0)에 가깝게 만든다.
2. JSON 기반의 에러 메타데이터 구조화
파싱된 핵심 정보는 프롬프트에 평문으로 줄줄이 풀어쓰는 것보다, LLM이 명확한 구조적 관계로 인식할 수 있도록 JSON (혹은 XML/YAML) 객체로 구조화하는 것이 훨씬 유리하다. 특히 다수의 에러가 동시다발적으로 발생했을 때 그 효과가 극대화된다.
- 구조화된 에러 리포트 예시:
{ "oracle_status": "REJECTED", "stage": "STATIC_TYPE_CHECK", "errors": [ { "type": "TS2322", "file": "src/userController.ts", "line": 42, "message": "Type 'null' is not assignable to type 'string'.", "context_snippet": "41: let username: string;\n42: username = getUser() || null;\n43: return username;" } ] }
## 3. 에러 중복 제거(De-duplication)와 우선순위화(Prioritization)
C++이나 Rust 같은 언어에서는 타입 불일치 에러 단 하나가 연쇄 반응을 일으켜 수백 개의 템플릿 에러(Cascade Errors)를 뱉어내곤 한다. 파서 모듈은 이 수백 개의 에러를 모두 LLM에게 던져서는 안 된다.
1. **중복 제거:** 동일한 변수에 대한 동일한 타입 에러가 여러 줄에 결쳐 나타나면 이를 하나의 에러(Grouped Error)로 병합한다.
2. **우선순위 정렬:** 복합적인 에러가 터졌을 때, 로직 에러(예: 린터 컨벤션 위반)보다는 치명적인 **문법 에러(Syntax Error)나 타입 에러(Type Error)를 리스트의 최상단에 배치**한다. 기초적인 골조가 부서졌는데 인테리어(컨벤션)를 고치는 것은 아무런 의미가 없기 때문이다.
이러한 전처리(Pre-processing) 과정을 거친 '순도 높은' 에러 리포트만이 모델의 자가 수정(Self-correction) 프롬프트로 들어갈 자격을 얻는다. 에러 메시지를 구조화하는 행위란, 쏟아지는 경고음 속에서 AI가 정확히 어디를 칼날로 도려내야 할지 알려주는 정밀한 외과 수술용 좌표를 깎아내는 것과 같다.