Maslan34 commited on
Commit
210743a
·
1 Parent(s): 532c3be

Add application file

Browse files
Files changed (3) hide show
  1. Dockerfile +19 -0
  2. app.py +163 -0
  3. requirements.txt +139 -0
Dockerfile ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Hugging Face Docker Spaces için FastAPI yapılandırması
2
+ FROM python:3.10-slim
3
+
4
+ RUN useradd -m -u 1000 user
5
+ USER user
6
+ ENV PATH="/home/user/.local/bin:$PATH"
7
+
8
+ WORKDIR /app
9
+
10
+ COPY --chown=user requirements.txt .
11
+ RUN pip install --no-cache-dir -r requirements.txt
12
+
13
+ COPY --chown=user . .
14
+
15
+ # Hugging Face Spaces için zorunlu port
16
+ ENV PORT=7860
17
+ EXPOSE 7860
18
+
19
+ CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
app.py ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import logging
3
+ import json
4
+ from typing import List, Dict
5
+ from fastapi import FastAPI, Request, HTTPException
6
+ from fastapi.middleware.cors import CORSMiddleware
7
+ from contextlib import asynccontextmanager
8
+
9
+ from langchain_core.prompts import ChatPromptTemplate
10
+ from langchain_core.documents import Document
11
+ from langchain_core.output_parsers import StrOutputParser
12
+ from langchain_core.runnables import RunnablePassthrough
13
+ from langchain_text_splitters import RecursiveCharacterTextSplitter
14
+ from langchain_community.vectorstores import Chroma
15
+ from langchain_community.embeddings import HuggingFaceEmbeddings
16
+ from langchain_google_genai import ChatGoogleGenerativeAI
17
+ from dotenv import load_dotenv
18
+
19
+ load_dotenv()
20
+
21
+ logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
22
+ logger = logging.getLogger(__name__)
23
+
24
+ GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
25
+
26
+
27
+ # =========================================================
28
+ # GEMINI RAG CHATBOT
29
+ # =========================================================
30
+
31
+ class GeminiRAGChatbotCPU:
32
+ def __init__(self, model_variant="gemini-2.0-flash-lite"):
33
+ self.model_variant = model_variant
34
+ self.device = "cpu"
35
+ self.vectordb = None
36
+ self.rag_chain = None
37
+ self.llm = None
38
+ self.embeddings = None
39
+ self.retriever = None
40
+
41
+ def gemini_yukle(self):
42
+ self.llm = ChatGoogleGenerativeAI(
43
+ model=self.model_variant,
44
+ google_api_key=GEMINI_API_KEY,
45
+ temperature=0.2,
46
+ max_output_tokens=200,
47
+ )
48
+ return self.llm
49
+
50
+ def embedding_yukle(self):
51
+ model = "emrecan/bert-base-turkish-cased-mean-nli-stsb-tr"
52
+ self.embeddings = HuggingFaceEmbeddings(
53
+ model_name=model,
54
+ model_kwargs={'device': self.device},
55
+ encode_kwargs={'normalize_embeddings': True}
56
+ )
57
+ return self.embeddings
58
+
59
+ def dokumanlari_yukle(self, klasor_yolu: str):
60
+ if not os.path.exists(klasor_yolu):
61
+ os.makedirs(klasor_yolu)
62
+ return []
63
+ documents = []
64
+ for root, _, files in os.walk(klasor_yolu):
65
+ for f in files:
66
+ path = os.path.join(root, f)
67
+ if f.endswith(".txt"):
68
+ with open(path, "r", encoding="utf-8") as t:
69
+ text = t.read()
70
+ documents.append(Document(page_content=text, metadata={"source": f}))
71
+ return documents
72
+
73
+ def metni_parcala(self, documents: List):
74
+ text_splitter = RecursiveCharacterTextSplitter(
75
+ chunk_size=450,
76
+ chunk_overlap=50,
77
+ length_function=len,
78
+ separators=["\n\n", "\n", ".", "!", "?", ";", ":", " ", ""]
79
+ )
80
+ return text_splitter.split_documents(documents)
81
+
82
+ def vektor_db_olustur(self, chunks: List, db_yolu):
83
+ if os.path.exists(db_yolu):
84
+ import shutil
85
+ shutil.rmtree(db_yolu)
86
+ self.vectordb = Chroma.from_documents(chunks, self.embeddings, persist_directory=db_yolu)
87
+ return self.vectordb
88
+
89
+ def format_docs(self, docs):
90
+ return "\n\n".join(doc.page_content for doc in docs)
91
+
92
+ def chatbot_olustur(self, k=5):
93
+ self.retriever = self.vectordb.as_retriever(search_type="similarity", search_kwargs={"k": k})
94
+ template = """Sen Gemini, Türkçe konuşan bir süpermarket asistanısın.
95
+
96
+ Bağlam:
97
+ {context}
98
+
99
+ Soru: {question}
100
+
101
+ Kurallar:
102
+ - Sadece bağlamdaki bilgilerle cevap ver
103
+ - Kısa ve net ol
104
+ - Bilgi yoksa "Bu konuda bilgim yok" de
105
+
106
+ Cevap:"""
107
+ prompt = ChatPromptTemplate.from_template(template)
108
+ self.rag_chain = (
109
+ {"context": self.retriever | self.format_docs, "question": RunnablePassthrough()}
110
+ | prompt
111
+ | self.llm
112
+ | StrOutputParser()
113
+ )
114
+ return self.rag_chain
115
+
116
+ def soru_sor(self, soru: str):
117
+ cevap = self.rag_chain.invoke(soru)
118
+ return {"cevap": cevap.strip()}
119
+
120
+ def setup(self, init=True, db_yolu="./chroma_db", dokuman_klasoru="./documents", k=5):
121
+ self.embedding_yukle()
122
+ self.gemini_yukle()
123
+ if init:
124
+ docs = self.dokumanlari_yukle(dokuman_klasoru)
125
+ chunks = self.metni_parcala(docs)
126
+ self.vektor_db_olustur(chunks, db_yolu)
127
+ self.chatbot_olustur(k)
128
+
129
+
130
+ # =========================================================
131
+ # FASTAPI APP
132
+ # =========================================================
133
+
134
+ gemini = None
135
+
136
+ @asynccontextmanager
137
+ async def lifespan(app: FastAPI):
138
+ global gemini
139
+ gemini = GeminiRAGChatbotCPU()
140
+ gemini.setup(init=True)
141
+ yield
142
+
143
+ app = FastAPI(lifespan=lifespan, title="Gemini Chatbot API")
144
+
145
+ app.add_middleware(
146
+ CORSMiddleware,
147
+ allow_origins=["*"],
148
+ allow_credentials=True,
149
+ allow_methods=["*"],
150
+ allow_headers=["*"],
151
+ )
152
+
153
+ @app.get("/")
154
+ async def root():
155
+ return {"status": "ok"}
156
+
157
+ @app.post("/api/chat")
158
+ async def chat(request: Request):
159
+ data = await request.json()
160
+ soru = data.get("message", "")
161
+ if not soru:
162
+ raise HTTPException(status_code=400, detail="Message required")
163
+ return gemini.soru_sor(soru)
requirements.txt ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ============================================================
2
+ # KURULUM TALİMATLARI
3
+ # ============================================================
4
+
5
+ # TEMEL KURULUM:
6
+ # pip install -r requirements.txt
7
+
8
+ # GPU DESTEĞİ İÇİN (NVIDIA CUDA):
9
+ # 1. Önce bu dosyayı düzenleyin ve torch satırlarını silin
10
+ # 2. Sonra GPU versiyonunu kurun:
11
+ # pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
12
+ #pip install torch==2.6.0 torchvision==0.21.0 torchaudio==2.6.0 --index-url https://download.pytorch.org/whl/cu124
13
+ # 3. Son olarak diğer paketleri kurun:
14
+ # pip install -r requirements.txt
15
+
16
+ # HAFIF KURULUM (Sadece temel özellikler):
17
+ # pip install langchain langchain-community transformers torch chromadb sentence-transformers
18
+
19
+ # NOT: İlk çalıştırmada modeller (~5-15GB) indirilecektir
20
+ # NOT: bitsandbytes paketi sadece CUDA ile çalışır (Windows'ta sorun çıkarabilir)
21
+
22
+ # Opsiyonal Paketler Yorum Satıları İle Kapatılmıştır.
23
+
24
+ # ==========================================
25
+ # KUMRU RAG CHATBOT - TÜM BAĞIMLILIKLAR
26
+ # ==========================================
27
+
28
+ # ============ TEMEL PAKETLER ============
29
+ # LangChain Framework (Güncel versiyon)
30
+ langchain>=0.1.0
31
+ langchain-community>=0.0.38
32
+ langchain-core>=0.1.0
33
+ langchain-text-splitters>=0.0.1
34
+
35
+ # LangChain Entegrasyonları
36
+
37
+ langchain-huggingface>=0.0.1 # Hugging Face modelleri için
38
+
39
+ # ============ AI/ML ÇEKIRDEK ============
40
+ # PyTorch (CPU versiyonu - GPU için aşağıdaki notlara bakın)
41
+ #torch>=2.6.0
42
+ torchvision>=0.15.0
43
+ torchaudio>=2.0.0
44
+
45
+ # Transformers & Model Yönetimi
46
+ transformers>=4.35.0
47
+ accelerate>=0.25.0
48
+ sentencepiece>=0.1.99
49
+ protobuf>=3.20.0
50
+
51
+
52
+ # Quantization (Opsiyonel - Model boyutunu küçültmek için)
53
+ #bitsandbytes>=0.41.0 # CUDA gerektirir
54
+ #optimum>=1.16.0 # Opsiyonel Optimizasyon Yapılcaksa gereklidir. Aksi Takdirde Çakışmaya Neden Oluyor.
55
+
56
+ # ============ EMBEDDING & VEKTÖR DB ============
57
+ # Vektör Veritabanı
58
+ chromadb>=0.4.0
59
+
60
+ #Bu paket çakışmaya neden olabilir
61
+ #faiss-cpu>=1.7.4 # Alternatif vektör DB (GPU için faiss-gpu kullanın)
62
+
63
+ # Embedding Modelleri
64
+ sentence-transformers>=2.2.0
65
+ InstructorEmbedding>=1.0.0 # Instructor embeddings için
66
+
67
+ # ============ DÖKÜMAN İŞLEME ============
68
+ # Metin Dosyaları
69
+ unstructured>=0.10.0
70
+ #python-magic-bin>=0.4.14 # Windows için
71
+
72
+ # PDF İşleme
73
+ pypdf>=3.17.0
74
+ pdfplumber>=0.10.0
75
+ PyMuPDF>=1.23.0 # fitz
76
+ pdfminer.six>=20221105
77
+
78
+ # Office Dökümanları
79
+ python-docx>=1.1.0 # Word
80
+ openpyxl>=3.1.0 # Excel
81
+ python-pptx>=0.6.23 # PowerPoint
82
+
83
+ # Markdown & HTML
84
+ markdown>=3.5.0
85
+ beautifulsoup4>=4.12.0
86
+ lxml>=4.9.0
87
+
88
+ # ============ YARDIMCI ARAÇLAR ============
89
+ # İlerleme Çubukları & Loglama
90
+ tqdm>=4.66.0
91
+ python-dotenv>=1.0.0 # .env dosyaları için
92
+ loguru>=0.7.0
93
+
94
+ # Tokenization & Metin İşleme
95
+ tiktoken>=0.5.0
96
+ nltk>=3.8.1
97
+ regex>=2023.0.0
98
+
99
+ # Veri İşleme
100
+ numpy>=1.24.0
101
+ pandas>=2.0.0
102
+
103
+
104
+ # Flask/FastAPI (API için)
105
+ flask>=3.0.0
106
+ fastapi>=0.104.0
107
+ uvicorn>=0.24.0
108
+ pydantic>=2.0.0
109
+
110
+ # ============ API İSTEKLERİ ============
111
+ requests>=2.31.0
112
+
113
+ # ============ ÖZELLEŞTİRME & GELİŞMİŞ ============
114
+ # Fine-tuning için
115
+ peft>=0.7.0 # Parameter Efficient Fine-Tuning
116
+ datasets>=2.15.0
117
+ evaluate>=0.4.0
118
+
119
+ # Prompt Engineering
120
+ langchain-experimental>=0.0.40
121
+
122
+ # RAG İyileştirme
123
+ rank-bm25>=0.2.2 # BM25 ranking
124
+ sentence-splitter>=1.4
125
+ semantic-text-splitter>=0.1.0
126
+
127
+ # Google Gemini için gerekli
128
+ langchain-google-genai>=3.0.0
129
+ httpx>=0.28.1
130
+
131
+
132
+ # Chroma DB için Gerekli Paketler
133
+ backoff>=2.2.1
134
+
135
+
136
+ # ============ TEST & DEV (Opsiyonel) ============
137
+ #pytest>=7.4.0
138
+
139
+