LLM. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models
⛓️ Chain-of-Thought Prompting Elicits Reasoning in Large Language Models
🤘 one-liner:
Способствование генерации цепочек рассуждений, а не только ответов, в больших языковых моделях значительно улучшает решение сложных задач
В целом на этом можно и закончить разбор!
Собственно как все таки раскрыть способность больших языковых моделей к рассуждению.
- По старинке. обучать с нуля или finetuning
- В In-context режиме. Вместо того чтобы дообучить модель под конкретную задачу, можно адаптировать замороженную языковую модель к задачам, предоставляя в промпт, включающий в себе условие задачи и несколько входных и выходных примеров.
♿️ Ограничения простого промптинга Второй подход плохо справляется с задачами, требующими способности к рассуждению, и при этом увеличении размера языковой модели не сильно улучшает качество.
💡 Идея В качестве примеров в промпте использовать не дуплет, а триплет:<input, output>→<input, chain of thought, output>
Где сhain of thought — последовательность промежуточных шагов (рассуждений) на естественном языке, которые приводят к конечному результату.
- Не нужно преобучать llm под конкретную задачу, выбрасывая время на сбор необходимого датасета и деньги на GPU-часы
- Благодаря prompt-base подходу можно выполнять множество задач используя одни и теже веса модели
💫 Положительные свойства CoT 1. При разделении сложной задачи на последовательные этапы, модель может выделять дополнительные ресурсы для решения тех задач, где требуется больше шагов в рассуждениях
2. Такой подход делает процесс генерации более прозрачным. Благодаря цепочки рассуждений можно понять как модель пришла к тому или иному ответу. Тем самым появляется возможность для отладки
3. Данных подход может быть использован с любой LLM, просто включив примеры последовательностей цепочки рассуждений в промпт
Нужно отметить что метод расцветает с увеличением размера модели.
♿️ Ограничения CoT
1. Не понятно где именно происходит процесс рассуждения в LLM
2. Для finetuning ручное добавление к обычному запросу CoT может быть дорогим, хотя в целом эту часть можно будет выполнять при помощи автогенерации
3. Нет гарантии генерации правильной цепочки рассуждений и тем более правильного ответа при правильной цепочки рассуждений
4. Как видно из графиков выше, CoT начинает работать на больших моделях, деплой которых может позволить себе далеко не каждый
❓ Потные вопросы 1. Интуиция почему подход CoT благоприятно влияет на результаты модели?
2. Почему метод начинает показывать хорошие результаты начиная с размерности в ∼100B параметров?
👨💻 Code
from langchain.llms import OpenAI llm = OpenAI( model_name="text-davinci-003", temperature=0, ) default_prompt = """ I went to the market and bought 10 apples. I gave 2 apples to the neighbor and 2 to the repairman. I then went and bought 5 more apples and ate 1. How many apples did I remain with? """ default_output = llm(default_prompt) print(default_output)
13 apples
cot_prompt = """ I went to the market and bought 10 apples. I gave 2 apples to the neighbor and 2 to the repairman. I then went and bought 5 more apples and ate 1. How many apples did I remain with? Let's think step by step. """ cot_output = llm(cot_prompt) print(cot_output)
I bought 10 apples. I gave away 4 apples. I bought 5 more apples. I ate 1 apple. So, I remain with 10 apples.