Spaces:
Paused
Paused
# func_ai.py | |
import requests | |
import torch | |
from transformers import pipeline | |
from deep_translator import GoogleTranslator | |
import time | |
import os | |
from datetime import datetime | |
VECTOR_API_URL = os.getenv('API_URL') | |
def log_message(message): | |
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S') | |
print(f"[{timestamp}] {message}") | |
# Инициализация моделей | |
def init_models(): | |
log_message("Инициализация моделей AI.") | |
sentiment_model = pipeline( | |
'sentiment-analysis', | |
model='cardiffnlp/twitter-xlm-roberta-base-sentiment', | |
tokenizer='cardiffnlp/twitter-xlm-roberta-base-sentiment', | |
device=0 if torch.cuda.is_available() else -1 | |
) | |
classifier = pipeline( | |
"zero-shot-classification", | |
model="valhalla/distilbart-mnli-12-6", | |
device=0 if torch.cuda.is_available() else -1 | |
) | |
return sentiment_model, classifier | |
sentiment_model, classifier = init_models() | |
def classify_comment(text): | |
if not text: | |
log_message("Получен пустой текст для классификации.") | |
return "non-interrogative" | |
log_message(f"Классификация комментария: {text}") | |
try: | |
translated_text = GoogleTranslator(source='auto', target="en").translate(text) | |
log_message(f"Переведенный текст: {translated_text}") | |
except Exception as e: | |
log_message(f"Ошибка при переводе: {e}") | |
return "non-interrogative" | |
if not translated_text: | |
log_message("Перевод вернул пустой текст.") | |
return "non-interrogative" | |
try: | |
result = classifier(translated_text, ["interrogative", "non-interrogative"], clean_up_tokenization_spaces=True) | |
log_message(f"Результат классификации: {result}") | |
except Exception as e: | |
log_message(f"Ошибка при классификации: {e}") | |
return "non-interrogative" | |
top_class = result['labels'][0] | |
log_message(f"Верхний класс: {top_class}") | |
return top_class | |
def analyze_sentiment(comments): | |
log_message("Начинаем анализ настроений.") | |
results = [] | |
for i in range(0, len(comments), 50): | |
batch = comments[i:i + 50] | |
log_message(f"Анализируем батч с {i} по {i + len(batch)} комментарий: {batch}") | |
try: | |
batch_results = sentiment_model(batch) | |
log_message(f"Результаты батча: {batch_results}") | |
results.extend(batch_results) | |
except Exception as e: | |
log_message(f"Ошибка при анализе настроений батча: {e}") | |
time.sleep(1) # Задержка для предотвращения перегрузки | |
log_message("Анализ настроений завершен.") | |
return results | |
def retrieve_from_vdb(query): | |
log_message(f"Отправка запроса к FastAPI сервису: {query}") | |
try: | |
response = requests.post(f"{VECTOR_API_URL}/search/", json={"query": query}) | |
if response.status_code == 200: | |
results = response.json().get("results", []) | |
log_message(f"Получено {len(results)} результатов: {results}") | |
return results | |
else: | |
log_message(f"Ошибка при поиске: {response.text}") | |
return [] | |
except Exception as e: | |
log_message(f"Ошибка при запросе к векторной базе данных: {e}") | |
return [] | |