lanchain - agent concept

HanJu Han·2025년 11월 11일

1. LangGraph: Agent를 위한 '순서도'

텍스트에서 "create_agent는 LangGraph를 사용하여 그래프 기반 에이전트 런타임을 구축합니다"라는 부분이 핵심입니다.

  • 기존 Agent (AgentExecutor): 정해진 하나의 '순환 고리(loop)' 안에서만 작동했습니다. 유연성이 조금 부족했습니다.
  • 최신 Agent (LangGraph): 우리가 직접 순서도를 짜듯이 Agent의 작동 방식을 설계할 수 있게 해줍니다. (예: "A 도구 실행 후, 결과가 'Yes'이면 B로 가고, 'No'이면 C로 가라"처럼 복잡한 로직 구현 가능)

2. 이미지(그래프) 단계별 상세 분석

이제 "오늘 서울 날씨는 어떻고, LangChain이 뭔지 검색해 줘"라는 예시를 이 순서도에 대입해 보겠습니다.

input (입력)

  • 설명: 모든 작업의 시작점입니다. 사용자의 요청이 처음 들어오는 노드(Node)입니다.
  • 예시: "오늘 서울 날씨는 어떻고, LangChain이 뭔지 검색해 줘"라는 텍스트가 input으로 들어옵니다.

model (모델 / 두뇌)

  • 설명: input을 받은 **LLM(두뇌)**입니다. 이곳은 Agent의 중앙 결정 센터입니다. 다이아몬드 모양인 이유는 '결정' 또는 '분기'가 일어나는 지점이기 때문입니다.
  • LLM은 현재까지의 정보(처음에는 input, 나중에는 observation)를 바탕으로 다음 중 하나를 결정합니다.
    1. 작업 완료: "모든 정보를 찾았으니, 최종 답변을 만들자!"
    2. 도구 필요: "아직 정보가 부족해. 도구를 써야겠다!"
  • 예시 (1번째 순환):
    • LLM이 input을 봅니다: "서울 날씨와 LangChain 검색, 두 가지가 필요하군. 일단 날씨부터!"
    • 결정: 도구 필요!
    • 결과: action 경로로 분기합니다.

action (행동)

  • 설명: model이 "도구를 써야겠다!"라고 결정했을 때, 어떤 도구를 어떻게 호출할지에 대한 구체적인 '명령'입니다.
  • 예시 (1번째 순환):
    • modelget_weather 도구가 필요하다고 판단했습니다.
    • action 내용: "get_weather 함수를 location='서울' 매개변수와 함께 실행하라."

tools (도구)

  • 설명: action에서 내려온 명령을 실제로 실행하는 노드입니다. get_weathersearch_google 같은 실제 파이썬 함수들이 대기하고 있는 곳입니다.
  • 예시 (1번째 순환):
    • get_weather(location="서울") 함수가 실제로 호출됩니다.
    • 실행 결과: "서울의 날씨는 맑고 25도입니다."라는 문자열을 반환합니다.

observation (관찰)

  • 설명: tools 노드에서 실행된 결과값입니다. Agent 입장에서는 도구를 사용해 '관찰'한 사실입니다.
  • 예시 (1번째 순환):
    • observation 내용: "서울의 날씨는 맑고 25도입니다."

observationmodel (피드백)

  • 설명: 이것이 바로 '순환 고리(loop)'의 핵심입니다. 도구 사용 결과(Observation)가 다시 model에게 전달됩니다.

  • 예시 (2번째 순환 시작):

    • modelobservation을 전달받습니다.

    • LLM의 생각: "좋아, '서울 날씨는 맑고 25도'라는 정보는 얻었어. 이제 input에서 요청한 두 번째 일, 'LangChain 검색'을 해야지."

    • 결정: 도구 또 필요!

    • 결과: 다시 action 경로로 분기합니다.

    • action (2번째): "search_google 함수를 query='LangChain' 매개변수와 함께 실행하라."

    • tools (2번째): search_google(query="LangChain") 함수 실행.

    • observation (2번째): "LangChain은 LLM을... 프레임워크입니다."

observationmodel (마지막 피드백)

  • 설명: 2번째 도구 사용 결과가 다시 model로 돌아갑니다.
  • 예시 (3번째 순환 시작):
    • model이 2번째 observation을 전달받습니다.
    • LLM의 생각: "이제 '서울 날씨' 정보도 있고, 'LangChain 검색' 결과도 있군. input에서 요청한 모든 작업을 완료했어. 이 두 가지를 조합해서 최종 답변을 만들자."
    • 결정: 작업 완료!
    • 결과: finish 경로로 분기합니다.

finish (종료) → output (출력)

  • 설명: model이 모든 작업이 끝났다고 판단하면, Agent는 순환을 멈추고(finish) 최종 결과를 output 노드로 보냅니다.
  • 예시 (최종):
    • model이 생성한 최종 답변: "오늘 서울의 날씨는 맑고 25도입니다. 그리고 LangChain은 LLM을 기반으로 강력한 애플리케이션을 구축하기 위한 프레임워크입니다."
    • 이 답변이 output으로 사용자에게 전달됩니다.

3. create_agent의 역할 (코드와의 연결)

이전 예제 코드를 다시 보겠습니다.

# ... (LLM, Tools 정의) ...

# 5. Agent가 사용할 프롬프트 가져오기
prompt = hub.pull("hwchase17/react")

# 6. Agent 생성 (★바로 여기가 핵심★)
agent = create_agent(llm, tools, prompt)

# 7. Agent 실행기(AgentExecutor) 생성
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

여기서 create_agent(...) 함수는, 우리가 직접 순서도를 그리지 않아도, 제공된 이미지와 똑같은 구조의 LangGraph 순서도를 내부적으로 뚝딱 만들어주는 편리한 함수입니다.

AgentExecutor(...)는 이 순서도(그래프)를 실제로 '실행'시켜주는 엔진 역할을 합니다. invoke를 호출하면, 이 엔진이 input부터 시작해서 model, tools 노드 사이를 순환하다가 finish 신호가 오면 output을 뱉어내는 것입니다.

요약

제공해주신 이미지는 **Agent가 작동하는 '지도' 또는 '순서도'**입니다.

  1. **input**으로 시작합니다.
  2. **model**이 다음 할 일을 결정합니다.
  3. 할 일이 남았으면 actiontoolsobservation 순서로 도구를 사용합니다.
  4. 도구 결과(observation)는 다시 **model**로 돌아가 다음 결정을 돕습니다.
  5. 이 과정(2~4)을 반복하다가,
  6. model이 일이 끝났다고 판단하면 finish → **output**으로 최종 답변을 반환합니다.

이 전체 구조를 LangChain에서는 LangGraph라고 부르며, create_agent는 이 표준 그래프를 쉽게 만들 수 있도록 도와주는 기능입니다.

profile
시리즈를 기반으로 작성하였습니다.

0개의 댓글