WladlenVK commited on
Commit
73ef64f
·
unverified ·
1 Parent(s): cca96e3

Update load_book.py

Browse files
Files changed (1) hide show
  1. load_book.py +58 -88
load_book.py CHANGED
@@ -1,106 +1,76 @@
1
  import os
2
- import sys
3
  import time
4
- import google.generativeai as genai
5
  from langchain_community.document_loaders import TextLoader
6
- from langchain_text_splitters import RecursiveCharacterTextSplitter
 
7
  from langchain_community.vectorstores import SupabaseVectorStore
8
  from supabase.client import create_client
9
 
10
- class RateLimitedEmbeddings:
11
- def __init__(self, api_key, model_name):
12
- genai.configure(api_key=api_key)
13
- self.model_name = model_name
14
 
15
- def embed_documents(self, texts):
16
- embeddings = []
17
- batch_size = 30
 
18
 
19
- for i in range(0, len(texts), batch_size):
20
- batch = texts[i : i + batch_size]
21
- print(f"--- Обработка батча: {i} из {len(texts)} ---")
22
-
23
- try:
24
- res = genai.embed_content(
25
- model=self.model_name,
26
- content=batch,
27
- task_type="retrieval_document"
28
- )
29
- embeddings.extend(res['embedding'])
30
- time.sleep(5)
31
- except Exception as e:
32
- if "429" in str(e):
33
- print("Лимит превышен. Ждем 70 секунд...")
34
- time.sleep(70)
35
- res = genai.embed_content(
36
- model=self.model_name,
37
- content=batch,
38
- task_type="retrieval_document"
39
- )
40
- embeddings.extend(res['embedding'])
41
- else:
42
- raise e
43
-
44
- return embeddings
45
 
46
- def embed_query(self, text):
47
- res = genai.embed_content(
48
- model=self.model_name,
49
- content=text,
50
- task_type="retrieval_query"
 
 
 
 
 
 
 
 
 
 
 
51
  )
52
- return res['embedding']
53
 
54
- def load_book_to_supabase():
55
- supabase_url = os.environ.get("SUPABASE_URL")
56
- supabase_key = os.environ.get("SUPABASE_SERVICE_ROLE_KEY")
57
- gemini_api_key = os.environ.get("GEMINI_API_KEY")
58
-
59
- if not all([supabase_url, supabase_key, gemini_api_key]):
60
- print("ОШИБКА: Проверьте секреты!")
61
- sys.exit(1)
62
-
63
- print("--- Шаг 1: Подключение к Supabase ---")
64
- supabase = create_client(supabase_url, supabase_key)
65
-
66
- # НОВОЕ: Очистка таблицы перед загрузкой
67
- print("--- Шаг 1.1: Очистка старых данных в таблице documents ---")
68
- try:
69
- # Удаляем все записи, где id не равен 0 (то есть вообще все)
70
- supabase.table("documents").delete().neq("id", 0).execute()
71
  print("Таблица успешно очищена.")
72
- except Exception as e:
73
- print(f"Предупреждение при очистке (возможно, таблица уже пуста): {e}")
74
-
75
- print("--- Шаг 2: Загрузка файла книги ---")
76
- try:
77
- loader = TextLoader("book.txt", encoding="utf-8")
78
- documents = loader.load()
79
- except Exception as e:
80
- print(f"ОШИБКА: {e}")
81
- sys.exit(1)
82
 
83
- print("--- Шаг 3: Нарезка текста ---")
84
- text_splitter = RecursiveCharacterTextSplitter(chunk_size=3000, chunk_overlap=300)
85
- docs = text_splitter.split_documents(documents)
86
- print(f"Нарезано на {len(docs)} фрагментов.")
 
 
 
 
 
 
 
 
 
 
 
 
87
 
88
- print("--- Шаг 4: Инициализация эмбеддингов ---")
89
- custom_embeddings = RateLimitedEmbeddings(gemini_api_key, "models/gemini-embedding-001")
90
 
91
- print("--- Шаг 5: Загрузка в базу ---")
92
- try:
93
- SupabaseVectorStore.from_documents(
94
- docs,
95
- custom_embeddings,
96
- client=supabase,
97
- table_name="documents",
98
- query_name="match_documents",
99
- )
100
- print("--- УСПЕХ: Все данные загружены в Supabase! ---")
101
  except Exception as e:
