Spaces:
Sleeping
Sleeping
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 | |