랭 그래프를 이용한 스테이트 그래프와 챗봇 구현

스테이트 그래프 소개

이 비디오에서는 랭 그래프를 사용하여 스테이트 그래프를 만들고, 이를 바탕으로 기본적인 챗봇을 구현하는 방법을 설명합니다. 스테이트 그래프는 노드 간에 정의된 상태(state)를 기반으로 정보를 주고받는 그래프입니다.

스테이트란 무엇인가?

  • 노드: 그래프의 각 지점이며, 특정 함수를 실행합니다.
  • 엣지: 노드 간의 연결로, 정보 흐름을 정의합니다.
  • 스테이트: 노드 사이에서 전달되는 정보의 형태와 구조를 정의합니다.
    • 스테이트는 TypedDict를 사용하여 정의됩니다. 이 구조를 통해 데이터의 일관성을 유지할 수 있습니다.

스테이트 정의 및 TypedDict 사용

스테이트 정의 예시

비디오에서는 다음 두 가지 속성을 갖는 스테이트를 예시로 사용합니다.

  • counter (카운터): 숫자를 저장하며, 노드가 실행될 때마다 숫자가 증가합니다.
  • alphabet (알파벳): 문자열 리스트를 저장하며, 특정 문자열을 리스트 형태로 저장합니다.

TypedDict 사용법

  • typing 라이브러리의 TypedDict 모듈을 사용하여 스테이트의 구조를 정의합니다.
  • TypedDict를 상속하여 클래스 형태로 스테이트를 선언합니다.
  • 이렇게 정의된 스테이트는 딕셔너리 형태를 가지며, 각 키에 대한 타입이 지정되어 있습니다.

데이터 처리 및 메타데이터: Te와 오퍼레이터

Te란 무엇인가?

Te는 데이터를 감싸서 데이터에 메타데이터를 추가하는 데 사용됩니다. 데이터의 특성(type)을 지정하고, 데이터가 어떻게 처리되어야 하는지를 정의합니다.

오퍼레이터 예시

  • operator.add: 리스트에 새로운 문자열을 추가하는 데 사용됩니다.
  • add_message: 리스트에 새로운 메세지를 추가하는 데 사용됩니다.

예를 들어, 알파벳 리스트에 Te를 적용하면, 리스트에 새로운 문자열이 추가될 때 add 연산이 수행되도록 지정할 수 있습니다.

스테이트 그래프 생성 및 노드/엣지 연결

스테이트 그래프 생성

  • langgraph.graph.StateGraph를 사용하여 스테이트 그래프를 생성합니다.
  • 정의된 스테이트 틀을 넣어줍니다.

노드 생성

  • 노드는 함수 형태로 정의됩니다.
  • 노드 함수는 스테이트를 입력으로 받아 처리하고, 업데이트된 스테이트를 출력합니다.
  • 예시로 노드 A 함수는 카운터를 1 증가시키고, 알파벳 리스트에 “hello”를 추가합니다.

엣지 연결

  • add_edge를 사용하여 노드 사이의 연결을 정의합니다.
  • set_entry_point, set_finish_point를 사용하여 그래프의 시작점과 끝점을 지정합니다.

챗봇 구현

간단한 챗봇 예시

  • 스테이트 그래프를 사용하여 간단한 챗봇을 구현합니다.
  • 사용자 입력은 스테이트에 저장되고, LLM(Large Language Model)이 응답을 생성하여 스테이트를 업데이트합니다.
  • stream 함수를 사용하여 사용자 입력과 챗봇 응답을 실시간으로 표시합니다.

메시지 스테이트

  • 대화 내역을 저장하기 위해 MessageState를 사용합니다.
  • MessageState는 메시지 리스트를 자동으로 누적하는 기능을 제공합니다.
  • add_message와 같은 오퍼레이터를 사용하여 이전 대화 내역을 계속 저장할 수 있습니다.

사용자 정의 스테이트

  • 기존 MessageState를 확장하여 추가적인 속성을 정의할 수 있습니다.
  • 예를 들어, 카운터 속성을 추가하여 대화 횟수를 저장할 수 있습니다.

결론

이 비디오에서는 랭 그래프를 사용하여 스테이트 그래프를 만들고, 데이터의 흐름을 정의하는 방법을 설명했습니다. 특히, TypedDict를 사용하여 스테이트의 구조를 명확히 하고, Te와 오퍼레이터를 사용하여 데이터 처리 방식을 정의하는 방법을 익혔습니다. 이러한 개념을 바탕으로 간단한 챗봇을 구현하고 대화 기록을 유지하는 방법도 알아보았습니다.