컨베이어 벨트로 이해하는 LangChain의 Chain

AI 개발을 배울 때 "Chain"이라는 단어에서 한 번쯤 멈칫하게 됩니다. 저는 이 개념을 후배에게 설명할 때 공장 컨베이어 벨트에 비유하는데, 그게 가장 빨리 통하더라고요. 오늘은 그 비유로 Chain을 풀어보고, 실제로 어떻게 코드가 되는지까지 짚어보겠습니다.

컨베이어 벨트로 이해하는 Chain

공장 라인을 떠올려 보세요. 원재료가 들어오면 → 1번 기계가 다듬고 → 2번 기계가 조립하고 → 3번 기계가 포장합니다. 각 기계는 앞 기계의 결과물을 받아 자기 일만 하고 다음으로 넘깁니다. LangChain의 Chain이 정확히 이 구조예요. 사용자 입력이 프롬프트 생성 → LLM 호출 → 결과 가공 순서로 흘러가죠. "여러 단계를 한 줄로 연결한 흐름"이라는 정의가 이래서 나옵니다.

가장 단순한 연결

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

prompt = ChatPromptTemplate.from_template("{keyword} 를 한 문장 광고 카피로 만들어줘")
model = ChatOpenAI(model="gpt-4o-mini")

chain = prompt | model          # 프롬프트 → 모델을 벨트로 연결
print(chain.invoke({"keyword": "무선 이어폰"}).content)

| 기호가 컨베이어 벨트라고 보면 됩니다. 왼쪽 결과가 오른쪽 입력으로 자동으로 넘어가죠.

한 단계 더 — 동시에 처리하기

제품 페이지를 만들 때 저는 "카피"와 "해시태그"를 한 번에 뽑고 싶었습니다. 이럴 땐 벨트를 나란히 두 개 놓는 RunnableParallel이 편합니다.

from langchain_core.runnables import RunnableParallel

copy_chain = ChatPromptTemplate.from_template("{k} 광고 카피") | model
tag_chain  = ChatPromptTemplate.from_template("{k} 해시태그 5개") | model

both = RunnableParallel(copy=copy_chain, tags=tag_chain)
result = both.invoke({"k": "캠핑 랜턴"})
print(result["copy"].content)
print(result["tags"].content)

두 작업이 순차가 아니라 동시에 돌아서 응답도 빨라집니다. 실제 상품 상세 자동화에 이 구조를 자주 씁니다.

제 기준: 언제 Chain을 쓸까

솔직히 단계가 하나뿐이면 굳이 Chain으로 감싸지 않습니다. 오히려 코드만 길어져요. 저는 "단계가 2개 이상 + 나중에 중간 단계를 갈아 끼울 가능성"이 보일 때부터 Chain으로 정리합니다. 그래야 나중에 모델을 바꾸거나 후처리를 추가할 때 벨트 한 칸만 교체하면 되거든요.

마무리

Chain은 어려운 이론이 아니라 "작업을 벨트로 이어 붙이는 정리 습관"입니다. 개념만 읽지 말고 위 invoke 예제를 한 번 직접 돌려보시면, 왜 다들 이걸로 시작하라고 하는지 감이 옵니다. 다음 글에서는 이 벨트의 첫 칸인 Prompt Template을 더 깊게 다뤄보겠습니다.

댓글

이 블로그의 인기 게시물

지하철 노선도로 이해하는 LangGraph (분기·반복 설계)

LangGraph State란 무엇인가? 상태 관리 개념 쉽게 이해하기

LangGraph Node와 Edge 개념 쉽게 이해하기 (초보자 완전 정리)