From a1184d3585019969c863d717f8f81d9f26bbde9f Mon Sep 17 00:00:00 2001 From: EverJun2 Date: Sat, 16 Aug 2025 13:47:00 +0900 Subject: [PATCH 1/5] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20=EB=94=94?= =?UTF-8?q?=EB=A0=89=ED=86=A0=EB=A6=AC=20=EA=B5=AC=EC=A1=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/main.cpython-310.pyc | Bin 1312 -> 0 bytes {services => app}/__init__.py | 0 main.py => app/main.py | 0 app/routes.py | 0 data/faiss_index/index.faiss | Bin 24621 -> 0 bytes data/faiss_index/index.pkl | Bin 2738 -> 0 bytes services/__pycache__/__init__.cpython-310.pyc | Bin 147 -> 0 bytes .../embedding_service.cpython-310.pyc | Bin 881 -> 0 bytes .../__pycache__/task_service.cpython-310.pyc | Bin 805 -> 0 bytes 9 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 __pycache__/main.cpython-310.pyc rename {services => app}/__init__.py (100%) rename main.py => app/main.py (100%) create mode 100644 app/routes.py delete mode 100644 data/faiss_index/index.faiss delete mode 100644 data/faiss_index/index.pkl delete mode 100644 services/__pycache__/__init__.cpython-310.pyc delete mode 100644 services/__pycache__/embedding_service.cpython-310.pyc delete mode 100644 services/__pycache__/task_service.cpython-310.pyc diff --git a/__pycache__/main.cpython-310.pyc b/__pycache__/main.cpython-310.pyc deleted file mode 100644 index 620f7ea229e7525e8cdd223b0ac440c7a9da5b08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1312 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

