Розробляємо автономні AI-системи обробки запитів. Це AI-оркестратор, який приймає вхідні запити з різних каналів: email, форм, API, месенджерів. Система класифікує їх, витягує дані, виконує логіку обробки та повертає відповідь. Або створює завдання в бізнес-системах — все без участі оператора для типових випадків.
На відміну від простого чат-бота або агента з одним інструментом, наша система включає повний цикл: прийом → розуміння → збагачення даних → виконання → сповіщення → моніторинг. Ми реалізували десятки таких проєктів, і в цій статті розберемо архітектуру на реальному прикладі.
Як працює класифікація запитів?
Вхідний запит проходить через граф станів LangGraph. Перший вузол — класифікатор на GPT-4o з Pydantic-моделлю. Він визначає тип запиту (техпідтримка, білінг, нове замовлення, статус, скарга, повернення), терміновість, впевненість та необхідність ескалації людині. Якщо впевненість нижча за 0.6 або запит містить тригери (юридичні загрози, повернення на значну суму, згадка про збиток) — запит передається оператору. Це наш досвід, підтверджений сотнями проєктів.
Архітектура системи
Вхідні канали
- webhook (email-парсер)
- REST API
- Telegram/WhatsApp Bot
- веб-форма
Ядро обробки
LangGraph-граф зі станом, класифікатор, виконавці, агрегатор.
Вихідні канали
- REST API зовнішніх систем (CRM, ERP, Service Desk)
- email/push сповіщення
- черга завдань (Celery/Redis)
Докладніше про структуру графа та вузли
Основні вузли: classify (класифікація), enrich (збагачення), plan (планування), execute (виконання), generate_response (генерація відповіді), escalate_to_human (ескалація), send_response (відправка). Умовні ребра route_after_classification та route_after_enrichment визначають наступний крок залежно від стану.
from langgraph.graph import StateGraph, END
from langgraph.checkpoint.postgres import PostgresSaver
from typing import TypedDict, Annotated, Optional
from datetime import datetime
import operator
class RequestState(TypedDict):
# Вхідний запит
raw_content: str
channel: str # "email", "api", "telegram", "form"
sender_id: str
received_at: datetime
# Класифікація
request_type: Optional[str] # "support", "order", "complaint", "inquiry", "refund"
urgency: Optional[str] # "critical", "high", "normal", "low"
confidence: Optional[float]
# Збагачення
user_profile: Optional[dict]
related_entities: Optional[list] # Пов'язані замовлення, договори, тікети
# Обробка
action_plan: Optional[list[dict]]
executed_actions: Annotated[list, operator.add]
requires_human: bool
human_reason: Optional[str]
# Результат
response_draft: Optional[str]
outcome: Optional[str]
processing_time_ms: Optional[int]
from langchain_openai import ChatOpenAI
from pydantic import BaseModel
from typing import Literal
class RequestClassification(BaseModel):
request_type: Literal["support_technical", "support_billing", "order_new",
"order_status", "complaint", "refund_request", "general_inquiry"]
urgency: Literal["critical", "high", "normal", "low"]
confidence: float
extracted_entities: dict
requires_human: bool
human_reason: Optional[str] = None
summary: str
llm = ChatOpenAI(model="gpt-4o", temperature=0)
def classify_request(state: RequestState) -> RequestState:
result = llm.with_structured_output(RequestClassification).invoke(
f"""Класифікуй вхідний запит.
Канал: {state['channel']}
Запит: {state['raw_content']}
Передай людині якщо:
- Юридичні загрози або згадка судових розглядів
- Запит на повернення суми, що перевищує високий поріг
- Згадка про фізичний збиток
- Емоційно заряджений відгук з публічними погрозами"""
)
return {
**state,
"request_type": result.request_type,
"urgency": result.urgency,
"confidence": result.confidence,
"requires_human": result.requires_human,
"human_reason": result.human_reason,
}
def plan_actions(state: RequestState) -> RequestState:
"""Агент складає план дій на основі типу запиту"""
action_templates = {
"order_status": [
{"action": "query_order_db", "params": {"order_id": "{extracted_order_id}"}},
{"action": "generate_status_response", "params": {}},
{"action": "send_response", "params": {}},
],
"refund_request": [
{"action": "verify_refund_eligibility", "params": {}},
{"action": "create_refund_ticket", "params": {}},
{"action": "notify_finance_team", "params": {}},
{"action": "send_confirmation", "params": {}},
],
"support_technical": [
{"action": "search_knowledge_base", "params": {}},
{"action": "generate_solution", "params": {}},
{"action": "create_ticket_if_unsolved", "params": {}},
{"action": "send_response", "params": {}},
],
}
base_plan = action_templates.get(state["request_type"], [
{"action": "generate_generic_response", "params": {}},
{"action": "create_manual_review_task", "params": {}},
])
return {**state, "action_plan": base_plan}
def route_after_classification(state: RequestState) -> str:
if state["requires_human"]:
return "escalate_to_human"
if state["confidence"] < 0.6:
return "escalate_to_human"
return "enrich"
def route_after_enrichment(state: RequestState) -> str:
if state.get("user_profile", {}).get("tier") == "vip" and state["urgency"] in ("high", "critical"):
return "plan_premium"
return "plan"
graph = StateGraph(RequestState)
graph.add_node("classify", classify_request)
graph.add_node("enrich", enrich_request)
graph.add_node("plan", plan_actions)
graph.add_node("plan_premium", plan_premium_actions)
graph.add_node("execute", execute_actions)
graph.add_node("generate_response", generate_final_response)
graph.add_node("escalate_to_human", create_human_task)
graph.add_node("send_response", send_response_to_channel)
graph.set_entry_point("classify")
graph.add_conditional_edges("classify", route_after_classification)
graph.add_conditional_edges("enrich", route_after_enrichment)
graph.add_edge("plan", "execute")
graph.add_edge("plan_premium", "execute")
graph.add_edge("execute", "generate_response")
graph.add_edge("generate_response", "send_response")
graph.add_edge("send_response", END)
graph.add_edge("escalate_to_human", END)
processor = graph.compile(checkpointer=PostgresSaver(conn))
Чому система працює без оператора?
Ключова відмінність — здатність виконувати дії в бізнес-системах: створювати замовлення, перевіряти статуси, повернення, надсилати сповіщення. Кожна дія — це готовий модуль, який система викликає за планом. Планувальник дій формує послідовність кроків на основі типу запиту та контексту користувача. Якщо план успішно виконано — відповідь надсилається автоматично. В іншому випадку система ескалює задачу оператору з докладним логом помилок.
Практичний кейс: онлайн-рітейлер, 2500 запитів/день
До впровадження: середній час першої відповіді 4.2 години, 12 операторів працюють у три зміни, 60% часу витрачається на типові статусні запити.
| Тип запиту | Частка в потоці |
|---|---|
| Статус замовлення | 41% |
| Повернення | 19% |
| Технічні проблеми | 14% |
| Загальні питання | 17% |
| Скарги та претензії | 9% |
Після впровадження:
- Автономна обробка без участі оператора: 74%
- Середній час першої відповіді: з 4.2 годин до 2.1 хвилини (у 120 разів швидше)
- Нічна зміна: скорочена з 4 до 1 оператора (моніторинг ескалацій)
- Точність відповідей (вибірка 500 запитів): 94.1%
- Хибні ескалації: 8.3%
- Помилкове автоматичне закриття: 2.1%
Перші два тижні після запуску пішли на донавчання класифікатора на реальних даних — точність зросла з 81% до 94% після 500 коригувань.
| Метрика | До впровадження | Після впровадження |
|---|---|---|
| Середній час першої відповіді | 4.2 год | 2.1 хв |
| Частка автономних запитів | 0% | 74% |
| Операторів у зміну | 12 | 4 (скорочення нічної зміни) |
Що входить в роботу
- Архітектура та проєктування: моделювання графа станів, визначення типів запитів, сценаріїв обробки.
- Розробка класифікатора: підбір промптів, fine-tuning GPT-4o при необхідності, тестування на історичних даних.
- Інтеграція з каналами: webhook, API, месенджери, веб-форми.
- Виконавці дій: підключення до CRM, ERP, Service Desk, написання коду для типових операцій.
- Система моніторингу: метрики в Prometheus, дашборди в Grafana, алерти за SLA.
- Документація: опис графа, API, інструкції для операторів.
- Навчання команди: воркшоп з донавчання моделі та адміністрування.
- Підтримка на запуску: 2 тижні супроводу після введення в експлуатацію.
Як ми це робимо: покроковий план
- Аналітика (1–2 тижні): збираємо логи, виявляємо типові запити, визначаємо критерії ескалації.
- Проєктування графа (1–2 тижні): створюємо StateGraph, визначаємо вузли та ребра.
- Розробка класифікатора (2–3 тижні): тренуємо модель, тестуємо на вибірці.
- Реалізація виконавців (2–4 тижні): код для кожного типу запитів.
- Інтеграція каналів (1–2 тижні): підключаємо email, API, месенджери.
- Тестування та калібрування (2 тижні): прогін на реальних даних, коригування порогів.
- Деплой та моніторинг: розгортання на Kubernetes, налаштування алертів.
Строки
- Архітектура системи та граф: 1–2 тижні
- Класифікатор + збагачення даних: 2–3 тижні
- Виконавці для кожного типу запитів: 2–4 тижні
- Інтеграція з каналами (email, месенджери): 1–2 тижні
- Калібрування та запуск у production: 2 тижні
- Разом: 8–13 тижнів
Оцінимо ваш проєкт — просто напишіть нам. Ми гарантуємо прозорість на кожному етапі та передаємо повну документацію. Сертифіковані інженери з досвідом 10+ років реалізують систему під ключ. Для попередньої оцінки вашого потоку запитів замовте безкоштовний аудит — ми визначимо потенціал автоматизації та строки впровадження.







