LLM API 쉽게 시작하는 방법
이 글에서는 대규모 언어 모델(LLM)이 어떻게 작동하는지 살펴보며, 먼저 토크나이제이션과 샘플링을 다룬 뒤 애플리케이션에서 이를 활용하는 방법을 소개합니다. 이 글은 AI 번역본입니다. 오역이 의심되면 댓글로 자유롭게 알려 주세요.
Created on September 12|Last edited on September 12
Comment
이 글은 W&B의 무료 온라인 강의인 Building LLM-Powered Applications를 바탕으로 작성되었습니다. 강의에서 다룬 슬라이드와 코드 스니펫을 함께 제공합니다. 지금 가입하고 학습을 시작하세요!
💡
LLM이란 무엇인가?
대규모 언어 모델(LLM), 예를 들어 GPT-4은 자연어 처리와 머신러닝 기술의 최전선에 있습니다. GPT-4 논문에 자세히 설명되어 있듯이, 이러한 모델은 주어진 텍스트에서 다음 토큰(즉, 단어 또는 서브워드)을 예측하도록 학습된 트랜스포머라고 할 수 있습니다.
이러한 모델 아키��처는 다음과 같이 알려져 있습니다 자가회귀이며, 이를 통해 모델은 일관되고 문맥에 맞는 텍스트를 생성할 수 있습니다.

대규모 언어 모델에서 “대규모”는 모델이 보유한 파라미터 수가 매우 많다는 뜻입니다. 예를 들어, GPT-3의 전신인 GPT-3는 1,750억 개의 파라미터를 가지고 있습니다! 본질적으로 각 파라미터는 학습 데이터에서 학습된 모델의 구성 요소이며, 이렇게 방대한 수의 파라미터 덕분에 LLM은 매우 다양한 언어 패턴과 미묘한 뉘앙스를 포착할 수 있어 뛰어난 성능을 발휘합니다.
LLM의 핵심적인 특징 중 하나는 출력이 텍스트의 다음 토큰에 대한 확률 분포라는 점입니다. 즉, 주어진 텍스트가 있을 때 모델은 가능한 다음 토큰들의 집합을 각기 연관된 확률과 함께 제시할 수 있습니다. 모델의 예측은 보통 가장 높은 확률을 가진 토큰이지만, 다양한 샘플링 전략을 사용해 출력에 무작위성과 창의성을 도입할 수 있습니다.

