AI-автоматизация генерации коммерческих предложений
Менеджер тратит 1–3 часа на КП под каждого клиента. AI-система генерирует персонализированное коммерческое предложение за 2–5 минут: извлекает данные из CRM, подбирает релевантные кейсы, формулирует ценностное предложение под конкретную боль клиента, собирает PDF с фирменным дизайном.
Архитектура системы
CRM данные (AmoCRM/Bitrix24) + шаблон отрасли
↓ GPT-4o: персонализация контента и структуры
↓ Подбор кейсов из базы знаний (vector search)
↓ Генерация PDF (WeasyPrint / python-docx)
↓ Трекинг открытий (pixel tracking / DocuSign)
Генератор персонализированного КП
from openai import AsyncOpenAI
from dataclasses import dataclass
import json
client = AsyncOpenAI()
@dataclass
class ProposalBrief:
client_name: str
client_company: str
industry: str
pain_points: list[str] # из CRM-заметок менеджера
budget_tier: str # small (<500k), mid (500k-3M), enterprise (3M+)
decision_maker_role: str # CTO, CEO, CMO, Head of IT
service_type: str
relevant_cases: list[dict] # из базы кейсов
manager_name: str
deadline_pressure: bool = False
async def generate_commercial_proposal(brief: ProposalBrief) -> dict:
cases_summary = "\n".join([
f"- {c['client']} ({c['industry']}): {c['result']}"
for c in brief.relevant_cases[:3]
])
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": f"""Ты — B2B-копирайтер, специалист по продающим коммерческим предложениям.
Создай КП, ориентированное на лицо принятия решений: {brief.decision_maker_role}.
СТРУКТУРА:
1. Персональное обращение (боль клиента, не хвастовство о нас)
2. Понимание задачи (покажи, что разобрались в проблеме)
3. Наше решение (конкретно под задачу, не универсальный сервис)
4. Почему мы (кейсы, цифры, не слова)
5. Что получите (измеримый результат)
6. Следующий шаг (конкретный CTA с датой)
Тон: уверенный, без лести и клише ("мы рады предложить...").
Бюджетный уровень клиента: {brief.budget_tier} — регулируй детализацию.
{"Добавь акцент на срочность решения." if brief.deadline_pressure else ""}
Верни JSON: {{executive_summary, problem_statement, solution_description, why_us, deliverables, next_steps, subject_line}}"""
}, {
"role": "user",
"content": f"""
Клиент: {brief.client_name}, {brief.client_company} ({brief.industry})
Боли: {', '.join(brief.pain_points)}
Услуга: {brief.service_type}
Релевантные кейсы:
{cases_summary}
Менеджер: {brief.manager_name}
"""
}],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
Поиск релевантных кейсов через векторную БД
from openai import OpenAI
import numpy as np
sync_client = OpenAI()
def find_relevant_cases(
client_industry: str,
pain_points: list[str],
case_database: list[dict],
top_k: int = 3
) -> list[dict]:
"""Ищем кейсы, близкие к задаче клиента по семантике"""
query = f"{client_industry}: {', '.join(pain_points)}"
query_embedding = sync_client.embeddings.create(
model="text-embedding-3-small",
input=query
).data[0].embedding
scored_cases = []
for case in case_database:
case_text = f"{case['industry']}: {case['challenge']} → {case['result']}"
case_embedding = sync_client.embeddings.create(
model="text-embedding-3-small",
input=case_text
).data[0].embedding
similarity = np.dot(query_embedding, case_embedding) / (
np.linalg.norm(query_embedding) * np.linalg.norm(case_embedding)
)
scored_cases.append((similarity, case))
return [case for _, case in sorted(scored_cases, reverse=True)[:top_k]]
Сборка PDF с фирменным дизайном
from weasyprint import HTML, CSS
from jinja2 import Environment, FileSystemLoader
import base64
def render_proposal_pdf(proposal_data: dict, template_name: str = "default") -> bytes:
env = Environment(loader=FileSystemLoader("templates/proposals"))
template = env.get_template(f"{template_name}.html")
html_content = template.render(**proposal_data)
# Фирменный CSS с переменными цветов бренда
css = CSS(string="""
@page { size: A4; margin: 20mm 15mm; }
body { font-family: 'Inter', sans-serif; color: #1a1a2e; }
.highlight { background: #f0f4ff; border-left: 4px solid #4361ee; padding: 12px; }
.case-block { border: 1px solid #e2e8f0; border-radius: 8px; padding: 16px; }
""")
pdf_bytes = HTML(string=html_content).write_pdf(stylesheets=[css])
return pdf_bytes
Интеграция с CRM
Система подключается к AmoCRM или Bitrix24 через API: при переводе сделки в стадию «Подготовка КП» автоматически запрашивает данные контакта, историю переговоров из заметок, тип услуги из поля сделки. Менеджер получает черновик в течение 2–3 минут и вносит финальные правки в веб-редакторе перед отправкой.
Трекинг реализуется через pixel-пиксель в HTML-письме или DocuSign API — менеджер видит, когда клиент открыл КП и сколько времени провёл на каждой странице.
Варианты персонализации по роли ЛПР
| Роль | Акцент в КП | Язык |
|---|---|---|
| CEO | ROI, стратегический эффект, риски бездействия | Бизнес-результаты |
| CTO | Архитектура, технологии, сроки, качество кода | Технический |
| CFO | TCO, окупаемость, экономия на FTE | Финансовые метрики |
| CMO | Метрики привлечения, конверсия, brand awareness | Маркетинговые KPI |
Генератор КП с интеграцией одной CRM и PDF-экспортом — 2–3 недели. Полная платформа с базой кейсов, трекингом, A/B-тестированием версий и аналитикой конверсии — 6–8 недель.







