메뉴 닫기

LangChain · FAISS · CrewAI로 만든 문서 기반 AI 챗봇 구축기

LangChain FAISS CrewAI PDF AI 챗봇
LangChain FAISS CrewAI PDF AI 챗봇

 

 

목차

  1. 개요

  2. 시스템 아키텍처 개요

  3. LangChain과 FAISS의 필요성

  4. PDF → 벡터화 핵심 코드

  5. 키워드 검색 vs 벡터 검색

  6. GPT 응답 구조 설계

  7. CrewAI로 복합 질문 대응

  8. Streamlit 기반 챗봇 UI

  9. 디렉터리 구조 예시

  10. 벤치마크 결과

  11. 참고 링크

 

 

1. 개요

PDF 문서 기반으로 질문에 응답하는 AI 챗봇을 LangChain, FAISS, CrewAI를 활용해 구축했습니다.
보안 매뉴얼, 기술 설명서처럼 길고 복잡한 문서에서 원하는 정보를 빠르게 찾고, GPT가 해당 내용을 바탕으로 답변하는 구조입니다.
검색 속도와 정확도를 모두 확보하면서도, Streamlit UI를 통해 실사용 가능한 인터페이스를 구성하였습니다.

 

2. 시스템 아키텍처 개요

전체 시스템은 RAG(Retrieval-Augmented Generation) 방식으로 구성되어 있습니다.

RAG(Retrieval-Augmented Generation)란?
 대형 언어 모델(LLM)이 질문에 답할 때, 외부 문서나 데이터에서 관련 정보를 먼저 검색하고, 그 결과를 기반으로 응답을 생성하는 방식입니다.

LLM의 한계인 최신 정보 부족이나 지식 오류 문제를 보완할 수 있으며, GPT가 문서 내용을 인용하거나 근거 기반 답변을 생성할 수 있게 만들어줍니다.

주로 LangChain, FAISS 같은 도구와 함께 사용되어 검색 시스템에 활용됩니다.

 

LangChain FAISS CrewAI PDF AI 챗봇 구성 흐름

  1. PDF 문서에서 텍스트 추출

  2. LangChain으로 텍스트 분할 & OpenAI Embedding을 통해 벡터화

  3. FAISS를 이용해 벡터 인덱스 저장

  4. 사용자 질문 입력

  5. FAISS에서 관련 문단 검색

  6. GPT가 문서를 기반으로 응답 생성

  7. Streamlit으로 결과 출력

 

3. LangChain과 FAISS의 필요성

LangChain의 역할

LangChain은 문서를 분할하고, 임베딩하고, 검색하고, LLM으로 응답을 생성하는 전체 흐름을 체인 형태로 연결합니다.
PDF나 다양한 포맷의 문서를 처리하기 위한 텍스트 처리와 검색 파이프라인 구성이 용이합니다.

 

FAISS의 역할

FAISS는 Facebook AI에서 개발한 벡터 검색 라이브러리입니다.
수천 개의 문장 중에서 질문과 의미상 가까운 문단을 빠르게 찾을 수 있어, 문서 기반 GPT 응답의 정확도를 크게 향상시킵니다.

 

 

4. PDF → 벡터화 핵심 코드

LangChain과 FAISS를 활용한 문서 전처리 및 벡터 저장 과정입니다.

langchain pdf 일부 사용 코드
[사진]langchain pdf 일부 사용 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import fitz
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import OpenAIEmbeddings
 
doc = fitz.open(“manual.pdf”)
text = “”.join(page.get_text() for page in doc)
 
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=150)
chunks = splitter.split_text(text)
 
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_texts(chunks, embeddings)
vectorstore.save_local(“faiss_db”)
cs
  • chunk_size=1000, chunk_overlap=150 설정이 기술 문서에 적합했습니다.

  • 지나치게 작게 나누면 문맥이 손실되고, 너무 크게 나누면 검색 정확도가 떨어질 수 있어 다음과 같이 설정하였습니다.

 

※ 이 예제에서는 OpenAI의 ChatGPT API를 사용하므로,OPENAI_API_KEY가 환경 변수 또는 설정 파일에 등록되어 있어야 합니다.

 

5. 키워드 검색 vs 벡터 검색

항목 기존 수동 검색 (직접 탐색) FAISS 벡터 검색
기준 단어 일치 의미 유사도
표현 다양성 대응 낮음 높음
누락 가능성 높음 낮음
검색 속도 빠름 (단순) 빠름 (의미 기반)
예시 “방화벽 설정”만 탐색 “보안 정책 구성” 포함 가능

 