LLM은 인터넷의 다양한 텍스트로 이루어진 방대한 데이터셋으로 학습됩니다. 이처럼 방대한 학습 데이터 덕분에 다양한 주제와 문체에 걸쳐 사람과 유사한 텍스트를 생성할 수 있습니다.
오늘날 이러한 강력한 모델은 OpenAI가 제공하는 것과 같은 API를 통해 접근할 수 있습니다. 덕분에 개발자는 방대하고 복잡한 모델을 직접 학습시키지 않아도, 고급 자연어 처리 기능을 애플리케이션에 손쉽게 통합할 수 있습니다.
LLM의 잠재적인 활용 사례는 매우 방대하고 다양합니다. 예를 들어 다음과 같은 작업에 사용됩니다 텍스트 생성, 번역, 요약, 질의응답, 그리고 더욱 다양한 작업에 쓰입니다. 또한 챗봇을 만들고, 코드를 작성하며, 시와 이야기 같은 창의적인 콘텐츠를 생성하고, 학습과 교육을 돕는 데 사용할 수 있습니다. 더 나아가 이메일 초안 작성이나 기사 집필 같은 고급 응용에도 활용됩니다. 사람이 쓴 것과 유사한 텍스트를 이해하고 생성하는 이 모델들의 능력은 자연어 이해와 생성 과제에서 무궁무진한 가능성을 열어 줍니다.
토크나이제이션이란 무엇인가?
토크나이제이션은 기본적인 단계로 자연어 처리 (NLP) 그리고 인간의 언어를 더 작은 단위, 즉 “토큰”으로 분해하는 자연어 처리와 머신러닝을 말합니다. 이러한 토큰은 글자 하나만큼 작을 수도 있고 문장 전체만큼 클 수도 있습니다.
일반적으로 토큰은 단어 또는 서브워드에 대응하며, 이는 언어 정보를 충분히 보존하면서도 토큰 수를 적절한 수준으로 유지하는 균형을 더 잘 달성하기 때문입니다.
자연어 처리와 머신러닝에서 토크나이제이션이 중요한 이유는 컴퓨터가 우리처럼 인간의 언어를 이해하지 못하기 때문입니다. 컴퓨터가 텍스트를 처리하려면, 해당 텍스트를 컴퓨터가 이해하고 조작할 수 있는 수치 표현으로 변환해야 합니다. 텍스트에 등장하는 각 고유한 토큰에는 고유한 숫자 식별자가 부여됩니다. 따라서 토크나이제이션 과정은 ���람이 읽을 수 있는 문자열을 기계가 읽을 수 있는 숫자 시퀀스로 변환합니다.
OpenAI의 tiktoken 라이브러리는 OpenAI의 모델(GPT-3 등)이 사용하는 방식과 일관되게 토크나이즈를 수행할 수 있는 Python 라이브러리입니다. 사람이 읽을 수 있는 텍스트를 토큰으로 인코딩하고, 토큰을 다시 사람이 읽을 수 있는 텍스트로 디코딩할 수 있도록 간편한 API를 제공합니다.
코드 스니펫으로 이를 보여 드리겠습니다:
import tiktoken# Load the tokenizer model for OpenAI's davinci modeltokenizer = tiktoken.encoding_for_model("text-davinci-003")# Encode a string of textenc = tokenizer.encode("Weights & Biases is awesome!")# Print the encoded tokensprint(enc)# Decode the tokens back into textprint(tokenizer.decode(enc))# Decode tokens one by onefor token_id in enc:print(f"{token_id}\t{tokenizer.decode([token_id])}")
이 코드에서는 먼저 OpenAI의 "text-davinci-003" 모델에 대응하는 토크나이저 모델을 로드합니다. 그런 다음 문자열("Weights & Biases is awesome!")을 숫자 목록으로 표현되는 토큰으로 인코딩합니다. 마지막으로 인코딩된 토큰을 출력합니다.
결과는 다음과 같습니다:
[1135, 2337, 1222, 8436, 1386, 318, 7427, 0]Weights & Biases is awesome!
그다음 전체 토큰 목록을 원문 텍스트로 다시 디코딩하여 인코딩·디코딩 과정이 올바른지 검증합니다. 이어서 인코딩된 목록의 각 토큰을 순회하면서 하나씩 디코딩합니다. 이를 통해 목록의 각 토큰이 원문 텍스트의 특정 부분에 대응한다는 점을 보여 줍니다. 각 반복에서 해당 토큰의 숫자 식별자와 그 토큰이 나타내는 원문 텍스트의 부분을 출력합니다.
1135 We2337 ights1222 &8436 Bi1386 ases318 is7427 awesome0 !
여기에서 예를 들어 해당 토큰이 ! 숫자에 대응합니다 0 그리고 이 토큰은 이 모델의 어휘에서 첫 번째 토큰입니다. 또한 일부 토큰에는 앞에 공백이 포함되어 있다는 점도 확인할 수 있습니다.
샘플링이란?
LLM은 자기회귀 모델로, 한 번에 하나의 요소씩 시퀀스를 생성합니다. 초기 프롬프트로 시작해, 가능한 단어들의 확률 분포에서 샘플링하여 다음 단어를 예측합니다. 그런 다음 이 과정을 반복하면서 이전 출력을 다음 단계의 입력으로 사용하고, 원하는 길이의 텍스트가 생성될 때까지 계속합니다.
즉, 자기회귀 LLM에서 어떤 출력이든 얻으려면 이들 모델의 동작 방식에 내재된 샘플링을 반드시 수행해야 합니다. 그리디 디코딩, 빔 서치, 온도 샘플링, 탑‑p 샘플링과 같은 다양한 샘플링 전략은 모델이 예측한 단어 분포에서 값을 추출하는 여러 방법을 의미합니다. 이러한 전략은 모델 출력에서 무작위성과 예측 가능성 사이의 균형에 직접적인 영향을 미칩니다.
그리디 디코딩 가장 높은 확률을 가진 단어를 다음 단어로 선택하는 방식을 말합니다. 이 방법은 단순하고 계산 효율이 높지만, 생성된 텍스트가 반복적이고 다양성이 부족해질 수 있습니다. 빔 서치반면 빔 서치는 여러 시퀀스를 함께 추적합니다(“빔”은 유지하는 시퀀스의 개수를 의미) 그리고 매 단계에서 모든 시퀀스를 확장합니다. 빔 서치는 그리디 디코딩의 몇 가지 문제를 완화할 수 있지만, 결정적 특성 때문에 여전히 최적보다 못한 결과를 초래할 수 있습니다.

