
소프트웨어 개발의 패러다임이 완전히 바뀌고 있습니다.
과거에는 마주하지 않았던 새로운 종류의 과제들이 이제는 일상적인 개발자의 과제로 주어지고 있으며, 더욱 당혹스러운 점은 이러한 과제들을 아무리 뛰어난 개발자라 할지라도 기존의 알고리즘과 코드로 풀어낼 수 없다는 사실입니다.
가장 흔한 예로, 우리가 매일 사용하는 채팅 서비스에서 사용자가 첫 질문을 입력했을 때 왼쪽에 생성되는 '채팅방 제목'을 만드는 기능을 생각하게되었는데요.
이 기능을 기존의 전통적인 알고리즘으로 구현할 수 있을까요? 사용자의 질문을 단순히 '10자 이내로 요약'하는 규칙을 세운다면 다음과 같은 수많은 예외 상황과 예외 처리에 직면하게 됩니다.
이처럼 사소해 보이는 요약 문장 하나를 만드는 데에도 인간 개발자의 코딩으로는 제어하기 힘든 수많은 예외와 제약 조건이 따릅니다.
이 영역은 오직 거대 언어 모델만이 해결할 수 있는 '함수성 문제'에 해당합니다.
이미 우리가 일상적으로 소비하는 많은 소프트웨어 뒷단에서는 이러한 LLM 기반의 기능들이 작동하고 있습니다.
이러한 문제를 해결하기 위해 필수적으로 사용되는 것이 바로 프롬프트입니다.
그러나 많은 이들이 오해하는 것과 달리, 프롬프트는 단순한 '지시문'이 아닙니다. 프롬프트의 본질과 이를 둘러싼 LLM의 동작 원리, 그리고 실무적인 모델 선택 및 작성 전략을 상세히 분석해 보겠습니다.
결론부터 말하자면, 프롬프트는 인간이 직접 완벽하게 작성할 수 없는 일종의 프로그래밍 언어입니다. 궁극적으로는 LLM만이 가장 완벽한 프롬프트를 짜낼 수 있습니다.
프롬프트는 인간의 언어 형식을 빌려와 어텐션 편향을 유도하고, 이를 통해 원하는 결과를 출력하게 만드는 언어입니다.
인간은 특정 단어를 배치했을 때 모델 내부에서 정확히 어떤 편향이 유도되고 어떤 확률 분포로 결과가 계산될지 예측할 수 없습니다.
오직 모델만이 "이렇게 프롬프트를 구성하면 내부 벡터 공간에서 이러한 편향이 일어날 것"을 예측할 수 있습니다.
프롬프트에 포함되는 단어들을 인간이 이해하는 사전적 의미의 단어로만 접근해서는 안 됩니다.
프롬프트의 단어들은 내부적으로 어텐션 편향에 어떻게 기여할지를 결정하는 조립품이자 파편이며, 소스코드 관점에서는 C 언어나 자바 같은 고급 언어가 아니라 바이너리 코드나 기계어에 가까운 속성을 가집니다.
예를 들어, 프롬프트 내에서 특정 조건의 강제성을 높이고 싶을 때 인간은 다음과 같은 단어들을 고민합니다.
requiredmandatorymust be이 중 어떤 단어가 모델 내부에서 가장 강력한 어텐션 편향을 일으킬지는 인간의 직관으로 알 수 없습니다. 모델의 아키텍처와 학습 데이터 분포에 따라 결과가 다르기 때문입니다.
결국 이 역산을 가장 잘 수행하고 프롬프트를 미세 조정할 수 있는 존재는 고성능 LLM 자신입니다.
인간이 대략적인 요구사항을 작성하면, 고성능 모델이 이를 역산하여 최적의 단어를 추천하고 구조를 변경하는 과정을 거쳐야만 알고리즘 수준의 정교함을 가진 프롬프트가 완성된다고합니다.
프롬프트가 어떻게 모델을 제어하는지 깊이 이해하려면, 디코더 기반 트랜스포머의 동작 원리와 어텐션 메커니즘을 파악해야 합니다.
디코더 트랜스포머는 문장 내의 모든 토큰을 대상으로 어텐션을 계산합니다.
'밥'이라는 단어가 존재할 때, 이것이 "내가 밥을 먹는다"는 맥락인지, "쌀이 가공되어 밥이 된다"는 맥락인지에 따라 단어의 임베딩 값이 달라집니다.
주변 모든 토큰을 고려하여 해당 토큰이 문맥 속에서 가지는 의미를 매번 재계산하는 과정이 바로 어텐션이며, 토큰의 조합을 통해 특정 방향으로 확률을 기울게 만드는 것을 어텐션 편향이라고 부릅니다.
디코더의 기본 작동 원리는 문맥상 앞서 존재하는 개의 토큰을 이용하여 번째 토큰을 예측하는 프로세스의 반복입니다.
여기서 두 가지 편향이 발생합니다.
입력 편향: 유저가 최초에 프롬프트로 제공한 입력 토큰들에 의해 어떤 답을 유도할지 결정되는 초기 편향입니다.
출력 편향: 모델이 문장을 생성하는 과정에서, 자신이 방금 전 단계까지 스스로 출력한 토큰들에 의해 다시 스스로 편향을 겪는 현상입니다.
즉, 모델은 유저의 질문에만 영향을 받는 것이 아니라, 자신이 중간에 뱉어낸 말에 갇혀 다음 출력을 결정하게 됩니다.
최근 주목받는 추론 모델이나 CoT 기법은 바로 이 출력 편향을 극대화하여 이용하는 구조입니다.
모델에게 곧바로 최종 결론을 내리지 못하게 막고, 중간 사고 과정과 논리적 단계를 스스로 화면에 계속 출력하게 만듦으로써, 그 출력된 내용에 유도되어 최종적으로 가장 정확한 정답 토큰에 도달하도록 제어하는 원리입니다.
그러나 토큰의 수가 늘어날수록 심각한 수학적 한계에 부딪히게 됩니다. 이를 어텐션 희석이라고 합니다.
10개의 토큰을 기반으로 11번째 토큰을 생성할 때, 특정 7번 토큰이 전체 가중치에 기여하는 바는 대략 수준으로 매우 높습니다.
하지만 문맥이 길어져 20,000개의 토큰을 기반으로 20,001번째 토큰을 생성해야 하는 상황이 되면, 동일한 7번 토큰의 기여도는 수준으로 급격히 떨어집니다.
이로 인해 출량이 많아지거나 컨텍스트 윈도우가 길어질수록, 프롬프트 초반부에 부여했던 강력한 지시사항이나 제약 조건이 뒤로 갈수록 희석되어 모델이 지침을 망각하는 현상이 발생합니다.
이 희석 현상을 구조적으로 방지하는 유일한 방법은 개별 토큰의 영향력이 수학적으로 줄어들더라도 단어 자체가 가질 수 있는 정보의 밀도, 즉 토큰 임베딩 차원을 크게 확장하는 것입니다.
임베딩 차원이 확장되면 어텐션 계산 결과가 고차원의 넓은 분포에 나누어 저장되므로, 전체 토큰 수가 많아져도 특정 차원 공간에서는 여전히 강한 영향력을 유지할 수 있습니다.
또한 차원이 커질수록 멀티 헤드 어텐션의 헤드 수를 더 많이 확보할 수 있어, 긴 문맥 속에서도 맥락을 잃지 않고 어텐션 효과를 오래 유지할 수 있습니다.
따라서 정교한 제어가 필요한 프롬프트를 설계할 때는 입력 컨텍스트의 최대 길이만 늘려놓은 모델이 아니라, 내부 임베딩 차원 자체가 거대하게 설계된 모델을 선택하는 것이 상책입니다. 예를 들어 라마 2나 초기 트랜스포머 모델들에 비해, 최근 출시되는 Gemma 3나 최신 미스트랄등의 모델들은 동일한 파라미터 용량이라 할 수 있어도 임베딩 차원이 8,000 차원 이상으로 크게 확장되어 있어 실제 벤치마크 및 지시 이행 능력에서 훨씬 뛰어난 성능을 보여줍니다.
프롬프트를 제작할 때 가장 먼저 고려해야 할 기준은 "이 프롬프트가 어떤 복잡한 문제를 해결할 것인가"가 아니라, "이 프롬프트가 얼마나 자주, 일상적으로 호출될 것인가" 하는 호출 빈도입니다.
| 구분 | 비정기적 / 특수 목적 사용 | 정기적 / 함수적 호출 |
|---|---|---|
| 호출 빈도 | 가끔 어쩌다 한 번 발생 | 매일 스케줄러가 돌거나 API 형태로 수시 호출 |
| 요구되는 특성 | 그 시점에 적절한 답변만 나오면 됨 | 결과물의 형태와 구조가 항상 일관되어야 함 |
| 프롬프트 정교도 | 정교함이나 규칙이 크게 중요하지 않음 | 고도의 예외 처리와 엄격한 포맷 제어 필요 |
| 추천 모델 | 대형 고성능 모델 | 경량화된 추론/프롬프트 특화 모델 |
매번 시스템 내부에서 API처럼 구동되어 일정한 구조로 값을 반환해야 하는 함수적 호출의 영역으로 들어갈수록, 프롬프트 엔지니어링의 난이도는 극도로 상승합니다.
코드 레벨에서 이를 파싱하여 시스템의 다른 모듈과 연동해야 하므로, 모델이 항상 엄격한 규칙과 포맷을 예를들어 JSON, YAML 을 유지하며 결과물을 출력해야 하기 때문입니다.
비용과 속도 측면에서 함수적 호출에는 크기가 작고 가벼운 모델을 여러 번 호출하는 것이 유리합니다.
이때 허깅페이스나 오픈소스 진영에서 작은 모델을 다운로드할 때 파일명 뒤에 붙는 접미사의 특성을 잘 파악해야 합니다.
추가 튜닝 모델: 시드 모델 위에 인간의 선호도나 특정 데이터셋으로 가공을 거친 모델들입니다.
이 모델들은 일반적인 질문을 던졌을 때 인간이 보기에 매우 미려하고 자연스러운 답변을 내놓습니다.
그러나 이미 내부 가중치가 특정 방향으로 강하게 편향되어 있기 때문에, 개발자가 정교하게 설계한 프롬프트 지시사항을 밀어 넣었을 때 오히려 프롬프트의 통제를 따르지 않고 개기는 지시를 거부하거나 무시하는 경향이 강합니다.
베이스/프롬프트 유도 특화 모델: 대표적으로 GPT-4o의 경우 대화 품질은 좋으나 자체적인 판단 개입이 심해 정교한 프롬프트 통제가 까다로운 반면, o3-mini 같은 모델은 내부 추론 과정을 거치면서 개발자의 프롬프트 편향 유도를 훨씬 더 정직하게 수용합니다.
오픈소스 진영에서는 Phi-4 모델이 약 9B 수준의 크기임에도 불구하고 프롬프트 지시 이행 능력이 매우 뛰어납니다.
반면, 프롬프트 제어 없이 단순 질의 자체의 품질을 높이고 싶다면 Gemma 3 13B / 27B 같은 모델이 더 적합합니다.
함수적 관점에서 LLM의 출력을 엄격하게 제어하고 최적의 프롬프트를 생성하기 위한 구체적인 프로토콜은 다음과 같습니다.
최종적으로 백엔드 프로그램이 수신해야 하는 데이터 포맷이 JSON일지라도, 프롬프트 내부에서 구조를 설명하고 입출력 예시를 제공할 때는 YAML 포맷을 사용하는 것이 훨씬 유리합니다.
어텐션 메커니즘은 JSON 특유의 수많은 중괄호, 대괄호, 큰따옴표, 콤마 같은 구문 기호들을 시멘틱 맥락으로 매끄럽게 인식하지 못하고 노이즈로 받아들입니다.
반면 들여쓰기와 직관적인 Key-Value 구조를 사용하는 YAML은 모델이 구조적 공백과 맥락을 파악하기에 최적화되어 있어 어텐션 편향을 깨뜨리지 않고 정확한 포맷을 유지하게 만듭니다.
인간 개발자가 처음부터 완벽한 프롬프트를 작성하는 것은 불가능하므로, 아래와 같은 반복 정제 파이프라인을 구축하여 프롬프트를 빌드해야 합니다.
[1단계: 초안 작성] 인간이 요구사항을 담아 허접한 수준의 프롬프트 초안 작성
│
▼
[2단계: 테스트 실행] 준비된 데이터셋으로 테스트를 돌려 결과물 확인
│
▼
[3단계: 피드백 제공] 발생한 에러 결과물과 정답을 고성능 LLM에 입력
│
▼
[4단계: 프롬프트 리팩토링] LLM에게 "기존 프롬프트를 어텐션 편향이 극대화되도록 개선해줘" 요구
│
▼
[5단계: 영어 변환 및 고도화] 개선된 프롬프트를 '영어'로 번역 및 지침 고도화 요청
│
▼
[6단계: 재테스트 및 최종 정착] 영어 프롬프트로 재테스트를 수행하고 이 과정을 반복
이 루프를 거쳐 도출된 최종 버전의 영어 프롬프트를 확인해 보면, 인간의 일상적인 문장 구조와는 완전히 다른, 특정 어텐션 가중치를 제어하기 위해 단어들이 기괴하게 배치된 형태를 띠게 됩니다.
인간의 직관으로는 도저히 설계할 수 없는 영역이지만, 이 상태에 도달했을 때 비로소 가벼운 경향성 모델에서도 알고리즘 소프트웨어 수준의 정교하고 일관된 출력을 보장할 수 있게 됩니다.