LeanX

첫 체인 만들기: 프롬프트 | 모델 | 파서

체인은 '프롬프트 → 모델 → 파서'를 파이프(|) 연산자로 연결한 조립라인이며, 10줄 이내의 코드로 번역기 같은 첫 LLM 앱을 만들 수 있습니다.

랭체인의 '체인(Chain)'은 이름 그대로 부품을 사슬처럼 연결한 것입니다. 공장의 조립라인을 떠올려 보세요. 재료(사용자 입력)가 들어오면 1번 기계(프롬프트)가 질문 형태로 다듬고, 2번 기계(모델)가 답을 생성하고, 3번 기계(파서)가 결과를 쓰기 좋은 형태로 포장합니다.

파이프 연산자: 체인의 핵심 문법

랭체인에서는 부품과 부품을 | (파이프) 기호로 연결합니다. '왼쪽의 출력이 오른쪽의 입력이 된다'는 뜻입니다. 리눅스 터미널의 파이프와 같은 개념이라, 읽는 순서 그대로 데이터가 흐릅니다.

체인의 뼈대 (개념)

# 데이터가 왼쪽에서 오른쪽으로 흐릅니다
# 입력 -> 프롬프트(질문 완성) -> 모델(답 생성) -> 파서(텍스트 추출)
chain = prompt | model | parser

실습: 번역 체인 만들기

체인 조립 순서

  1. 프롬프트 템플릿 만들기: 어떤 질문을 할지 틀을 정합니다
  2. 모델 준비하기: init_chat_model로 LLM을 불러옵니다
  3. 파서 붙이기: StrOutputParser가 답변 객체에서 순수 텍스트만 꺼냅니다
  4. 파이프로 연결하고 invoke로 실행합니다

첫 체인: 한국어 → 영어 번역기

from langchain.chat_models import init_chat_model
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# 1. 프롬프트: {text} 자리에 나중에 값이 끼워집니다
prompt = ChatPromptTemplate.from_template(
    '다음 한국어 문장을 자연스러운 영어로 번역해줘: {text}'
)

# 2. 모델: 어떤 LLM을 쓸지 결정
model = init_chat_model('openai:gpt-4o-mini')

# 3. 파서: AIMessage 객체에서 문자열만 추출
parser = StrOutputParser()

# 4. 파이프로 조립 = 조립라인 완성
chain = prompt | model | parser

# 5. 실행: 딕셔너리로 변수 값을 전달
result = chain.invoke({'text': '오늘 날씨가 정말 좋네요.'})
print(result)  # The weather is really nice today.

이 10줄이 랭체인의 절반입니다. 앞으로 배울 RAG도, 에이전트도 결국 이 조립라인에 부품을 추가하는 것뿐입니다. 파서를 바꾸면 JSON으로 받을 수 있고, 프롬프트 앞에 검색 부품을 붙이면 RAG가 됩니다.

invoke 말고 다른 실행 방법

  • invoke(입력): 한 번 실행하고 결과를 한 번에 받기 (기본)
  • stream(입력): ChatGPT처럼 글자가 한 글자씩 흘러나오게 받기
  • batch([입력1, 입력2]): 여러 입력을 한꺼번에 병렬 처리하기

스트리밍으로 실행하기

# 답변이 생성되는 대로 실시간 출력됩니다
for chunk in chain.stream({'text': '만나서 반가워요.'}):
    print(chunk, end='', flush=True)

체인의 모든 부품(프롬프트, 모델, 파서)은 invoke, stream, batch를 똑같이 지원합니다. 이 공통 규격을 Runnable이라고 부르는데, '같은 규격이라 어디든 끼울 수 있다'는 것만 기억하면 됩니다.

invoke에 문자열이 아니라 딕셔너리를 넘긴다는 점에 주의하세요. 프롬프트에 {text}라는 변수가 있으면 반드시 {'text': '값'} 형태로 전달해야 합니다. 변수 이름이 다르면 KeyError가 발생합니다.