메인 콘텐츠로 건너뛰기

2장 대규모 언어 모델(LLM)과 OpenAI 챗 컴플리션 모델 활용 기초

로버트
로버트
조회수 26

생성형 AI 도구를 활용하여 작성 및 편집된 노트입니다.

개요

대규모 언어 모델(LLM, Large Language Model)은 방대한 텍스트 데이터를 학습해 사람과 자연스럽게 대화하거나 글을 생성하는 인공지능 모델이다. 이들 모델은 예측이나 분류만 하는 전통적인 머신러닝 모델과 달리, 새로운 텍스트를 "만들어내는" 생성 모델이라는 점이 핵심적인 특징이다.

Generated Image

이 노트에서는 LLM을 이루는 기본 구성 요소와 GPT 계열 트랜스포머 아키텍처의 개념, ChatGPT가 RLHF(인간 피드백을 활용한 강화학습)를 통해 어떻게 챗 컴플리션 모델로 다듬어지는지, 그리고 왜 에이전트/어시스턴트에 챗 컴플리션 모델이 잘 맞는지를 정리한다. 마지막으로 OpenAI Python SDK를 이용해 GPT‑4 계열 LLM에 연결하는 기초 코드 구조까지 살펴본다.


생성 모델과 예측·분류 모델의 차이

머신러닝 모델은 크게 "무엇인가를 만들어내는 모델"과 "무엇인가를 맞히는 모델"로 나눌 수 있다. LLM과 GPT 계열 모델은 생성(generative) 모델로, 입력을 바탕으로 새로운 텍스트(답변, 글, 코드 등)를 만들어내도록 학습된다. 사용자가 질문을 하면 그에 이어질 가장 자연스럽고 일관된 문장을 한 토큰씩 이어가며 생성하는 방식이다.

반면 전통적인 예측·분류(predictive/classification) 모델은 주어진 입력이 어떤 범주에 속하는지를 판별하는 데 초점을 둔다. 예를 들어 스팸 메일 분류기, 감성 분석 모델(긍·부정 판단), 숫자 이미지를 0-9 중 하나로 분류하는 모델 등이 이에 해당한다. 이들 모델은 새로운 텍스트를 길게 생성하기보다는 "레이블(정답)을 맞히는 것"이 목표다.

생성 모델은 내부적으로도 "다음에 올 단어(토큰)를 예측한다"는 의미에서 예측 작업을 수행하지만, 그 결과가 하나의 클래스가 아니라 긴 텍스트 시퀀스로 이어진다는 점에서 전통적인 분류·회귀 모델과 구분된다. 요약하자면, 예측·분류 모델이 "이게 뭔지 맞히는 모델"이라면, LLM과 같은 생성 모델은 "이어서 무엇을 말할지 지어내는 모델"이라고 이해할 수 있다.


LLM을 구성하는 주요 요소

LLM은 크게 네 가지 축으로 이해하면 구조가 잡힌다. 학습 데이터, 모델 아키텍처, 용도별 학습(챗, 컴플리션, 인스트럭션), 그리고 파인튜닝이다. 이 네 요소가 합쳐져 최종적으로 우리가 사용하는 특정 LLM 서비스나 API 형태가 된다.

먼저 학습 데이터는 LLM의 "지식과 언어 감각"을 형성하는 재료다. 웹 문서, 책, 코드, 위키, 포럼 글 등 다양한 공개 텍스트가 사용되며, 모델이 자연스러운 문장 구조와 다양한 분야의 일반 지식을 익히는 기반이 된다. 데이터가 크고 다양할수록 모델이 처리할 수 있는 상황과 표현도 넓어진다.

모델 아키텍처는 이 데이터를 어떻게 소화하고 내부적으로 표현할지 결정하는 설계도에 해당한다. 파라미터(parameter)는 이 아키텍처 안에서 학습되는 가중치의 개수로, 수십억~수천억 단위까지 커질 수 있다. 파라미터가 많을수록 복잡한 패턴을 학습할 수 있지만, 그만큼 계산 비용과 메모리 요구도 커진다.

