LLM 기초 동작원리 톺아보기
LLM의 등장배경과 인코더, 디코더 등 기초적인 동작 메커니즘에 대한 포스팅입니다.
📌 개요
이번 포스팅에서는 AI가 어떤 과정을 거쳐 지금의 LLM에 이르게 되었는지 발전 과정을 먼저 살펴봅니다. 이를 바탕으로 LLM이 무엇이고 어떻게 동작하는지 구성과 핵심 개념들을 짚어보고, 기계번역을 위해 탄생한 트랜스포머와 그 핵심인 어텐션 메커니즘의 원리를 이해합니다. 마지막으로 LLM을 더 잘 활용하기 위한 프롬프트 엔지니어링 기법들을 정리합니다.
📌 AI 발전과정

LLM의 동작원리를 다루기 이전에 AI가 발전하게 된 배경과 과정을 살펴보도록 합시다. AI는 위와 같이 3번의 붐 그리고 2번의 암흑기를 거치면서 현재 단계까지 발전할 수 있었어요. AI는 심볼릭(Symbolic)과 서브심볼릭(Subsymbolic)으로 구분되는데요, 심볼릭은 로직에 기반하는 AI로 “IF 종이울린다면 THEN 수업을 마친다”와 같이 로지컬한 시스템이에요. 반면 서브 심볼릭은 신경망으로 구성되기 때문에 답변에 대한 원인 설명이 불가하죠. 심볼릭과 서브심볼릭은 과도기 때마다 서로를 보완하는 기술을 개발하는 방식을 주고 받으며 발전하고 있어요. 타임라인 별로 어떤 일이 일어났는지 살펴봅시다!
✨ 인공지능 태동: 1950년 튜링 테스트
1950년 앨런 튜링이 튜링 테스트(Turing Test)를 제안하며 “기계가 생각을 할 수 있는가?”라는 시대적 질문을 던지게 됩니다. 앨런이 제안한 시험 방법은 간단했어요. 시험에 필요한 준비물은 인간 심판, 인간 참여자, 컴퓨터였습니다. 심판이 컴퓨터와 사람을 보지 않으면서 번갈아가며 텍스트로만 질문을 하고, 누가 컴퓨터이고 사람인지 판단하지 못 한다면 시험 성공으로 간주하는 것이었죠.

하지만 1980년 존 설이 중국인의 방으로 튜링 테스트를 비판하는 질문을 제기합니다. 중국인의 방 논리는 다음과 같습니다.
- 중국어를 전혀 모르는 당신은 폐쇄된 방 안에 있습니다. 방 안에는 매뉴얼 중국어 사전이 있었습니다.
- 방 밖에서 누군가 중국어로 작성된 쪽지를 문 틈으로 넣었습니다.
- 매뉴얼을 확인했더니 중국어 쪽지를 받을 경우, 중국어 사전을 통해 답변을 회신하라고 작성되어 있습니다.
- 당신은 중국어 사전을 참고하여 쪽지 내용을 해석하고, 중국어로 답변을 작성하여 방 밖으로 전달합니다.
- 방 밖에서 그걸 받은 중국인은 방 안에 있는 당신이 중국어를 잘 한다고 생각할 것입니다.
해당 논리는 튜링 테스트의 성공 기준 또한 컴퓨터를 구별하지 못해서 사람처럼 판단한 것인데 그게 진정한 지능이고 어떤 내용을 이해한 것이라 할 수 있는가? 라는 철학적 질문을 제기한 것이죠. 당시에는 AI라 불리던 시스템이 개발되기 이전이라 사회적으로 파장을 일으키진 못 했습니다. 하지만 인공지능에 대한 정의를 다시 한번 생각하게끔 하는 논리로는 잘 동작한 거 같아요.
✨ 첫 번째 인공지능 붐: 1957년 퍼셉트론
드디어 인간의 뇌 신경을 모사한 단층 인공신경 뉴런이 개발됩니다. 뇌 신경끼리의 자극을 가중치로 구현했지만, 단층이기 때문에 입력층과 출력층만 있고 히든 노드가 존재하지 않는 모델이었습니다. (자극 = 파라미터 = 가중치로 이해하시면 될 것 같아요!) 현대에 들어서는 파라미터 개수에 따라 스몰 모델, 라지 모델로 구분되어요. GPT5, Gemini3 등 요즘 쓸만한 LLM은 1000억개 이상의 파라미터로 구성된다고 하네요. 파라미터가 너무 많아서 출력이 도대체 어떻게 나온 건지는 알 수 없다고 해요.

단층 퍼셉트론은 자극이 있다(1), 없다(0)으로만 구현되어 있습니다. 회로판 기준으로 AND, OR 연산이 되는 것이죠.
연산에서 사용되는 공식 Y = S(W0 * X0 + W1 * X1 + W2 * X2)에서 Y는 자극이 있다 없다를 표시하는 1 또는 0이고, W는 가중치, S는 시그모이드 함수를 의미해요. 즉, 가중치 값만으로 AND 연산이 되고 OR 연산이 되는 것이죠. 또한 가중치 값이 AND, OR 연산에서 직선의 방정식을 결정합니다. 이때 가중치 값은 무한대로 설정할 수 있어요.
하지만 퍼셉트론은 “단층” 신경망이라 XOR과 같은 비선형 연산이 불가하다는 치명적인 단점으로 AI의 첫 번째 암흑기에 도래하게 됩니다. 현재는 이 문제가 해결되긴 했어요. 차원을 추가해서 직선의 평면을 앞쪽에 배치하여 XOR 연산이 가능하도록 하는 방법이죠. 4차원, 5차원으로 차원을 올리는 것도 가능하다고 해요. 시각적인 설명이 어려울 뿐이지 평면으로 나누어버리는 논리는 동일하다고 합니다.
✨ 두 번째 인공지능 붐: 1980년대 전문가 시스템

1980년대에는 전문가 지식 시스템을 구축하는 것이 유행이었습니다. IF-THEN으로 전문가의 지식 전체를 데이터베이스화 하는 것이었죠. 하지만 지식 베이스 구축은 순수 노가다의 영역이었고 ROI의 한계가 존재했습니다. 모든 케이스를 작성해야 했고 지식이 변경될 경우 일일이 반영해줘야 했죠. 또한 특정 분야에서는 사용이 국한되었습니다. 결국 지식 베이스 구축의 어려움으로 두 번째 암흑기를 맞게 됩니다.
✨ 세 번째 인공지능 붐: 1980년 다층 신경망 등장
1980년 다층 신경망과 역전파 알고리즘이 등장합니다. 단층 퍼셉트론 구조에서 입력과 출력 계층 사이에 은닉 계층이 추가된 것인데요. 역전파 알고리즘은 말 그대로 뒤쪽 은닉 계층부터 탐색하는 것인데 이로 인해 더욱 많은 은닉 계층을 구성할 수 있었죠. 은닉 계층이 많아진다는 것은 가중치가 많아지는 것이기 때문에 연산이 증가하여 오래 걸리고 답변에 대한 이유를 모르는 것입니다.
해당 내용이 세 번째 인공지능 붐의 시작이에요. 이후 딥러닝 알고리즘(2010), 대용량 데이터, 고성능 GPU의 보급, 알고리즘 개선, 트랜스포머 알고리즘(2017) 등이 함께 결합되며 현재의 생성형 AI 혁명을 맞이합니다.
트랜스포머 알고리즘과 그 안에 포함된 핵심 요소인 어텐션(Attention) 메커니즘은 원래 기계 번역의 용도로 개발되었어요. 뒤에서 다룰 내용이지만 가볍게 설명드리자면, 기계 번역은 원래 문장을 하나씩 하나씩 처리해야 합니다. 따라서 뒤쪽으로 갈수록 앞쪽의 내용을 까먹게 되는데, 어텐션을 통해 문장을 한 번에 보고 단어끼리 관계를 병렬로 빠르게 분석하고 학습할 수 있게 된 것이죠.
📌 LLM이란?
✨ 그래서 LLM이 뭔데?