102
- print(f"КРИТИЧЕСКАЯ ОШИБКА: {e}")
103
- sys.exit(1)
104
 
105
  if __name__ == "__main__":
106
- load_book_to_supabase()
 
1
  import os
 
2
  import time
 
3
  from langchain_community.document_loaders import TextLoader
4
+ from langchain_text_splitters import CharacterTextSplitter
5
+ from langchain_google_genai import GoogleGenerativeAIEmbeddings
6
  from langchain_community.vectorstores import SupabaseVectorStore
7
  from supabase.client import create_client
8
 
9
+ # Данные для подключения (берутся из Secrets GitHub)
10
+ supabase_url = os.environ.get("SUPABASE_URL")
11
+ supabase_key = os.environ.get("SUPABASE_SERVICE_KEY")
12
+ google_api_key = os.environ.get("GOOGLE_API_KEY")
13
 
14
+ def load_and_split():
15
+ print("--- Шаг 1: Загрузка файла book.txt ---")
16
+ if not os.path.exists("./book.txt"):
17
+ raise FileNotFoundError("Файл book.txt не найден в корневой директории!")
18
 
19
+ loader = TextLoader("./book.txt", encoding='utf-8')
20
+ documents = loader.load()
21
+
22
+ # Настройка нарезки: куски по 1000 символов
23
+ text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
24
+ docs = text_splitter.split_documents(documents)
25
+ print(f"Успешно: Файл разбит на {len(docs)} фрагментов.")
26
+ return docs
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
 
28
+ def main():
29
+ try:
30
+ # 1. Подготовка данных
31
+ all_docs = load_and_split()
32
+
33
+ # --- МИКРОШАГ: ОГРАНИЧЕНИЕ ДЛЯ ТЕСТА ---
34
+ # Берем только первые 2 фрагмента для проверки связи и типа данных ID
35
+ docs = all_docs[:2]
36
+ print(f"--- ТЕСТОВЫЙ РЕЖИМ: Работаем только с {len(docs)} фрагментами ---")
37
+
38
+ # 2. Инициализация клиентов
39
+ print("--- Шаг 2: Инициализация моделей и клиента Supabase ---")
40
+ supabase = create_client(supabase_url, supabase_key)
41
+ embeddings = GoogleGenerativeAIEmbeddings(
42
+ model="models/embedding-001",
43
+ google_api_key=google_api_key
44
  )
 
45
 
46
+ # 3. Очистка таблицы
47
+ print("--- Шаг 3: Очистка таблицы documents в базе данных ---")
48
+ # Мы используем .neq("id", "0"), так как теперь ID — это текст
49
+ supabase.table("documents").delete().neq("id", "0").execute()
 
 
 
 
 
 
 
 
 
 
 
 
 
50
  print("Таблица успешно очищена.")
 
 
 
 
 
 
 
 
 
 
51
 
52
+ # 4. Загрузка данных
53
+ print("--- Шаг 4: Отправка данных в Supabase ---")
54
+ # Для 2-х фрагментов батчи не нужны, но оставим структуру для будущего
55
+ batch_size = 30
56
+ for i in range(0, len(docs), batch_size):
57
+ batch = docs[i:i + batch_size]
58
+ print(f"Обработка фрагментов с {i} по {i + len(batch)}...")
59
+
60
+ SupabaseVectorStore.from_documents(
61
+ batch,
62
+ embeddings,
63
+ client=supabase,
64
+ table_name="documents",
65
+ query_name="match_documents"
66
+ )
67
+ print(f"Успешно записано в базу.")
68
 
69
+ print("--- ФИНАЛ: Тестовая загрузка завершена успешно! ---")
70
+ print("Проверьте таблицу 'documents' в интерфейсе Supabase.")
71
 
 
 
 
 
 
 
 
 
 
 
72
  except Exception as e:
73
+ print(f"!!! КРИТИЧЕСКАЯ ОШИБКА: {e}")
 
74
 
75
  if __name__ == "__main__":
76
+ main()