용도별 학습은 기본적으로 같은 언어 모델이라도 어떤 형태로 쓰일지에 맞춰 추가로 훈련하는 과정이다. 대표적으로 "챗(chat)", "컴플리션(completion)", "인스트럭션(instruction)" 용도가 있다. 챗 모델은 대화를 주고받는 형식에 맞춰, 컴플리션 모델은 "텍스트를 이어쓰기"에 초점을 맞춰, 인스트럭션 모델은 "명령을 이해하고 따르기"에 중점을 두고 추가 학습을 진행한다.

마지막으로 파인튜닝(fine-tuning)은 이미 학습된 LLM을 특정 도메인이나 스타일에 맞게 재학습시키는 단계다. 예를 들어 법률 상담, 의료 지식, 특정 기업의 내부 용어, 브랜드 톤에 최적화된 모델을 만들고 싶을 때 파인튜닝을 활용한다. 이때는 대규모 데이터를 처음부터 다시 학습하는 것이 아니라, 상대적으로 작은 양의 특화 데이터로 모델의 응답 성향을 조정한다.


GPT 기반 트랜스포머 아키텍처와 대규모 학습

GPT 계열 모델은 트랜스포머(transformer)라는 아키텍처를 사용한다. 트랜스포머의 핵심 아이디어는 "자기 주의(attention)" 메커니즘으로, 문장 내 단어들이 서로에게 얼마나 중요한지를 동적으로 계산하여 문맥을 이해하는 방식이다. 이를 쌓아 올린 것이 우리가 흔히 말하는 "레이어(layer)"이며, 레이어 수와 각 레이어의 크기가 곧 모델의 규모와 성능에 큰 영향을 준다.

이 아키텍처는 병렬 처리에 유리하고, 토큰 간 관계를 멀리까지 고려하기 쉽기 때문에, 파라미터 수를 수십억~수천억 개까지 늘려도 학습이 가능하다. 이렇게 거대한 모델을 학습시키기 위해서는 테라바이트(수조 글자 규모)에 이르는 방대한 텍스트 데이터가 필요하다. 이 데이터에서 "다음에 나올 토큰을 맞히는 문제"를 반복해서 풀면서, 모델은 언어 구조와 사실 관계, 추론 패턴까지 점점 내재화한다.

일반적으로 학습 과정은 여러 단계로 나뉜다. 먼저 대규모 공개 텍스트로 "기초 언어 능력"을 익히는 사전 학습(pretraining)을 진행한 뒤, 그 위에 다양한 목적을 가진 추가 학습을 덧붙인다. 예를 들어 코드에 특화된 데이터, 대화 데이터, 지시문-응답 쌍 등의 데이터로 추가 학습을 하면, 같은 GPT 아키텍처라도 코드 작성에 강한 모델, 챗봇에 강한 모델 등으로 특화할 수 있다.


ChatGPT와 RLHF로 만들어지는 챗 컴플리션 모델

ChatGPT는 단순히 인터넷 텍스트를 학습한 언어 모델에 그치지 않고, 여러 단계의 "사람 중심" 미세 조정을 거쳐 만들어진다. 그 중 가장 중요한 과정이 RLHF(Reinforcement Learning with Human Feedback, 인간 피드백을 통한 강화학습)이다.

기본적인 흐름을 간단히 정리하면 다음과 같다. 먼저, 사람이 작성한 "좋은 응답 예시"를 모아 기본 언어 모델을 지시문/대화 형태에 맞게 지도학습(supervised fine-tuning)으로 미세 조정한다. 그 다음, 모델이 같은 질문에 대해 여러 개의 답을 생성하도록 하고, 사람이 이 답변들을 비교하여 "어떤 답이 더 바람직한지" 순위를 매긴다. 이 순위 데이터를 이용해 보상 모델(reward model)을 학습시키고, 최종적으로 강화학습 알고리즘(PPO 등)을 통해 모델이 "보상이 높은" 즉, 더 도움이 되고 안전한 응답을 생성하도록 조정한다.