AI는 용도나 개발 방법에 따라 종류가 구분됩니다.
LLM: 사람의 텍스트를 해석하고 생성하는 심층 신경망딥러닝: 많은 층으로 구성된 신경망을 활용하는 머신러닝GenAI: 심층 신경망을 사용하여 텍스트, 이미지 등 미디어 형태로 새로운 컨텐츠 생성머신러닝: 데이터에서 자동으로 규칙을 학습하는 알고리즘인공지능: 사람 수준의 지능을 갖춘 시스템
저희는 LLM을 자세히 살펴보겠습니다. 앞서 다룬 내용들은 LLM 내부의 구성이나 핵심 기술의 일부분이었어요. LLM이 무엇인지는 사실상 이제부터 다룰 것인데요. 그래서 LLM 모델이 도대체 뭐냐고 묻는다면, 가중치 값들이 모두 작성된 ZIP 파일 + 명령할 수 있는 C 코드 약 500줄이라고 답할 수 있어요.
LLM(Large Language Model)의 신경망은 크게 텍스트 이해 신경망, 생성 신경망, 응답 신경망으로 구분되어요. 상용화된 LLM은 대규모 모델 파라미터로 대량의 훈련 데이터 셋으로 학습된 가중치 덩어리가 매우 크다는 의미에요. 여기서 모델 파라미터란 다음 단어를 예측하도록 훈련할 때 조정되는 가중치 값입니다.
LLM 구축은 크게 보았을 때 Pretraining + Fine-Tuning으로 이루어집니다. LLM 모델의 언어 이해도를 향상시키기 위해 인터넷, 책, 논문, 위키 등 방대한 자료를 대규모 데이터 셋으로 구성하여 사전 훈련합니다. 훈련이라는 것 자체가 컴퓨터에게 언어를 이해시키는 행위인데 이것은 트랜스포머의 어텐션 덕분에 가능한 거랍니다.
하지만 LLM이 학습하는 데이터에는 좋은 정보만 있지 않죠. 그래서 욕설이나 편향적인 정보 등을 정제하는 작업이 필요합니다. 이러한 정제 작업을 파인 튜닝이라고 합니다. 구체적인 작업이나 도메인을 위해서 레이블이 있는 특정 데이터 셋만 추가로 훈련하는 것인데요. 사전 훈련은 비지도 학습, 파인 튜닝은 지도 학습으로 구분되어요. 이렇게 파인 튜닝을 거친 모델은 우리가 흔히 사용하는 GPT, Gemini 등 답변이 착해진답니다.
(GPT 2와 같은 모델을 로컬에 다운 받아서 개인 데이터를 넣으면 GPT보다 똑똑한 개인 비서가 만들어진대요! 이때 .hwp 파일은 LLM이 읽기 힘들다네요)
✨ Token
LLM에는 토큰(Token)이라는 개념이 존재합니다. 토큰은 LLM 모델이 문자를 읽고 이해하는 최소한의 의미 단위인데요. 우리가 “안녕”이라고 말하더라도 컴퓨터는 이 단어의 의미를 바로 이해하지 못합니다. 그래서 이를 숫자로 변환하는 과정이 필요한데 그 중간 단계가 바로 토큰화(Tokenization)입니다. 사람의 텍스트를 LLM이 이해할 수 있도록 토큰으로 구분하고, 토큰을 벡터 공간으로 다시 변환하는 것이죠.
LLM에서는 토큰별로 가격이 정해져 있습니다. 하나의 서브워드가 하나의 토큰인데요. “안녕하세요”의 경우는 “안녕” 토큰과 “하세요” 토큰으로 분할될 수 있어요.
토큰마다 고유한 토큰 번호를 가집니다. 이때 LLM 모델별로 토큰 고유 번호는 상이합니다. 토큰 설계가 잘 되어 있는 LLM 모델은 가격이 그만큼 더 저렴하답니다. 초기 LLM 모델들은 한국어에 대한 토큰 설계가 미흡하여 영어를 사용해야만 가격이나 성능 측면에서 이득이었지만 GPT5, Gemini3 등 최신 모델에서는 체감상 한국어도 동일하게 지원하는 거 같아요.
다양한 Tokenizer 사이트에서 입력한 텍스트의 토큰을 확인할 수 있습니다. 저는 https://platform.openai.com/tokenizer를 사용했습니다.

✨ Temperature
LLM을 단순하게 말하면 학습을 통해 A가 입력되었을 때 B가 출력되는 구조인데요. 수많은 학습 데이터를 통해 앞의 맥락에서 나올 수 있는 다음 단어를 반복적으로 예측합니다. 그리고 예측 결과 중에서 확률이 높은 단어를 출력합니다. 만약 특정 LLM에서 “독도는 일본 땅이다”라고 출력된다면 학습 데이터 중에서 그런 정보가 많았기 때문이죠. GPT, Gemini 등 상용화된 LLM들은 파인 튜닝을 통해 빈도 수를 조정하고 잘못된 학습 정보를 교정하여 정상적인 결과가 출력되도록 만든다고 해요.
다시 말해서 LLM의 출력은 철저한 확률 기반이에요. 출력 시 얼마나 모험적인 선택을 할지 Temperature로 조절할 수 있어요. 만약 헛소리하지 않고 매우 일반적인 말만 하는 LLM을 만들고 싶다면 Temperature 수치를 줄이는 방법이 있습니다. Temperature를 줄이면 매우 높은 확률의 단어만 출력되고, Temperature를 높이면 매우 무작위적인 단어가 출력되기 때문이죠. (GPT의 경우 Playground에서 결과를 직접 확인하실 수 있는데 유료 토큰이 필요하네요)

스탠퍼드 대학의 논문에 따르면 Temperature를 조절하지 않고도 LLM을 속여서 창의적인 결과를 출력하게 만들 수 있다고 해요. “확률적으로 나올 확률이 낮은 단어만 출력해봐” 또는 “1% 안에서 샘플링 해봐” 라는 내용을 프롬프트에 입력하면 엄청나게 창의적인 답변이 출력된다고 하네요. 샘플링(Sampling)이란 단순히 확률에 기반하여 단어를 뽑는 행위로 이해하시면 됩니다.

