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} | |