본문 바로가기

프로그래밍/AI

[Agent] LCEL(a.k.a. Langchain pattern)

Langchain이 진화함에 따라 기존의 LLMChain 방식에서 벗어나, 더 직관적이고 유연한 LCEL(Langchin expression Language) 패턴이 표준으로 자리잡고 있습니다. 

 

LCEL Concept
  • 기본 개념
    • Langchain 컴포넌트들을 연결하기 위한 선언적 방식이다.
    • 데이터의 흐름을 직관적으로 정의하여 입력에서 출력까지 깔끔한 워크플로우를 보장한다. (like 리눅스의 '|')
  • 장점 
    • 가독성 : 데이터 흐름을 명확하게 시각화 할 수 있다. 
    • 구성 용이성 : 복잡한 체인을 레고 블록처럼 쉽게 조립할 수 있다. 
    • 유연성 : 병렬 실행, 비동기 지원, 스트리밍 등의 기능을 기본적으로 지원한다. 
Pipe Operator(|) Method
# LCEL 패턴 예시 
chain = prompt | llm | output_parser
  • prompt : 사용자의 입력을 받아 프롬프트 템플릿에 주입
  • llm : 완성된 프롬프트를 언어 모델에 전달
  • output_parser : LLM의 응답을 문자열 등으로 파싱하여 최종 출력
Runnable Protocol 
  • Langchai의 모든 빌딩 블록(LLM, Retriever, Tool 등)은 Runnable 프로토콜을 따른다. 
  • RunnableSequence(순차 실행) 
    • 이전 컴포넌트의 출력을 다음 컴포넌트의 입력으로 전달
      • 기존 방식 : RunnableSequence(comp1, comp2) 
      • LCEL 방식 : comp1 | comp2 (직관적 !) 
  • RunnableParallel(병렬 실행) 
    • 동일한 입력을 사용하여 여러 컴포넌트를 동시에 실행 
      • Summary, Translation, sentiment 를 동시에 실행 (딕셔너리 구조 사용)
      • {dict} | final_process : 앞선 실행의 결과값을 모두 넘겨 받음
# 딕셔너리 구조를 사용하면 자동으로 병렬 실행됨
chain = {
    "summary": summary_chain,
    "translation": translation_chain,
    "sentiment": sentiment_chain
} | final_process

 

Type Coercion (자동 타입 변환) 
  • 명시적으로 Runnable 클래스로 감싸지 않아도, LCEL이 알아서 python code -> Runnable 변환 
    • Dictionary({ }) -> RunnableRarallel
      • 딕셔너리를 Chain에 넣으면 자동으로 병렬 실행 컴포넌트로 변환됨 
    • Function(def) -> RunnableLambda
      • 일반 파이썬 함수를 Chain에 넣으면, 입력을 변환하는 람다함수(RunnableLambda)로 자동 래핑
LCEL vs Langraph
  • LCEL
    • 표준적인 오케스트레이션 작업에 최적화
    • 프롬프트 템플릿, LLM 호출, 출력 파싱 과정 
  • Langraph
    • 매우 복잡한 워크플로우를 구현해야 할때
    • 루프(Loop), 순환(Cycle) 이 있을때 등 
    • 단, Langraph의 각 노드 내부 로직은 여전히 LCEL로 작성하는 것이 유리함. 

-------------------------------------------------------------------------------------------

참고 : IBM RAG and Agentic AI - Develop Generative AI Applications: Get Started (Coursera) 

--------------------------------------------------------------------------------------------