패키지 변화가 큰 프레임워크 - LangChain

Mujung Kim·2025년 12월 17일

LLM + RAG 시스템

목록 보기
6/11

1. “프로토타입 → 플랫폼”으로 진화 중인 프레임워크

LangChain은 처음부터 완성된 프레임워크로 설계된 것이 아니라,

  • LLM 활용 패턴을 빠르게 실험하기 위한 실험적 도구
  • 커뮤니티 주도 빠른 기능 추가

에서 출발했습니다.

👉 그 결과:

  • 초반에는 “일단 되는 코드” 위주
  • 설계 일관성보다 속도와 확장성이 우선
  • 사용자가 늘면서 구조적 한계가 드러남

그래서 하위 호환을 유지한 채 점진 개선이 아니라
👉 큰 단위의 구조 재설계를 반복하게 되었습니다.


2. 핵심 이유 ①: “책임 분리(Separation of Concerns)” 재정의

초기 (v0.0.x ~ v0.0.2x)**

  • langchain 하나에 모든 것이 들어 있음
    • LLM
    • Embedding
    • VectorStore
    • Loader
    • Tool
    • Agent

📌 문제:

  • 의존성 폭발
  • 패키지 크기 과대
  • 선택하지 않은 기능까지 강제 설치

중기 (v0.0.3x ~ v0.1.x)

대대적인 분리 시작:

패키지역할
langchain-core인터페이스, 추상 타입
langchain-community외부 연동 구현체
langchain-openaiOpenAI 전용
langchain-text-splittersText Split 전용

📌 이 시점부터

  • import 경로가 자주 깨짐
  • 예제 코드가 버전마다 달라짐

하지만 이건 의도된 변화입니다.


3. 핵심 이유 ②: “인터페이스 안정성” 확보 시도

LangChain 팀은 깨달았습니다.

“사용자가 진짜 의존해야 할 것은 구현체가 아니라 인터페이스다”

그래서:

🎯 langchain_core 중심 구조로 이동

  • Document
  • Runnable
  • BaseChatModel
  • Embeddings
  • Retriever

같은 표준 인터페이스를 고정하고, 구현체(OpenAI, HF, FAISS 등)는 바깥으로 이동

📌 이 과정에서:

  • 기존 import 경로 변경
  • class 위치 이동
  • 일부 API 제거(deprecation)

이 발생할 수밖에 없음


4. 핵심 이유 ③: Runnable / LCEL 도입

LangChain Expression Language (LCEL)
이건 사실상 프레임워크 재창조 수준입니다.

기존

llm = ChatOpenAI()
chain = LLMChain(llm=llm, prompt=prompt)

변경

chain = prompt | llm | output_parser

📌 이 변화로 인해:

  • Chain 중심 → 데이터 흐름 중심
  • Agent, Chain, Tool 개념 재정의
  • 많은 기존 클래스가 deprecated

👉 구조 변경은 필연적이었습니다.


5. 핵심 이유 ④: 생태계 폭발 속도

LangChain은 다음을 모두 동시에 처리해야 했습니다.

  • OpenAI / Azure / Anthropic / HF
  • 수십 개 Vector DB
  • RAG 패턴의 급격한 진화
  • Agent / Tool / Function Calling
  • Streaming / Async / Batch

📌 안정적인 단일 구조로는 감당 불가
→ 모듈화 + 빈번한 구조 조정


6. 왜 “특히” LangChain이 심해 보이는가?

다른 프레임워크와 비교하면 명확합니다.

프레임워크성격
PyTorch코어가 매우 안정적
Transformers모델 중심
LangChain워크플로우 실험 프레임워크

👉 “사용 패턴” 자체가 아직 고정되지 않은 영역
→ 구조가 고정되기 어려움

7. 실무 관점에서의 대응 전략 (중요)

✅ 1) import를 직접 쓰지 말고 “래퍼 계층”을 둬라

# embedding/base.py
class Embedder(Protocol):
    def embed_query(self, text: str) -> List[float]: ...

→ LangChain 변경 시 영향 최소화

✅ 2) langchain_core만 직접 의존

  • Document
  • Runnable
  • 인터페이스 타입
    구현체는 모두 캡슐화

✅ 3) 예제 코드는 “참고용”으로만

공식 문서 예제는 버전 종속적 → 그대로 복사 = 위험

8. 한 문장 요약

LangChain의 잦은 패키지 구조 변경은 미성숙해서가 아니라,LLM 워크플로우라는 ‘아직 정의되지 않은 영역’을 프레임워크화하는 과정에서 발생한 필연적인 재설계의 결과다.

profile
천천히 고민하면서 걷는 개발자

0개의 댓글