Search

16. LangGraph로 구현하는 사내 QnA 봇

섹션
5. Agent: 사내 QnA 봇

LangGraph로 구현하는 사내 Q&A 봇

LangGraph 개념 복습

핵심 개념

State: 관리해야 할 변수들
Node: 작업 단위
Edge: 작업 순서

Q&A 봇 작업 흐름 설계

작업 순서

사용자 질문 입력
FAQ 확인: 자주 묻는 질문인지 체크
조건 분기:
FAQ인 경우: 즉시 답변 생성
FAQ가 아닌 경우: 문서명 추출 → 문서 검색 → 답변 생성

FAQ 우선 처리 이유

빠른 응답: 다른 문서 검색 없이 즉시 답변
효율성: 자주 묻는 질문에 대한 최적화

환경 설정 및 초기화

환경변수 로드

OpenAI API Key: LLM 모델 사용
Pinecone API Key: 벡터 스토어 접근

모델 선언

Large LLM: GPT-4o (고품질 작업용)
Small LLM: GPT-4o-mini (간단한 작업용)
Embedding Model: 벡터 검색용

Pinecone Vector Store 설정

Retriever 선언: AsRetriever 메소드 활용
테스트 실행: invoke 메소드로 동작 확인

State 정의

AgentState 구조

class AgentState(TypedDict): question: str # 사용자 질문 answer: str # AI 생성 답변 context: List[Document] # 검색된 문서들 document_name: str # 선택된 문서명 is_in_faq: str # FAQ 여부 (Yes/No)
Python
복사

StateGraph 선언

상태 기반 그래프: AgentState를 사용하는 그래프
컴파일 대기: 나중에 실행 가능한 워크플로우로 변환

노드 구현

CheckFAQ 노드

기능

FAQ 문서 필터링: "Employee Benefits and Welfare FAQ" 파일만 검색
LLM 판단: 질문이 FAQ에 있는지 확인
Boolean 결과: Yes/No 문자열로 반환

구현 세부사항

함수 형태: 노드는 함수로 구현
상태 입력: 함수 인수로 state 받기
필터 적용: metadata 파일명으로 문서 필터링
출력 파서: StringOutputParser 사용

GetDocumentName 노드

기능

문서명 추출: 사용자 질문에 적합한 문서 결정
예시 기반 프롬프트: 여러 예시로 LLM 성능 향상
Small LLM 활용: 간단한 작업으로 비용 절약

RetrieveDocs 노드

기능

문서 검색: 지정된 문서명으로 필터링하여 검색
컨텍스트 구성: 관련 문서들을 context에 저장

GenerateAnswer 노드

기능

최종 답변 생성: 수집된 문서를 바탕으로 답변 작성
프롬프트 기반: 질문과 컨텍스트를 활용한 답변

그래프 구축

노드 추가

add_node 메소드: 4개 노드 모두 추가
START/END: 시작과 종료 지점 설정

Edge 설정

일반 Edge

순차 연결: GetDocumentName → RetrieveDocs → GenerateAnswer

Conditional Edge

조건부 분기: CheckFAQ 결과에 따른 분기
check_if_in_faq 함수: FAQ 여부 확인하여 다음 노드 결정
Yes: GenerateAnswer로 직행
No: GetDocumentName으로 이동

그래프 시각화

실선: 일반 edge
점선: conditional edge
흐름 확인: 설계한 대로 연결되었는지 검증

테스트 실행

FAQ가 아닌 경우

질문: "네트워크 담당자는 누구인가?"
경로: CheckFAQ → GetDocumentName → RetrieveDocs → GenerateAnswer
결과: 정확한 답변 생성

FAQ인 경우

FAQ 질문 테스트
경로: CheckFAQ → GenerateAnswer (직행)
결과: 빠른 답변 생성

상태 관리 특징

자동 업데이트

리턴 키만 업데이트: 노드에서 반환한 키만 자동 갱신
입력 상태 복사 불필요: 전체 상태 복사할 필요 없음
효율적 처리: 필요한 부분만 업데이트

유연한 처리

컨텍스트 오버라이드: 후속 노드에서 컨텍스트 재설정 가능
토큰 효율성: 사용하지 않는 컨텍스트는 토큰 소비 없음