목차
1. 정리 배경
2. LangGraph의 탄생 배경
3. 상태(State)
4. Node와 Edge
5. 결론
1. 정리 배경
훗날 멀티에이전트를 잘 구축하기 위해 LangGraph라는 프레임워크에 대한 학습이 필요했음.
해당 게시물은 테디노트님의 유료 강의를 듣고 내가 이해하기 편하게 정리한 게시물.
글이 부족하다고 생각하신다면 유료 강의 구매하여 들으시면 됩니다.
2. LangGraph의 탄생 배경
1) RAG 기능에 대한 한계 => 단방향의 파이프라인의 태생적인 한계
- LLM이 생성한 답변이 Hallucination이 아닐까?
- RAG를 사용한다고 해서 Hallucination이 100% 없어지는 것은 아니다.
- RAG를 적용하여 받은 답변이 문서에는 없는 "사전지식"으로 답변한 건 아닐까?
- Retriever가 적절한 정보를 참고 시키지 못해 사전지식으로 임의의 답변을 한다면 자연스럽게 Hallucination이 발생한다.
- 문서 검색에서 원하는 내용이 없으면 적절한 답변이 가능할까?
- 물론 다음과 같은 경우에는 웹서칭이나 논문검색을 통해 추가적으로 지식을 보강하는 경우가 있을 수 있다.
- 오류가 발생할 때 마다 LangChain의 Chain을 걸어 해결하려고 하면 프로세스가 비대해진다.
=> 사전에 정의된 데이터나 처리 방식을 활용해 적절히 결과를 도출하지 못하면 Hallucination이 증가 하고, 프로그램이 무거워질 수 있다는 것을 의미한다.
=> 자연스럽게 동작시간이나 토큰 사용량 증가로 이어질 수 있다.
2) LangGraph의 특징을 바탕으로 한 문제 해결 => 그래프 형식
- 노드, 엣지, 조건부 엣지를 통해 유연하게 서비스를 구성
- Node(파이썬 함수, LangChain 문법을 사용하지 않아도 됨)
- Edge(노드를 연결하는 선)
- State
- 노드들은 서로 독립적임. 따라서 통신 수단이 필요
- State가 통신 수단으로 동작하는 것
- 순환(Cycle) 연산 기능이 존재
- Conditional Edge: 조건을 바탕으로 전체 그래프의 흐름 제어
- Human-in-the-loop: 필요시, 특정 노드에 도착하면 사람이 직접 개입할 수 있음
- Checkpointer: 과거 실행 과정에 대한 "수정"&"리플레이"기능
3. 상태(State)
역할 => 노드와 노드간 정보 전달의 매개체, 상태 객체에 담아 정보를 전달
사용 방법 => Class와 TypedDict를 사용
- TypedDict: 일반 파이썬 Dict에 타입힌팅을 추가한 개념
- RAG를 기준으로 한 상태 변화
- 1번 노드가 Question 생성, 2번 노드가 문서 Retrieve, 3번 노드가 Answer 반환, 4번 노드가 Evalution을 담당한다고 가정하자
- 각각의 Node는 순서대로 동작하고, State Class를 이용해, 각각 question, context, answer, score에 정보를 전달한다.
- 4번 노드에서 나온 결과를 바탕으로 좋지 못한 결과가 나오면 잘못 결과가 나온 노드로 이동해 작업을 재진행 시킬 수 있다.
4. Node와 Edge
- 노드 (Node)
- 파이썬 함수로 정의
- 세세하게 Node를 정의해서 사용할 수 록 작업에 유리 하다.
- 함수의 입력도 상태(GrapeState), 출력도 상태(GraphState)가 되도록 정의해야 한다.
- 노드 이름은 최대한 영어로 작성한다.(한글도 되지만 잘 안될 때가 있음)
- 조건부 엣지(Conditional Edge)
- 노드에 조건부 엣지를 추가하여 조건에 따른 분기를 수행
- add_conditional_edges('노드이름', 조건부 판단 함수, dict로 다음 단계 결정)
-
시작점을 잘 설정해야 한다.
-
체크포인터
- 노드간 실행결과를 추적
- 일종의 메모리로 뒤로 되돌리기와 같은 작업을 수행할 수 있음
- 가능하면 최대한 시각화하여 결과를 확인해 보는 것이 중요하다.
5. 결론
우리가 LangGraph를 하게 된다면 해야하는 것 => Flow Engineering
개념은 이해하고 있으니, 직접 코드를 돌려며보면서 어떻게 동작하고, 어느 부분에서 에러가 자주 발생하는지 판단하는 것이 필요(내가 작업할 때).
LangGraph에서 자주 사용하는 파이썬 문법에 추가적으로 익숙해질 필요가 있음