6. GPT 응답 구조 설계

GPT가 정확한 답변을 하기 위해 다음과 같은 처리 구조를 설계했습니다.

  1. 사용자 질문을 입력

  2. FAISS로 관련 문단 Top-N 검색

  3. ChatGPT에 전달할 프롬프트에 문단 포함

  4. “문서 기준으로만 응답하라”는 조건 삽입

  5. 문단이 없을 경우 fallback (키워드 검색 또는 GPT 자체 응답)

GPT 응답 생성을 위해 OpenAI의 GPT-4.o 모델 API를 사용했습니다. 

모델 호출 시에는 문서에서 검색된 문단과 함께 사용자 질문을 프롬프트로 구성해 전달합니다

 

7. CrewAI로 복합 질문 대응

단일 GPT 모델은 복잡한 질문에서 맥락을 놓치는 경우가 있었습니다.
CrewAI를 도입해 역할 기반 Agent 구조로 전환했습니다.

예시 질문

“탐지 정책을 설정하고, 외부 접속도 차단할 수 있나요?”

[사진] LangChain · FAISS · CrewAI Agent + ChatGPT 4o API 사용한 답변
[사진] LangChain · FAISS · CrewAI Agent + ChatGPT 4o API 사용한 답변
[사진] ChatGPT 4o 사용한 답변
[사진] ChatGPT 4o 사용한 답변

ChatGPT 일부 조건 누락 및 외부 접속 차단에서 잘못된 결과 값을 도출하였지만, 

Langchain + FAISS + Crew AI Agent  + ChatGPT를 통해  사용자의 질문에  정확하고 완벽한 답을 도출 할 수 있었습니다.

 

구조 결과
단일 GPT 일부 조건 누락, 불완전한 응답
CrewAI 설정 + 조건 + 적용 방식까지 모두 포함된 응답

 

Crew AI Agent 구성

  • 탐색 에이전트: 문서에서 관련 문단 검색

  • 분석 에이전트: 핵심 정보 추출

  • 작성 에이전트: 사용자 기준 자연어 응답 구성

복합 질문에서도 정확도와 응답 일관성이 향상됐습니다.

 

8. Streamlit 기반 챗봇 UI

[사진] Streamlit web UI code
[사진] Streamlit web UI code
[사진] Streamlit web UI
[사진] Streamlit web UI

 

Streamlit을 이용해 질문 입력부터 응답 확인, 피드백까지 처리할 수 있는 간단한 챗봇 UI를 구성했습니다.

주요 기능

  • 사용자 질문 입력

  • 문서 기반 응답 출력

  • “정확/부정확” 피드백 버튼

  • fallback 시 고객센터 유도 메시지

  • 모든 이력 CSV 저장

피드백 저장 예시 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from datetime import datetime
import pandas as pd
 
new_row = {
    “timestamp”: datetime.now().isoformat(),
    “question”: query,
    “answer”: answer,
    “feedback”: feedback
}
 
try:
    df = pd.read_csv(“feedback.csv”)
    df = pd.concat([df, pd.DataFrame([new_row])], ignore_index=True)
except FileNotFoundError:
    df = pd.DataFrame([new_row])
 
df.to_csv(“feedback.csv”, index=False)
 
cs
feedback.csv
[사진] AI 질문에 대한  feedback.csv 파일

 

 

9. 디렉터리 구조 예시

pdf-ai-chatbot/
├── data/ # PDF 원본
├── faiss_db/ # 벡터 인덱스 저장소
├── src/
│ ├── loader.py # PDF → 텍스트 분할
│ ├── embedder.py # 임베딩 처리
│ ├── retriever.py # FAISS 검색
│ └── chatbot.py # GPT 응답 생성
├── ui/
│ └── app.py # Streamlit UI
└── feedback.csv # 피드백 로그

 

10. 벤치마크 결과

딥파인더 사용 설명서 (약 240페이지) 기준으로 기존 방식과 LangChain + FAISS 적용 후 성능을 비교했습니다.

항목 기존 수동 검색 (사람 직접 탐색) LangChain + FAISS
평균 응답 시간 약 1~3분 약 2~5초
문서 기반 정확도 중간 (표현 일치 필요) 높음 (의미 유사 검색)

벡터 검색 기반 시스템 도입 후 응답 속도는 10배 이상 개선됐고, 정확도가 매우 향상됐습니다.

 

11. 참고 링크

 

다음 추천 글 

AI란 무엇인가?

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x