카테고리 없음

[LangChain] 랭체인 표현 언어(LCEL)

늘이 2024. 6. 25. 14:05

 

 

1. 랭체인 표헌 언어(LangChain Expression Language)

  • 랭체인 표현 언어(LCEL)는 랭체인 구성요소를 체인화하는 선언적 방법
  • LCEL은 가장 간단한 "프롬프트 + LLM" 체인부터, 가장 복잡한 체인까지 코드 변경 없이 프로토타입을 프로덕션에 넣을 수 있도록 설계되었습니다.

 

2. LCEL을 사용해야 하는 이유

1) 최고 수준의 스트리밍 지원

  • LCEL로 체인을 구축하면 첫 번째 토큰에 도달하는 시간(첫 번째 출력 청크가 나올 때까지 경과된 시간)을 최대한 단축할 수 있습니다.
  • 일부 체인의 경우 이는 예를 들어 LLM에서 스트리밍 출력 파서로 토큰을 바로 스트리밍하고, LLM 공급자가 원시 토큰을 출력하는 것과 동일한 속도로 파싱된 증분 출력 청크를 다시 받는다는 것을 의미합니다.

2) 비동기 지원

  • LCEL로 구축된 모든 체인은 동기 API(예: 프로토타이핑 중 Jupyter 노트북에서)와 비동기 API(예: LangServe 서버에서)로 모두 호출할 수 있습니다.
  • 이를 통해 프로토타입과 프로덕션에서 동일한 코드를 사용할 수 있으며, 뛰어난 성능과 함께 동일한 서버에서 많은 동시 요청을 처리할 수 있습니다.


3) 최적화된 병렬 실행

LCEL 체인에 병렬로 실행할 수 있는 단계가 있을 때마다(예: 여러 검색기에서 문서를 가져오는 경우) 동기화 및 비동기 인터페이스 모두에서 자동으로 수행하여 대기 시간을 최소화합니다.



4) 재시도 및 폴백

  • LCEL 체인의 모든 부분에 대해 재시도 및 폴백을 구성할 수 있습니다. 이는 체인을 대규모로 더욱 안정적으로 만들 수 있는 좋은 방법입니다.
  • 현재 재시도/폴백에 대한 스트리밍 지원을 추가하기 위해 노력 중이므로 지연 시간 비용 없이 안정성을 높일 수 있습니다.

 

5) 중간 결과 액세스

더 복잡한 체인의 경우 최종 결과물이 생성되기 전에도 중간 단계의 결과에 액세스하는 것이 매우 유용할 때가 많습니다. 이는 최종 사용자에게 어떤 일이 일어나고 있음을 알리거나 체인을 디버깅하는 데 사용할 수 있습니다. 중간 결과를 스트리밍할 수 있으며, 모든 LangServe 서버에서 사용할 수 있습니다.

 

6) 입력 및 출력 스키마

입력 및 출력 스키마는 모든 LCEL 체인에 체인의 구조에서 추론된 Pydantic 및 JSONSchema 스키마를 제공합니다. 이는 입력 및 출력의 유효성 검사에 사용할 수 있으며 LangServe의 필수적인 부분입니다.

 

7) 원활한 LangSmith 추적

  • 체인이 점점 더 복잡해짐에 따라 모든 단계에서 정확히 무슨 일이 일어나고 있는지 이해하는 것이 점점 더 중요해지고 있습니다.
  • LCEL을 사용하면 모든 단계가 자동으로 LangSmith에 기록되어 관찰 가능성과 디버깅 가능성을 극대화할 수 있습니다.

 

8) 원활한 LangServe 배포

LCEL로 생성된 모든 체인은 LangServe를 사용해 쉽게 배포할 수 있습니다.

 

3. Runnable 인터페이스


사용자 정의 체인을 최대한 쉽게 생성할 수 있는 "Runnable" 프로토콜

채팅 모델, LLM, 출력 파서, 검색기, 프롬프트 템플릿 등을 포함한 많은 LangChain 컴포넌트가 런너블 프로토콜을 구현합니다.

이것은 표준 인터페이스로, 사용자 정의 체인을 쉽게 정의하고 표준 방식으로 호출할 수 있게 해줍니다.

 

1) 표준 인터페이스에는 다음이 포함됩니다.

  • stream: 응답의 청크를 다시 스트리밍합니다.
  • invoke: 입력에 대한 체인 호출
  • batch: 입력 목록에 대한 체인 호출


2) 동시성을 위해 asyncio await 구문과 함께 사용해야 하는 해당 비동기 메서드

  • astream: 응답 청크를 비동기식으로 다시 스트리밍합니다.
  • ainvoke: 입력 비동기에서 체인을 호출합니다.
  • abatch: 입력 목록에서 체인을 비동기 호출합니다.
  • astream_log: 최종 응답 외에 중간 단계가 발생할 때 스트림백합니다.
  • astream_events: 체인에서 발생하는 베타 스트림 이벤트 (langchain-core 0.1.14에서 도입)

 

3) input type(입력 유형)과 output type(출력 유형)은 컴포넌트에 따라 다릅니다.

Component Input Type Output Type
Prompt 딕셔너리(Dictionary) PromptValue
ChatModel String(단일 문자열), 채팅 메시지 목록 또는 PromptValue ChatMessage
LLM String(단일 문자열), 채팅 메시지 목록 또는 PromptValue String
OuputParser LLM 또는 ChatModel의 출력 parser에 따라 다름
Retriever Stirng(단일 문자열) List of Documents
Tool tool에 따라 Stirng(단일 문자열) 또는 dictionary tool에 따라 다름

 

 

4) 모든 Runnable은 입력 및 출력 스키마를 노출하여 입력 및 출력을 검사합니다.

  • input_schema: 런너블의 구조에서 자동 생성된 입력 Pydantic 모델입니다.
  • output_schema: 런너블의 구조에서 자동 생성된 출력 Pydantic 모델입니다.