긴 AI 스레드가 흐트러지고 작은 오류가 눈덩이처럼 커질 때
Source: Dev.to
번역을 진행하려면 번역하고자 하는 전체 텍스트를 제공해 주시겠어요? 텍스트를 주시면 요청하신 대로 한국어로 번역해 드리겠습니다.
컨텍스트 윈도우와 감소하는 제약조건
레거시 기능을 반복 작업하는 동안 채팅을 3일 동안 열어 두었습니다. 스레드 초반에 “Django 3.2, Python 3.8, synchronous codebase”라고 적고 실제 모델 정의 몇 개를 붙여넣었습니다. 둘째 날이 되자 어시스턴스가 URL 경로 변환기와 async 뷰를 제안하기 시작했습니다. 패치를 적용해 보려 할 때 테스트 스위트가 import 오류로 충돌하면서 그 제안이 그럴듯하게 들렸습니다. 최신 토큰이 주의를 지배합니다. 모델은 스레드 상단에 명시한 제약조건보다 최신 스니펫과 예제를 따라갔고, 그래서 초기 가정이 조용히 사라졌습니다.
Small mismatches compound into dangerous runs
한 번은 차이(diff) 형태로는 괜찮아 보였지만, 세 번째 메시지에서 예시로 사용했던 단수형 테이블 이름을 사용한 자동 생성 마이그레이션을 받아들였었습니다. 그 마이그레이션은 스테이징에서 실행되어 잘못된 테이블을 수정했습니다. 어느 하나의 제안도 명백히 잘못된 것은 아니었습니다. 각각은 아주 작고 숨겨진 가정—변수 이름, 기본 플래그, 환경—에 의존하고 있었습니다. 이러한 가정들이 쌓여 CI 작업이 원하지 않는 마이그레이션을 적용하게 만들었습니다. 모델은 부수 효과를 이해하지 못하고, 예측하기 쉬운 컨텍스트를 그대로 반영합니다.
도구 호출이 실패하고 어시스턴트가 빈틈을 메움
모델을 로그 검색에 연결했을 때, 상황이 나아지기 전에 더 악화되었습니다. 한 쿼리는 타임아웃으로 인해 잘린 로그를 반환했습니다. 모델은 그 조각을 읽고 전체 로그에 나타나지 않은 문제를 해결하는 코드 변경을 제안했습니다. 그런 다음 자신 있게 패치를 작성했으며, 우리의 자동화 시스템이 이를 적용하려고 시도했습니다. 패치에는 로그 형태에 대한 검사가 포함되지 않았는데, 이는 어시스턴트가 타임아웃 오류를 보지 못했기 때문입니다. 외부에서는 이것이 잘못된 추론처럼 보였습니다. 실제로는 도구 응답이 누락되고 프롬프트에 부정적인 경로가 없었기 때문입니다.
몇 차례 사건이 발생한 뒤, 저는 도구 출력에 대한 명시적인 검사를 추가했습니다. 이제 모든 도구 호출은 상태 코드와 길이 필드를 반환합니다. 응답이 부분적일 경우 어시스턴트는 우리 오케스트레이터가 감지할 수 있는 특정 문구로 답하도록 요청받습니다. 이것은 지루한 파이프라인 작업—검증, 로그 기록, 그리고 부분 데이터에 대해 행동을 거부하는—입니다. 이 작은 변화 덕분에 모델이 서술을 완성하기 위해 값을 만들어 내는 일련의 실수를 여러 번 방지할 수 있었습니다.
실제로 적용한 실용적인 가드레일
나는 긴 스레드를 단일 세션으로 다루는 것을 중단하고 가변 문서로 취급하기 시작했다. 몇 번의 턴마다 정확한 버전, 프로젝트 경로, 그리고 반드시 참조해야 하는 작은 예시를 포함한 간결한 “Current constraints” 블록을 게시한다. 모델이 해당 블록을 무시하는 결과를 생성하면 스레드를 재설정하는 트리거가 된다. 또한 프롬프트를 스냅샷하고 생성된 코드를 샌드박스 테스트 러너에서 실행한 뒤 파이프라인에서 배포 가능한 아티팩트를 허용한다. 이는 수동적인 마찰이지만, 유창한 답변이 숨길 수 있는 드리프트 유형을 포착한다.
검증을 위해 이제 두 가지 교차 검증을 병렬로 사용한다. 빠른 비교를 위해 동일한 프롬프트를 공유 워크스페이스에서 여러 모델에 실행시켜 의견 차이가 명확한 가정을 드러내게 한다; 이 워크플로우는 팀 노트에 문서화했으며 때때로 전용 멀티‑모델 채팅에서 실행한다. 런타임 동작에 영향을 주는 모든 경우에는 어시스턴트에게 문서나 테스트를 인용하도록 요청하고, 그런 주장들을 연구 흐름과 유사한 소싱 워크플로우를 사용한 집중 연구 단계에서 검증한다. 이 두 패턴을 함께 사용하면 많은 숨겨진 드리프트를 포착할 수 있다.
Changing how I accept answers
저는 어시스턴트 출력물을 초안으로 보고 기계와 인간 검증이 필요하다고 생각합니다. 지루하게 들릴 수 있지만, 또 다른 중단을 방지했습니다: 멱등성을 가정한 재시도 루프 제안이 있었죠. 테스트에서 비멱등성을 감지했고, 패치는 프로덕션에 도달하지 못했습니다. 이제 저는 프롬프트에 사소하고 실행 가능한 예시를 반드시 포함하고, 자동화된 변경 주변에 로깅을 요구합니다. 모델은 여전히 제가 더 빠르게 반복하도록 돕습니다. 바뀐 점은 검증 방식, 로그 위치, 그리고 스레드가 흔들리기 시작할 때 컨텍스트를 얼마나 빨리 재설정하는가입니다.