https://arxiv.org/abs/2510.01171 해당 링크에서 논문의 자세한 내용을 확인할 수 있어요.
✨ Context Windows
컨텍스트 윈도우(Context Windows)란 LLM이 한 번에 처리할 수 있는 텍스트의 최대 크기를 의미합니다. 앞서 살펴본 토큰 개념과 연결해서 이해하면 쉬운데요, 쉽게 말해 “모델이 한 번에 읽을 수 있는 토큰의 총량”이 바로 컨텍스트 윈도우입니다. 사용자의 입력(Input)과 모델의 출력(Output)이 모두 이 안에 포함됩니다.
컨텍스트 윈도우의 크기는 모델의 성능과 활용 범위에 직접적인 영향을 미칩니다. 창이 좁으면 긴 문서를 한꺼번에 다루지 못하고, 대화가 길어질수록 앞의 내용을 참조하지 못하게 됩니다. 반대로 창이 넓을수록 더 긴 맥락을 유지하면서 정교한 답변이 가능하죠. 예를 들어 100페이지짜리 계약서 전체를 넣고 “5페이지와 73페이지의 내용이 상충하는 부분을 찾아줘”와 같은 요청을 처리하려면 그만큼 넓은 컨텍스트 윈도우가 필요합니다.
모델마다 지원하는 컨텍스트 윈도우의 크기가 다릅니다. 초기 GPT 모델은 수천 토큰 수준이었지만, Claude는 20만 토큰, Gemini는 최대 100만 토큰까지 지원하는 등 빠르게 확장되고 있어요. 다만 창이 넓을수록 처리해야 할 연산량이 늘어나기 때문에 응답 속도가 느려지고 비용도 함께 증가합니다.
어텐션 메커니즘과도 연결해서 이해할 수 있는데요. 셀프 어텐션은 입력된 모든 토큰 쌍 사이의 유사도를 계산하는 구조이기 때문에, 토큰 수가 늘어날수록 연산량은 제곱으로 증가합니다. 컨텍스트 윈도우를 무한정 넓히지 못하는 근본적인 이유가 여기에 있습니다. 이 한계를 극복하기 위해 Sparse Attention, Sliding Window Attention처럼 연산량을 줄이는 다양한 기법들이 연구되고 있다고 해요.
개인적으로 Claude Code를 사용할 때 영어보다 한글 지시에서 Context가 빨리 차는 거 같아요. 대량의 레거시 코드를 이해하고 기능을 추가하는 거보다, README 파일에 사양을 한글로 작성해달라고 하는 게 배는 빨리 차더라구요. 모델마다 다르겠지만 Claude 친구는 한글 토큰이 비효율적인 거 같습니다.
✨ Knowledge Cutoff와 데이터 싱크
세상에 공개되어 있는 사전, 인터넷, 논문 등 최대한 많은 정보를 모아서 사전 학습(Pretraining)한 것을 지식 컷오프(Knowledge Cutoff) 라고 칭하는데요. Knowledge Cutoff는 현재보다 과거의 데이터를 통해 학습한 결과물이기 때문에 현재 데이터와는 싱크가 맞지 않을 수 있어요. 2024년 기준 Knowledge Cutoff된 모델에 “우리나라 대통령이 누구야?”라고 묻는다면 “윤석열 대통령”이라고 출력되는 것이죠.(저는 중도입니다 🗽)
환율, 날씨 정보, 스포츠 경기 결과 등 Knowledge Cutoff만으로 해결할 수 없는 정보들이 분명하게 존재합니다. LLM 모델이 이러한 문제를 해결하는 데에는 크게 두 가지 방법이 있습니다.
첫 번째로 RAG를 이용한 방법이 있습니다. RAG는 검색 증강 생성(Retrieval-Augmented Generation)인데요. 사용자의 질문을 벡터로 변환한 뒤, 사전에 구축해 놓은 벡터 DB에서 관련 문서를 검색(Retrieve)합니다. 예를 들어 “우리 회사 연차 규정 알려줘”라고 물어본다면 사내 문서를 벡터 DB화해 두었다가 관련 내용을 꺼내오는 것이죠. 그렇게 검색된 정보를 입력층에서 Pretraining으로 갖고 있던 지식과 Merge 합니다. 이때 Pretraining 지식보다 방금 검색된 정보를 우선시하여 최종 결과를 출력하는 것이죠. Pretraining 지식을 입력층에서 RAG로 한번 Wrapping하는 것이죠.
두 번째는 Fine-tuning입니다. Fine-tuning은 새로운 학습 정보를 LLM 모델에 입력시키는 방식인데요. 새로운 학습 정보는 역전파(Backpropagation)를 통해 신경망 내부의 수치들을 미세하게 조정하여 모델이 새로운 지식을 영구적으로 기억하게 만듭니다. 앞서 살펴본 RAG는 Pretraining 지식에 영향을 주지 않았지만 Fine-tuning은 Pretraining 지식이 업데이트되는 것이죠.
마지막으로 이건 데이터 싱크 불일치와는 연관이 없지만 데이터를 재가공하는 방식이에요. 후처리(Post-processing)라고 부릅니다. 예를 들어 욕설을 *로 변환하거나, 소스 코드를 출력했을 때 코드에 맞는 포맷팅으로 출력되는 거라고 이해하시면 될 것 같네요. Post-processing은 출력층 마지막 단에서 동작합니다.
Knowledge Cutoff의 데이터 싱크 불일치를 극복하기 위한 기술들과 내부적으로 어디에서 동작하는지를 살펴보았습니다.
| 구분 | 예시 | 건드리는 곳 |
|---|---|---|
| RAG | "오늘 서울 날씨 어때?", "우리 회사 연차 규정 알려줘"처럼 학습 데이터에 없는 최신 정보나 비공개 문서를 참고해서 답변해야 할 때 | 입력단 (Prompt) |
| Fine-tuning | 일반 모델을 의료/법률 전용 AI로 만들거나, "친절한 상담원 말투" 혹은 "경상도 사투리"를 쓰는 AI로 영구적으로 개조할 때 | 모델 내부 가중치 (Weights) |
| Post-processing | 답변에 포함된 욕설을 *로 가리거나, 줄글로 나온 답변을 프로그램 연동을 위해 JSON 데이터 포맷으로 강제 변환할 때 | 출력단 (Output) |
📌 트랜스포머

