5.1 Chain-of-thoughts («цепочка размышлений»)
Иногда чтобы модель дала качественный ответ, недостаточно написать для неё подробный системный промпт и даже показать правильный ответ по методу few-shot. В этом случае на помощь приходят продвинутые методы системного промптинга. В этом уроке мы рассмотрим два из них: Сhain of Thoughts («цепочка раcсуждений») и SmartLLM Pipeline.

Метод Chain of thoughts («цепочка размышлений»)

Итак, цепочка рассуждений (Chain of thoughts, CoT) — это метод, при котором GigaChat генерирует несколько промежуточных шагов-размышлений, прежде чем даёт финальный ответ на запрос. Это позволяет увидеть, как модель пришла к такому ответу и существенно повышает его качество.

Разберем метод CoT на примере.

1) Сначала разработаем пайплайн, в котором GigaChat будет проверять сам себя:
  • первый ответ на запрос;
  • формирование дополнительных проверочных вопросов;
  • ответ на проверочные вопросы;
  • итоговый ответ

2) Теперь импортируем необходимые модули из GigaChain и запустим GigaChat:
3) Дальше инициализируем шаблон, с помощью которого получим исходный ответ на вопрос:
Здесь BASELINE_PROMPT — строка шаблона промпта, в котором будет передаваться наш запрос query. Переменные в такой строке шаблона нужно выделить фигурными скобками по аналогии с f-string.

С помощью BASELINE_PROMPT мы инициализируем baseline_response_prompt_template — экземпляр класса шаблона запроса langchain, который затем используется как входная точка в baseline_response_chain — отдельной цепочке нашего пайплайна, в которой будет генерироваться первая версия ответа.

Она состоит из шаблона для запроса модели, в которую мы будем делать этот запрос и StrOutputParser — парсера результата, который сконвертирует выход модели в строку.

4) По аналогии инициализируем цепочку для генерации уточняющих вопросов:
5) Теперь по тому же принципу инициализируем цепочку base_verification_chain.
В цепочке генерации вопросов мы зафиксировали то, что каждый вопрос будет начинаться с новой строки, поэтому теперь ответим на каждый из этих вопросов по отдельности с помощью метода .map() цепочки base_verification_chain.

В результате работы verification_chain получим «склеенные» вместе вопрос и ответ.
6) Для получения финальной версии ответа реализуем final_answer_chain, принимающую на вход запрос, исходный ответ и информацию по уточняющим вопросам.
7) Наконец, соединим все наши цепочки вместе в одну цепь chain. С помощью .assign() здесь мы присваиваем результату работы каждой компоненты имя, по которому могут обращаться все последующие компоненты цепи.
Вот как разработанная цепочка CoT работает на примере. GigaChat с помощью уточняющих вопросов приходит к правильному ответу, исправив первый, ошибочный ответ: