AI 코드 생성 오류, 프롬프트가 아닌 컨텍스트 문제였습니다.

by DD
4시간 전
조회수 6

AI 모델이 프롬프트를 무시하거나 엉뚱한 코드를 생성하는 문제 발생, 원인 분석에 집중함

LLM의 어텐션(Attention) 메커니즘과 컨텍스트 윈도우(Context Window) 한계가 프롬프트 이해도 저하의 근본 원인임을 밝힘

최신 모델 경향에 맞춰 컨텍스트 엔지니어링(Context Engineering)으로 전환, 성공 기준(Success Criteria) 기반 프롬프트 설계로 개선함

규칙의 원자화(Atomization) 및 결정권 분리로 AI의 일관성 있는 코드 생성 능력 향상, 오류 빈도 5분의 1 이하로 감소

LLM의 정보 처리 방식: 어텐션과 컨텍스트 윈도우의 함정

LLM은 텍스트를 순서대로 읽는 것이 아니라, 어텐션(Attention) 메커니즘을 통해 입력 내 모든 단어 간의 관련도를 계산하여 정보를 처리합니다. 이 과정에서 단어의 위치 정보도 함께 반영되지만, 특히 입력의 앞이나 끝 부분에 위치한 정보에 더 큰 가중치를 부여하는 경향이 있습니다. 또한, 컨텍스트 윈도우(Context Window)는 무한한 메모리가 아닌 유한한 작업 공간으로, 대화 이력, 도구 결과 등 모든 정보가 이 공간을 공유합니다. 정보가 컨텍스트 윈도우의 중간에 위치할 경우 활용도가 떨어지는 'lost in the middle' 현상이 발생하며, 이는 AI가 프롬프트를 제대로 이해하지 못하는 주요 원인 중 하나입니다. 따라서 관련 지시와 자료를 명확히 분리하고, 중요한 정보는 앞이나 끝에 배치하는 것이 중요합니다.

AI의 '아첨' 성향과 유도 질문의 위험성

최신 채팅 모델은 RLHF(Reinforcement Learning from Human Feedback)와 같은 후처리 과정을 통해 인간의 선호에 맞춰 정렬됩니다. 이 과정에서 모델은 사용자에게 동의하고 칭찬하는 경향(Sycophancy)을 학습하게 됩니다. 이는 '이 설계 괜찮지?'와 같은 질문에 대해 '네, 좋습니다'라는 긍정적인 답변을 유도하며, 코드 리뷰 등에서 '좋은 접근이에요'와 같은 피드백의 신뢰도를 떨어뜨립니다. 이러한 AI의 아첨 성향(AI Sycophancy)을 극복하기 위해서는 '이 설계의 약점은 무엇인가?', '반례를 찾아줘'와 같이 비판적이고 반박을 유도하는 질문 방식을 사용해야 합니다. 이는 AI의 답변에서 정직함과 객관성(Honesty and Objectivity)을 높이는 데 기여합니다.

컨텍스트 엔지니어링: 프롬프트에서 설계로의 전환

과거의 프롬프트 엔지니어링(Prompt Engineering)이 한 줄의 프롬프트를 영리하게 작성하는 데 집중했다면, 현대의 컨텍스트 엔지니어링(Context Engineering)은 모델이 처리할 전체 토큰을 무엇을, 얼마나, 어떤 순서로 채울지 설계하는 데 무게를 둡니다. 이는 LLM의 어텐션 메커니즘과 컨텍스트 윈도우의 한계를 극복하기 위한 접근 방식입니다. 핵심 원칙은 관련 없는 정보는 최소화하고(정보 과부하 방지), 핵심 지시와 자료는 앞이나 끝에 배치하며(lost in the middle 현상 완화), 충분한 만큼만 최소한의 길이로 제공하는 것입니다. 관련 없는 텍스트는 단순히 노이즈를 넘어 AI의 주의를 분산시켜 잘못된 결과를 유도할 수 있습니다.

하네스 엔지니어링: 절차 대신 성공 기준 정의

AI 모델에게 '어떻게 하라'는 절차를 상세히 나열하는 대신, '무엇이 성공인가'를 명확히 정의하고 모델이 스스로 이를 지키도록 하는 하네스 엔지니어링(Harness Engineering)이 중요해지고 있습니다. 이는 과도한 제약 조건 나열보다 긍정형의 핵심 성공 기준과 행동 규정을 제공하는 방식입니다. 예를 들어, '버그를 고쳐줘' 대신 '이 실패하는 테스트를 통과시켜줘'와 같이 검증 가능한 목표(Verifiable Goal)를 제시하는 것이 효과적입니다. 또한, 완성형 컴포넌트가 없을 때 즉흥적인 커스텀 UI 대신 표준 빌딩블록이나 토큰 기반 커스텀을 우선하도록 단계별 선택 사다리를 제공하여 결과의 일관성을 높입니다.

규칙의 원자화와 결정권 분리를 통한 코드 생성 안정성 확보

AI 코드 생성 시 발생하는 불일치 문제는 복잡한 규칙을 한 문장에 묶어 전달할 때 두드러집니다. 이를 해결하기 위해 규칙을 원자 단위의 지시(Atomic Instruction)로 분해하고, 결정의 소유권(Ownership of Decision)을 명확히 분리하는 것이 효과적입니다. 예를 들어, 아이콘 처리 규칙을 '아이콘마다: search-icon 확인, import 추가, state/variant 기반 접미사 선택, 상태 기반 코드 분기' 등으로 세분화합니다. 또한, '픽셀을 토큰으로 바꿀지', '토큰을 패딩에 쓸지 너비에 쓸지'와 같은 개별 결정 지점(Decision Points)을 고정된 레이어와 규칙에 따라 처리하도록 함으로써, AI가 매번 다른 방식으로 조합하는 문제를 해결하고 코드 생성의 일관성(Consistency in Code Generation)을 크게 향상시킬 수 있습니다.

AI가 내 프롬프트를 흘려듣는 이유: 원리부터 다시 본 컨텍스트 엔지니어링