Spaces:
Sleeping
Sleeping
File size: 2,110 Bytes
235412b a7aa125 244e857 a7aa125 244e857 9faaee5 244e857 a7aa125 a73e1ef 244e857 8c5a7b2 a7aa125 244e857 235412b 244e857 a7aa125 244e857 a7aa125 244e857 a7aa125 244e857 a7aa125 244e857 a7aa125 244e857 a7aa125 244e857 a73e1ef 244e857 4b347f0 244e857 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
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]
@app.get("/")
def read_root():
return {"message": "Добро пожаловать в Лор-Бота!"}
@app.get("/ask/")
def ask_question(q: str):
answer = find_best_answer(q)
return {"question": q, "answer": answer}
|