드디어 이번 포스팅의 핵심인 트랜스포머와 어텐션에 대해 알아봅시다. (트랜스포머는 기계번역을 위해 개발되었습니다. 따라서 실제 LLM 모델들은 트랜스포머를 기반한 것은 맞지만 동일한 구조로 개발되었다고는 할 수 없어요.)
트랜스포머는 위 이미지와 같이 좌측의 인코더와 우측의 디코더로 구분되어 있습니다. 인코더에서는 입력된 텍스트의 맥락을 파악하고 이해하는 역할이고, 디코더에는 출력할 수 있는 단어를 확률 기반으로 선택하여 출력합니다. 이때 전체 문장 중에 오른쪽 어절을 한 칸 밀어낸 것을 Input으로 사용하는데요, Output Probabilities는 단어가 나올 수 있는 확률들을 의미하는 것이죠.
포지셔널 인코딩(Positional Encoding)에서는 “사과는 맛있다”, “철수는 사과를 먹었다”와 같은 문장에서 주어와 목적어를 구분합니다. 이를 통해 문장에서 맥락을 더욱 잘 이해할 수 있으며 포지셔널 인코딩까지를 거쳐야 인공 신경망에 넣을 수 있습니다.
✨ 임베딩(Embedding)
임베딩(Embedding)은 자연어를 숫자로 변경하여 배치하는 것입니다. 컴퓨터는 글자를 읽고 이해하지 못합니다. 오직 숫자만을 계산할 수 있죠. 그래서 가장 처음에 텍스트를 숫자로 변환하는 토큰화 과정을 거칩니다.
- This apple is sweet = 237, 500, 50, 100
- This banana is sweet = 237, 501, 50, 100
이렇게 토큰화까지 되었지만 문제가 남아있습니다. 위 텍스트에서 사과와 바나나의 토큰이 각각 500과 501로 다르지만, 숫자 사이에는 맛이나 색상 등의 의미가 전혀 담겨있지 않죠. 따라서 표현 방식을 벡터와 같은 다차원 공간으로 구성하여 다양한 내용을 추가하고 이해도를 향상시키는 것이죠. 이러한 과정이 임베딩입니다.
우리는 임베딩의 역할을 데이터를 기계가 이해할 수 있게 벡터 공간으로 변환하는 것이라고 이해했습니다. 이번에는 다양한 임베딩 기법과 파이프라인을 통해 상세 방식을 살펴보도록 합시다.
🧩 BoW(Bags-of-Words)
BoW(Bags-of-Words)는 어휘 사전을 구성하는 방식입니다. 모든 문장을 어절로 구분하여 5,000 단어 정도를 구분하죠. 특정 문장에서 나오는 단어를 1로 표시하여 다른 문장과의 유사도를 판별합니다.
| 문장 | 나는 | 사과를 | 좋아해 | 너도 | 바나나를 | 싫어해 | 최종 벡터 |
|---|---|---|---|---|---|---|---|
| 문장 1 | 1 | 2 | 2 | 1 | 0 | 0 | [1, 2, 2, 1, 0, 0] |
| 문장 2 | 1 | 0 | 0 | 0 | 1 | 1 | [1, 0, 0, 0, 1, 1] |
고전적이지만 직관적인 방법으로 복잡한 인공지능 모델이 없어도 텍스트를 숫자로 변환할 수 있죠. 특정 단어가 많이 나왔을 때 해당 문장이나 문서에서 주제를 파악할 수 있습니다. 하지만 “사과가 나를 먹는다”와 “내가 사과를 먹는다”를 똑같이 취급합니다. 사과와 바나나가 과일이라는 점을 알 수 조차 없죠. 임베딩의 존재 목적이라고 볼 수 있을 거 같습니다.
🧩 맥락 중요성과 위치 중요성
BoW를 통해 보완해야 할 점이 구체화됩니다. 문장에서 맥락과 주체를 구분해야 한다는 것이죠.
맥락 중요성은 다의어에서 주변 단어를 통해 맥락을 파악하는 것을 의미합니다. “밤에 밤을 먹었다”에서 처음 밤은 시간을, 두 번째 밤은 음식을 의미하죠. 맥락적으로 보아 먹었다라는 단어가 주변에 있는 두번째 밤을 음식으로 편향 해석합니다.
위치 중요성은 단어의 위치에 따라 주어인지 목적어인지 달라진다는 것을 의미합니다. “철수가 영희를 좋아한다”와 “영희가 철수를 좋아한다”에서 철수, 영희, 좋아한다 라는 단어가 나왔습니다. 철수와 영희의 위치가 바뀌면 누가 누구를 좋아하는지 주체와 대상이 바뀌게 되죠. 트랜스포머에서는 문장을 통째로 읽기 때문에 어떤 단어가 먼저 왔는지 모릅니다. 그래서 각 단어의 위치를 표기하여 주체와 대상을 파악하는 것이죠.
🧩 Word2Vec
Word2Vec은 단어 임베딩 모델입니다. 유사 맥락에 등장하는 단어는 유사한 의미를 갖는다는 원칙 하에 동작하죠. 맥락이 비슷하다는 것은 “철수는 새콤달콤한 OO을 좋아한다” 또는 “영희는 새콤달콤한 OO을 좋아한다”에서 OO 주위의 내용을 통해 어떤 단어가 들어갈지 예측하는 것이죠. 반대로 OO 주위에 어떤 단어가 나올지도 예측 가능합니다.
Word2Vec에는 CBow와 Skip-gram 두 가지 방식이 있습니다. CBow는 주변 단어들을 보고 가운데 빈칸에 들어갈 단어를 맞추는 방식으로 학습 속도가 빠릅니다. 위 문장에서 “철수는” = V(t-2), “새콤달콤한” = V(t-1)으로 볼 수 있죠.
Skip-gram은 한 단어를 보고 주변에 어떤 단어들이 올지 예측합니다. 성능이 좋고 희소한 단어도 잘 학습합니다. V(t)를 기준으로 v(t-1), v(t+1)을 예측합니다.
🧩 임베딩 파이프라인
이제 트랜스포머의 임베딩 파이프라인을 정리해봅시다.
- 문장 입력
- 사용자가 “fox jumps over box”를 입력합니다.
- 토큰 분할
- “fox jumps over box”를 토큰 단위로 분할합니다.
- “fox”, “jumps”, “over”, “box”로 분할됩니다.
- 토큰 ID 변환
- 분할된 토큰은 어휘 사전을 참조하여 고유 숫자로 변환됩니다.
- “fox” → 1024, “jumps” → 3561로 변환됩니다.
- 임베딩 벡터로 변환
- 숫자 상태인 텍스트에 위치 정보를 더하여 벡터로 만드는 최종 단계입니다.
- 토큰 임베딩
- 각 토큰에 대응하는 고유한 벡터값을 가져옵니다.
- 초기에는 랜덤한 값으로 시작할 수 있습니다.(훈련을 거쳐서 마지막에는 최적의 값으로 변경됩니다.)
- 동일 토큰은 문맥을 구분할 수 없습니다. (“fox jumps over box”와 “fox jumps over fox”의 fox 벡터가 같은 것이죠)
- 위치 임베딩
- 트랜스포머는 문장을 한꺼번에 읽으므로, 단어의 순서 정보를 수동으로 입력해줘야 합니다.
- 동일한 단어라도 위치가 다르면 다른 값을 갖게 하여 시작점을 다르게 만듭니다.
- 실제 트랜스포머에서는 주기 함수인 Sin과 Cos 값을 사용하여 각 위치에 대한 고유 벡터를 생성합니다.
- 토큰 임베딩 + 위치 임베딩으로 최종 벡터를 생성합니다.
✨ 어텐션(Attention)
트랜스포머는 기계번역을 위해 개발되었습니다. 번역을 수행할 때 문장에서 각 단어별로 번역해버리면 잘못된 문장이 만들어집니다. 따라서 텍스트 전체를 먼저 읽고 단어 앞 뒤의 단어를 참조해서 맥락을 이해한 후 번역해야 합니다. 이러한 역할을 어텐션(Attention)이 담당하고 있습니다.
🧩 RNN(Recurrent Neural Network)
초기 기계번역 모델은 RNN(Recurrent Neural Network), 순환 신경망 구조를 사용하였는데요. 사람이 문장을 읽는 방식과 유사하게 단어를 하나씩 순차적으로 입력받으면서 그 정보를 신경망 내부 메모리에 저장해두는 방식을 취합니다. 이렇게 저장된 정보는 다음 단어를 처리할 때 함께 활용되어 전체 문장의 맥락을 파악할 수 있습니다.
하지만 RNN에는 치명적인 약점이 있었습니다. 문장이 길어질수록 초반에 입력된 단어들의 정보가 뒤로 갈수록 까먹게 되는 장기 의존성(Long-term Dependency) 문제가 발생한 것입니다. 이를 해결하기 위해 입력 문장의 정보를 끝까지 유지하며 계속 요약해 나가는 인코더(Encoder), 디코더(Decoder) 구조가 고안되었습니다. 인코더가 문장 전체를 훑으며 정보를 압축하고, 그 최종 결과물인 은닉 상태(Hidden State)를 디코더에게 전달하면 디코더는 이 요약된 메모리를 바탕으로 번역이나 답변을 생성하는 방식입니다.
이렇게 구조를 개선했음에도 불구하고 여전히 한계는 존재했습니다. 아무리 긴 문장이라도 결국 고정된 크기의 작은 메모리 셀 하나에 모든 정보를 욱여넣어야 했기 때문입니다. 이 과정에서 정보가 손실되는 병목 현상이 일어났고, 특히 문장이 아주 길어질 경우 뒷부분의 요약에 치중하느라 정작 중요한 앞부분의 세부 내용을 놓치는 일이 잦았습니다.
🧩 셀프 어텐션(Self Attention)
2014년 어텐션이 처음 등장합니다. 입력된 문장을 벡터로 변환하고 각 단어끼리의 연관성을 판단하여 가중치가 높은 단어를 출력하는 구조에요. 어텐션은 입력 문장 전체를 언제든지 들여다 볼 수 있었기에 RNN의 고질적인 문제를 해결할 수 있었죠.
이때 Query(질문자), Key(대상), Value(정보)가 사용됩니다.

