티스토리 뷰
1. Vector DB 구성
1) Loader
- PDF Loader: LangChain에서 PDF 문서를 불러와 RAG 시스템에 사용할 수 있도록 변환하는 도구
from langchain.document_loaders import PyMuPDFLoader
# PDF 파일 로드
pdf_path = "2025년 사이버 위협 전망 보고서.pdf"
pdf_loader = PyMuPDFLoader(path + pdf_path)
# 문서 로드 실행
documents_pdf = pdf_loader.load()
# 출력 확인
print(f"총 {len(documents_pdf)} 개의 페이지가 로드됨")
- csv 로더: 각 행을 하나의 Document 객체로 변환
data = pd.read_csv(path+'sample.csv')
data.head()
2) Splitter
- RecursiveCharacterTextSplitter: 계층적인 분할 방식
문단 -> 문장 -> 단어 순으로 점진적으로 분할하여 자연스러운 문맥유지
청크 크기 조정 설정된 chunk_size를 초과할 경우 재귀적으로 더 작은 단위로 분할
from langchain.text_splitter import CharacterTextSplitter, RecursiveCharacterTextSplitter
#텍스트 청크 분할
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 한 청크의 최대 길이
chunk_overlap=100, # 문맥 유지를 위한 오버랩
separators=["\n\n", "\n", ". "," "] # 문단 → 줄바꿈 → 문장 → 단어 순서로 분할
)
split_docs = text_splitter.split_documents(documents_pdf)
# 결과 확인
print(f"원본 문서 개수: {len(documents_pdf)}")
print(f"분할된 청크 개수: {len(split_docs)}")
print(f"첫 번째 청크:\n{split_docs[0].page_content}")
3) Embedding & Store
- Embedding model 선언
from langchain.embeddings import OpenAIEmbeddings
embedding_model = OpenAIEmbeddings(model="text-embedding-3-small")
- FAISS DB 저장
faiss_index 폴더에 저장됨
from langchain.vectorstores import FAISS
vectorstore = FAISS.from_documents(split_docs, embedding_model)
vectorstore.save_local("faiss_index")
- DB에 추가 입력
new_docs = [
Document(page_content="조선시대의 교육 제도는 성균관 중심이었다.", metadata={"source": "추가"}),
Document(page_content="한국 전통 사회에서 글을 읽는 능력은 권력의 상징이었다.", metadata={"source": "추가"})
]
# 문서 추가
vectorstore.add_documents(new_docs)
- 유사도 높은 문서 조회 3개 문
query = "가장 심각한 사이버 보안 위험이 뭐야?"
retrieved_docs = vectorstore.similarity_search(query, k=3)
# 결과 출력
print("검색 결과:")
for doc in retrieved_docs:
print(doc.page_content)
print('-'*200)
- 유사도 점수도 함께 조회
# 검색
query = "랜섬웨어 대응 방안은?"
retrieved_docs = vectorstore.similarity_search_with_score(query, k=2)
# 점수 추출 + 변환
for doc, score in retrieved_docs:
print('유사도 점수 :', score)
print('문서 내용 :', doc.page_content)
print('-'*200)
2. RAG 파이프라인
순서
- Retriever 선언
- LLM 모델 지정
- 메모리 선언
- 체인 함수로 엮기
1) RAG 파이프라인 구축
- 리트리버 생성, gpt 모델 설정
# (1) 리트리버(Retriever) 생성
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
# (2) GPT-4o mini 모델 설정
llm = ChatOpenAI(model_name="gpt-4o-mini")
- 메모리 추가, 체인 구성
ConversationBufferMemory()
ConversationalRetrievalChain.from_llm()
2) 프롬프트 이용
from langchain.prompts import ChatPromptTemplate
# 프롬프트 템플릿
prompt = ChatPromptTemplate.from_messages([
("system", "너는 사이버 보안 분야 최고 전문가야. 답변은 간결하게 해줘."),
("human", "질문: {question}\n\n관련 문서:\n{context}")
])
ConversationalRetrievalChain.from_llm(
)
combine_docs_chain_kwargs={"prompt": prompt}
'Data science > RAG' 카테고리의 다른 글
[RAG] 1. 벡터 DB 구성과 RAG 파이프라인 구축 (0) | 2025.04.30 |
---|