cdxxi commited on
Commit
ae7e3fa
·
1 Parent(s): ce85a90
.gitattributes CHANGED
@@ -33,3 +33,6 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ dff.csv filter=lfs diff=lfs merge=lfs -text
37
+ indexes/*.faiss filter=lfs diff=lfs merge=lfs -text
38
+ *.jpg filter=lfs diff=lfs merge=lfs -text
dff.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:49a3cc4bbda9a0e9dbbf620ef57bfe074909c8b37eb80b59e45f55155cb02706
3
+ size 57631098
images/book03.PNG ADDED
images/book04.png ADDED
images/book06.jpg ADDED

Git LFS Details

  • SHA256: f9d412d21f69b7c8bc6163a0e39804f542b7e7bc6723c19282ca2e9f94619d59
  • Pointer size: 130 Bytes
  • Size of remote file: 31.6 kB
images/photo_p.jpg ADDED

Git LFS Details

  • SHA256: acf642b9502cb151c9d141adbd923e1c56833e13209cd0de3c6d3ac1286ea2a6
  • Pointer size: 130 Bytes
  • Size of remote file: 18.1 kB
images/reklama.jpg ADDED

Git LFS Details

  • SHA256: e8fca42095199442d34f1116ad0a625842a7d5869ba5986243e93739f9c92b61
  • Pointer size: 129 Bytes
  • Size of remote file: 8.78 kB
indexes/index1.faiss ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e193751613617d3f6c57fbaf1efdd9d7b45953802ad4f7626aadb8365041e6ed
3
+ size 54789165
indexes/index2.faiss ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5410a3c69e097e7eb674d8e01c0aab1de3617ed56bb03096e42df7ef0163d19a
3
+ size 109578285
indexes/index3.faiss ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:65aabbe31583b4ad81f78a033728ebca7b88153a69a0809c01018798325e1fbe
3
+ size 146104365
main.py ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ELBRUSE Bootcamp
2
+ # 13-02-2025
3
+ # Week 9 Day 4 Project
4
+ # team: Dasha, Alina, Ilya, Andrey u
5
+
6
+ import streamlit as st
7
+ import pandas as pd
8
+
9
+
10
+
11
+ #initialization ----------------------------
12
+
13
+
14
+ #Основная страница ----------------------------
15
+ # боковая панель
16
+ page01 = st.Page("pages/page_01.py", title = 'Оглавление:')
17
+
18
+ page02 = st.Page("pages/page_02.py", title = 'Описание Проекта')
19
+ page03 = st.Page("pages/page_03.py", title = '-> Умный поиск книг')
20
+ page04 = st.Page("pages/page_031.py", title = 'Описание моделей')
21
+
22
+
23
+ pg = st.navigation([page01, page02,
24
+ page03, page04
25
+ ], expanded=True)
26
+ pg.run()
27
+
28
+ st.sidebar.image(
29
+ "images/photo_p.jpg",
30
+ width=300
31
+ )
32
+ st.sidebar.title('Команда проекта:')
33
+ st.sidebar.write('[Галина Горяинова](https://github.com/ratOfSteel) 🤦')
34
+ st.sidebar.write('[Анатолий Яковлев](https://github.com/cdxxi) 🤬')
35
+ st.sidebar.write('[Андрей Абрамов](https://github.com/ANDREY700) ✋')
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
pages/page_01.py ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ELBRUSE Bootcamp
2
+ # 13-02-2025
3
+ # Week 9 Day 4 Project
4
+ # team: Dasha, Alina, Ilya, Andrey
5
+
6
+ import streamlit as st
7
+ import pandas as pd
8
+
9
+ image_size = 160
10
+
11
+ #st.header('Оглавление')
12
+
13
+ st.write('-------------------------------------------------------------------------------------')
14
+
15
+ col1, col2, col3 = st.columns(spec=[0.4, 0.3, 0.4])
16
+ with col1:
17
+ st.page_link("pages/page_02.py", label='Описание проекта')
18
+ with col2:
19
+ st.image('images/book04.jpg', width=image_size)
20
+
21
+ st.write('-------------------------------------------------------------------------------------')
22
+
23
+ col1, col2, col3 = st.columns(spec=[0.4, 0.3, 0.4])
24
+ with col2:
25
+ st.image('images/book03.PNG', width=image_size)
26
+ with col3:
27
+ st.page_link("pages/page_03.py", label='Умный поиск книг')
28
+
29
+
30
+ st.write('-------------------------------------------------------------------------------------')
31
+
32
+
33
+ col1, col2, col3 = st.columns(spec=[0.4, 0.3, 0.4])
34
+ with col1:
35
+ st.page_link("pages/page_031.py", label='Описание моделей')
36
+ with col2:
37
+ st.image('images/book06.jpg', width=image_size)
38
+
39
+ st.write('-------------------------------------------------------------------------------------')
pages/page_02.py ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ # ELBRUSE Bootcamp
3
+ # 13-02-2025
4
+ # Week 9 Day 4 Project
5
+ # team: Dasha, Alina, Ilya, Andrey
6
+
7
+
8
+ import streamlit as st
9
+ import pandas as pd
10
+
11
+
12
+ #st.title('Страница 01')
13
+ st.header('Умный поиск книг')
14
+ st.subheader('Описание Проекта')
15
+ st.write('Магазин электронных книг хочет усовершенствовать поиск. Сейчас поиск происходит по автору и названию книги, при этом никак не учитывается аннотация (а большая часть из них даже не добавлена на сайт). Вашей команде предстоит собрать выборку из не менее, чем 5000 аннотаций c сайта и построить систему поиска наиболее подходящих под пользовательский запрос книг.')
16
+
17
+ st.subheader('План проекта:')
18
+ st.write('Разработать систему поиска книги по пользовательскому запросу. Сервис должен принимать на вход описание книги от пользователя и возвращать заданное количество подходящих вариантов. Демо должно быть развернуто через streamlit. Макет интерфейса сервиса можно найти тут. Сервис должен быть развернут на huggingface spaces.')
19
+
20
+ st.subheader('Релизы:')
21
+ st.write('-------------------------------------------------------------------------------------')
22
+ st.write('Релиз 1.0')
23
+ st.write('Срок: среда, 17:00')
24
+ st.write('* сделать csv-файл следующей структуры:')
25
+ st.write('page_url, image_url, author, title, annotation')
26
+ st.write('* сделать py-файл, содержащий скрипт с парсингом и сохранением данных')
27
+ st.write('* реализовать streamlit-скрипт main.py, который возвращает случайные 10 позиций из csv-файла формате: автор - название книги')
28
+
29
+ st.write('-------------------------------------------------------------------------------------')
30
+ st.write('Релиз 2.0')
31
+ st.write('Срок: четверг, 17:00')
32
+ st.write('* сделать ipynb-файл с демонстрационным примером работы сервиса')
33
+
34
+ st.write('-------------------------------------------------------------------------------------')
35
+ st.write('Релиз 3.0')
36
+ st.write('Срок: пятница, 16:00')
37
+ st.write('* сделать main.py-файл, содержащий скрипт, реализующий streamlit-сервис')
38
+ st.write('* сделать README.MD, содержащий описание репозитория и способ запуска вашего сервиса')
39
+
40
+ st.write('-------------------------------------------------------------------------------------')
41
+ st.subheader('Рекомендации')
42
+ st.write('В качестве технологий стоит обратить внимание на:')
43
+ st.write('* библиотеку Sentence Transformers')
44
+ st.write('* языковые модели ruBERT (1,2)')
45
+ st.write('* поиск должен происходить максимально быстро, в этом может помочь faiss')
46
+ st.write('* рядом с каждым результатом выводите меру того, насколько он подходит под конкретный запрос')
47
+ st.write('* для улучшения качества поиска попробуйте отсечь слишком короткие аннотации')
48
+ st.write('* пробуйте использовать другие метрики близости – результат может отличаться в произвольную сторону')
49
+ st.write('* для уточнения поиска можно сделать дополнительное поле ввода (например, с автором)')
50
+ st.write('* в общем случае вы будете решать задачу симметричного семантического поиска: запрос должен быть подробным и по длине быть сопоставим с документами в хранилище. Это не всегда удобно: часто пользователю не хочется долго печатать, а значит его запрос будет короче описания объектов. Тогда можно рассмотреть модели для ассиметричного семантического поиска')
51
+ st.write('* Дополните сервис возможностью получать краткое содержание книги (Sber GigaChat, YandexGPT, парсинг с Викип��дии и тд).')
52
+ st.write('* Упакуйте свое приложение в docker-контейнер и разместите образ на docker hub. Чтобы контейнер весил не очень много, обратите внимание, что некоторые модели с hugging-face доступны по API (переходите в карточку модели, жмите кнопку Deploy и выбирайте Inference API (serverless): вам будет предоставлен код, по которому можно обратиться к модели).')
53
+ st.write('* и получить результат, за инференс будет отвечать сервис hf).')
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
+
pages/page_03.py ADDED
@@ -0,0 +1,263 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+
3
+ import streamlit as st
4
+ import numpy as np
5
+ import pandas as pd
6
+ from sentence_transformers import SentenceTransformer
7
+ import faiss
8
+
9
+ # title itself
10
+ col1, col2, col3 = st.columns(spec=[0.4, 0.5, 0.2])
11
+ with col1:
12
+ st.image('images/book03.PNG', width=160)
13
+ with col2:
14
+ st.subheader("Умный поиск книг")
15
+
16
+ st.divider()
17
+
18
+
19
+ @st.cache_resource
20
+ def load_resources():
21
+ # Загрузка модели
22
+ model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
23
+ model1 = SentenceTransformer('sentence-transformers/paraphrase-multilingual-mpnet-base-v2')
24
+ model2 = SentenceTransformer('intfloat/multilingual-e5-large')
25
+
26
+ # Загрузка FAISS-индекса
27
+ index = faiss.read_index("indexes/index1.faiss")
28
+ index1 = faiss.read_index('indexes/index2.faiss')
29
+ index2 = faiss.read_index('indexes/index3.faiss')
30
+
31
+ df = pd.read_csv('all_books_final.csv')
32
+
33
+ return model, model1, model2, index, index1, index2, df
34
+
35
+ model, model1,model2, index, index1, index2, df = load_resources()
36
+
37
+
38
+ user_query = st.text_input(
39
+ "📖 Введите описание книги, которую хотите найти:",
40
+ placeholder="Например: детектив о загадочном убийстве в маленьком городке"
41
+ )
42
+
43
+ num_results = st.slider(
44
+ "Количество рекомендаций:",
45
+ min_value=1,
46
+ max_value=20,
47
+ value=10,
48
+ help="Выберите сколько книг показать в результатах"
49
+ )
50
+
51
+ search_button = st.button("Искать")
52
+
53
+ # --- Обработка и вывод результатов ---
54
+ if search_button and user_query:
55
+ with st.spinner("Ищем лучшие варианты..."):
56
+ try:
57
+ # Преобразование запроса в вектор
58
+ test_embedding = model.encode([user_query])
59
+ faiss.normalize_L2(test_embedding)
60
+
61
+ # Поиск в индексе
62
+ distances, indices = index.search(test_embedding, num_results)
63
+
64
+ # Отображение результатов
65
+ st.subheader(f"Найденные варианты для запроса Модель 1: '{user_query}'")
66
+
67
+ for i, (idx, score) in enumerate(zip(indices[0], distances[0])):
68
+ book = df.iloc[idx]
69
+
70
+ # Создаем карточку для каждой книги
71
+ with st.container():
72
+ cols = st.columns([0.2, 0.8])
73
+
74
+ with cols[0]:
75
+ try:
76
+ if pd.notna(book['image_url']): # Проверяем, что URL не пустой
77
+ st.image(
78
+ book['image_url'],
79
+ width=120,
80
+ caption="Обложка книги",
81
+ use_container_width="auto"
82
+ )
83
+ else:
84
+ st.warning("Обложка недоступна")
85
+ st.image("images/reklama.jpg", width=120) # Если есть колонка с изображениями
86
+ except Exception as e:
87
+ st.error(f"Ошибка загрузки обложки: {str(e)}")
88
+ st.image("images/reklama.jpg", width=120)
89
+
90
+ with cols[1]:
91
+ st.markdown(f"**{book['title']}**")
92
+ st.caption(f"Автор: {book['author']}")
93
+ st.write(f"**Сходство:** {score:.3f}")
94
+
95
+ # Добавляем раскрывающуюся аннотацию
96
+ annotation = book['annotation']
97
+ short_length = 150 # Количество символов для сокращённой версии
98
+
99
+ if len(annotation) > short_length:
100
+ short_annotation = annotation[:short_length] + "..."
101
+ with st.expander(f"Аннотация: {short_annotation}"):
102
+ st.write(annotation)
103
+ else:
104
+ st.write(f"**Аннотация:** {annotation}")
105
+
106
+ st.divider()
107
+
108
+ except Exception as e:
109
+ st.error(f"Ошибка при поиске: {str(e)}")
110
+
111
+ elif search_button and not user_query:
112
+ st.warning("Пожалуйста, введите описание для поиска!")
113
+
114
+ if search_button and user_query:
115
+ with st.spinner("Ищем лучшие варианты..."):
116
+ try:
117
+ # Преобразование запроса �� вектор
118
+ test_embedding = model1.encode([user_query])
119
+ faiss.normalize_L2(test_embedding)
120
+
121
+ # Поиск в индексе
122
+ distances1, indices1 = index1.search(test_embedding, num_results)
123
+
124
+ # Отображение результатов
125
+ st.subheader(f"Найденные варианты для запроса Модель 2: '{user_query}'")
126
+
127
+ for i, (idx, score) in enumerate(zip(indices1[0], distances1[0])):
128
+ book = df.iloc[idx]
129
+
130
+ # Создаем карточку для каждой книги
131
+ with st.container():
132
+ cols = st.columns([0.2, 0.8])
133
+
134
+ with cols[0]:
135
+ try:
136
+ if pd.notna(book['image_url']): # Проверяем, что URL не пустой
137
+ st.image(
138
+ book['image_url'],
139
+ width=120,
140
+ caption="Обложка книги",
141
+ use_container_width="auto"
142
+ )
143
+ else:
144
+ st.warning("Обложка недоступна")
145
+ st.image("images/reklama.jpg", width=120) # Если есть колонка с изображениями
146
+ except Exception as e:
147
+ st.error(f"Ошибка загрузки обложки: {str(e)}")
148
+ st.image("images/reklama.jpg", width=120)
149
+
150
+ with cols[1]:
151
+ st.markdown(f"**{book['title']}**")
152
+ st.caption(f"Автор: {book['author']}")
153
+ st.write(f"**Сходство:** {score:.3f}")
154
+
155
+ # Добавляем раскрывающуюся аннотацию
156
+ annotation = book['annotation']
157
+ short_length = 150 # Количество символов для сокращённой версии
158
+
159
+ if len(annotation) > short_length:
160
+ short_annotation = annotation[:short_length] + "..."
161
+ with st.expander(f"Аннотация: {short_annotation}"):
162
+ st.write(annotation)
163
+ else:
164
+ st.write(f"**Аннотация:** {annotation}")
165
+
166
+ st.divider()
167
+
168
+ except Exception as e:
169
+ st.error(f"Ошибка при поиске: {str(e)}")
170
+
171
+ elif search_button and not user_query:
172
+ pass
173
+
174
+ if search_button and user_query:
175
+ with st.spinner("Ищем лучшие варианты..."):
176
+ try:
177
+ # Преобразование запроса в вектор
178
+ test_embedding = model2.encode([user_query])
179
+ faiss.normalize_L2(test_embedding)
180
+
181
+ # Поиск в индексе
182
+ distances2, indices2 = index2.search(test_embedding, num_results)
183
+
184
+ # Отображение результатов
185
+ st.subheader(f"Найденные варианты для запроса Модель 3: '{user_query}'")
186
+
187
+ for i, (idx, score) in enumerate(zip(indices2[0], distances2[0])):
188
+ book = df.iloc[idx]
189
+
190
+ # Создаем карточку для каждой книги
191
+ with st.container():
192
+ cols = st.columns([0.2, 0.8])
193
+
194
+ with cols[0]:
195
+ try:
196
+ if pd.notna(book['image_url']): # Проверяем, что URL не пустой
197
+ st.image(
198
+ book['image_url'],
199
+ width=120,
200
+ caption="Обложка книги",
201
+ use_container_width="auto"
202
+ )
203
+ else:
204
+ st.warning("Обложка недоступна")
205
+ st.image("images/reklama.jpg", width=120) # Если есть колонка с изображениями
206
+ except Exception as e:
207
+ st.error(f"Ошибка загрузки обложки: {str(e)}")
208
+ st.image("images/reklama.jpg", width=120)
209
+
210
+ with cols[1]:
211
+ st.markdown(f"**{book['title']}**")
212
+ st.caption(f"Автор: {book['author']}")
213
+ st.write(f"**Сходство:** {score:.3f}")
214
+
215
+ # Добавляем раскрывающуюся аннотацию
216
+ annotation = book['annotation']
217
+ short_length = 150 # Количество символов для сокращённой версии
218
+
219
+ if len(annotation) > short_length:
220
+ short_annotation = annotation[:short_length] + "..."
221
+ with st.expander(f"Аннотация: {short_annotation}"):
222
+ st.write(annotation)
223
+ else:
224
+ st.write(f"**Аннотация:** {annotation}")
225
+
226
+ st.divider()
227
+
228
+ except Exception as e:
229
+ st.error(f"Ошибка при поиске: {str(e)}")
230
+
231
+ elif search_button and not user_query:
232
+ pass
233
+
234
+ if search_button and user_query:
235
+ with st.spinner("Сравниваем полученные варианты..."):
236
+ try:
237
+ col1, col2, col3, col4 = st.columns(spec=[0.1, 0.3, 0.3, 0.3])
238
+ with col1:
239
+ st.write('#')
240
+ with col2:
241
+ st.write('Model-1')
242
+ with col3:
243
+ st.write('Model-2')
244
+ with col4:
245
+ st.write('Model-3')
246
+
247
+ for i in range(0, num_results):
248
+ col1, col2, col3, col4 = st.columns(spec=[0.1, 0.3, 0.3, 0.3])
249
+ with col1:
250
+ st.write(str(i))
251
+ with col2:
252
+ st.image(df.loc[indices[0][i], 'image_url'], width=100)
253
+ with col3:
254
+ st.image(df.loc[indices1[0][i], 'image_url'], width=100)
255
+ with col4:
256
+ st.image(df.loc[indices2[0][i], 'image_url'], width=100)
257
+
258
+ st.divider()
259
+ except Exception as e:
260
+ st.error(f"Ошибка при поиске: {str(e)}")
261
+
262
+
263
+
pages/page_031.py ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+
4
+ st.header(" Набор данных")
5
+ nassiv_row = 35670
6
+ st.write(f"* Размер массива: строк`{nassiv_row}`")
7
+
8
+
9
+ st.divider()
10
+ st.header(" Использованные модели")
11
+ col0, col1 = st.columns(spec=[0.1, 0.9])
12
+ with col0:
13
+ st.write('1')
14
+ st.write('2')
15
+ st.write('3')
16
+ with col1:
17
+ st.write('sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2')
18
+ st.write('sentence-transformers/paraphrase-multilingual-mpnet-base-v2')
19
+ st.write('intfloat/multilingual-e5-large')
20
+
21
+
22
+ st.divider()
23
+
24
+
25
+
requirements.txt ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ altair==5.5.0
2
+ attrs==25.1.0
3
+ blinker==1.9.0
4
+ cachetools==5.5.2
5
+ certifi==2025.1.31
6
+ charset-normalizer==3.4.1
7
+ click==8.1.8
8
+ faiss-cpu==1.10.0
9
+ filelock==3.17.0
10
+ fsspec==2025.2.0
11
+ gitdb==4.0.12
12
+ GitPython==3.1.44
13
+ huggingface-hub==0.29.1
14
+ idna==3.10
15
+ Jinja2==3.1.5
16
+ joblib==1.4.2
17
+ jsonschema==4.23.0
18
+ jsonschema-specifications==2024.10.1
19
+ markdown-it-py==3.0.0
20
+ MarkupSafe==3.0.2
21
+ mdurl==0.1.2
22
+ mpmath==1.3.0
23
+ narwhals==1.28.0
24
+ networkx==3.4.2
25
+ numpy==2.2.3
26
+ nvidia-cublas-cu12==12.4.5.8
27
+ nvidia-cuda-cupti-cu12==12.4.127
28
+ nvidia-cuda-nvrtc-cu12==12.4.127
29
+ nvidia-cuda-runtime-cu12==12.4.127
30
+ nvidia-cudnn-cu12==9.1.0.70
31
+ nvidia-cufft-cu12==11.2.1.3
32
+ nvidia-curand-cu12==10.3.5.147
33
+ nvidia-cusolver-cu12==11.6.1.9
34
+ nvidia-cusparse-cu12==12.3.1.170
35
+ nvidia-cusparselt-cu12==0.6.2
36
+ nvidia-nccl-cu12==2.21.5
37
+ nvidia-nvjitlink-cu12==12.4.127
38
+ nvidia-nvtx-cu12==12.4.127
39
+ packaging==24.2
40
+ pandas==2.2.3
41
+ pillow==11.1.0
42
+ pip==25.0.1
43
+ protobuf==5.29.3
44
+ pyarrow==19.0.1
45
+ pydeck==0.9.1
46
+ Pygments==2.19.1
47
+ python-dateutil==2.9.0.post0
48
+ pytz==2025.1
49
+ PyYAML==6.0.2
50
+ referencing==0.36.2
51
+ regex==2024.11.6
52
+ requests==2.32.3
53
+ rich==13.9.4
54
+ rpds-py==0.23.1
55
+ safetensors==0.5.3
56
+ scikit-learn==1.6.1
57
+ scipy==1.15.2
58
+ sentence-transformers==3.4.1
59
+ setuptools==75.8.2
60
+ six==1.17.0
61
+ smmap==5.0.2
62
+ streamlit==1.42.2
63
+ sympy==1.13.1
64
+ tenacity==9.0.0
65
+ threadpoolctl==3.5.0
66
+ tokenizers==0.21.0
67
+ toml==0.10.2
68
+ torch==2.6.0
69
+ tornado==6.4.2
70
+ tqdm==4.67.1
71
+ transformers==4.49.0
72
+ triton==3.2.0
73
+ typing_extensions==4.12.2
74
+ tzdata==2025.1
75
+ urllib3==2.3.0
76
+ watchdog==6.0.0
77
+ wheel==0.45.1