이 과정을 통해 모델은 단순히 "텍스트를 잘 이어 쓰는 것"을 넘어서, 사람의 기대에 더 부합하는 방향으로 응답을 선택하게 된다. 정중한 표현, 유해 콘텐츠 회피, 질문 의도 파악, 단계적 설명 등은 이런 RLHF와 추가적인 정책 학습의 결과물이다. ChatGPT와 같은 챗 컴플리션 모델은 이렇게 사람과의 대화에 최적화된 훈련을 거쳤기 때문에, 에이전트나 어시스턴트의 기반 모델로 적합하다.


챗 컴플리션 모델과 일반 컴플리션 모델의 차이

OpenAI API에서 흔히 구분하는 두 가지 주요 모델 계열은 "컴플리션(completion) 모델"과 "챗 컴플리션(chat completion) 모델"이다. 둘 다 기본적으로는 텍스트를 생성하지만, 인터페이스와 학습 방식, 사용 용도가 다르다.

일반 컴플리션 모델은 단일 텍스트 입력을 받아 그 뒤를 이어 쓰는 방식이다. 예를 들어 "The capital of France is" 옆에 이어질 텍스트를 생성하는 식이다. 시스템 설정이나 역할 구분이 없고, 모델은 단지 "지금까지의 텍스트"만 보고 가장 자연스러운 후속 토큰을 생성하려고 한다. 이 방식은 자동 완성, 짧은 문장 보완, 특정 포맷의 텍스트 생성 등에는 유용하지만, 길고 복잡한 대화 흐름을 관리하기에는 불편하다.

챗 컴플리션 모델은 대화를 전제로 설계된 인터페이스를 가진다. 요청 시에 messages 리스트 안에 여러 개의 메시지를 넣고, 각 메시지는 system, user, assistant 같은 역할(role)을 가진다. system 메시지로는 모델의 역할과 규칙(예: "당신은 친절한 파이썬 튜터입니다")을 설정하고, user 메시지는 실제 사용자 발화를 나타내며, assistant 메시지는 직전까지 모델이 했던 응답을 다시 전달해 대화 맥락을 이어준다.

이 구조 덕분에 챗 컴플리션 모델은 이전 대화 내용, 시스템 규칙, 사용자 의도를 함께 고려해 응답을 생성할 수 있다. 또한 이런 챗 모델들은 RLHF를 포함한 대화 특화 훈련을 거치면서 "대화의 연속성", "작업 완료 능력", "이유와 계획 설명 능력"에서 높은 성능을 보이도록 최적화되어 있다. 이런 이유로, 긴 대화 흐름을 유지해야 하는 에이전트·어시스턴트, 단계적 계획 수립, 도구 호출 기반 워크플로우 구성 등에 특히 잘 맞는다.


OpenAI Python SDK로 GPT‑4 계열 LLM 연결하기: 준비와 설치

OpenAI의 GPT‑4 계열 LLM을 실제 코드에서 사용하려면, 기본적인 파이썬 개발 환경을 준비하고 OpenAI Python SDK를 설치해야 한다. 이 과정은 대부분의 LLM 기반 에이전트·어시스턴트 프로젝트에서 공통적으로 등장하는 초기 작업이다.

먼저 파이썬이 설치되어 있어야 하며, 가상환경(venv, virtualenv 등)을 만드는 것이 좋다. 프로젝트 폴더를 하나 만든 뒤, 해당 폴더에서 가상환경을 생성하고 활성화한다. 이렇게 하면 각 프로젝트마다 독립된 패키지 구성을 유지할 수 있다.

그 다음 필요한 패키지를 설치한다. 기본적으로는 OpenAI SDK와 환경변수 관리용 패키지가 자주 함께 쓰인다.

pip install openai python-dotenv

이 명령은 OpenAI API를 호출하기 위한 클라이언트 라이브러리와 .env 파일에 저장된 비밀 키를 손쉽게 불러오기 위한 python-dotenv를 설치한다. 설치가 완료되면, 프로젝트 폴더 안에 .env 파일을 만들고 다음과 같이 OpenAI API 키를 저장한다.

OPENAI_API_KEY=your-openai-api-key

