Codex의 일반적인 문제점
Codex의 빈번한 문제 중 하나는 느슨하게 정의된 용어로 설계나 구현을 시도하는 경향입니다. 제 경험상 Claude에서는 이 문제가 다소 덜하지만, Codex의 경우 5.5에서 문제가 되었고 5.6에서도 지속되고 있습니다. 이 글은 그 문제에 대한 대응책입니다.
예를 들어, 연구 보고서의 한 섹션에 "압축 지점(Compression Point)"이라는 제목이 있었습니다. 본문을 읽어보면 이 용어는 세 가지 의미 사이를 오갔습니다: "대화 기록이 설정된 양에 도달했을 때", "자동 요약을 시작하는 임계값", "요약이 실제로 시작되는 순간". 문장은 유려했고 기술적인 설명처럼 보였습니다. 하지만 하나의 용어가 시작 조건이자 값이자 이벤트 역할을 하는 순간, 설명의 대상이 정의되지 않게 되었습니다. 결과적으로 연구 결과는 안타깝게도 잘못된 방향으로 이끌렸습니다.
이 실패를 계기로 저는 semantic-generation이라는 스킬을 만들었습니다. 이름은 텍스트 생성 기술처럼 들리지만, 실제로 변경한 것은 텍스트를 작성하기 전에 단어의 정의를 내리는 것이었습니다.
문제의 구조와 영향
일본어 용어 "압축 지점"이 본질적으로 모호하다는 문제도 있지만, Codex는 이 점을 지적받았을 때 먼저 설명 부족 문제로 수정하려고 했고, 그 다음에는 제목 표현 문제로 수정하려고 했습니다. 시작 조건과 실행 이벤트를 혼동했다는 사실을 즉시 깨닫지 못한 것입니다.
같은 세션에서 비슷한 일이 발생했습니다. 아직 원인을 알 수 없었기 때문에, 테스트를 수행하고 결과에서 원인을 분리한 후 대책을 선택하는 계획이었습니다. Codex는 이것을 "관찰 결과를 하나로 모으기"라고 요약했습니다.
수집의 대상은 관찰 결과 자체가 아니었습니다. 테스트에서 얻은 값이나 기록이었습니다. 더 나아가, 값을 수집하는 것이 목표가 아니라 원인을 분리하기 위한 수단이었습니다.
짧은 문구로 요약되면서 다음과 같은 순서가 사라졌습니다:
- 원인을 아직 알 수 없음.
- 테스트 수행.
- 결과에서 원인 분리.
- 분리 후 대책 선택.
"관찰 결과를 하나로 모으기"는 그럴듯해 보입니다. 그럴듯해 보이기 때문에 정리되지 않은 부분을 덮어버리고 이후 설계의 전제 조건이 됩니다.
원래 용어에 대한 수정 목록으로는 막을 수 없음
개선 방안을 고민할 때, 수정된 단어와 의미 간의 대응 관계를 기록하여 다음 세션으로 이전하는 제안이 있었습니다.
제가 막고 싶은 것은 "이전에 잘못 사용한 단어를 다시 사용하는 것"이 아닙니다. 대상이 모호한 상태에서 단어를 먼저 배치하고 그 단어를 기반으로 사고를 진행하는 것입니다. 잘못된 단어 목록을 만들어도 다음 번에는 다른 조어(造語)가 탄생할 것입니다.
따라서 수정된 단어 대신, 매 세션 시작 시 원래 용어를 만들기 전에 후보 단어를 먼저 생성하도록 정책을 변경했습니다.
대책) 설계 전에 후보 단어 목록 생성을 강제
AI가 고유하게 정의된 용어에 대한 대응 테이블을 생성하게 한 후, 해당 파일을 로드한 다음 설계를 수행하도록 결정했습니다.
대응 테이블에는 다음 7개의 열이 있습니다:
- 출처(Source)
- 목적(Purpose)
- 구체적 대상(Concrete Object)
- 역할(Role)
- 컨텍스트(Context)
- 후보 단어(Candidate Word)
- 초기 정의(Initial Definition)
열의 순서는 중요합니다. 후보 단어는 맨 오른쪽에 있으며, 구체적 대상과 역할이 작성될 때까지 채울 수 없습니다.
후보 단어가 맨 왼쪽에 있었다면, "압축 지점"이라는 단어를 먼저 쓰고 나중에 그 단어에 맞는 설명을 만들 수 있었을 것입니다. 이는 테이블 내에서 제가 막고자 하는 생성 순서를 그대로 재현하는 것입니다.
역할도 한 줄에 하나씩 배치됩니다. 시작 조건과 이벤트를 같은 단어로 처리하려면 줄을 나눕니다. 그러면 "하나의 단어로 끝내야 한다"는 압박을 받기 전에, 두 개의 대상을 처리하고 있다는 사실이 드러납니다.
이를 통해 생성 AI 자체가 단어가 모호해지고 있음을 인지할 수 있게 되었고, 단어가 모호한 상태에서 사용하는 것을 적극적으로 금지할 수 있었습니다.
요약
생성 AI는 빈 공간을 그대로 두는 것을 잘하지 못합니다. 대상이나 목적이 아직 결정되지 않았더라도, 그럴듯한 단어를 배치하면 텍스트를 계속 이어나갈 수 있습니다. 이러한 유창함은 설계에서 위험할 수 있습니다.
semantic-generation은 좋은 단어를 찾는 스킬이 아닙니다. AI가 원래 용어를 사용하려 할 때 잠시 멈추고 적절한 단어를 선택하도록 만드는 스킬입니다.
대상은 무엇인가? 조건인가, 상태인가, 이벤트인가? 어떤 목적으로 처리되며, 무엇 이후에 무엇이 발생하는가?
그렇게 작성된 줄에 대해서만 마지막에 이름을 부여합니다. 언뜻 보면 우회로처럼 보이지만, "압축 지점"이라는 하나의 단어에서 전체 설계를 재구축하는 것보다는 짧은 길입니다.
semantic-generation 스킬
1---2name: semantic-generation3description: |4 대상 문서(설계 자료, 요구사항 기반 설계, 연구 보고서, 원인 분리 계획, 대책 계획, 네이밍, 추론 순서 요약)를 작성하기 전에, 독립적인 산출물로서 대응 테이블(referent table)을 먼저 제출하여 단어보다 지시 대상(referent)과 역할을 고정시키는 생성 절차.5 트리거: 설계 자료 작성, 설계 문서 생성, 연구 보고서 작성, 대책 계획 작성, 네이밍, 상태 이름/조건 이름/타입 이름/메서드 이름 결정, 추론 순서 요약, 지시 대상 테이블, 대응 테이블.6 트리거 금지: 사용자 원문 인용, 단순 기계적 편집, 기존 이름 재사용, 고정 출력, 잡담, 확립된 용어만으로 작성 가능한 짧은 문장.7---89# semantic-generation — 단어보다 대상을 먼저 고정하는 절차1011대상이 모호한 상태에서 단어(종종 즉석에서 만든 조어)를 먼저 배치하고 그 단어를 기반으로 사고를 진행하면, 지시 대상과의 불일치가 일본어 문장, 설계 문장, 코드 식별자로 수정 없이 전파됩니다. 이 스킬은 "대응 테이블을 먼저 독립적으로 제출하고 본문을 그 복사본으로 작성"하는 순서를 강제합니다. 규율 기준은 [[referent-before-label]] 규칙이 보유합니다.1213## 적용 기준1415다음 중 하나에 해당하는 경우 사용합니다. 판단이 어려우면 적용 대상으로 간주합니다.16171. 설계 자료, 요구사항 기반 설계, 연구 보고서, 원인 분리 계획 또는 대책 계획을 작성하는 경우.182. 네이밍(공개 사양, 상태 이름, 조건 이름, 이벤트 이름, 값 또는 기록의 타입 이름, 메서드 이름, boolean 이름)을 하는 경우.193. 사용자가 제공한 추론 순서를 짧은 작업 레이블로 요약하려는 경우.2021## 일반 흐름2223### 1. 대응 테이블을 먼저 독립적인 산출물로 저장 (2단계 제출)2425본문을 한 글자도 쓰기 전에, 대응 테이블을 독립적인 파일로 저장합니다.2627- 저장 위치: 작업 디렉토리의 `referent-table-<slug>.md` (산출물이 `output/` 아래에 있는 경우 동일 디렉토리에 배치).28- 저장 후 sha256을 기록합니다(예: `shasum -a 256 <path>`). 이 기록은 "본문보다 먼저 대응 테이블이 생성되었다"는 증거가 됩니다. 완성된 문서의 시작 부분에 테이블을 배치하는 것만으로는 생성 순서를 증명할 수 없습니다.2930### 2. 대응 테이블 형식 (열 순서 변경 금지)3132| 출처(Source) | 목적(Purpose) | 구체적 대상(Concrete Object) | 역할(Role) | 컨텍스트(Context) | 후보 단어(Candidate Word) | 초기 정의(Initial Definition) |3334- **후보 단어는 맨 오른쪽에 고정됩니다. 구체적 대상과 역할이 채워질 때까지 후보 단어 열을 비워 둡니다.** 이는 단어를 먼저 결정하고 대상을 나중에 붙이는 순서를 형식을 통해 불가능하게 만들기 위함입니다.35- 역할은 폐쇄된 옵션에서 선택합니다: `시작 조건(Starting Condition) / 상태(State) / 이벤트(Event) / 값(Value) / 기록(Record) / 목적(Purpose) / 수단(Means)`. 동일한 단어가 여러 역할을 지칭하는 경우 줄을 나눕니다.36- "컨텍스트"에는 사용자가 제공한 추론 순서(예: 테스트 → 분리 → 대책)를 원문의 단어를 사용하여 작성합니다. 역할 열과 혼합하지 마십시오.37- 테이블은 일반적으로 1~6줄로 제한됩니다. 초과하는 경우 의미가 변경되는 경계에서 테이블을 분할합니다.38- 완료 시, 후보 단어 열을 숨겨도 "구체적 대상" 열만으로 의미가 명확한지 확인합니다.3940### 3. 후보 단어 채우기4142- 사용자 용어와 확립된 용어를 최우선으로 사용합니다.43- 그 외의 새로운 단어를 배치할 때는 "초기 정의" 열에 "X는...을 의미합니다"라고 작성합니다. 정의를 작성할 수 없는 단어는 도입하지 말고, 구체적 대상의 설명을 본문에 그대로 사용합니다.4445### 4. 대응 테이블의 복사본으로 본문 작성4647- 대응 테이블에 나열된 단어만을 본문의 중심 어휘로 사용합니다.48- 일본어 문장, 설계 요소, 코드 식별자의 세 레이어에서 동일한 대응 관계를 유지합니다(예: "기록 볼륨이 250K에 도달" = 시작 조건 → 조건 이름 / "자동 요약 시작" = 이벤트 → 이벤트 이름/메서드 이름 / "자동 요약 진행 중" = 상태 → 상태 이름. 다른 역할은 다른 이름을 가져야 합니다).49- 프레임워크나 제목에 작업 레이블(목적, 대상, 판단을 생략한 추상 명사구)을 사용하지 마십시오. 사용하려면 해당 구문의 지시 대상을 테이블에 작성해 보십시오. 작성할 수 없으면 구체적인 문장으로 작성하십시오.5051## 문제 발생 시 사전 조치5253- 대응 테이블을 제출하지 않고 본문 작성을 시작했다는 것을 깨달은 경우, 나중에 테이블을 추가하여 계속 진행하지 마십시오. 본문을 폐기하고, 대응 테이블을 독립적으로 다시 제출한 후 본문을 재생성하십시오.54- 테이블의 한 줄이 잘못되었다는 지적(지시 대상 또는 역할 혼동)을 받은 경우, 설명을 추가하지 말고 해당 줄을 다시 작성한 후 본문의 해당 부분을 재생성하십시오.55- 이 스킬을 로드할 수 없는 환경에서는 본문을 시작하기 전에 최소 6개 열(출처, 목적, 구체적 대상, 역할, 컨텍스트, 후보 단어)의 테이블을 독립적인 파일로 저장하십시오.5657## 비고5859- 이 스킬의 본문에 검증을 위한 테스트 입력이나 예상 답변을 포함하지 마십시오(검증의 독립성 유지. 테스트는 별도 디렉토리의 fixtures에서 관리).60- 목표는 잘못된 용어 목록과의 일치 여부를 확인하는 것이 아닙니다. 일치 대상은 "문서 자체가 선언한 대응 테이블"입니다.
referent-before-label 규칙
1# 단어보다 지시 대상을 먼저 고정23<!-- codex-runtime-summary -->4- 중요: 대상 문서(설계 문장, 연구 보고서, 대책 계획, 네이밍, 추론 순서 요약)의 경우, 대응 테이블을 독립적으로 제출한 후 본문을 작성합니다. 대응 테이블 없이 본문을 제출하는 것은 금지됩니다. 테이블 없이 작성을 시작한 경우 본문을 폐기하고 대응 테이블부터 다시 시작하십시오.5- 중요: 프레임워크나 제목에 작업 레이블(정리되지 않은 작업을 추상 명사로 감싼 구문)을 사용하지 마십시오. 초기 정의를 작성할 수 없는 새로운 단어나 조어를 도입하지 마십시오. 대상을 구체적인 설명으로 분해하십시오.6- 중요: 대상 문서를 시작할 때 semantic-generation 스킬을 트리거하십시오. 스킬을 사용할 수 없더라도 최소 6개 열(출처, 목적, 구체적 대상, 역할, 컨텍스트, 후보 단어)의 대응 테이블을 먼저 독립적인 산출물로 저장하십시오.7<!-- /codex-runtime-summary -->89대상이 모호한 상태에서 단어(종종 즉석에서 만든 조어)를 먼저 배치하고 그 단어를 기반으로 사고를 진행하면, 지시 대상과의 불일치가 설계 문장, 상태 이름, 조건 이름, 메서드 이름, 타입 이름으로 수정 없이 전파됩니다(TASK-52의 "압축 지점" 및 "관찰 결과를 하나로 모으기" 예시 참조). 이 규칙은 이러한 생성 과정 자체를 중단시킵니다. 잘못된 용어 목록과의 일치 여부 확인(단어 사냥)은 대책이 아닙니다. 조어는 열거할 수 없기 때문입니다. 단어 변동 기준은 [[terminology]]가 보유하며, 이 규칙은 "단어를 배치하기 전의 절차"를 보유합니다.1011## 적용 범위 (대상 문서)1213다음 중 하나에 해당하는 작업에만 적용합니다. 판단이 어려우면 적용합니다.14151. 설계 자료, 요구사항 기반 설계, 연구 보고서, 원인 분리 계획 또는 대책 계획을 작성하는 경우.162. 네이밍(공개 사양, 상태 이름, 조건 이름, 이벤트 이름, 값 또는 기록의 타입 이름, 메서드 이름, boolean 이름)을 하는 경우.173. 사용자가 제공한 추론 순서를 짧은 작업 레이블로 요약하려는 경우.1819사용자 원문 인용, 단순 기계적 편집, 기존 이름 재사용, 고정 출력, 잡담, 확립된 용어만으로 작성 가능한 짧은 문장에는 적용하지 마십시오.2021## 상시 적용 (3가지 금지 사항)2223- 중요: 대상 문서에서, 대응 테이블(referent table)을 독립적으로 제출하지 않고 본문을 제출하지 마십시오. 대응 테이블은 본문과 별도의 파일 또는 별도의 턴으로 먼저 저장되어야 하며, 그 후에 본문을 작성합니다(완성된 문서의 시작 부분에 테이블을 배치하는 것만으로는 "먼저 만들었다"는 것을 증명할 수 없습니다).24- 중요: 프레임워크, 제목 또는 결론에 작업 레이블을 사용하지 마십시오. 작업 레이블이란 목적, 대상 또는 판단 없이 정리되지 않은 작업을 추상 명사로 감싼 구문입니다(예: "관찰 결과 요약"). 사용하려면 해당 구문이 지칭하는 대상을 대응 테이블에 작성해 보십시오. 작성할 수 없으면 구문을 폐기하고 구체적인 문장으로 작성하십시오.25- 중요: 사용자 용어나 확립된 용어 이외의 새로운 단어를 도입할 때는 첫 번째 출현 시 "X는...을 의미합니다"라는 정의 문장을 작성하십시오. 정의 문장을 작성할 수 없는 단어는 도입하지 말고, 대상을 문장으로 그대로 풀어서 작성하십시오.2627## 일반 흐름28291. 대상 문서에 해당하는지 판단합니다(의심스러우면 적용 대상으로 간주).302. [[semantic-generation]] 스킬을 트리거하고 대응 테이블을 먼저 독립적인 산출물로 저장합니다.313. 대응 테이블에 나열된 단어만을 중심 어휘로 사용하여, 일본어 문장, 설계 요소, 코드 식별자에서 동일한 대응 관계를 유지하며 본문을 작성합니다.3233## 문제 발생 시 사전 조치3435- 대상 문서에 대해 대응 테이블을 제출하지 않고 본문 작성을 시작했다는 것을 깨달은 경우, 나중에 테이블을 추가하여 계속 진행하지 마십시오. 본문을 폐기하고, 대응 테이블을 독립적으로 다시 제출한 후 본문을 재생성하십시오.36- 스킬을 사용할 수 없는 환경에서는 본문을 시작하기 전에 작업 디렉토리에 최소 6개 열(출처, 목적, 구체적 대상, 역할, 컨텍스트, 후보 단어)의 대응 테이블을 독립적인 파일로 저장하십시오.





