Разработка AI-системы автоматического заполнения карточки клиента после звонка
Извлечение структурированных данных из транскрипта звонка и автоматическое заполнение полей CRM — имён, адресов, дат, сумм, пожеланий. Оператор только проверяет и подтверждает, а не вводит вручную.
NER для извлечения сущностей из звонков
async def extract_entities_from_call(transcript: str) -> dict:
"""Извлекаем структурированные данные из диалога"""
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": """Извлеки из текста звонка следующие данные (если упоминались):
- customer_name: полное имя клиента
- address: адрес доставки/проживания
- email: email адрес
- phone_secondary: дополнительный телефон
- order_details: детали заказа/запроса
- complaint_description: описание проблемы
- preferred_contact_time: удобное время для связи
- product_interest: интересующие продукты/услуги
- next_appointment: дата/время следующего контакта
- notes: важные заметки
Верни JSON. Поля не упоминавшиеся в разговоре — null."""
}, {
"role": "user",
"content": transcript
}],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
Confidence scoring для каждого поля
async def extract_with_confidence(transcript: str) -> dict:
"""Извлечение с оценкой уверенности"""
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": """Извлеки сущности из звонка.
Для каждого поля верни: {"value": "...", "confidence": 0.0-1.0, "source": "цитата из текста"}
Confidence: 1.0 — явно сказано, 0.7 — подразумевается, 0.3 — предположение."""
}, {"role": "user", "content": transcript}],
response_format={"type": "json_object"}
)
data = json.loads(response.choices[0].message.content)
# Поля с confidence < 0.6 помечаем для ручной проверки
for field, info in data.items():
if isinstance(info, dict):
info["needs_review"] = info.get("confidence", 1.0) < 0.6
return data
Merge с существующей карточкой
async def smart_merge_contact_data(
existing: dict,
extracted: dict
) -> dict:
"""Умное слияние: не затираем старые данные новыми неуверенными"""
merged = dict(existing)
for field, new_data in extracted.items():
if not isinstance(new_data, dict) or new_data.get("value") is None:
continue
if field not in existing or not existing[field]:
# Поле пустое — заполняем
merged[field] = new_data["value"]
elif new_data.get("confidence", 0) >= 0.85:
# Высокая уверенность — обновляем
merged[field] = new_data["value"]
merged[f"{field}_updated_from_call"] = True
else:
# Предлагаем оператору выбрать
merged[f"{field}_suggestion"] = new_data["value"]
merged[f"{field}_suggestion_confidence"] = new_data["confidence"]
return merged
UI для проверки перед сохранением
После звонка на экране оператора — карточка с предзаполненными полями. Зелёный — высокая уверенность, жёлтый — требует подтверждения, серый — пустое поле.
Сроки: NER + заполнение одной CRM — 2–3 недели. Мультиплатформенная система с UI — 1.5 месяца.







