컨베이어 벨트로 이해하는 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을 더 깊게 다뤄보겠습니다.
댓글
댓글 쓰기