티스토리 뷰

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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함