Еще в 2023 я использовал в продакше Chain of Thought и Chain of Prompts (цепочка мыслей и цепочка промптов).
Первое – это "думай по шагам", чтобы LLM не сразу давала ответ, а сначала подумала "вслух" (сейчас все модели уже сразу дообучены так делать).
Второе – разбиваем сложную задачу на несколько этапов и делаем их по очереди отдельными запросами (выдели логические блоки из текста и придумай названия → напиши саммари для каждого → переведи на русский)
Но тут несколько проблем:
1. Chain of Thought выбирает совсем разные шаги для похожих входных данных и вообще делает что хочет
2. Chain of Prompts жрет кучу денег, т.к. каждый этап делаем новый запрос (заново загружая токены контекст). Плюс занимает больше времени на выполнение (бывает критично).
А что делать то?
✨Custom Chain of Though✨ – делаем один запрос, но четко указываем, какие шаги нужно сделать и формат результата
Упрощенный пример из двух шагов:
[тут у нас какой-то промт]...
Ответь сначала на английском. Потом переведи на русский
# output format
Response
<english response>
Translation
<перевод на русский>
Тут модель при генерации ответа "думает" на своем родном английском → нет просадки качества из-за чужого языка. При этом сразу получаем версию на русском. Так она еще и лучше по качеству, чем если просто в новом чате скинуть английский результат и попросить перевести. Есть идеи почему так? 🙃
Ну и че тут такого, все очевидно, где рокет саенс?
А нет рокет саенса, это простой дубовый подход, который работает. Дает управляемую генерацию в несколько шагов, экономит деньги и снижает задержку до результата.
А если использовать structured output, то LLMка, даже если очень захочет, не сможет сгенерировать другие шаги. Ну и так можно не только линейный список шагов задавать, а еще и дерево с ветвлениями, которые выбираются прям во время генерации.
А это, я считаю, разъеб.