Runnable Interface
LangChain에서 Runnable은 LCEL(LangChain Expression Language) 시스템을 구동하는 핵심 동작 규격이자 기본 인터페이스이다. 시스템 내의 다양한 구성 요소(프롬프트 템플릿, 언어 모델, 데이터 검색기, 출력 파서 등)를 동일한 방식으로 실행하고 상호 연결할 수 있도록 표준화된 뼈대를 제공한다.
어떤 객체가 Runnable 인터페이스를 상속받으면, 개발자는 해당 객체의 내부 구조나 동작 원리를 알 필요 없이 예측 가능한 표준 메서드를 통해 데이터를 입출력할 수 있다. 또한 파이썬의 파이프 연산자(|)를 사용하여 여러 Runnable 객체를 체인 형태로 연결하면, 그 결합된 결과물 역시 새로운 Runnable 객체(RunnableSequence)로 취급된다.
Runnable 인터페이스는 데이터 처리 방식에 따라 동기(Synchronous) 및 비동기(Asynchronous) 환경을 모두 지원하며, 상호 비교되는 표준 실행 메서드는 다음과 같다.
| 기능 | 동기(Sync) 메서드 | 비동기(Async) 메서드 | 동작 특징 및 설명 |
|---|---|---|---|
| 단일 실행 | invoke | ainvoke | 단일 입력값을 전달하여 체인을 온전히 실행하고 최종 출력을 반환함 |
| 스트리밍 | stream | astream | 출력 생성 과정에서 완성된 청크(Chunk) 데이터를 실시간 스트리밍 형태로 반환함 |
| 일괄 처리 | batch | abatch | 다수의 입력값 배열을 받아 스레드 풀 등을 활용해 동시에 병렬로 처리함 |
| 이벤트 로깅 | (지원하지 않음) | astream_events | 체인 내부의 각 하위 단계(LLM 호출 시작, 검색 완료 등)에서 발생하는 과정 이벤트를 추적하고 반환함 |
단순한 순차적 연결(|) 외에, 데이터의 흐름을 제어하기 위해 LangChain은 내부적으로 가공된 여러 특수 Runnable 유틸리티 클래스를 제공한다. 기능적 목적에 따른 각 클래스의 비교는 다음과 같다.
| 유틸리티 클래스 | 인터페이스 목적 | 주요 활용 로직 |
|---|---|---|
RunnableSequence | 다중 요소의 순차적 연결 | 이전 단계의 출력값을 다음 단계의 입력값으로 자동 전달 구동 |
RunnableParallel | 다중 요소의 병렬 실행 | 하나의 입력값을 여러 검색기(Retriever)나 모델에 동시에 전달 후 딕셔너리로 묶어 반환 |
RunnablePassthrough | 데이터 바이패스(Bypass) 및 병합 | 입력 데이터를 수정 없이 그대로 통과시키거나, 새로운 키-값 쌍을 기존 데이터에 덧붙임 (주로 RAG 환경에서 사용) |
RunnableLambda | 임의 코드의 프로토콜 편입 | 사용자가 직접 작성한 일반 파이썬 커스텀 함수(Function)를 Runnable 객체로 변환하여 체인 중간에 삽입 |
출처 (Sources):
- LangChain Documentation, “Runnable interface”. Available at: https://python.langchain.com/docs/concepts/runnables/
- LangChain Documentation, “LangChain Expression Language (LCEL)”. Available at: https://python.langchain.com/docs/concepts/lcel/