Разработка AI-ассистента для CRM: суммаризация звонков и предложения
AI-ассистент для CRM автоматизирует рутинные задачи менеджеров по продажам: суммаризация переговоров, извлечение данных для обновления сделки, генерация follow-up письма, подготовка к следующему контакту. Менеджер фокусируется на продажах, а не на заполнении CRM.
Архитектура CRM-ассистента
from anthropic import Anthropic
from pydantic import BaseModel
from typing import Optional, Literal
import json
client = Anthropic()
class CallSummary(BaseModel):
key_points: list[str]
client_needs: list[str]
objections: list[str]
agreements: list[str]
next_steps: list[str]
deal_probability: Literal["high", "medium", "low"]
sentiment: Literal["positive", "neutral", "negative"]
class CRMFields(BaseModel):
title: Optional[str] = None
budget: Optional[float] = None
timeline: Optional[str] = None
decision_maker: Optional[str] = None
competitors_mentioned: list[str] = []
pain_points: list[str] = []
notes: str = ""
class CRMAssistant:
def summarize_call(self, transcript: str) -> CallSummary:
"""Суммаризует транскрипцию звонка"""
response = client.messages.create(
model="claude-haiku-4-5",
max_tokens=2048,
system="""Ты — ассистент по продажам. Анализируй переговоры.
Будь конкретным: указывай факты, цифры, имена из разговора.""",
messages=[{
"role": "user",
"content": f"""Проанализируй звонок и верни JSON:
{{
"key_points": ["ключевые моменты"],
"client_needs": ["потребности клиента"],
"objections": ["возражения"],
"agreements": ["договорённости"],
"next_steps": ["следующие шаги"],
"deal_probability": "high|medium|low",
"sentiment": "positive|neutral|negative"
}}
Транскрипция:
{transcript}"""
}]
)
text = response.content[0].text
data = json.loads(text[text.find("{"):text.rfind("}") + 1])
return CallSummary(**data)
def extract_crm_fields(self, transcript: str) -> CRMFields:
"""Извлекает данные для обновления CRM"""
response = client.messages.create(
model="claude-haiku-4-5",
max_tokens=1024,
messages=[{
"role": "user",
"content": f"""Извлеки данные из разговора для CRM.
Верни только то, что явно упоминалось в разговоре.
{{
"title": "название сделки если обсуждалось",
"budget": число или null,
"timeline": "сроки если упоминались",
"decision_maker": "ЛПР если называли",
"competitors_mentioned": ["конкуренты если упоминались"],
"pain_points": ["боли клиента"],
"notes": "важные заметки"
}}
Разговор:
{transcript[:3000]}"""
}]
)
text = response.content[0].text
try:
data = json.loads(text[text.find("{"):text.rfind("}") + 1])
return CRMFields(**data)
except Exception:
return CRMFields()
def generate_followup_email(
self,
summary: CallSummary,
crm_fields: CRMFields,
manager_name: str,
client_name: str,
company_name: str,
) -> str:
"""Генерирует follow-up письмо после звонка"""
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{
"role": "user",
"content": f"""Напиши follow-up письмо после переговоров.
Менеджер: {manager_name}
Клиент: {client_name}, компания {company_name}
Ключевые моменты разговора:
{chr(10).join(f"- {p}" for p in summary.key_points)}
Договорённости:
{chr(10).join(f"- {a}" for a in summary.agreements)}
Следующие шаги:
{chr(10).join(f"- {s}" for s in summary.next_steps)}
{f"Обсуждаемый бюджет: {crm_fields.budget}" if crm_fields.budget else ""}
{f"Сроки: {crm_fields.timeline}" if crm_fields.timeline else ""}
Требования к письму:
- Деловой, профессиональный тон
- Кратко: 3-4 абзаца
- Подтверди договорённости
- Укажи следующий шаг с конкретной датой если есть
- Подпись менеджера"""
}]
)
return response.content[0].text
def prepare_next_meeting(
self,
summary: CallSummary,
crm_history: list[dict],
meeting_agenda: str = "",
) -> str:
"""Готовит бриф для следующего контакта"""
history_text = "\n".join([
f"[{h['date']}] {h['summary']}"
for h in crm_history[-5:]
]) if crm_history else "Первый контакт"
response = client.messages.create(
model="claude-haiku-4-5",
max_tokens=1024,
messages=[{
"role": "user",
"content": f"""Подготовь бриф менеджера для следующего контакта.
История взаимодействий:
{history_text}
Итоги последнего звонка:
- Потребности: {", ".join(summary.client_needs)}
- Возражения: {", ".join(summary.objections)}
- Договорённости: {", ".join(summary.agreements)}
{f"Планируемая повестка: {meeting_agenda}" if meeting_agenda else ""}
Включи:
1. Контекст (что важно помнить)
2. Открытые вопросы требующие проработки
3. Рекомендуемые аргументы против возражений
4. Предложения и материалы для встречи"""
}]
)
return response.content[0].text
Интеграция с популярными CRM
class AmoCRMIntegration:
"""Интеграция с amoCRM (популярна в России)"""
def __init__(self, domain: str, access_token: str):
self.base_url = f"https://{domain}.amocrm.ru/api/v4"
self.headers = {"Authorization": f"Bearer {access_token}"}
def update_lead(self, lead_id: int, fields: CRMFields, note: str):
"""Обновляет сделку данными из звонка"""
import requests
# Обновляем поля сделки
update_data = {}
if fields.budget:
update_data["price"] = int(fields.budget)
if fields.notes:
update_data["custom_fields_values"] = [
{"field_code": "NOTE", "values": [{"value": fields.notes}]}
]
if update_data:
requests.patch(
f"{self.base_url}/leads/{lead_id}",
headers=self.headers,
json=update_data
)
# Добавляем примечание
requests.post(
f"{self.base_url}/leads/{lead_id}/notes",
headers=self.headers,
json={"note_type": "common", "params": {"text": note}}
)
Практический кейс: B2B-продажи SaaS
Команда: 8 менеджеров по продажам, 15–20 звонков в день у каждого.
Проблема: менеджеры тратили 20–30 минут после каждого звонка на CRM + письмо. "Горячий" момент после звонка терялся.
Результат:
- Время post-call работы: 25 мин → 5 мин (ревью AI черновика)
- Качество follow-up писем: значительно выросло (более конкретные, с правильными деталями)
- Заполнение CRM: 70% автоматически
- Конверсия из первого звонка в следующий шаг: +18%
Сроки
- Суммаризация + извлечение полей: 3–5 дней
- Follow-up генерация: 2–3 дня
- CRM интеграция (amoCRM/Bitrix): 3–5 дней
- Встроенная транскрипция звонков: +1 неделя