Q, K, V의 동작을 조금 더 구체적으로 살펴보겠습니다. “철수는 맛있는 사과를 먹었다”라는 문장에서 “먹었다”를 이해하기 위해 어텐션이 작동하는 방식을 예로 들겠습니다.
- Query(Q): “먹었다”가 “문장에서 나와 연관된 단어가 뭐야?”라고 질문을 던집니다.
- Key(K): 문장 내 모든 단어(“철수는”, “맛있는”, “사과를”, “먹었다”)가 각자 “나는 이런 단어야”라는 명패를 내밉니다.
- Value(V): Q와 K의 유사도를 계산한 결과를 바탕으로 연관도가 높은 단어(“사과를”, “철수는”)의 정보를 가중합산하여 최종 표현을 만들어냅니다.
이 과정은 모든 단어 쌍에 대해 동시에, 병렬로 계산되기 때문에 RNN의 순차 처리보다 훨씬 빠르답니다.
조금 더 직관적인 예시를 들어볼까요? “짜장면”, “짬뽕”, “탕수육”이 있다고 가정해봅시다. 각 단어는 처음에 랜덤한 벡터값으로 임베딩됩니다.
- 짜장면: (0.8, 0.1)
- 짬뽕: (0.7, 0.2)
- 탕수육: (0.9, 0.9)
셀프 어텐션이 수행되면, 각 단어는 나머지 단어들과의 유사도를 계산합니다. 짬뽕은 탕수육보다 짜장면과 벡터 방향이 유사하기 때문에 더 높은 가중치로 영향을 받게 되죠. 그 결과 짬뽕의 최종 벡터는 짜장면의 방향으로 끌려가며 (0.7, 0.2) → (0.6, 0.3)처럼 조정될 수 있습니다. 결국 “짬뽕”이라는 단어가 “탕수육”보다 “짜장면”과 가까운 맥락으로 표현되는 것이죠.
초기 임베딩 값이 랜덤이더라도 이 계산이 학습 과정에서 수없이 반복되다 보면, 자연스럽게 맥락적으로 유사한 단어들은 가까운 벡터로, 그렇지 않은 단어들은 먼 벡터로 수렴해갑니다.
이때 단어 간 유사도를 계산하는 방법이 코사인 유사도(Cosine Similarity)입니다. \[A \cdot B = |A| \times |B| \times \cos\theta\]
두 벡터가 같은 방향을 가리킬수록 코사인 값이 1에 가까워지고, 수직에 가까울수록 0, 반대 방향이면 -1에 가까워집니다. 이 값을 통해 단어끼리 얼마나 맥락적으로 가까운지를 수치로 판단할 수 있죠.
유사도 계산 이후에는 값들의 합이 1이 되도록 정규화하여 가중치로 사용합니다. 예를 들어 (1.4, 1.5, 1.3, 0.9) 같은 유사도 점수들을 합산이 1.0이 되도록 변환하는 것이죠. 이때 음수 값이 존재할 수 있는데, 일반적인 정규화로는 음수를 처리하기 어렵습니다. 그래서 소프트맥스(Softmax)라는 정규화 방법을 사용합니다. 소프트맥스는 모든 값을 지수 함수로 변환하기 때문에 음수도 양수로 바꿔주면서 합이 1이 되도록 만들어줍니다.

