LCEL이 편한 진짜 이유 (예전 방식과 비교)

LangChain을 조금 쓰다 보면 | 기호로 연결하는 문법을 자주 만납니다. 이게 LCEL(LangChain Expression Language)인데, 저는 처음엔 "굳이 왜 이런 문법을?" 싶었어요. 그런데 예전 방식과 비교해 보니 이유가 바로 이해됐습니다.

예전 방식 vs LCEL

예전엔 객체를 만들고 함수로 이어 붙였습니다. 단계가 늘면 코드가 장황해졌죠.

# 예전 느낌 (개념)
result1 = prompt.format(...)
result2 = llm.invoke(result1)
result3 = parser.parse(result2)

LCEL은 이걸 한 줄로 파이프처럼 잇습니다.

chain = prompt | llm | parser
result = chain.invoke({"q": "벡터 DB"})

|는 리눅스 파이프와 같은 발상이에요. 왼쪽 출력이 오른쪽 입력으로 자동으로 흘러갑니다. 읽는 순서와 실행 순서가 일치해서 눈에 잘 들어와요.

제가 체감한 진짜 장점

단순히 짧아서가 아니라, 스트리밍·비동기·배치가 공짜로 딸려온다는 점이 컸습니다. 같은 체인에서 chain.stream(...)으로 바꾸면 토큰이 실시간으로 흘러나오고, chain.batch([...])로 여러 입력을 한 번에 처리할 수 있어요. 예전 방식이라면 이걸 다 직접 짰어야 했죠.

for tok in chain.stream({"q": "임베딩"}):
    print(tok, end="", flush=True)   # 실시간 출력

주의: 타입 맞추기

파이프로 이을 때 앞 단계 출력과 뒤 단계 입력 타입이 안 맞으면 조용히 이상하게 동작합니다. 저는 중간에 StrOutputParser()를 끼워 문자열로 정리하는 걸 습관으로 뒀더니 헷갈림이 줄었어요.

마무리

LCEL은 "체인을 파이프 한 줄로, 그러면서 스트리밍·배치까지" 얻는 문법입니다. 최신 LangChain은 대부분 이 방식이라 익혀두면 두고두고 편합니다.

댓글

이 블로그의 인기 게시물

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

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

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