3장. LangChain 기본 구조와 LCEL
모델 부품 ChatOpenAI 의 설정
식당에 요리사를 새로 들일 때는 몇 가지를 정해 둡니다. 어느 요리사를 쓸지, 레시피대로만 할지 솜씨를 부려도 될지, 한 접시에 얼마나 담을지, 주문 하나에 얼마나 기다려 줄지입니다. ChatOpenAI 를 만들 때 넣는 인자가 바로 이 약속입니다.
네 상자가 자주 쓰는 네 설정입니다. 왼쪽부터 어느 모델을 쓸지, 얼마나 모험할지(온도), 답을 얼마나 길게 쓸 수 있는지, 답을 얼마나 기다릴지입니다. 여기서 요리사 고르기가 model, 솜씨 부리기가 temperature, 한 접시의 양이 max_tokens, 기다려 주는 시간이 timeout 입니다. 비유와 다른 점은, 요리사는 양을 넘기면 접시를 바꾸지만 모델은 max_tokens 에 닿으면 문장 중간이라도 답을 끊는다는 것입니다.
자주 쓰는 설정
| 인자 | 뜻 | 이 교안에서 | 주의할 것 |
|---|---|---|---|
model | 쓸 모델의 이름 | MODEL(기본 gpt-4.1-mini) | 교수자가 정한 모델이 있으면 .env 의 OPENAI_MODEL 로 바꾼다 |
temperature | 온도. 0 이면 한결같이, 높으면 다양하게 | 안내 0, 소개글 0.7~1 | GPT-5 계열처럼 기본값(1)만 받는 모델도 있다 |
max_tokens | 답의 최대 토큰 수 | 200 안팎 | 설치된 판에서는 max_completion_tokens 라는 이름으로도 받는다 |
timeout | 답을 기다리는 최대 초 | 30 | 넘으면 오류가 난다. 너무 짧으면 긴 답이 끊긴다 |
max_retries | 실패했을 때 다시 시도하는 횟수 | 2 | retry 는 "다시 해 보기"라는 뜻 |
max_tokens 와 timeout 은 이 교안의 langchain-openai 1.7.3 에서 ChatOpenAI 의 칸 이름을 확인한 것입니다. 이 판에서 max_tokens 는 OpenAI 의 max_completion_tokens 와 같은 칸이고, timeout 은 request_timeout 과 같은 칸입니다. 판이 바뀌면 이름이 달라질 수 있으니 설명서를 확인합니다.
짧은 예시
모델을 만들기만 하고 부르지는 않습니다. 만드는 일에는 인터넷도 요금도 들지 않습니다. 키가 없는 PC 에서도 돌도록, 키가 없으면 자리표시 글을 넣어 만듭니다.
import os
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model=os.getenv("OPENAI_MODEL", "gpt-4.1-mini"), # 쓸 모델. .env 로 바꿀 수 있다
temperature=0, # 온도 0: 한결같은 답
max_tokens=200, # 답은 200 토큰까지
timeout=30, # 30초 넘게 걸리면 멈춘다
max_retries=2, # 실패하면 두 번까지 다시 보낸다
api_key=os.getenv("OPENAI_API_KEY", "발급받은_인증키"), # 키는 환경 변수에서 읽는다. 없으면 자리표시
)
print("모델:", model.model_name)
print("온도:", model.temperature, "/ 최대 토큰:", model.max_tokens)
print("기다리는 시간:", model.request_timeout, "초 / 다시 시도:", model.max_retries, "번")모델: gpt-4.1-mini
온도: 0.0 / 최대 토큰: 200
기다리는 시간: 30.0 초 / 다시 시도: 2 번넣은 timeout=30 은 request_timeout 이라는 이름으로 30.0 초가 들어갔습니다. 이 모델을 체인에 끼우는 일은 실습 3에서 합니다. 실습에서는 2장처럼 .env 에서 키를 읽으므로 api_key 인자를 적지 않습니다.
코드가 의미하는 것
이 코드는 새 요리사를 들이며 근무 약속을 적어 두는 일을 흉내 낸 것입니다. 요리사를 고르고, 솜씨를 얼마나 부릴지, 한 접시의 양, 기다려 줄 시간, 다시 해 볼 횟수를 정한 뒤 적힌 약속을 읽어 봅니다.
| 코드 | 하는 일 | 챗봇에서 뜻하는 것 |
|---|---|---|
os.getenv("OPENAI_MODEL", "gpt-4.1-mini") | 환경 변수에서 모델 이름을 읽고, 없으면 기본값을 쓴다 | 코드를 고치지 않고 .env 만 바꿔 다른 모델로 갈아 끼울 수 있습니다 |
temperature=0 | 온도를 0 으로 정한다 | 규정 안내처럼 늘 같은 답이 필요한 챗봇에 맞는 설정입니다 |
max_tokens=200, timeout=30 | 답의 길이 상한과 기다리는 시간을 정한다 | 답이 너무 길어지거나 화면이 오래 멈추는 것을 막는 안전장치입니다 |
max_retries=2 | 실패하면 두 번까지 다시 보낸다 | 잠깐의 네트워크 문제로 챗봇이 바로 오류를 내지 않게 합니다 |
api_key=os.getenv("OPENAI_API_KEY", "발급받은_인증키") | 키를 환경 변수에서 읽고, 없으면 자리표시를 넣는다 | 키를 코드에 적지 않습니다. 만들기만 하므로 자리표시로도 오류가 나지 않습니다 |
결과에서 읽을 것은 두 가지입니다.
- 넣은 값이 그대로 들어갔습니다. 모델
gpt-4.1-mini, 최대 토큰 200, 다시 시도 2 번이 찍혔습니다. 온도는 0 을 넣었지만 실수0.0으로 바뀌어 들어갔습니다. - 같은 설정이 다른 이름으로 찍힙니다.
timeout=30으로 넣은 값이request_timeout으로 30.0 초가 됐습니다. 설정을 확인할 때는 이 칸 이름으로 읽습니다.
주의할 점
- 설정은 모델을 만들 때 정해집니다. 같은 체인에서 온도만 다르게 쓰고 싶으면 온도가 다른 모델을 하나 더 만들어 끼웁니다. 프로젝트에서 이렇게 견줍니다.
max_tokens를 너무 작게 잡으면 답이 문장 중간에 끊깁니다. 한국어는 토큰을 많이 쓰므로(1장 실습 3에서 토큰 하나에 한국어 1.76글자) 넉넉히 잡습니다.