18 KiB
Да, так двигаться можно, но не в виде «сейчас добьём все сложные вопросы, а потом когда-нибудь займёмся длинным диалогом». Правильнее так:
сейчас добивать сложные вычислительные вопросы — да, но уже сейчас заложить минимальный каркас длинного диалога, чтобы потом не пришлось ломать всё заново.
То есть ответ не «сначала одно, потом другое», а:
основной фокус — на сложных доказуемых вопросах, но с обязательной тонкой прослойкой state/navigation уже сейчас.
Почему так
У тебя сейчас по сути есть три разных задачи, и их нельзя смешивать:
1. Доказательный вычислительный контур
Это вопросы типа:
- кому должны;
- кто должен нам;
- остатки;
- задолженность;
- обязательства на дату;
- НДС;
- обороты;
- сверки;
- причины расхождения.
Тут нужен не “умный ассистент”, а строгий финансовый движок ответа. LLM тут только:
- понимает запрос,
- канонизирует,
- упаковывает ответ.
2. Диалоговая навигация по результатам
Это уже история:
- покажи должников;
- открой первого;
- покажи документы по нему;
- открой вот этот документ;
- вернись к списку;
- теперь покажи только крупных;
- а теперь снова общий список.
Это вообще другая задача. Это не про бухгалтерский расчёт, а про сессионное состояние, ссылки на объекты и навигацию.
3. Разговорный слой
Это:
- как красиво формулируется ответ;
- как держится контекст;
- как не врёт;
- как не теряет тему;
- как уточняет.
Если не разделить эти три задачи, начнётся каша:
- вычислительные баги будете лечить промптом;
- диалоговые провалы — данными;
- архитектурные проблемы — текстом ответа.
Что у вас уже сделано правильно
Судя по описанию, вы уже сделали важную правильную вещь: вы ушли от «говно-MVP на if-ах» к более нормальной оркестрации и явным контрактам.
Это правильно.
Потому что без этого дальше было бы бессмысленно развивать сложные вопросы.
Где сейчас опасность
Опасность у вас не в том, что вы пошли в сложные вопросы. Опасность в другом:
вы можете начать чинить сложные кейсы так, что они размоют рабочие простые кейсы.
Это самая частая проблема.
То есть:
- новый route ради сложного кейса начинает перехватывать старые запросы;
- новая нормализация ломает короткие вопросы;
- новый orchestration layer делает хуже там, где раньше всё было стабильно;
- deep/fallback начинает срабатывать там, где раньше был простой exact answer.
Поэтому тебе сейчас нельзя работать по принципу:
“ну сейчас доделаем тяжёлые вопросы, а там посмотрим”
Нужен другой режим:
сложные кейсы добавляются как отдельный слой, не ломая работающий baseline.
Самый правильный способ двигаться сейчас
Главный принцип:
не делать “общую умность”, а делать “изолированные доказательные capability-маршруты”.
То есть не надо пытаться “в целом сделать ассистент умнее”. Надо делать конкретные capability-блоки:
- confirmed_payables_as_of_date
- confirmed_receivables_as_of_date
- vat_obligation_breakdown
- account_balance_as_of_date
- document_chain_explainer
- debtor_detail_drilldown
- settlement_reconciliation_trace
И каждый из них:
- имеет входной контракт,
- имеет data-route,
- имеет свой evidence model,
- имеет свои acceptance tests.
Это намного стабильнее, чем пытаться “допилить общий интеллект”.
Можно ли сейчас фокусироваться на сложных вопросах, а длинные цепочки делать потом
Да, но только частично.
Правильный ответ такой:
Что можно отложить
Можно отложить:
- полноценную богатую conversational UX-историю;
- красивые возвращения по веткам;
- умные эллипсисы типа “тот же документ, что мы обсуждали раньше”;
- сложные нелинейные прыжки по истории.
Что нельзя откладывать
Нельзя откладывать:
- модель состояния результата;
- идентификаторы result set’ов;
- идентификаторы выбранных объектов;
- контекст фокуса;
- операции drilldown / back / reopen / refine.
Потому что если этого не заложить сейчас, потом всё придётся перепахивать.
Очень важная мысль
Длинный диалог в вашем кейсе — это не “LLM держит контекст”.
Это вообще не об этом.
Это должно быть не:
- “модель помнит, о чём говорили”,
а:
- “система хранит конкретный объектный state разговора”.
Например:
После запроса “покажи должников”
создаётся объект:
result_set_id = debtors_2020_05_v1- тип:
receivables_list - дата среза
- фильтры
- сортировка
- список entity_id
Потом “открой второго”
создаётся:
focus_object = counterparty:gamma_mebelparent_result_set = debtors_2020_05_v1
Потом “покажи документы по нему”
создаётся:
result_set_id = docs_for_gamma_mebel_2020_05_v1- тип:
document_list - parent focus:
counterparty:gamma_mebel
Потом “вернись к списку должников”
это не магия модели, а явное:
- restore
result_set_id = debtors_2020_05_v1
Вот тогда это работает как система. А не как “LLM вроде бы держит мысль”.
Поэтому правильная стратегия у вас должна быть двухконтурной
Контур А — основной: сложные доказательные вопросы
Это ваш главный приоритет прямо сейчас.
Потому что если ассистент не умеет честно отвечать на:
- кому должны,
- кто должен нам,
- сколько НДС,
- какие обязательства открыты,
- почему расхождение,
то всё остальное рано или поздно бессмысленно.
Здесь надо добивать exact analytical routes.
Контур Б — минимальный state/navigation framework
Не весь длинный диалог целиком, а минимальный каркас.
То есть прямо сейчас нужно ввести хотя бы:
conversation_statecurrent_focusresult_setsdrilldown_historyresolvable referencesтипа “этот контрагент”, “первый”, “тот документ”, “верни прошлый список”
Без этого потом многоуровневые кейсы будут собираться заново криво.
Как бы я выстроил разработку по этапам
Этап 1. Заморозить baseline
Перед любыми тяжёлыми доработками нужно зафиксировать текущий рабочий контур:
- список простых запросов, которые уже работают;
- их эталонные ответы;
- их route expectations;
- их допустимые форматы;
- их accuracy baseline.
Иначе вы не заметите, как сложные доработки сожрут простые кейсы.
То есть нужен golden baseline suite.
Прям обязательно:
- 30–50 простых сценариев;
- 10–20 средних;
- 5–10 сложных.
И для каждого:
- intent;
- expected route;
- required evidence;
- must_not_happen;
- acceptance criteria.
Этап 2. Выделить отдельный слой exact analytical capabilities
Не один “универсальный роут”, а capability registry.
Например:
confirmed_payables_as_of_dateconfirmed_receivables_as_of_dateaccount_balance_as_of_datetax_obligation_snapshotdocument_trace_chaincounterparty_reconciliation_detail
И каждый capability должен быть:
- изолирован,
- версионирован,
- под rollout flag,
- с собственным eval suite.
Это защитит простые кейсы.
Этап 3. Для сложных вопросов делать не prompt-tuning, а data-route design
Вот тут очень важно.
На текущем этапе вам не нужно “допилить LLM, чтобы она лучше поняла вопрос”. Вам нужно:
- описать доказательный объект ответа;
- понять, какие сущности для него нужны;
- понять, где эти поля лежат;
- понять, как строится формула;
- понять, как выглядит traceability.
То есть сложный вопрос нужно разбирать не как “сложный prompt”, а как:
какой exact business computation за ним стоит?
Например, вопрос:
кому должны на май 2020
разбирается как:
- дата среза,
- открытые обязательства,
- группировка по контрагенту,
- классификация обязательств,
- исключение закрытых,
- доказательная цепочка.
Вот это правильный уровень.
Этап 4. Уже сейчас ввести минимальный state model для диалога
Не надо пока делать “идеальный длинный разговор”. Но нужно завести базовые сущности:
session_context
- active_result_set_id
- active_focus_object
- last_confirmed_route
- date_scope
- organization_scope
result_set
- id
- type
- route_id
- filters
- sort
- entity_refs[]
- source_refs[]
- created_from_turn
focus_object
- object_type
- object_id
- label
- provenance_result_set_id
navigation_event
- action: open / refine / back / compare / reset
- source_result_set_id
- target_object_id
- derived_result_set_id
Тогда потом длинный диалог нарастает нормально.
Этап 5. Сделать 2–3 эталонные длинные цепочки, а не весь “длинный диалог”
Вот это важный баланс.
Не надо сейчас пытаться закрыть все длинные диалоги. Нужно взять 2–3 ключевые цепочки и довести их как вертикальные срезы.
Например:
Цепочка 1
- покажи должников на дату
- открой крупнейшего
- покажи документы по нему
- открой документ
- покажи, чем закрывался
- вернись к списку
Цепочка 2
- кому должны на дату
- оставь только поставщиков
- покажи по конкретному контрагенту
- покажи основание долга
- покажи связанные оплаты
- верни сводку
Цепочка 3
- покажи НДС за период
- объясни расхождение
- открой документы-источники
- покажи корректировки
- вернись к агрегату
Этого уже хватит, чтобы не строить всё вслепую.
На что я бы не тратил время сейчас
Сейчас я бы не делал ставку на:
- “сделаем модель ещё умнее, и она сама вытянет”;
- бесконечную шлифовку prose-ответов;
- тонкую косметику fallback-логики;
- попытку одной общей оркестрацией покрыть всё;
- богатую свободную болталку.
Это всё вторично по сравнению с:
- exact routes,
- state model,
- regression harness,
- evidence model.
Как не сломать простые кейсы
Вот тут прям практический совет.
1. Все новые маршруты — только за флагами
Новый exact-route не должен сразу заменять старый baseline.
Сначала:
- old route remains default
- new route runs in shadow mode
- сравниваете ответы
- смотрите deltas
- только потом переводите на prod path
2. Для каждого кейса фиксируйте expected route
Например:
- “остаток по счету” не должен внезапно уйти в deep-analysis;
- “кому должны” должен идти только в confirmed payables route;
- “покажи документы по этому контрагенту” — только в drilldown route.
3. Отдельно меряйте регрессии
Не только answer correctness, но и:
- route correctness;
- evidence completeness;
- fallback frequency;
- overconfident wrong answers;
- broken referential follow-ups.
Самый правильный способ мыслить про ваш продукт сейчас
Не как про “LLM-ассистента по бухгалтерии”, а как про:
доказательный финансовый query engine + conversational navigator поверх него
Вот это, по-моему, самая точная рамка.
Потому что если мыслить “ассистентом”, вас всё время будет тянуть лечить вычислительные проблемы через LLM. А если мыслить “доказательным query engine”, тогда всё встаёт на место:
- LLM — вход и объяснение;
- engine — расчёт;
- state layer — навигация;
- evidence layer — доверие.
Мой прямой совет по порядку работ
Я бы делал так:
Сейчас
- Зафиксировать baseline простых рабочих кейсов.
- Выбрать 5–7 самых важных сложных управленческих вопросов.
- Для каждого сделать exact business route.
- Одновременно заложить минимальный result/state/navigation layer.
- Прогнать 2–3 длинные эталонные цепочки.
Не сейчас
- не пытаться закрыть весь длинный диалог целиком;
- не делать глобальную магическую “универсальную” оркестрацию;
- не лечить сложные кейсы только prompt engineering’ом.
Короткий ответ на твой главный вопрос
Да, фокус на сложных вопросах сейчас — правильный. Но полностью откладывать длинные цепочки нельзя. Их нужно не “доделывать потом”, а заложить сейчас в виде минимальной объектной модели состояния и 2–3 эталонных навигационных сценариев.
То есть:
сначала не “сложные вопросы vs длинные диалоги”, а “exact routes first, state skeleton in parallel, rich dialog later”.
Это, на мой взгляд, для вас сейчас самый здоровый путь.
Могу дальше сразу разложить это в виде конкретного roadmap-а по спринтам / этапам, чтобы это можно было отдать в работу.