async def personalize_response(user_id, query, user_position):
# Получаем базовый ответ на запрос
base_response = await get_basic_response(query)
# Проверяем, нужна ли персонализация для этого типа запроса
if requires_personalization(query):
# Дополняем ответ информацией, специфичной для должности
position_specific_info = await get_position_specific_info(
query_type=classify_query(query),
position=user_position
)
# Комбинируем общую информацию со специфичной
return combine_responses(base_response, position_specific_info)
return base_response
class VectorSearch:
def __init__(self):
# Загружаем предобученную модель для русского языка
self.model = SentenceTransformer('DeepPavlov/rubert-base-cased-sentence')
# Инициализируем индекс FAISS
self.index = faiss.IndexFlatL2(768) # 768 - размерность BERT-эмбеддингов
# Загружаем и индексируем базу знаний
self.load_knowledge_base()
def load_knowledge_base(self):
# Получаем все Q&A пары из базы данных
qa_pairs = KnowledgeBase.objects.all().values('question', 'answer', 'id')
# Создаем текстовые представления вопросов
self.questions = [item['question'] for item in qa_pairs]
self.answers = [item['answer'] for item in qa_pairs]
self.ids = [item['id'] for item in qa_pairs]
# Получаем векторные представления вопросов
embeddings = self.model.encode(self.questions)
# Добавляем векторы в индекс
self.index.add(np.array(embeddings))
def search(self, query, top_k=5):
# Получаем векторное представление запроса
query_vector = self.model.encode([query])[0].reshape(1, -1)
# Ищем ближайших соседей
distances, indices = self.index.search(query_vector, top_k)
# Возвращаем результаты
results = []
for i, idx in enumerate(indices[0]):
if idx != -1: # Валидный индекс
results.append({
'question': self.questions[idx],
'answer': self.answers[idx],
'id': self.ids[idx],
'score': 1.0 - (distances[0][i] / 100.0) # Нормализуем оценку
})
return results
async def route_query(user_id, query):
# Классифицируем запрос
query_type = classify_query(query)
confidence = get_classification_confidence(query)
# Если уверенность в классификации высокая и есть ответ в базе знаний
if confidence > CONFIDENCE_THRESHOLD and has_knowledge_base_answer(query_type, query):
# Отвечаем из базы знаний
return await get_knowledge_base_response(query_type, query)
# Если уверенность низкая или ответа нет в базе знаний
else:
# Предлагаем перенаправить запрос HR-специалисту
await bot.send_message(
user_id,
"Я не уверен, что правильно понял вопрос. Хотите, чтобы я передал его HR-специалисту?",
reply_markup=create_transfer_keyboard()
)
# Сохраняем контекст для последующей обработки
await save_unresolved_query_context(user_id, query)
# Возвращаем None, так как ответ будет предоставлен позже
return None