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 (직행)
•
결과: 빠른 답변 생성
상태 관리 특징
자동 업데이트
•
리턴 키만 업데이트: 노드에서 반환한 키만 자동 갱신
•
입력 상태 복사 불필요: 전체 상태 복사할 필요 없음
•
효율적 처리: 필요한 부분만 업데이트
유연한 처리
•
컨텍스트 오버라이드: 후속 노드에서 컨텍스트 재설정 가능
•
토큰 효율성: 사용하지 않는 컨텍스트는 토큰 소비 없음