프로젝트 개요
내가 담당한 범위
새로운 요구사항을 프롬프트 수정으로만 처리하지 않고, 고객과 엔지니어링 사이에서 구조적 문제를 해결했습니다.
변경 전 시스템
서비스는 LangChain, RAG, GPT를 활용해 지문에서 영어 문제를 생성하고 있었습니다. 이미 사용 중이었지만 생성 품질이 점차 흔들리고 있었습니다.
- 같은 문제가 중복 생성됐습니다.
- 오답 선택지가 지문과 관련 없는 내용으로 생성되기도 했습니다.
- Few-shot 검색이 의도한 문제 유형이나 학생 수준과 맞지 않는 예시를 선택했습니다.
- 생성 실패가 최종 결과 전에 일관되게 걸러지지 않았습니다.
개별 프롬프트만의 문제가 아니었습니다. 검색, 출력 구조, 검증 과정이 모두 최종 품질에 영향을 주고 있었습니다.
새로운 고객 요구사항
고객은 생성 도구를 자사 서비스에 내장할 계획이었고, 1지문 2문항은 고객 제품에서 반드시 지원해야 하는 형식이었습니다.
“하나의 지문에서 서로 연결된 문제 두 개를 생성해주세요.”
고객 요구사항
겉으로는 출력 개수를 하나 늘리는 요청처럼 보였습니다. 하지만 기존 시스템은 한 번의 생성 과정에서 독립적인 문제 하나를 만드는 구조였고, 각 문제가 개별적으로 컨텍스트를 관리해 두 문제가 함께 참조할 수 있는 지문 단위 구조가 없었습니다.
프롬프트 호출을 한 번 더 하면 문제 두 개를 만들 수는 있지만, 같은 지문 맥락을 공유하거나 유효한 연계 문제로 구성된다는 보장은 없었습니다.
고객과 요구사항 범위 나누기
요청을 두 가지 범위로 나누고 차이를 고객에게 직접 설명했습니다.
즉시 개선할 수 있는 범위
- 검색 샘플과 Few-shot 품질
- 프롬프트와 출력 일관성
- 문제 형식과 검증 규칙
- 기존 단일 문제 생성의 품질 오류
아키텍처 변경이 필요한 범위
- 여러 문제가 공유하는 지문 컨텍스트
- 생성 단계 분리
- 지문 단위 토큰 관리
- 연계 결과를 위한 캐시 동작 변경
한계에는 날짜를 함께 붙였습니다
현재 아키텍처로는 전체 요구사항을 안정적으로 지원할 수 없다고 설명하고, 구조 변경을 3주 안에 납품하겠다고 약속했습니다. "불가능하다"로 끝내지 않고 경계를 분명히 한 대화였습니다.
핵심 의사결정
01즉시 가능한 품질 개선과 구조 변경을 분리한다
모든 문제를 하나의 대규모 재개발로 묶으면 진행 상황을 설명하고 검증하기 어려웠습니다. 검색·프롬프트·검증 개선과 연계 문제를 위한 아키텍처 변경을 분리했습니다.
고객은 지금 개선할 수 있는 것과 재설계 이후 가능한 것을 명확히 이해할 수 있었습니다.
02문제 하나가 아니라 지문을 파이프라인의 중심 단위로 만든다
기존 시스템은 한 번의 생성 과정을 문제 하나 중심으로 구성했습니다. 새 아키텍처에서는 여러 문제를 조율할 수 있는 공유 지문 컨텍스트를 중심으로 흐름을 다시 만들었습니다.
연계 문제들이 동일한 원문 맥락을 사용하면서도 각각의 생성과 검증 단계를 유지할 수 있게 되었습니다.
03학생 수준과 유사도를 함께 고려해 Few-shot 예시를 선택한다
기존 검색은 의미적으로는 비슷하지만 교육 수준에는 맞지 않는 예시를 선택할 수 있었습니다. 학교급에 따라 벡터 값을 다시 조정하고, 콘텐츠와 학습자 수준을 함께 반영하도록 유사도 선택 방식을 수정했습니다.
생성 이후에 잘못된 예시를 고치는 대신 프롬프트 이전 단계에서 실패 원인을 줄였습니다.
04문제 구조를 표준화하고 다단계 검증을 추가한다
생성 결과의 구조를 표준화하고 여러 단계의 검증을 추가했습니다. 중복, 관련성, 구조 오류를 최종 응답 전에 더 쉽게 발견할 수 있게 했습니다.
검증을 최종 수작업이 아니라 생성 시스템의 일부로 만들었습니다.
05반복적인 GPT 테스트로 동작을 측정한다
개별 예시는 변동성이 커서 아키텍처 의사결정의 근거로 충분하지 않았습니다. 변경된 파이프라인에서 약 800회의 GPT API 테스트를 수행하고, 반복 결과를 바탕으로 프롬프트·검색·검증을 조정했습니다.
변경 전후 아키텍처
단계 이름은 일반화해 표기했습니다. 실제 파이프라인 컴포넌트와 캐시 이름은 고객 확인 전까지 공개하지 않습니다.
3주
실패를 재현
중복 문제, 지문과 무관한 오답, 수준이 맞지 않는 Few-shot 선택을 보고가 아니라 재현으로 확인했습니다.
요구사항 분류
즉시 가능한 수정과 아키텍처에 의존하는 요구사항을 분리해 고객에게 설명하고 3주를 약속했습니다.
검색 재구축
학교급에 따라 벡터 값을 조정하고, 콘텐츠와 학습자 수준을 함께 반영하도록 유사도 선택을 다시 작성했습니다.
구조와 검증
생성 결과 구조를 표준화하고 파이프라인 내부에 다단계 검증을 추가했습니다.
지문 중심 재설계
공유 지문 컨텍스트, 생성 단계 분리, 지문 단위 토큰 관리와 캐시 동작 재작성.
약 800회 GPT API 테스트
변경된 파이프라인에서 반복 실행하고, 개별 출력이 아닌 누적 결과로 프롬프트·검색·검증을 조정했습니다.
배포
연계 문제 요구사항을 약속한 일정 안에 완료하고 실서비스에 배포했습니다.
테스트와 성능
수치는 변경 이후 테스트한 생성 파이프라인 기준입니다. 정확한 측정 조건과 약 800회 테스트의 문제 유형별 구성은 게시 전 고객 확인이 필요합니다.
결과
측정된 결과
- 생성 속도를 15초에서 8초로 단축했습니다.
- 실패율을 5%에서 1.5%로 낮췄습니다.
- 기존 구조로 지원할 수 없던 연계 문제 요구사항을 3주 안에 납품했습니다.
- 완성된 작업은 연 USD 40K 규모의 B2B 계약에 기여했습니다.
납품 상태
- 재설계한 파이프라인을 실서비스에 배포했습니다.
- 고객 요구사항을 약속한 일정 안에 완료했습니다.
주장의 범위
- 성능 수치는 변경 이후 파이프라인을 내부에서 측정한 값입니다.
- 재설계는 2인이 함께 구현했으며, 계획·프롬프트·검색 개선·테스트는 제가 담당했습니다.
배운 점
기술적 한계는 실행 가능한 경로와 함께 설명할 때 가장 유용했습니다. 요구사항을 "지금 가능한 것"과 "아키텍처 변경 후 가능한 것"으로 나누어, 제약을 숨기지 않으면서도 고객과 방향을 합의할 수 있었습니다.
LLM 출력의 실패가 프롬프트에서 시작되는 것만은 아니라는 점도 확인했습니다. 검색 품질, 공유 컨텍스트, 데이터 구조, 검증, 캐싱이 모두 최종 결과에 영향을 주었습니다.
다시 진행한다면 검색 품질 검사를 더 이른 단계에 추가할 것입니다. Few-shot 불일치가 생성 이후의 품질 문제로 이어지기 전에 발견할 수 있습니다.
모든 다이어그램은 실제 구조를 바탕으로 다시 그렸으며, 고객사명·데이터·식별자는 제거했습니다.