본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] LangChain vs LlamaIndex 차이 분석 : 복잡한 에이전트 설계 해결을 위한 2가지 프레임워크 선택 방법

by Papa Martino V 2026. 4. 25.
728x90

LangChain vs LlamaIndex
LangChain vs LlamaIndex

 

생성형 AI 어플리케이션 개발의 양대 산맥인 LangChainLlamaIndex. 초기에는 두 프레임워크의 역할이 명확히 구분되었으나, 최근 업데이트를 통해 기능이 겹치면서 많은 개발자들이 에이전트 워크플로우 설계 시 혼란을 겪고 있습니다. 본 포스팅에서는 '데이터 연결'과 '실행 체인'이라는 본질적인 관점에서 두 도구의 차이를 명확히 하고, 복잡한 실무 에이전트를 구축할 때의 구체적인 방법 7가지를 제시합니다.


1. 에이전트 설계 관점에서의 프레임워크 본질적 차이

LangChain은 '행동(Action)' 중심입니다. 다양한 도구를 연결하고 순차적 혹은 자율적으로 로직을 실행하는 데 최적화되어 있습니다. 반면 LlamaIndex는 '데이터(Data)' 중심입니다. 방대한 문서를 구조화하고, 에이전트가 가장 적절한 정보를 '가져오는(Retrieval)' 능력에 초점이 맞춰져 있습니다. 복잡한 워크플로우를 설계할 때는 이 두 가지의 밸런스를 어떻게 맞추느냐가 성공의 핵심입니다.

2. LangChain과 LlamaIndex의 상세 비교 분석

복잡한 에이전트 시스템을 구축하기 전, 인프라와 로직의 특성에 따라 아래 비교표를 참고하여 전략을 세워야 합니다.

비교 항목 LangChain (LangGraph 중심) LlamaIndex (Workflows 중심)
핵심 아키텍처 Directed Acyclic Graphs (DAGs) / Cyclic Graphs Event-driven / Hierarchical Data Indexing
상태 관리(State) 정교한 State 공유 및 체크포인트 지원 쿼리 엔진 기반의 암묵적 상태 관리
커스터마이징 매우 높음 (모든 단계를 제어 가능) 중간 (추상화된 데이터 쿼리 최적화)
에이전트 복잡도 순환 로직 및 인간 개입(Human-in-the-loop)에 유리 다단계 추론 및 복잡한 RAG 파이프라인에 유리
추천 해결 시나리오 자율적인 추론과 외부 도구 사용이 잦을 때 데이터 소스가 다양하고 검색 품질이 중요할 때

3. 실전 에이전트 워크플로우 구축을 위한 7가지 파이썬 구현 예제

현업에서 직면하는 복잡한 에이전트 설계 문제를 해결하기 위한 실무 중심의 코드 예제입니다.

Example 1: LangGraph를 이용한 상태 유지형(Stateful) 에이전트 구조 정의

LangChain의 최신 확장인 LangGraph를 사용하여 에이전트가 이전 대화와 상태를 기억하며 순환하는 로직을 구축합니다.

from typing import TypedDict, Annotated, Sequence
from langgraph.graph import StateGraph, END

# 1. 에이전트 상태 정의
class AgentState(TypedDict):
    messages: Annotated[Sequence[str], "대화 내역"]
    next_step: str

# 2. 노드 정의 (실행 로직)
def call_model(state: AgentState):
    # LLM 로직 호출
    return {"messages": ["모델의 응답"], "next_step": "tools"}

# 3. 그래프 구성
workflow = StateGraph(AgentState)
workflow.add_node("agent", call_model)
workflow.set_entry_point("agent")
workflow.add_edge("agent", END)

app = workflow.compile()
        

Example 2: LlamaIndex의 ReAct 에이전트와 도구 연동

데이터 검색 능력이 뛰어난 LlamaIndex 에이전트에 실시간 도구를 연결하는 방법입니다.

from llama_index.core.agent import ReActAgent
from llama_index.core.tools import FunctionTool

def get_stock_price(ticker: str) -> str:
    # 실시간 주가 조회 로직
    return f"{ticker}의 현재가는 150달러입니다."

stock_tool = FunctionTool.from_defaults(fn=get_stock_price)

# LlamaIndex의 강력한 쿼리 엔진과 연동 가능
agent = ReActAgent.from_tools([stock_tool], llm=llm, verbose=True)
response = agent.chat("애플 주가 알려줘.")
        