생성된 텍스트에 무작위성과 창의성을 더하려면 온도 샘플링과 탑‑p 샘플링과 같은 확률적 샘플링 방법을 사용할 수 있습니다.
온도 샘플링 표본을 추출하기 전에 확률 분포의 “선명도”를 조정하는 것을 말합니다. 온도가 0에 가까울수록 분포는 더 뾰족해져, 모델이 최고 확률의 단어를 선택할 가능성이 커집니다. 반대로 온도가 높아질수록 분포는 더 평평해지고, 모델이 덜 가능성 높은 단어를 선택할 확률이 커집니다. 즉, 온도가 높을수록 생성된 텍스트에는 더 많은 무작위성과 다양성이 나타납니다.

탑‑p 샘플링는 누클리어스 샘플링이라고도 하며, 또 다른 방식으로 무작위성을 도입합니다. 가능한 모든 다음 단어를 고려하는 대신, 탑‑p 샘플링은 누적 확률이 임계값 p를 넘기는 데 필요한 가장 작은 상위 단어 집합만 고려합니다. p 값이 높을수록 더 많은 단어가 포함되어, 생성된 텍스트의 무작위성이 커집니다.

제공된 코드 스니펫을 사용해 다양한 온도와 탑‑p 값을 실험해 볼 수 있습니다.
import openaidef generate_text(temp=None, topp=None):"Generate text with a given temperature or top-p, but not both"if temp is not None and topp is not None:raise ValueError("Only one of temperature or top-p should be set")response = openai.Completion.create(model="text-davinci-003",prompt="Say something about Weights & Biases",max_tokens=50,temperature=temp,top_p=topp,)return response.choices[0].text.strip()# Generate text with varying temperaturesfor temp in [0, 0.5, 1, 1.5, 2]:print(f'TEMP: {temp}, GENERATION: {generate_text(temp=temp)}')# Generate text with varying top-p valuesfor topp in [0.01, 0.1, 0.5, 1]:print(f'TOP_P: {topp}, GENERATION: {generate_text(topp=topp)}')
낮은 온도와 높은 온도에서의 출력을 비교해 보면, 온도가 높을수록 신뢰도는 떨어질 수 있지만 확실히 더 다양한 텍스트가 생성된다는 것을 알 수 있습니다.
TEMP: 0, GENERATION: Weights & Biases is an amazing tool for tracking andanalyzing machine learning experiments. It provides powerful visualizationsand insights into model performance, enabling data scientists to quicklyidentify areas of improvement and optimize their models.TEMP: 1.5, GENERATION: Weights & Biases is a powerful tool that assists withearly stage project showcase and analysis, helping designers, datascientists, and product/ decision teams discover their highest potentialcreative insights. With automated experiment tracking, visual presentation,and team plotting
OpenAI는 온도와 탑‑p를 동시에 조정하지 말 것을 권장한다는 점에 유의해야 합니다. 두 파라미터 모두 서로 다른 방식으로 출력의 무작위성을 제어하기 때문에, 둘을 함께 조정하면 예측하기 어려운 결과가 나올 수 있습니다. 대신, 생성하고자 하는 텍스트의 특성에 따라 두 파라미터 중 하나를 선택해 조정하는 것이 좋습니다.
채팅 API
GPT‑3.5와 GPT‑4 같은 더 강력한 모델로 넘어가면, OpenAI는 다른 API인 채팅 API를 제공합니다. 단일 문자열 프롬프트로 동작하는 대신, 이 API는 메시지의 시퀀스로 동작합니다. 시퀀스의 각 메시지에는 역할과 내용이 있습니다. 역할은 "system", "user", "assistant" 중 하나이며, 내용은 해당 역할에서 보낸 메시지의 텍스트입니다.
“system” 역할은 일반적으로 대화 시작 시 어시스턴트의 동작 방침을 설정하는 데 사용됩니다. “user” 역할의 메시지는 사용자가 어시스턴트에게 보내는 지시나 질문입니다. “assistant” 역할의 메시지는 어시스턴트의 응답입니다. 모델은 응답을 생성할 때 시퀀스에 있는 모든 메시지를 고려합니다.
다음은 채팅 API 사용 예시입니다:
import openaiMODEL = "gpt-3.5-turbo"response = openai.ChatCompletion.create(model=MODEL,messages=[{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "Say something about Weights & Biases"},],temperature=0,)response
이 코드에서는 먼저 사용할 모델을 정의합니다. 이번 예에서는, gpt-3.5-turbo그다음 호출합니다 openai.ChatCompletion.create 응답을 생성하기 위해서입니다. messages 매개변수는 메시지 객체의 목록입니다. 각 객체에는 "role"과 "content"가 있습니다. 먼저 어시스턴트가 도움이 되도록 지시하는 system 메시지로 시작하고, 이어서 Weights & Biases에 대해 말해 달라는 user 메시지를 보냅니다. temperature 매개변수는 0으로 설정되어 있으며, 이는 모델이 각 단계에서 가장 가능성이 높은 다음 단어를 결정적으로 선택한다는 뜻입니다.
모델의 응답은 ChatCompletion 객체 형태로 반환되며, 기타 정보와 함께 모델의 메시지를 포함합니다.
<OpenAIObject chat.completion id=chatcmpl-2534523452345 at 0x12ca7cf90> JSON: {"choices": [{"finish_reason": "stop","index": 0,"message": {"content": "Weights & Biases is a machine learning platform that helps data scientists and machine learning engineers track and visualize their experiments. It provides tools for experiment management, hyperparameter tuning, and model visualization, making it easier to iterate and improve machine learning models. Weights & Biases also offers integrations with popular machine learning frameworks like TensorFlow, PyTorch, and Keras.","role": "assistant"}}],"created": 1686671355,"id": "chatcmpl-2534523452345","model": "gpt-3.5-turbo-0301","object": "chat.completion","usage": {"completion_tokens": 74,"prompt_tokens": 27,"total_tokens": 101}}
결론
요약하면, GPT‑4 같은 LLM은 인공지능의 중대한 도약을 이룹니다. 방대한 매개변수와 자기회귀 아키텍처를 갖춘 이 모델들은 다양한 주제와 스타일 전반에 걸쳐 인간과 유사한 텍스트를 이해하고 생성할 수 있습니다. OpenAI가 제공하는 것과 같은 API를 활용하면 개발자는 이러한 고급 능력을 애플리케이션에 통합하여 자연어 이해와 생성 작업에서 무궁무진한 가능성을 열 수 있습니다.
LLM의 세계를 더 깊이 파고들고 싶으신가요? Weights & Biases에서 무료 온라인 강의를 제공합니다: LLM 기반 애플리케이션 구축이 강의는 LLM 기반 앱을 설계하고, 실험하며, 평가하는 전 과정을 안내합니다.
Add a comment