LangChain은 처음부터 완성된 프레임워크로 설계된 것이 아니라,
에서 출발했습니다.
👉 그 결과:
그래서 하위 호환을 유지한 채 점진 개선이 아니라
👉 큰 단위의 구조 재설계를 반복하게 되었습니다.
📌 문제:
대대적인 분리 시작:
| 패키지 | 역할 |
|---|---|
langchain-core | 인터페이스, 추상 타입 |
langchain-community | 외부 연동 구현체 |
langchain-openai | OpenAI 전용 |
langchain-text-splitters | Text Split 전용 |
📌 이 시점부터
하지만 이건 의도된 변화입니다.
LangChain 팀은 깨달았습니다.
“사용자가 진짜 의존해야 할 것은 구현체가 아니라 인터페이스다”
그래서:
🎯 langchain_core 중심 구조로 이동
같은 표준 인터페이스를 고정하고, 구현체(OpenAI, HF, FAISS 등)는 바깥으로 이동
📌 이 과정에서:
이 발생할 수밖에 없음
LangChain Expression Language (LCEL)
이건 사실상 프레임워크 재창조 수준입니다.
기존
llm = ChatOpenAI()
chain = LLMChain(llm=llm, prompt=prompt)
변경
chain = prompt | llm | output_parser
📌 이 변화로 인해:
👉 구조 변경은 필연적이었습니다.
LangChain은 다음을 모두 동시에 처리해야 했습니다.
📌 안정적인 단일 구조로는 감당 불가
→ 모듈화 + 빈번한 구조 조정
다른 프레임워크와 비교하면 명확합니다.
| 프레임워크 | 성격 |
|---|---|
| PyTorch | 코어가 매우 안정적 |
| Transformers | 모델 중심 |
| LangChain | 워크플로우 실험 프레임워크 |
👉 “사용 패턴” 자체가 아직 고정되지 않은 영역
→ 구조가 고정되기 어려움
# embedding/base.py
class Embedder(Protocol):
def embed_query(self, text: str) -> List[float]: ...
→ LangChain 변경 시 영향 최소화
공식 문서 예제는 버전 종속적 → 그대로 복사 = 위험
LangChain의 잦은 패키지 구조 변경은 미성숙해서가 아니라,LLM 워크플로우라는 ‘아직 정의되지 않은 영역’을 프레임워크화하는 과정에서 발생한 필연적인 재설계의 결과다.