Chain이 뭔지 몰라서 3일을 헤맸던 이야기

✍️

Infographic explaining the concept and applications of Chain with blockchain and supply chain examples in Korean

Chain이 뭔지 몰라서 3일을 헤맸던 이야기

처음 LangChain 문서를 열었을 때 제일 당황스러웠던 단어가 바로 “Chain”이었습니다. 튜토리얼마다 LLMChain, SequentialChain, 요즘은 | 파이프 문법까지 나오는데, 정작 “Chain이 대체 왜 필요한지”는 아무도 설명해 주지 않더라고요. 저는 그냥 “LLM 한 번 호출하면 되는 거 아냐?” 하고 넘어갔다가, 실제 챗봇을 만들면서 코드가 스파게티가 되고 나서야 Chain의 의미를 몸으로 이해했습니다. 그 삽질을 압축해서 정리해 봅니다.

제가 겪은 문제: Chain 없이 짰더니

처음엔 이렇게 짰습니다. 사용자 질문을 받아서 프롬프트 문자열을 f-string으로 만들고, LLM을 호출하고, 결과를 후처리하고… 이걸 함수 하나에 다 넣었죠. 기능이 하나일 땐 괜찮았어요. 문제는 “검색(RAG)도 붙이고, 날씨 API도 붙이고, 대화 기록도 기억하게 해줘”라는 요구가 들어온 순간이었습니다. 단계가 늘어날 때마다 함수가 비대해지고, 중간 결과를 어디서 바꿔야 하는지 찾는 데만 한참 걸렸어요.

Chain은 결국 이 “여러 단계를 하나의 흐름으로 묶고, 각 단계를 부품처럼 갈아 끼우게 해주는 것”입니다. 거창한 개념이 아니라, 유지보수를 위한 배관 정리에 가깝습니다.

지금이라면 이렇게 씁니다 (LCEL 예시)

예전엔 LLMChain 객체를 일일이 연결했지만, 요즘 LangChain은 LCEL(파이프 문법)로 훨씬 읽기 쉽게 씁니다. 아래는 제가 실제 프로젝트에서 쓰는 가장 단순한 형태예요.

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser

prompt = ChatPromptTemplate.from_template("다음 문장을 한 줄로 요약해줘: {text}")
model = ChatOpenAI(model="gpt-4o-mini")

# 프롬프트 → 모델 → 문자열 파싱을 하나의 Chain으로
chain = prompt | model | StrOutputParser()

print(chain.invoke({"text": "LangChain의 Chain은 여러 단계를 파이프로 연결한다."}))

| 기호가 리눅스 파이프처럼 “왼쪽 출력 → 오른쪽 입력”으로 흘려보낸다고 생각하면 편합니다. 제가 처음에 헷갈렸던 건 StrOutputParser()였는데, 이걸 빼면 결과가 AIMessage 객체로 나와서 .content를 매번 붙여야 합니다. 파서를 체인 끝에 끼워두면 그냥 문자열로 떨어져서 훨씬 깔끔해요. 사소하지만 이걸 몰라서 한참 헤맸습니다.

RAG·Agent가 결국 다 Chain인 이유

이 구조를 이해하고 나니 RAG가 갑자기 쉬워졌습니다. RAG는 결국 “질문 → 문서 검색 → 검색 결과를 프롬프트에 끼워 넣기 → LLM 호출”이라는 체인 하나거든요. Agent도 마찬가지로, “어떤 도구를 쓸지 판단 → 도구 실행 → 결과를 다시 LLM에” 하는 흐름의 반복입니다. 그래서 저는 신입에게 LangGraph나 Agent를 바로 가르치기보다, 이 파이프 하나를 손에 익히라고 권합니다.

솔직한 의견: Chain을 언제 쓰고 언제 안 쓰나

다만 모든 걸 Chain으로 짜야 한다고는 생각하지 않습니다. 단계가 2~3개이고 분기(조건 나눔)가 없다면 그냥 함수로 짜는 게 더 읽기 쉬울 때도 많아요. 분기와 반복, 상태 관리가 필요해지는 순간(예: “실패하면 다른 도구로 재시도”)부터는 LCEL만으로 버겁고, 그때가 LangGraph로 넘어갈 타이밍이라고 봅니다. 도구는 문제 크기에 맞춰 고르는 게 맞습니다.

정리하며

Chain은 어렵고 특별한 개념이 아니라, 여러 단계를 갈아 끼우기 쉽게 묶는 배관입니다. 저처럼 “그냥 LLM 부르면 되지” 하고 넘겼다가 코드가 엉키기 전에, 작은 예제 하나라도 invoke까지 직접 돌려보시길 권합니다. 다음 글에서는 이 Chain에 재사용 가능한 Prompt Template을 붙이는 방법을, 제가 쓰는 실제 프롬프트 예시와 함께 다뤄보겠습니다.

✍️ 글쓴이 — Terry Jang (장태리)

20년 경력 AI 에이전트 엔지니어. LLM·RAG·에이전트를 실제 제품에 적용하며 겪은 문제와 해법을 직접 코드로 확인해 공유합니다.

🔗 저자 소개 · ✉️ jasi798@gmail.com

답글 남기기