IJU^_Vq<$3XeFeNf+d$!fSiB_- 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 PPO2TqykaIG!NLFl-H;)G diff --git a/services/__pycache__/embedding_service.cpython-310.pyc b/services/__pycache__/embedding_service.cpython-310.pyc deleted file mode 100644 index 9891b221c742bd2543e923670fef4f09cca76252..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 881 zcmYjQzi$&U6t;aob4j5B1QG*cV9C%%f)xQ(p;8bk6@kUe={P&Y)b~TSFKVjGRMtw2 zjLFD9#Nd^wI};PnSDMzR_w@Na->3I|=c~515(Mkl{*T#rg3xcbxw%5vyn@hgAu+_T zLKKj7(MrkqU`?E}Cx#8*~KQWV93IiBUY`?F0xi@}OeCCXa@{5LAaIiO? zOl)r|Bv0$i%xoe`#!oJBsJLlVnS;K~iUIi$`w;pNl0hvx!%NbV6<(vIX9&ZLFz=i! z{nlT3t+&R@!1&B(!8u-rCRl}S(1vTWjM``wwRjD#n79qjFz5>p#UG5&#Z#aj5}V|+ zraVryIOTNf5?6DsWLBTvH=u8aU&+~dwxf$oN~fx*7?;DIa)Vo6f=9{&NN;OrN6MqtlTG65hNQrO0KLAOxngBE0}DjQL@16&pmAd@*-7HNwKuoB4wuL&kZAJ{ zDDF!B(zaCm1uA9@L|JP_-^`9@zi-wS-EQLGO7DMPesvw^rwxu*h`|dq^#&bt7~xJq zQbH_txm$Rt*Isfc7NSKE%|jNm);B+mSu%C{?O)i>=@Zlb09xj- zru_XF!{l^H_1hJc;|WH=tMOzyMbP`3dRcr1#`1EZOng~^(zz&2l9vpwvK7@!6H3sP zEN3X?uwq03+9{fPjZUKs=I+VP)#Ti*N$oO^`Fn5Y)!wyt_kBJV`+&?ADv0Kpe*BJM!D%wl^v?2XKSqD^wwO8 zBAYE~US@i;0^`Z5#4h$0Wz=*zP*tYAhM5*pp@Hn!lD2K)UQ#$gmgp9k(Ap%vQD From d6a2d7e2393ac58578fc7ba82d4e2211fb38b873 Mon Sep 17 00:00:00 2001 From: EverJun2 Date: Sat, 16 Aug 2025 14:40:34 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor:=20main=20=EA=B3=BC=20routes=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/routes.py | 35 +++++++++++++++++++++++++++++++++++ main.py | 7 +++++++ 2 files changed, 42 insertions(+) create mode 100644 main.py diff --git a/app/routes.py b/app/routes.py index e69de29..45b04fe 100644 --- a/app/routes.py +++ b/app/routes.py @@ -0,0 +1,35 @@ +from dotenv import load_dotenv +from fastapi import APIRouter, UploadFile, File, HTTPException +from services.embedding_service import embed_file +from services.task_service import generate_task +from app.config import UPLOAD_DIR, INDEX_PATH +import os + +router = APIRouter() +ALLOWED_EXTENSIONS = {".pdf", ".txt",".html", ".json", ".docx", ".xlsx", ".pptx"} + +@router.post("/upload") +async def upload_file(file: UploadFile = File(...)): + ext = os.path.splitext(file.filename)[1].lower() + if ext not in ALLOWED_EXTENSIONS: + raise HTTPException( + status_code=400, + detail="지원하지 않는 파일 형식입니다. PDF, TXT, HTML, JSON, DOCX, XLSX, PPTX만 업로드 가능합니다." + ) + + os.makedirs(UPLOAD_DIR, exist_ok=True) + file_path = os.path.join(UPLOAD_DIR, file.filename) + + with open(file_path, "wb") as f: + content = await file.read() + f.write(content) + + # TODO: 확장자별 다른 임베딩 함수로 변경 가능 + chunk_count = embed_file(file_path, INDEX_PATH) + + return {"message": f"{chunk_count}개의 청크가 임베딩되어 저장되었습니다."} + +@router.get("/generate-task") +async def get_task(prompt: str): + result = generate_task(prompt, INDEX_PATH) + return {"task": result} diff --git a/main.py b/main.py new file mode 100644 index 0000000..207b61b --- /dev/null +++ b/main.py @@ -0,0 +1,7 @@ +from fastapi import FastAPI +from app.routes import router + +app = FastAPI() +app.include_router(router) + +#uvicorn main:app --reload : 실행 명령어 \ No newline at end of file From c47d19f089d34f84d13e9415890f0ee5888f4f4f Mon Sep 17 00:00:00 2001 From: EverJun2 Date: Sat, 16 Aug 2025 14:41:15 +0900 Subject: [PATCH 3/5] =?UTF-8?q?chore=20:=20config=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/config.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 app/config.py diff --git a/app/config.py b/app/config.py new file mode 100644 index 0000000..6e79cdb --- /dev/null +++ b/app/config.py @@ -0,0 +1,12 @@ +from dotenv import load_dotenv +import os + +INDEX_PATH = "data/faiss_index" +UPLOAD_DIR = "data/uploads" + +os.makedirs(UPLOAD_DIR, exist_ok=True) +os.makedirs(INDEX_PATH, exist_ok=True) + +load_dotenv() + + From 5ff7ec7cf67e87d942ed650bacbd39ff9399dd17 Mon Sep 17 00:00:00 2001 From: EverJun2 Date: Sat, 16 Aug 2025 14:41:34 +0900 Subject: [PATCH 4/5] =?UTF-8?q?chore:=20init.py=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- services/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 services/__init__.py diff --git a/services/__init__.py b/services/__init__.py new file mode 100644 index 0000000..e69de29 From 313638d9ee7acb8c1f7fef1cb4a03c04f3313e6d Mon Sep 17 00:00:00 2001 From: EverJun2 Date: Sat, 16 Aug 2025 14:41:56 +0900 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20=EC=9E=84=EB=B2=A0=EB=94=A9=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=ED=99=95=EC=9E=A5=EC=9E=90=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- services/embedding_service.py | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/services/embedding_service.py b/services/embedding_service.py index 5edfd25..272035e 100644 --- a/services/embedding_service.py +++ b/services/embedding_service.py @@ -1,10 +1,31 @@ -from langchain_community.document_loaders import PyPDFLoader +from langchain.document_loaders import ( + PyPDFLoader, + TextLoader, + UnstructuredHTMLLoader, + JSONLoader, + UnstructuredFileLoader, +) + from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import FAISS -def embed_pdf(file_path: str, index_path: str) -> int: - loader = PyPDFLoader(file_path) +def embed_file(file_path: str, index_path: str) -> int: + ext = file_path.split(".")[-1].lower() + + if ext == "pdf": + loader = PyPDFLoader(file_path) + elif ext == "txt": + loader = TextLoader(file_path) + elif ext == "html": + loader = UnstructuredHTMLLoader(file_path) + elif ext == "json": + loader = JSONLoader(file_path) + elif ext in ["docx", "xlsx", "pptx"]: + loader = UnstructuredFileLoader(file_path) + else: + raise ValueError(f"지원하지 않는 파일 형식입니다: {ext}") + docs = loader.load() splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) @@ -12,6 +33,6 @@ def embed_pdf(file_path: str, index_path: str) -> int: embeddings = OpenAIEmbeddings(model="text-embedding-3-small") vectorstore = FAISS.from_documents(chunks, embeddings) - vectorstore.save_local(index_path) + return len(chunks)