AI/LangChain

LCEL (LangChain Expression Language): 선언형 LangChain 구성 방식

불타는고굼이 2025. 3. 28. 13:57
반응형

LCEL (LangChain Expression Language): 선언형 LangChain 구성 방식

LCEL(LangChain Expression Language)은 LangChain의 컴포넌트들을 함수형으로 연결할 수 있도록 지원하는 선언적 표현 방식이다. LangChain v0.1 이후부터 공식 도입되었으며, 체인 구성 시 가독성과 재사용성을 높이고, 실행 흐름의 추적 및 디버깅을 용이하게 한다.

LCEL 도입 배경

  • 기존 LangChain 구성 방식은 Imperative(명령형) 스타일로 가독성이 떨어지는 경우가 많았다.
  • 체인(Chain) 간 연결 구조를 함수형으로 선언할 수 있는 방식을 제공하여 코드의 명확성과 유지보수성을 개선했다.
  • LangSmith와의 통합을 통해 실행 흐름 추적도 자연스럽게 가능해졌다.

기본 개념

  • 각 LangChain 컴포넌트(Prompt, LLM, Output Parser 등)를 파이프라인처럼 연결한다.
  • | 또는 invoke() 메서드를 사용하여 순차적으로 연결한다.
  • 전체 체인을 하나의 구성 요소처럼 재사용할 수 있다.

LCEL 구성 요소

  • PromptTemplate: 입력값을 포맷팅하는 역할
  • LLM: 대형 언어 모델 호출
  • OutputParser: 모델 응답을 구조화된 형태로 파싱
  • Runnable: 위 구성 요소들을 실행 가능한 체인으로 연결

LCEL 코드 예제

from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.output_parsers import StrOutputParser

# 1. 컴포넌트 정의
prompt = PromptTemplate.from_template("Q: {question}\nA:")
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
parser = StrOutputParser()

# 2. LCEL 방식으로 체인 연결
chain = prompt | llm | parser

# 3. 실행
result = chain.invoke({"question": "LangChain Expression Language란?"})

파이프라인 구성 방식

LCEL에서는 체인 연결 시 각 컴포넌트가 Runnable 형태를 갖는다. 입력 → 프롬프트 → LLM → 파서 → 출력 형태로 파이프라인을 형성한다.

예시 구조:

[dict] → PromptTemplate → ChatOpenAI → OutputParser → [str]

invoke, stream, batch 메서드

LCEL은 다양한 실행 메서드를 제공한다.

  • invoke(input): 단일 입력 실행
  • batch(inputs): 다중 입력 동시 실행
  • stream(input): 토큰 스트리밍 응답 처리

LCEL의 장점

  • 체인 구성을 선언형으로 표현 가능
  • 코드 간결화 및 가독성 향상
  • 실행 흐름 재사용성 증가
  • LangSmith와의 통합 시 추적 용이

주의 사항

  • 모든 LangChain 구성 요소가 LCEL을 완벽히 지원하는 것은 아니다
  • Legacy 방식과 혼용 시 실행 방식이 달라질 수 있으므로 주의 필요
  • LCEL에서 사용되는 각 컴포넌트는 Runnable을 구현해야 연결 가능
728x90
반응형