Как заставить LLM использовать внешние инструменты (например, поиск в гугле, калькулятор, Википедию) при генерации текста
Известная проблема LM в том, что вместо точной информации они зачастую генерят полную отсебятину. Как было и со скоропостижно скончавшейся Galactica, которая выдумывала цитирования или факты. Понятно, что хочется сделать так, чтобы модель ходила за точной инфой в базу данных, поисковый движок или python script
Для этого нужно несколько шагов:
1. Специфичный промтинг (как всегда). Про это был пост в канале DL in NLP. Модели на вход подается большой промт, где объясняется, что она может инициировать IPython session (чтобы в том числе импортировать модуль Википедии), чтобы ответить на вопрос. Выглядит промт примерно так:
«If you can answer directly, use this format:
Question: ${Question}
Answer: ${Answer}
You are unable to directly answer any question <…>
In these cases, consult Python. Use this format:
Question: ${Question}
IPython session:
${IPython commands and output needed to find answer}»
+ далее сам вопрос
Важно заметить, что в этом случае никакой код не прогоняется – модель его только генерирует, но это тем не менее уже немного повышает ее фактологичность и способность к вычислениям.
2. Self-ask. Логичное продолжение идеи «let’s think step by step» из этой статьи. Для ответа на сложные вопросы, нужно заставить модель здавать сначала промежуточные. Пример промта выглядит примерно так:
«Question: When was the founder of craigslist born?
Are follow up questions needed here: Yes.
Follow up: Who was the founder of craigslist?
Intermediate answer: Craigslist was founded by Craig Newmark.
Follow up: When was Craig Newmark born?
Intermediate answer: Craig Newmark was born on December 6, 1952.
So the final answer is: December 6, 1952»
+ далее сам вопрос
При ответе на новый вопрос, модель будет имитировать такую структуру ответа, и снова окажется более фактологичной.
3. Почему бы в предыдущем примере вместо того, чтобы дать модели самой отвечать на промежуточные ответы, не отправлять этот запрос в поисковый движок гугла? Или для вычислений – почему бы действительно не прогнать сгенерированный код, подставив в дальнейшую генерацию модели результат его исполнения?
Эту задачу из коробки сейчас стали решать LangChainAI. Вообще их либа в целом помогает строить пайплайны для промтинга, но киллер-фича – это как раз возможность передать задачу поиска и/или вычисления соответствующему агенту, который ее выполнит.
Работает это так, что модель генерирует follow-up вопросы, и для ответа на них может быть выбрано то или иное действие (Search/Calculate). Результат этого действия подставляется как ответ на этот промежуточный вопрос («Intermediate answer»), и с его учетом модель продолжает дальше свою генерацию. Например, после этого она может вызвать какое-то другое следующее действие, как в задании на скрине. Весь тяжелый промтинг, нужный для того, что это работало, происходит на стороне LangChain, и руками это прописывать не нужно (удобно!).
В целом исполнение идеи пока сырое, но безумно радостно видеть, что этот очевидный пробел начали закрывать. Очень много функционала сюда можно накрутить; как уже показывали примеры, с помощью jupyter сессии модель может сделать аналитику по реально существующему датасету; можно подтягивать базы цитирований и предлагать хорошие списки литературы; можно генерить отчеты с реальными показателями фирм, которые можно нагуглить.
Possibilities are endless короче 🌈
Post #884
2.71K