import os import asyncio from langchain.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.vectorstores import FAISS from langchain_huggingface.embeddings import HuggingFaceEmbeddings async def process_and_store_file(file_path, user_id, websocket=None, upload_directory="./uploaded_files"): try: # 1. PDF 파일 로드 if websocket: await websocket.send_text("1. PDF 파일 로드 중...") loader = PyPDFLoader(file_path) documents = loader.load() if websocket: await websocket.send_text(f"PDF 파일 로드 완료: {len(documents)} 문서") except Exception as e: if websocket: await websocket.send_text(f"PDF 파일 로드 오류: {e}") return try: # 2. 텍스트 분할 if websocket: await websocket.send_text("2. 텍스트 분할 중...") text_splitter = RecursiveCharacterTextSplitter(chunk_size=3000, chunk_overlap=500) docs = text_splitter.split_documents(documents) if websocket: await websocket.send_text(f"텍스트 분할 완료: {len(docs)} 청크") except Exception as e: if websocket: await websocket.send_text(f"텍스트 분할 오류: {e}") return try: # 3. 임베딩 생성 및 벡터화 if websocket: await websocket.send_text("3. 임베딩 생성 및 벡터화 중...") embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2") vectors = FAISS.from_documents(docs, embeddings) # 4. 벡터 저장 db_path = os.path.join(upload_directory, "faiss_index") vectors.save_local(db_path) if websocket: await websocket.send_text(f"FAISS 인덱스 저장 완료: {db_path}") except Exception as e: if websocket: await websocket.send_text(f"벡터화 오류: {e}") return finally: # 5. 파일 삭제 try: if os.path.exists(file_path): os.remove(file_path) if websocket: await websocket.send_text(f"파일 삭제 완료: {file_path}") except Exception as e: if websocket: await websocket.send_text(f"파일 삭제 오류: {e}")