-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsetup_database.py
More file actions
234 lines (194 loc) · 7.83 KB
/
setup_database.py
File metadata and controls
234 lines (194 loc) · 7.83 KB
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
# ================================================================
# setup_database.py — HUGGING FACE DATASET VERSİYONU (TAM TEST EDİLMİŞ)
# ================================================================
import os
import shutil
from pathlib import Path
from typing import List
print("📦 Modüller yükleniyor...")
try:
import pandas as pd
from datasets import load_dataset
except ImportError as e:
print(f"❌ HATA: {e}")
print("💡 Şu komutu çalıştırın: pip install pandas datasets")
exit(1)
try:
from langchain_community.vectorstores import Chroma
except ImportError:
try:
from langchain.vectorstores import Chroma
except ImportError as e:
print(f"❌ HATA: {e}")
print("💡 Şu komutu çalıştırın: pip install langchain langchain-community")
exit(1)
try:
from langchain_huggingface import HuggingFaceEmbeddings
except ImportError:
try:
from langchain.embeddings import HuggingFaceEmbeddings
except ImportError as e:
print(f"❌ HATA: {e}")
print("💡 Şu komutu çalıştırın: pip install langchain-huggingface sentence-transformers")
exit(1)
try:
from langchain_core.documents import Document
except ImportError:
try:
from langchain.schema import Document
except ImportError as e:
print(f"❌ HATA: {e}")
print("💡 Şu komutu çalıştırın: pip install langchain-core")
exit(1)
print("✅ Tüm modüller yüklendi\n")
# 🎯 PROJENİN KÖK DİZİNİ
BASE_DIR = Path(__file__).parent.absolute()
# ✅ ChromaDB'yi proje içinde tut
CHROMA_PATH = BASE_DIR / "chroma_db_lexmove_mini"
# 🔥 Hugging Face Dataset Ayarları
DATASET_NAME = "Renicames/turkish-law-chatbot"
SPLIT_NAME = "train"
COLLECTION_NAME = "mevzuat_chunks_mini"
EMBEDDING_MODEL = "all-MiniLM-L6-v2"
print("="*70)
print("🚀 LexMove - ChromaDB Kurulum Başlatıldı (Hugging Face Dataset)")
print("="*70)
print(f"📦 Dataset: {DATASET_NAME}")
print(f"📂 Çıkış dizini (Chroma): {CHROMA_PATH}")
print(f"📂 Proje kök dizini: {BASE_DIR}")
# ================================================================
# 1. HUGGING FACE'TEN VERİ YÜKLEME
# ================================================================
def load_and_create_documents() -> List[Document]:
"""
Hugging Face Q&A veri setini yükler ve her Cevabı, Soru metadatasıyla
LangChain Document listesine dönüştürür.
"""
all_documents = []
print(f"\n⏳ Hugging Face'ten veri seti yükleniyor: {DATASET_NAME} ({SPLIT_NAME})")
try:
# Hugging Face'ten doğrudan yükleme
dataset = load_dataset(DATASET_NAME, split=SPLIT_NAME)
df = dataset.to_pandas()
print(f"✅ Veri seti yüklendi. Toplam satır: {len(df)}")
print(f"📊 Sütunlar: {list(df.columns)}")
except Exception as e:
print(f"❌ Veri seti yüklenirken HATA oluştu: {e}")
print("💡 İnternet bağlantınızı kontrol edin veya dataset adını doğrulayın.")
return []
# Her satırı LangChain Document'e dönüştür
for idx, row in df.iterrows():
# Sütun isimlerini kontrol et (küçük/büyük harf duyarlı)
question = ""
answer = ""
# Farklı olası sütun isimlerini dene
for q_col in ['question', 'Question', 'Soru', 'soru']:
if q_col in df.columns:
question = str(row.get(q_col, '')).strip()
break
for a_col in ['answer', 'Answer', 'Cevap', 'cevap']:
if a_col in df.columns:
answer = str(row.get(a_col, '')).strip()
break
# Sadece boş olmayan cevapları ekle
if answer and len(answer) > 10:
doc = Document(
page_content=answer,
metadata={
"question": question,
"source": DATASET_NAME,
"row_id": int(idx)
}
)
all_documents.append(doc)
print(f"✅ {len(all_documents)} adet Document oluşturuldu")
return all_documents
# ================================================================
# 2. ESKİ VERİTABANINI SİLME
# ================================================================
if CHROMA_PATH.exists():
print(f"\n⚠️ Eski veritabanı siliniyor: {CHROMA_PATH}")
try:
shutil.rmtree(CHROMA_PATH)
print("✅ Eski veritabanı silindi")
except OSError as e:
print(f"❌ Klasör silinirken hata: {e}")
print("💡 Klasörü manuel olarak silmeyi deneyin veya yönetici olarak çalıştırın")
exit(1)
# ================================================================
# 3. BELGELERİ YÜKLEME
# ================================================================
print("\n🔥 Belgeler Hugging Face'ten yükleniyor...")
documents = load_and_create_documents()
if len(documents) == 0:
print("\n❌ HATA: Yüklenecek belge bulunamadı!")
print("💡 Dataset boş olabilir veya sütun isimleri farklı olabilir.")
exit(1)
print(f"\n📄 İlk belge örneği:")
print(f" Soru: {documents[0].metadata.get('question', 'N/A')[:100]}...")
print(f" Cevap: {documents[0].page_content[:150]}...")
# ================================================================
# 4. EMBEDDING MODELİ
# ================================================================
print("\n🔧 Embedding modeli hazırlanıyor...")
try:
embeddings = HuggingFaceEmbeddings(
model_name=EMBEDDING_MODEL,
model_kwargs={"device": "cpu"},
encode_kwargs={"normalize_embeddings": True}
)
print("✅ Embedding modeli hazır")
except Exception as e:
print(f"❌ Embedding modeli yüklenemedi: {e}")
print("💡 sentence-transformers paketi kurulu mu kontrol edin")
print(" Komut: pip install sentence-transformers")
exit(1)
# ================================================================
# 5. CHROMADB OLUŞTURMA
# ================================================================
print("\n🧠 Chroma vektör veritabanı oluşturuluyor...")
print("⏳ Bu işlem birkaç dakika sürebilir...")
try:
# ChromaDB dizinini oluştur
CHROMA_PATH.mkdir(parents=True, exist_ok=True)
# Batch processing ile vektör oluştur (bellek tasarrufu için)
batch_size = 100
total_docs = len(documents)
vectorstore = None
for i in range(0, total_docs, batch_size):
batch = documents[i:i+batch_size]
print(f"⏳ İşleniyor: {i+1}-{min(i+batch_size, total_docs)}/{total_docs}")
if vectorstore is None:
# İlk batch ile vectorstore oluştur
vectorstore = Chroma.from_documents(
batch,
embeddings,
persist_directory=str(CHROMA_PATH),
collection_name=COLLECTION_NAME
)
else:
# Sonraki batch'leri ekle
vectorstore.add_documents(batch)
# Vektör sayısını kontrol et
total_chunks = vectorstore._collection.count()
print("\n" + "="*70)
print("✅ BAŞARILI! ChromaDB oluşturuldu")
print("="*70)
print(f"📊 Toplam vektör sayısı: {total_chunks}")
print(f"📁 Kayıt yeri: {CHROMA_PATH}")
print(f"📦 Koleksiyon adı: {COLLECTION_NAME}")
print(f"🌐 Dataset: {DATASET_NAME}")
print(f"🔍 Embedding Model: {EMBEDDING_MODEL}")
print("\n🚀 Şimdi şu komutu çalıştırın:")
print(" streamlit run app.py")
print("="*70)
except Exception as e:
print(f"\n❌ HATA: ChromaDB oluşturulamadı!")
print(f"Detay: {e}")
print("\n💡 Olası çözümler:")
print(" 1. Klasör izinlerini kontrol edin")
print(" 2. Yeterli disk alanı olduğundan emin olun")
print(" 3. chromadb paketini kurun: pip install chromadb")
import traceback
traceback.print_exc()
exit(1)