4.7 입력 데이터의 정규화 및 프롬프트 전처리
LLM 기반 시스템에서 비결정적 출력(Nondeterministic Output)을 치유하는 가장 첫 번째 방어선은 파라미터 튜닝이나 프롬프트 지시문 수정이 아니다. 모델이 읽어들일 ’입력 데이터 자체를 예측 가능한 형태로 정돈’하는 전처리(Preprocessing) 단계야말로 AI 오라클을 견고하게 만드는 가장 강력한 결정론적 제어 수단이다.
동일한 의미를 지닌 입력이라도 공백, 특수 기호, 마크다운(Markdown) 포맷의 미세한 차이에 따라 모델의 내부적인 어텐션 분포(Attention Distribution)가 크게 흔들리며 완전히 다른 출력 경로를 타는, 이른바 ‘프롬프트 민감성(Prompt Sensitivity)’ 현상이 발생하기 때문이다.
1. 입력 데이터의 엄격한 포맷 정규화(Normalization)
사용자 입력이나 외부 API에서 연동된 비정형 데이터(Unstructured Data)를 날것(Raw) 그대로 모델의 시스템 프롬프트에 삽입하는 것은 언제 터질지 모르는 폭탄을 안고 있는 것과 같다. 오라클이 일관되게 채점할 수 있는 출력을 유도하려면 프롬프트의 동적 변수 영역을 주입하기 전에 철저한 정규화 프로세스를 거쳐야 한다.
- 공백 및 제어 문자 제거: 여러 줄의 연속된 개행 기호(
\n\n\n), 눈에 보이지 않는 유니코드 제어 문자, 앞뒤의 불필요한 공백을 제거(trim)하거나 단일 공백으로 치환하라. LLM은 공백 문자의 양에 따라 문단의 논리적 단절 강도를 다르게 해석하여 생성 확률(Logit) 계산을 변경한다. - 인코딩 및 특수 기호 정렬: 문장 부호(예: 둥근 따옴표
“”를 곧은 따옴표""로 변경)나 인코딩 방식을 통일하라. 동일한 코드 조각이라도 어떤 텍스트 에디터에서 복사되었느냐에 따라 숨겨진 문자열이 달라져 모델의 구문 분석(Parsing) 로직을 교란할 수 있다. - JSON/XML 구조화 주입: 단순한 텍스트 덩어리를
{{input_data}}형태로 밀어 넣지 마라. 구조가 복잡한 데이터라면 차라리 애플리케이션 백엔드에서 미리 JSON 객체로 파싱하고 검증한 후, 잘 정돈된JSON문자열로 변환하여 프롬프트의<data>...</data>XML 태그 블록 안에 격리(Sandboxing)시켜 삽입하라. 이는 데이터의 경계(Boundary)를 명확히 하여 모델이 입력값을 지시문(Instruction)으로 오인하는 프롬프트 인젝션(Prompt Injection)을 예방하는 핵심 기법이기도 하다.
2. 모호성 사전 제거와 문맥 압축
모델에게 불필요하게 많은 정보를 제공하면 할루시네이션(Hallucination) 확률과 출력의 가변성이 급증한다. 오라클 시스템을 위한 프롬프트는 ’정확한 계산’을 위한 수식을 작성하듯, 잡음(Noise)을 최소화해야 한다.
- 의무적인 핵심 정보 추출(Information Extraction): 수십 페이지의 문서를 통째로 컨텍스트로 넘기는 대신, 프롬프트 파이프라인 정면에 사전 처리 태스크(혹은 소형 NLP 모델)를 배치하여 ’비즈니스 로직 판단에 필요한 핵심 키워드나 수치’만을 추출해라. 추출된 정형 데이터만 메인 오라클 판단 프롬프트에 전달함으로써 추론의 복잡도를 낮추고 일관성을 극대화할 수 있다.
- 모호한 지시대명사 교체: 입력 텍스트 내의 ‘이것’, ‘그 회의’ 같은 맥락 의존적 지시어를 명시적인 고유 명사나 날짜 데이터로 백엔드에서 치환(Resolution) 처리한 뒤 프롬프트에 제공하라. 모델 스스로 대명사가 지칭하는 대상을 추론하도록 방치하는 순간 경로의 비결정성이 발생한다.
3. 프롬프트 토큰화(Tokenization) 안전망 구축
입력값의 길이가 모델이 허용하는 최대 컨텍스트 창(Context Window) 한계에 다다르면 문장의 끝부분이 잘려 나가며 최악의 오작동을 일으킨다.
- 동적 청킹(Dynamic Chunking) 및 절단(Truncation): 모델 API 호출 전에 반드시 백엔드 단에서 토크나이저(예:
tiktoken) 라이브러리를 사용해 입력값을 사전 토큰화하고 길이를 검증하라. 허용 한계를 넘는다면 비즈니스 규칙에 따라(예: ‘최근 대화 우선’, ‘헤더 정보 유지’) 안전하게 잘라내거나 요약 모델을 태운 뒤 메인 프롬프트에 주입하는 보호막(Safety Net)을 구현해야 한다. 이러한 토큰 수준의 전처리 안전망이 없다면 프롬프트는 입력 데이터의 크기에 따라 언제든 깨질 수 있는 유리 조각에 불과하다.