from pydantic import BaseModel, Field from typing import Literal import logging from langchain.prompts import ChatPromptTemplate from langchain_core.output_parsers import JsonOutputParser from get_answer_gigachat import AnswerGigaChat from service_by_name import get_service_by_name from base_graph import BaseGraph import os from dotenv import load_dotenv load_dotenv() log_path = os.path.join("/tmp", "service.log") if os.path.exists(log_path): os.remove(log_path) logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler(log_path) ] ) logger = logging.getLogger(__name__) class SupportCategory(BaseModel): """Структура для классификации вопроса техподдержки.""" category: Literal["openvpn", "corporate_email", "internet_access", "другое"] = Field( description="Категория вопроса: openvpn, почта, wifi или другое" ) confidence: float = Field( description="Уверенность модели в классификации (0-1)", ge=0, le=1 ) llm = AnswerGigaChat() parser = JsonOutputParser(pydantic_object=SupportCategory) prompt = ChatPromptTemplate.from_template(""" Ты — вдумчивый и ответственный специалист технической поддержки. Под твоим руководством работают эксперты - работники технической поддержки, каждый из которых разбирается в своем отдельном сервисе. Ты анализируешь поступающие вопросы и распределяешь их по экспертам. Тебе нужно понять, к какому сервису относится проблема пользователя и направить его к соответствующему эксперту. Тебе не нужно уточнять у пользователя детали, чтобы точнее определить категорию задачи, ведь, если ты ошибешься, эксперт в ходе диалога это поймет и перенаправит запрос на другого специалиста. **Категории:** - "openvpn" — если вопрос про VPN, подключение к корпоративной сети, сертификаты OpenVPN. - "corporate_email" — вопрос отправляется к эксперту, который помогает с корпоративной почтой сотрудников компании, которая доступна по адресу mail-13.renlife.com и поддерживает работу через веб-интерфейс в браузере или через клиент Microsoft Outlook. - "internet_access" — вопрос отправляется к эксперту, который помогает с вопросами про доступ в интернет, в том числе доступ к корпоративным ресурсам на корпоративной технике(пк, нб). - "b2b" - ПО, обеспечивающее взаимодействие наших сотрудников с партнерами компании и наоборот, является web-формой общения с БД Borlas. В ПО реализована возможность заведения и просмотра уже созданных ДС. - "crm" - ПО, которое позволяет управлять продажами и сотрудниками, проводить встречи и звонки. В системе предусмотрена возможность записи встреч и разговоров. Система работает в синергии с телефонией Naumen. - "one_c" - 1С - Инструмент для автоматизации учета и управления бизнесом. Документооборот, бухгалтерия, кадровый учет, учет техники и оборудования. - "borlas" - База данных клиентов, сотрудников, ДС. - "print_and_scan" - Многофункциональное устройство (сокр. МФУ) — устройство, совмещающее в себе функции принтера, сканера, копировального аппарата, иногда также факса и терминала электронной почты, поточные сканеры - "другое" — если вопрос не подходит ни под одну категорию. Верни ответ в формате JSON с полями `category` и `confidence`. **Вопрос пользователя:** {question} """) classification_chain = prompt | llm | parser def get_graph_class(question): result = classification_chain.invoke({"question": question}) service_name = result["category"] confidence = result["confidence"] logger.info(f"question: {question} goes to {service_name} with confidence {confidence}") service = BaseGraph(get_service_by_name(service_name)) return service