Коротко
Автор подключил Hindsight к FastAPI-ассистенту продаж, чтобы находить похожие успешные сделки и использовать их стратегии для новых запросов. Главный вывод — семантический поиск сработал, но важно не записывать принятую стратегию как проверенный успех: согласие с советом и результат сделки — разные факты.
Контекст
Автор создал DealMind — небольшой ассистент для B2B-продавцов, работающий с CRM на SQLite. FastAPI предоставляет чат с потоковой выдачей, сохранение стратегий и обновление исходов сделок; Hindsight отвечает за память, а LLM openai/gpt-oss-120b на Groq формирует рекомендации. В статье автор разбирает как интеграцию памяти, так и ошибку в том, когда и с какой меткой сохранять стратегии.
Главное
- В демонстрационной CRM — 20 сделок с этапом, суммой, ролью контакта, препятствием и причиной успеха для закрытых сделок.
- Для поиска автор объединяет вопрос пользователя с препятствием из CRM: для сделки Stark Industries это сопротивление крупным авансовым платежам и запрос Net-90.
- Hindsight вернул стратегию из сделки другой компании, Oscorp: привязать платежи к этапам внедрения. Совпадение обнаружилось по смыслу, без общего названия компании или ID сделки.
- Найденная память добавляется в системный промпт под заголовком «what worked in the past», а интерфейс отдельно показывает репу сам результат поиска.
- После предложения стратегии кнопка «Accept Strategy & Save to Hindsight» сохраняет её и переводит сделку в этап «Strategy Applied».
- В сохранённом тексте стратегия ошибочно называется «successfully applied», хотя на момент принятия совет ещё не подтверждён исходом сделки.
- Эндпоинт /api/update_outcome отмечает Closed Won или Closed Lost в SQLite, но пока не обновляет Hindsight.
- Для холодного старта автор заранее добавил четыре стратегии из закрытых сделок: по авансовым затратам, простоям при миграции, привязке к поставщику и требованиям к локальному размещению.
- При интеграции обнаружились утечки HTTP-сессий aiohttp: клиент теперь закрывается через api.api_client.close() как при успехе, так и при ошибке.
Как сделано
При запросе автор берёт текст вопроса и дополняет его препятствием активной сделки из CRM. Получившийся запрос передаётся в Hindsight через RecallRequest с лимитом до трёх результатов. Найденные воспоминания включаются в контекст LLM; интерфейс заранее показывает совпадения, чтобы продавец мог проверить источник рекомендации.
В исходной схеме принятие совета вызывает retain_memories с объектом MemoryItem, после чего сделка получает этап «Strategy Applied». Автор планирует разделить запись на два события: сохранять принятую стратегию как предложенную, а после закрытия сделки добавлять отдельную память о том, сработала она или нет. Отдельный скрипт заполняет новую базу четырьмя примерами из CRM.
Результаты
По словам автора, память помогла получить конкретную рекомендацию о платежах по этапам внедрения для похожей сделки, тогда как без памяти модель давала более общие советы о скидках и переговорах. Контролируемого сравнения и количественной оценки улучшения автор не проводил. Также он исправил закрытие HTTP-клиента, добавил предупреждения при отсутствии ключа и видимый в интерфейсе индикатор найденных воспоминаний.
Ограничения
Нет контролируемого сравнения качества ответов, поэтому улучшение описано только как заметная разница в примерах. Банк памяти для первого запуска предварительно заполнен стратегиями из демонстрационных данных — это не результат обучения на новых сделках. Принятие стратегии сейчас может ошибочно выглядеть как доказательство её эффективности; исправление автор только планирует. Кроме того, инициализатор перезагружает CRM при каждом старте приложения, поэтому локальные изменения этапов теряются, хотя память Hindsight сохраняется. Стоимость и производительность системы не измерялись.
Что взять себе
- Для поиска похожего опыта передавайте описание проблемы из CRM, а не только общий вопрос пользователя.
- Показывайте исходную найденную память отдельно от ответа модели, чтобы человек мог проверить основание рекомендации.
- Сохраняйте одобрение совета и подтверждённый исход сделки как разные события.
- Явно сообщайте о предварительно загруженной памяти и делайте ошибки её подключения заметными.
- В асинхронных интеграциях проверяйте закрытие HTTP-клиентов на всех путях выполнения.
Читать оригинал, если…
Откройте оригинал, если нужны детали кода FastAPI и вызовов Hindsight, реализация эндпоинтов или ссылка на репозиторий.