Agentic RAG는 LLM을 자율적인 에이전트로 활용하는 RAG 아키텍처입니다. 기존 RAG가 고정된 파이프라인을 따르는 반면, Agentic RAG에서는 에이전트가 상황을 판단하여 검색, 웹 검색, 계산, API 호출 등 여러 도구 중 적절한 것을 선택하고 실행합니다.
from typing import TypedDict, Annotated, Sequencefrom langchain_core.messages import BaseMessage, HumanMessage, SystemMessagefrom langgraph.graph import StateGraph, START, ENDfrom langgraph.graph.message import add_messagesfrom langgraph.prebuilt import ToolNode, tools_conditionclass AgentState(TypedDict): messages: Annotated[Sequence[BaseMessage], add_messages]# 도구가 바인딩된 LLMllm_with_tools = llm.bind_tools(tools)SYSTEM_PROMPT = ( "당신은 질문에 답변하는 AI 어시스턴트입니다.\n" "주어진 도구를 활용하여 정확한 정보를 수집한 뒤 답변하세요.\n" "- vector_search: 내부 문서에서 정보를 찾을 때 사용\n" "- web_search: 최신 정보나 내부 문서에 없는 정보가 필요할 때 사용\n" "- calculator: 수학 계산이 필요할 때 사용\n" "충분한 정보를 수집한 후에 답변하세요.")def agent(state: AgentState) -> AgentState: """에이전트가 도구 사용 여부를 판단하고 응답합니다.""" messages = [SystemMessage(content=SYSTEM_PROMPT)] + state["messages"] response = llm_with_tools.invoke(messages) return {"messages": [response]}# 그래프 구성workflow = StateGraph(AgentState)workflow.add_node("agent", agent)workflow.add_node("tools", ToolNode(tools))workflow.add_edge(START, "agent")workflow.add_conditional_edges("agent", tools_condition)workflow.add_edge("tools", "agent")app = workflow.compile()
tools_condition은 LangGraph가 제공하는 내장 함수로, 에이전트의 응답에 도구 호출이 포함되어 있으면 tools 노드로, 아니면 END로 라우팅합니다.
# 벡터 검색 활용result = app.invoke({ "messages": [HumanMessage(content="Self-RAG의 Reflection Token에 대해 설명해줘")]})# 웹 검색 활용result = app.invoke({ "messages": [HumanMessage(content="2024년 가장 주목받은 RAG 논문은?")]})# 복합 도구 활용result = app.invoke({ "messages": [HumanMessage(content="RAG 논문 수가 2023년 대비 2024년에 몇 배 증가했나?")]})# 마지막 메시지 출력print(result["messages"][-1].content)