Example 3: 복잡한 DAG 해결을 위한 LangChain 조건부 분기(Conditional Edge)

def should_continue(state: AgentState):
    if "검색 필요" in state["messages"][-1]:
        return "search_tool"
    return END

workflow.add_conditional_edges(
    "agent",
    should_continue,
    {"search_tool": "search_node", END: END}
)
        

Example 4: LlamaIndex의 Sub-Question Query Engine을 활용한 분할 정복

복잡한 질문을 여러 하위 질문으로 나누어 병렬 처리하는 에이전트 워크플로우 해결법입니다.

from llama_index.core.query_engine import SubQuestionQueryEngine

# 하위 쿼리 엔진 구성 (각 문서별 특화 가능)
query_engine = SubQuestionQueryEngine.from_defaults(
    query_engine_tools=query_engine_tools,
    use_async=True
)
response = query_engine.query("A사와 B사의 2023년 영업이익 차이를 비교해줘.")
        

Example 5: LangChain의 Human-in-the-loop (승인 프로세스) 구현

# LangGraph의 interrupt 기능을 활용하여 사용자 승인 단계 추가
# 민감한 API 호출 전 실행을 멈추고 대기하는 실무적 해결책
app = workflow.compile(interrupt_before=["execute_transaction"])
        

Example 6: LlamaIndex 워크플로우(Event-driven) 시스템 설계

최신 LlamaIndex Workflows를 사용하여 이벤트 기반의 비동기 에이전트를 구축합니다.

from llama_index.core.workflow import Workflow, step, Event

class ExtractionEvent(Event):
    data: str

class MyWorkflow(Workflow):
    @step
    async def extract(self, ev: Event) -> ExtractionEvent:
        # 데이터 추출 이벤트 발생
        return ExtractionEvent(data="추출된 정보")

    @step
    async def refine(self, ev: ExtractionEvent) -> Event:
        # 추출된 정보를 바탕으로 최종 가공
        return Event()
        

Example 7: 두 프레임워크의 하이브리드 운영 (Best Practice)

현업에서 가장 권장되는 방식으로, 로직 제어는 LangGraph로 하고 데이터 검색은 LlamaIndex를 도구로 사용하는 방법입니다.

# LlamaIndex 쿼리 엔진을 LangChain 툴로 변환
from langchain.agents import Tool

llama_index_tool = Tool(
    name="Financial_DB",
    func=lambda q: str(query_engine.query(q)),
    description="재무제표 검색 전문 도구"
)

# 이제 이 툴을 LangChain 에이전트의 tools 리스트에 포함
        

4. 복잡한 에이전트 구축 시 마주하는 병목 해결 전략

  • 상태 일관성(State Consistency): 에이전트가 경로를 이탈할 경우를 대비해 LangGraph의 Persistence(체크포인트) 기능을 사용하여 에러 발생 시점에서 재시작할 수 있도록 설계하세요.
  • 토큰 비용 최적화: 무분별한 Loop를 방지하기 위해 Max Iteration 제한을 반드시 설정하고, LlamaIndex의 Metadata Filtering을 통해 불필요한 검색을 차단하세요.
  • 지연 시간(Latency) 해결: 병렬 처리가 가능한 작업은 LlamaIndex의 use_async=True 혹은 LangGraph의 병렬 노드를 활용하여 응답 속도를 2배 이상 개선할 수 있습니다.

5. 결론: 어떤 프레임워크를 선택해야 하는가?

결론적으로, 여러분의 프로젝트가 "모델의 지능적인 도구 활용과 복잡한 로직 흐름"이 핵심이라면 LangChain(LangGraph)이 압도적으로 유리합니다. 반면, "대규모 지식 베이스로부터의 정교한 데이터 추출과 추론"이 중심이라면 LlamaIndex가 정답입니다. 최근의 트렌드는 로직의 유연성을 위해 LangGraph를 뼈대로 삼고, 강력한 검색 엔진으로 LlamaIndex를 임포트하여 사용하는 하이브리드 방식이 가장 견고한 해결책으로 자리 잡고 있습니다.


참고 문헌 및 내용 출처

  • LangChain Official Documentation 
  • LlamaIndex Official Documentation 
  • Chase, H. (2024). "Agentic Workflows: Beyond simple chains." NeurIPS Workshop.
  • Liu, J. (2023). "Data-Centric AI with LlamaIndex." KDD Tutorials.
728x90