Spaces:
Runtime error
Runtime error
| import os | |
| import glob | |
| import uvicorn | |
| from fastapi import FastAPI | |
| from sentence_transformers import SentenceTransformer | |
| from sklearn.metrics.pairwise import cosine_similarity | |
| import numpy as np | |
| app = FastAPI() | |
| # Загружаем модель для создания эмбеддингов | |
| model = SentenceTransformer('sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2') | |
| # Папка с файлами лора | |
| LORE_DIR = './lore' | |
| # Параметры нарезки текста | |
| CHUNK_SIZE = 1000 # символов | |
| CHUNK_OVERLAP = 100 # перекрытие кусков для связности текста | |
| # Загружаем и обрабатываем лор | |
| def load_lore_chunks(): | |
| chunks = [] | |
| file_paths = glob.glob(os.path.join(LORE_DIR, '*.txt')) | |
| for path in file_paths: | |
| with open(path, 'r', encoding='utf-8') as f: | |
| text = f.read() | |
| # чистим мусорные символы | |
| text = ''.join(c if 0x20 <= ord(c) <= 0xFFFF else ' ' for c in text) | |
| # разбиваем на кусочки | |
| for i in range(0, len(text), CHUNK_SIZE - CHUNK_OVERLAP): | |
| chunk = text[i:i + CHUNK_SIZE].strip() | |
| if chunk: | |
| chunks.append(chunk) | |
| return chunks | |
| # Загружаем чанки и строим эмбеддинги | |
| print("Идёт загрузка файлов...") | |
| lore_chunks = load_lore_chunks() | |
| lore_embeddings = model.encode(lore_chunks) | |
| print(f"Загружено {len(lore_chunks)} частей текста.") | |
| # Функция для поиска лучшего ответа | |
| def find_best_answer(question): | |
| question_embedding = model.encode([question])[0] | |
| similarities = cosine_similarity([question_embedding], lore_embeddings)[0] | |
| best_idx = np.argmax(similarities) | |
| return lore_chunks[best_idx] | |
| def read_root(): | |
| return {"message": "Добро пожаловать в Лор-Бота!"} | |
| def ask_question(q: str): | |
| answer = find_best_answer(q) | |
| return {"question": q, "answer": answer} | |