마지막으로 학습 효율성 측면에서도 한 가지 짚고 넘어갈 부분이 있습니다. 학습 문장이 하나씩 들어올 때마다 매번 처음부터 계산하는 것은 매우 비효율적입니다. 그래서 트랜스포머는 모든 학습 문장을 한꺼번에 행렬로 묶어 병렬로 계산합니다. 이것이 RNN 대비 트랜스포머가 압도적으로 빠르게 학습할 수 있는 핵심 이유이기도 하죠.
그렇다면 기존 어텐션과 트랜스포머의 셀프 어텐션은 어떻게 다를까요? 2014년 등장한 기존 어텐션은 여전히 RNN 기반의 인코더-디코더 구조 위에서 동작했습니다. 디코더가 단어를 출력할 때 인코더의 어느 부분을 참고할지 결정하는 방식으로 서로 다른 두 문장 사이의 관계를 계산하는 것이었죠. RNN의 순차 처리 문제는 여전히 남아있었기 때문에 완전한 해결책은 아니었습니다.
반면 2017년 트랜스포머 논문에서 등장한 셀프 어텐션은 같은 문장 내에서 각 단어가 나머지 단어들과 얼마나 관련 있는지를 스스로 계산합니다. “철수가 사과를 먹었다”에서 “먹었다”가 “사과를”과 “철수가” 모두를 동시에 참조하는 방식이죠. RNN 없이 문장 전체를 한 번에 병렬로 처리할 수 있게 된 것이 핵심인데요. 덕분에 아무리 긴 문장이라도 거리에 상관없이 단어 간의 관계를 정확하게 포착할 수 있게 되었습니다.
🧩 멀티 헤드 어텐션(Multi-Head Attention)
셀프 어텐션을 한 번만 수행하면 각 단어의 관계를 단 하나의 관점으로만 바라보는 셈입니다. 예를 들어 “철수는 사과를 먹었다”에서 “먹었다”가 문법적 주어(“철수”)에 집중할 수도 있고, 동시에 의미적 목적어(“사과”)에도 집중해야 하는데 이 두 가지를 한 번에 잡아내기는 어렵죠.
멀티-헤드 어텐션(Multi-Head Attention)은 이 문제를 해결하기 위해 셀프 어텐션을 여러 개의 헤드(Head)로 병렬 수행합니다. 각 헤드는 서로 독립적인 Q, K, V 가중치 행렬을 가지고 있어서 단어 간의 관계를 서로 다른 차원과 관점에서 동시에 분석합니다.
- 헤드 1: 문법적 관계(주어-동사)에 집중
- 헤드 2: 의미적 관계(동사-목적어)에 집중
- 헤드 3: 장거리 의존성에 집중
- …
각 헤드의 결과를 이어 붙인(Concatenate) 뒤 최종 선형 변환을 거쳐 하나의 풍부한 표현으로 합칩니다. 결과적으로 단어 하나에 여러 개의 가중치가 생기므로, 단일 어텐션보다 훨씬 다양한 맥락 정보를 담을 수 있게 되는 것이죠.
인코더에서 멀티-헤드 어텐션을 마친 결과물을 컨텍스트 어웨어 임베딩(Context Aware Embedding)이라고 합니다. 처음에 입력된 단순 토큰 임베딩과는 다르게, 문장 전체의 맥락이 녹아든 임베딩이에요. 인코더는 이 컨텍스트 어웨어 임베딩을 디코더에게 넘겨주고, 디코더는 이를 바탕으로 번역이나 답변을 생성합니다. 단순한 문자 수준의 임베딩을 넘어 문장이나 문서 단위의 의미까지 포착할 수 있다는 점이 핵심입니다.
🧩 마스크드 셀프 어텐션(Masked Self-Attention)
디코더에서는 셀프 어텐션에 한 가지 제약이 추가됩니다. 바로 아직 생성하지 않은 미래의 단어를 미리 참조하지 못하도록 막는 것인데요.
예를 들어 “I love you”를 번역한다고 할 때, “나는”을 출력하는 시점에서 “사랑해”라는 단어를 미리 보고 출력한다면 실제 추론 상황과 달라지기 때문에 제대로 학습이 되지 않습니다. 학습 시에 답을 미리 보는 것과 같죠.
이를 방지하기 위해 마스크 행렬(M)을 도입합니다. 현재 위치보다 뒤에 있는 단어들의 유사도 점수를 무한대로 강제 설정하면, 소프트맥스를 거쳤을 때 해당 위치의 가중치가 0에 수렴하게 됩니다. 결과적으로 모델은 현재 시점까지 출력된 단어들만을 참조하여 다음 단어를 예측하게 되죠.
디코더가 최종 단어를 출력할 때도 소프트맥스를 사용합니다. 각 후보 단어에 대한 점수를 소프트맥스로 변환하여 확률 분포를 만들고, 그 중 가장 확률이 높은 단어를 선택하는 방식이죠. 이 과정이 반복되면서 한 단어씩 순차적으로 문장이 완성됩니다.
마지막으로 트랜스포머 구조에 대해 짚고 넘어가겠습니다. 원래 트랜스포머는 번역을 위해 설계되었기 때문에 인코더와 디코더가 함께 붙어있는 구조입니다. 하지만 용도에 따라 둘을 분리해서 사용하기도 합니다.
| 구조 | 대표 모델 | 특징 |
|---|---|---|
| 인코더만 | BERT | 텍스트 이해·분류에 특화 |
| 디코더만 | GPT 시리즈 | 텍스트 생성에 특화 |
| 인코더 + 디코더 | 원조 트랜스포머, T5 | 번역·요약 등 Seq2Seq 작업에 특화 |
우리가 흔히 사용하는 GPT 계열 모델은 디코더만으로 구성되어 있습니다. 인코더 없이 입력 문장도 디코더가 그대로 처리하면서, 다음 단어를 예측하는 방식을 반복하여 텍스트를 생성하는 것이죠.
📌 프롬프트 엔지니어링
LLM의 발전은 단순히 더 똑똑한 챗봇의 등장에서 끝나지 않습니다. AI 기반 OS가 현실화되면 지금처럼 파이썬이나 특정 언어를 공부하지 않아도 된다는 전망이 점점 설득력을 얻고 있죠. 그렇다면 앞으로 엔지니어에게 요구되는 것은 무엇일까요? 구현 능력보다는 문제를 정의하고 그 문제를 소유하는 능력이 될 가능성이 높습니다. 무엇을 만들어야 하는지 정의하고, 그 방향을 설계하는 역할이 더욱 중요해지는 것이죠.
LLM을 비즈니스에 활용할 때 가장 핵심적인 역량 중 하나가 바로 프롬프트 엔지니어링입니다. LLM은 방대한 데이터를 학습한 뒤 질문이 들어오는 시점에 모든 능력을 발휘하는, 일종의 벼락치기한 천재와 같아요. 이미 실력은 충분한데, 어떻게 질문하느냐에 따라 그 능력이 완전히 달라집니다. 실제로 동일한 수능 문제를 넣더라도 프롬프트 구성에 따라 1등급이 나오기도 하고, 9등급이 나오기도 해요. LLM을 사용할 때 텍스트 대신 보이스로 맥락을 충분히 전달해야 인사이트가 온전히 발휘된다는 이유도 여기에 있습니다.
그렇다면 좋은 질문을 하려면 어떻게 해야 할까요? 결국 LLM이 어떻게 동작하는지를 이해해야 하는데 그 핵심은 앞서 살펴본 어텐션 메커니즘입니다. 어텐션이 어떻게 단어 간 맥락을 연결하는지 이해하면, 왜 특정 프롬프트가 더 좋은 결과를 내는지 납득할 수 있습니다.
✨ 프롬프트 엔지니어링이란?
프롬프트 엔지니어링(Prompt Engineering)은 출력을 원하는 방향으로 유도하기 위해 전략적으로 지시문을 설계하는 기술입니다. 별도의 학습 없이 모델의 핵심 가중치(파라미터)를 수정하지 않고도 성능 향상이 가능하다는 점이 강력한 장점이에요.
베이스 모델 하나를 만드는 데는 막대한 시간과 비용이 들어갑니다. 그러다 보니 Gemini 2.5와 3.0의 Knowledge Cutoff가 모두 2025년 1월로 동일한 것을 보면, 두 버전의 개발 시점은 사실상 같았을 가능성이 높습니다. 버전이 다른 이유는 날리지 컷오프가 달라서가 아니라, 도입된 기술과 아키텍처가 달랐기 때문이겠죠. 지금 이 순간에도 새로운 기술이 개발되어 기존 베이스 모델에 반영되고 있을 수 있습니다.
프롬프트는 크게 세 가지 구성 요소로 이루어집니다.
| 구성 요소 | 설명 | 예시 |
|---|---|---|
| 지시문 | 모델이 수행해야 할 과업 | “아래 문장을 한국어로 번역해줘” |
| 맥락 | 과업 수행에 필요한 배경 정보 또는 추가 단서 | “이 문장은 의료 분야 논문에서 발췌한 것이야” |
| 사용자 입력 | 사용자가 모델에게 전달하는 실제 입력 | 번역할 영문 원문 |
세 가지를 얼마나 잘 조합하느냐에 따라 동일한 모델에서 전혀 다른 수준의 결과가 나옵니다. LLM이 어텐션을 통해 입력 전체의 맥락을 참조한다는 것을 이해하면, 지시문과 맥락을 충분히 제공할수록 모델이 더 적절한 단어에 가중치를 부여하여 출력한다는 것도 자연스럽게 납득이 되죠.
이제 다양한 프롬프트 엔지니어링 기법을 살펴보도록 합시다.
✨ Chain of Thought (CoT)
Chain of Thought(CoT)는 LLM에게 단계별 사고 과정을 예시로 제공하여 추론 능력을 끌어올리는 기법입니다. 기존에는 <Q, A> 형식으로 질문과 정답만 예시로 주었다면, CoT는 <Q, CoT, A> 형식으로 중간 풀이 과정까지 포함한 예시를 제공합니다. 이를 통해 모델이 단순히 정답을 외우는 것이 아니라 추론의 흐름 자체를 학습하게 되는 것이죠.
주목할 만한 특징은 모델 크기에 따라 효과가 극명하게 갈린다는 점입니다. 작은 모델에서는 성능 향상이 거의 없지만, 일정 규모 이상의 큰 모델에서는 급격한 성능 향상이 나타납니다. 특히 수학, 논리, 다단계 추론처럼 복잡한 문제일수록 그 향상폭이 더욱 두드러집니다.
✨ Zero-Shot CoT
Zero-Shot CoT는 별도의 예시(Few-Shot) 없이도 단 한 줄의 지시문만으로 모델의 추론 성능을 끌어올리는 기법입니다. 동작 방식은 두 단계로 이루어집니다.
- 1단계: “단계별로 생각해봐”처럼 추론 과정을 먼저 생성하도록 유도합니다.
- 2단계: 원본 질문과 1단계에서 모델이 생성한 추론 과정 전체를 합쳐 최종 답변을 뽑아냅니다.
구조적으로 보면 RAG와 원리가 유사합니다. 외부 정보를 끌어다 맥락을 보강하는 것처럼, 모델 스스로 생성한 추론 과정을 다시 맥락으로 활용하는 것이죠.
비슷한 지시문들 중에서도 “단계별로 생각해” 한 줄이 성능 향상 효과가 가장 좋다고 알려져 있습니다. 단, 모델마다 효과가 다르게 나타납니다. 모델 특성을 무시하고 특정 프롬프트를 돈 주고 사는 행위가 얼마나 비효율적인지 잘 보여주는 사례이기도 하죠.
✨ Few-Shot CoT
Few-Shot CoT는 Zero-Shot CoT에서 한 단계 더 나아가, 추론 과정이 담긴 예시를 직접 제공하는 방식입니다. 단순히 <Q, A> 예시만 던지는 것이 아니라, <Q, CoT, A> 형식의 풀이 과정이 포함된 예시를 여러 개 제공합니다. 모델은 이 예시들에서 추론의 패턴 자체를 파악하고, 동일한 방식으로 새로운 질문도 풀어냅니다.
Zero-Shot CoT가 “어떻게 생각해야 하는지”를 말로 지시하는 방식이라면, Few-Shot CoT는 “이렇게 생각하는 거야”라고 직접 보여주는 방식입니다. 복잡한 도메인일수록 말로 설명하기 어려운 추론 패턴이 있기 때문에, 이럴 때일수록 Few-Shot CoT가 더 강력하게 동작합니다.
✨ Verbalized Sampling
Verbalized Sampling은 직역하면 “말로 확률을 표시해라”입니다. LLM은 보통 다음 단어를 출력할 때 확률 분포의 중간, 즉 가장 나올 법한 단어를 선택합니다. 이 덕분에 자연스럽고 무난한 답변이 나오지만, 반대로 말하면 창의성이 떨어진다는 의미이기도 하죠.
Temperature를 높이면 확률 분포의 양 끝에 있는, 평소엔 잘 선택되지 않는 단어를 끌어낼 수 있습니다. Verbalized Sampling은 Temperature 조작 없이, 입력 프롬프트만으로 같은 효과를 내는 기법입니다.
실제 적용 방법은 다음과 같습니다.
- 프롬프트에
"their corresponding probabilities"를 포함하면 각 단어가 나올 확률도 함께 출력됩니다. - 여기에
"0.05 미만의 답변만 샘플링해줘"를 추가하면 평소엔 선택되지 않을 단어들이 출력되어 훨씬 낯설고 창의적인 결과가 나옵니다. - 출력 토큰을 줄이지 말고 원래의 1000토큰을 유지하라고 명시해야 온전한 결과를 받을 수 있습니다.
- 각 결과 옆에는 반드시 확률 값(예: 0.6)이 함께 출력되도록 지시해야 합니다.
Temperature를 직접 건드리지 않고도, 프롬프트 한 줄로 모델의 샘플링 전략을 바꿀 수 있다는 점이 이 기법의 핵심이에요. 앞서 살펴본 스탠퍼드 대학 논문에서 다루었던 내용이 바로 이것입니다.
✨ Rule of Thumbs
Rule of Thumbs은 이론적으로 완전히 검증되진 않았지만 실전에서 반복적으로 효과가 확인된 프롬프트 작성 법칙입니다. 아래와 같은 항목들을 프롬프트 작성 시에 참고하면 좋을 거 같아서 정리해 봅니다.
- 최신 모델 사용
- 같은 프롬프트라도 모델 버전에 따라 결과가 크게 달라집니다. 최신 모델일수록 지시를 더 잘 따르고 추론 능력도 뛰어나죠.
- 비용이 부담된다면 GPT turbo처럼 가성비 좋은 모델을 로컬에서 개인 데이터로 파인튜닝하는 방법도 있습니다.
- 지시문과 처리할 항목 분리
- 어텐션 메커니즘 특성상 모델은 앞의 내용을 기반으로 뒤를 참조하지 않고 출력합니다. 따라서 지시문과 처리할 내용을 섞어두면 성능이 떨어지죠.
"""또는###같은 구분자로 명확히 분리하는 것이 좋습니다. - 맨 뒤 배치 (Recency Bias): 지시문을 마지막에 배치하면 최신 편향을 이용해 모델이 지시를 바로 실행하게 만들 수 있습니다. 가장 효과적인 방식입니다.
- 맨 앞 배치 (Global Context): 지시문을 처음에 배치하면 이후 내용을 읽기 전에 규칙을 미리 세팅하는 효과가 있습니다.
- 어텐션 메커니즘 특성상 모델은 앞의 내용을 기반으로 뒤를 참조하지 않고 출력합니다. 따라서 지시문과 처리할 내용을 섞어두면 성능이 떨어지죠.
- 구체적이고 상세한 묘사
- “훌륭하게”, “최대한 잘” 같은 모호하고 과대포장된 표현은 피하는 것이 좋습니다. 어텐션 관점에서 보면, 구체적인 단어일수록 더 많은 Q, K, V가 활성화되어 모델이 더 풍부한 맥락 정보를 파악할 수 있습니다.
- 예시(Shot)로 원하는 출력 형식 첨부
- 원하는 출력 형식이 있다면 말로 설명하는 것보다 예시를 직접 제시하는 것이 훨씬 효과적입니다.
- Zero-Shot → Few-Shot → Fine-Tuning 순으로 시도해보는 것을 권장합니다. 예시 몇 개로 해결된다면 굳이 파인튜닝까지 갈 필요가 없죠. 파인튜닝은 위 방법으로도 원하는 결과가 나오지 않을 때, 데이터를 추가 학습시켜 가중치를 미세 조정하는 마지막 수단입니다.
- “하지 마라” 대신 “이렇게 해라” 등의 긍정문 사용
- LLM은 부정형 지시를 상대적으로 잘 이해하지 못합니다. “욕설을 사용하지 마라” 보다 “정중한 표현만 사용해라”처럼 긍정형으로 바꾸면 훨씬 잘 따릅니다.
- 유도 단어 활용
- 원하는 출력 방향으로 모델을 유도하는 단어를 프롬프트 끝에 배치하면 효과적입니다. 예를 들어 Python 코드 작성을 원한다면 지시문 뒤에
"import"를 붙여두면 모델이 자연스럽게 코드를 작성하는 방향으로 이어갑니다.
- 원하는 출력 방향으로 모델을 유도하는 단어를 프롬프트 끝에 배치하면 효과적입니다. 예를 들어 Python 코드 작성을 원한다면 지시문 뒤에
- 프롬프트를 돈 주고 구입하지 말 것
- 효과 좋다고 알려진 프롬프트라도 모델 종류와 버전마다 결과가 다르게 나옵니다. 특정 프롬프트를 구매하는 것보다, 위 원칙들을 이해하고 직접 작성하는 능력을 키우는 것이 훨씬 가치 있습니다.
📌 후기
LLM의 성능은 나날이 발전합니다. 지금까지 LLM 없이 어떻게 살았을까 싶을 정도로 삶에 녹아들었죠. 다양한 LLM 모델과 IDE를 사용해보면서 앞으로의 영상, 이미지 등 LLM 멀티 모델 개발은 Gemini가 압도할 거라 예상합니다. 구글은 기본적으로 자체 GPU를 양산하고, 검색 엔진을 통한 알고리즘을 갖고 있으며 유튜브에서 대용량 학습 데이터를 조달할 수 있기 때문이죠.
요즘은 전공 분야 별로 특화된 LLM이 개발되고 있습니다. 하지만 이러한 LLM은 궁극적으로 브라우저, OS와 같은 플랫폼으로 통합될 거라 생각됩니다. 그때쯤이면 윈도우, iOS, 안드로이드 등의 기존 OS는 망하지 않을까 싶네요. 현재 개발자들이 OS를 잘 알아야 시스템 개발을 잘 하는 거 처럼 미래에는 당연 LLM을 잘 알아야 할 것입니다.
성능 좋은 LLM 모델이 개발되더라도 이를 실제 서비스하기 위해서는 엄청난 전력과 GPU가 필요합니다. GPU 선두 기업인 엔비디아 젠슨황은 왜 삼성전자와 SK하이닉스에 GPU를 공급해준다고 했을까요? 우리나라에는 HBM(High Bandwidth Memory)을 양산할 수 있는 기술력이 있습니다. HBM은 일반 메모리와는 다르죠. LLM 가동을 위해서는 GPU 뿐만 아니라 성능 좋은 메모리, 즉 HBM이 필요하죠. 그리고 이러한 니즈를 맞추어줄 수 있는 삼성전자, SK하이닉스와 공생 관계를 원했을 겁니다.
해당 비지니스에 대해 대기업의 독점이라고 주장하는 사람들은 편협한 사고라고 생각합니다. 스타트업 규모의 기업은 공급을 해주어도 사용 자체를 못 합니다. 기술이나 비용적인 측면에서 대형 시스템 구동 환경을 구축할 수 없기 때문이죠. 저는 대기업이 인프라를 구축하고 스타트업이 그 위에서 서비스를 구성하는 게 건강한 관계라고 생각합니다. 아마존이 인프라를 구축하고 우버가 서비스하는 것처럼 말이죠.
산업의 관점에서는 한정된 GPU를 AI와 블록체인 양쪽 모두 필요로 하더라도 한 쪽만 발전하지는 않을 거 같습니다. GPU에도 종류가 있기 때문에 각 분야의 합의 하에 서로 다른 것을 사용할 수도 있고, 알고리즘을 개발하여 GPU 사용에 대한 성능이 좋아질 수도 있기 때문이죠.
LLM과 관련된 지식은 너무나도 방대했습니다. 하나의 포스팅으로 압축하는 게 엄청나게 어려웠어요. 그래서 필수로 포함시켜야 된다고 생각된 부분만 작성했는데, 그럼에도 엄청나게 길어져버렸네요. 트랜스포머와 어텐션은 저도 이해되지 않는 부분이 상당히 많습니다. 깊게 파면 팔수록 처음 접하는 내용이라 이걸 다 이해하려면 몇년은 걸릴 거 같아서 일부만 추려서 작성했습니다.
개인적으로 AI 버블론에 대해서는 회의적입니다. AI의 발전은 끝이 없는 거 같아요. Agentic AI와 A2A 등 인간 대체가 이미 시작되고 있죠. 다음 포스팅에서는 AI의 실제 사용 방법, Claude Code에서 OpenClaw 등과 MCP 연동 방법 등 실질적인 내용을 담고자 합니다. 읽어주셔서 감사합니다. 🙇♂️