실제 키 값은 OpenAI 계정에서 발급받은 값을 사용한다. 이 .env 파일은 보안이 중요하므로, Git 등 버전 관리 시스템에는 추가하지 않도록 .gitignore에 포함시키는 것이 일반적이다.


OpenAI 챗 컴플리션 기본 연결 코드 구조

이제 Python 코드에서 GPT‑4 계열 챗 컴플리션 모델을 호출하는 기본 구조를 살펴보자. 핵심 요소는 환경변수 로딩, 클라이언트 생성, 메시지 구성, 응답 처리 네 가지다.

먼저 환경변수에서 API 키를 읽어와 OpenAI 클라이언트를 생성한다.

import os
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()  # .env 파일에서 환경변수 로드

api_key = os.getenv("OPENAI_API_KEY")
if not api_key:
    raise ValueError("OPENAI_API_KEY가 설정되어 있지 않습니다. .env 파일을 확인하세요.")

client = OpenAI(api_key=api_key)

다음으로, 사용자 메시지를 받아 챗 컴플리션 모델에 질의하는 함수를 정의할 수 있다.

def ask_chatgpt(user_message: str) -> str:
    response = client.chat.completions.create(
        model="gpt-4-1106-preview",  # 또는 현재 사용 가능한 GPT-4 계열 모델 이름
        messages=[
            {
                "role": "system",
                "content": "You are a helpful assistant."
            },
            {
                "role": "user",
                "content": user_message
            }
        ],
        temperature=0.7,
    )
    return response.choices[0].message.content

여기서 model에는 사용할 GPT‑4 계열 모델 이름을 지정한다. messages에는 시스템 메시지와 사용자 메시지를 순서대로 넣는다. 시스템 메시지는 모델의 역할과 톤을 설정하는 데에, 사용자 메시지는 실제 질문이나 요청을 전달하는 데 사용된다. temperature는 생성 결과의 다양성을 제어하는 파라미터로, 0에 가까울수록 일관되고 보수적인 답변, 1에 가까울수록 더 창의적이고 변동성이 큰 답변을 생성한다.

마지막으로 이 함수를 호출하여 실제로 모델의 응답을 받아볼 수 있다.

if __name__ == "__main__":
    question = "What is the capital of France?"
    answer = ask_chatgpt(question)
    print(answer)

이 코드를 실행하면 "The capital of France is Paris."와 유사한 응답을 얻을 수 있다. LLM은 확률적 모델이기 때문에, 특히 temperature가 높을수록 매번 조금씩 다른 표현으로 대답할 수 있다. 반대로, 고객 서비스 같은 일관성이 중요한 환경이라면 temperature=0 또는 매우 낮은 값으로 설정하여 응답의 변동성을 줄이는 것이 일반적이다.


정리와 활용 방향

지금까지 생성 모델과 예측·분류 모델의 차이, LLM을 구성하는 주요 요소, GPT 기반 트랜스포머 아키텍처의 대규모 학습 방식, RLHF를 통한 ChatGPT 챗 컴플리션 모델의 형성 과정을 살펴보았다. 이어서 챗 컴플리션 모델과 일반 컴플리션 모델의 차이와, 에이전트·어시스턴트에 챗 컴플리션이 더 적합한 이유를 구조적으로 정리했다.

실습 측면에서는 OpenAI Python SDK를 이용해 GPT‑4 계열 LLM에 연결하는 기본 패턴을 확인했다. 가상환경 준비 → openai, python-dotenv 설치 → .env에 API 키 설정 → messages 구조로 요청을 보내고 응답을 받는 흐름만 이해하면, 이후에는 프롬프트를 더 정교하게 설계하고 메시지 히스토리를 관리하면서 점진적으로 에이전트 기능을 확장해 갈 수 있다. 이 노트를 바탕으로, 다음 단계에서는 프롬프트 엔지니어링, 도구 호출(tool calling), 메모리, 계획(플래닝) 등을 결합해 실제로 유용한 AI 에이전트를 설계해 보는 것이 자연스러운 학습 경로가 될 것이다.

이 노트는 요약·비평·학습 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.