LLM могут быть более полезными и менее подверженными галлюцинациям, когда они могут читать соответствующие документы, веб-страницы и предыдущие разговоры, прежде чем отвечать на новый вопрос пользователя. К сожалению, LLM имеют конечную длину контекста, которая может быть быстро превышена при запросе на чтение этих внешних ресурсов. Так что надо как-то решить, какие ресурсы стоит попросить прочитать LLM, а получается, что это проблема ранца.
Обзор рюкзака
Задача о рюкзаке — это классическая задача динамического программирования, которая обычно начинается со следующего описания:
Вор, грабящий магазин, находит N предметов. Товар i стоит v[i] долларов и весит w[i] фунтов, где v[i] и w[i] — целые числа. Вор хочет взять как можно более ценный груз, но может унести в своем рюкзаке не более W фунтов за некоторое целое число W.
Какие предметы должен украсть вор?
Вышеприведенное технически представляет собой вариант 0–1 задачи о рюкзаке, потому что вор может украсть либо 0 из 1 копий каждого предмета (а не несколько копий или дробные копии).
Решить, что показать LLM
Давайте представим, что вы используете LLM для ответа на вопрос пользователя и хотите, чтобы он прочитал как можно больше соответствующих документов, прежде чем ответить. Каждый документ стоит LLM определенное количество токенов для чтения, что равно w[i]. Кроме того, у каждого документа есть некоторое значение v[i], которое можно вычислить различными способами в зависимости от ваших целей. Например, вы можете использовать эмбеддинги и косинусное сходство для оценки документов на основе того, насколько они семантически похожи на новый вопрос пользователя. Возможно, вы также хотите уменьшить оценку старых документов, поскольку они с большей вероятностью содержат устаревшую информацию.
После того, как каждый документ имеет известную стоимость и значение, нам нужно определиться с бюджетом токена W. Максимальное значение для W равно L — P — R, где L — длина контекста LLM, P — это длина приглашения, предшествующего выбранным документам, а R — это количество маркеров, зарезервированных для ответа LLM. Теперь вы можете подключить все эти входные данные к Knapsack, и вам будет возвращена подборка документов, наиболее достойных чтения с учетом вашего бюджета.
Другие соображения
- Вместо этого вы можете захотеть использовать жадное приближение решения задачи о рюкзаке, потому что оно работает за O(N log N) и имеет очень простую стратегию: сначала выбираются элементы с наивысшим отношением ценности к весу. Решение динамического программирования работает за время O(N * W), которое является псевдополиномиальным, но в некоторых случаях может быть гораздо более оптимальным.
- Разделение документа может быть жизнеспособной стратегией для работы с документами, содержащими нерелевантную информацию. Однако решить, как разделить документ, сохранив его значение, кажется нетривиальной задачей. Может быть, LLM сам мог предварительно обработать и обобщить документы?
Найди меня в Твиттере или на моем личном сайте.
Первоначально опубликовано на https://www.awelm.com 9 июля 2023 г.