Используем LLaMA 2 для обогащения поискового индекса и систем Q&A
Часто в исходном тексте некоторый объём полезной информации закодирован через местоимения, аббревиатуры, неполное написание и прочие логические, семантические, синтаксические связи. Человеку это понятно, а вот у машин возникают трудности.
Благодаря появлению больших языковых моделей есть техническая возможность распаковывать информацию "из коробки" без каких-либо дополнительных обучений моделей и сборки новых датасетов.
Публичная модель GPT3.5, доступная через платный API, локальная условно-бесплатная LLama 2 и другие LLM-модели позволяют существенно обогатить исходный текст, расширить метаданные к нему. Это может быть полезно для повышения релевантности, как в случае с полнотекстовым поиском по ключевым словам, так и для семантического поиска. В конечном счете это упрощает понимание текста и для самих моделей LLM для использования в Question Answering. Особенно для тех, что будут с меньшим числом параметров.
Далее мы рассмотрим несколько методов обогащения 1) личные местоимения, 2) аббревиатуры, 3) имена и фамилии, 4) составляем вопросы 5) выделяем ключевые слова
1. Личные местоимения - он, она, его, ее, ему
Исходный текст:
По смыслу ключевой объект NVIDIA RTX A5500 здесь упоминается 3 раза: сначала полное написание, во второй раз через местоимение "она", третий через "ее". Любая поисковая система воспримет только 1 упоминание объекта в тексте.
Решение
Чтобы повысить релевантность поиска необходимо все местоимения переписать на полное наименование объекта.
Быстрый способ протестировать гипотезу о том, что потенциально может языковая модель, это отправить задачу в GPT4 и GPT3.5 API, их ответы дадут понимание, что можно ожидать от LLM и каким образом будет работать промпт.
Cпросим LLM.
Openai GPT4 через чат-бота генерирует правильный ответ
Помимо названия объекта модель добавила еще и "видеокарта", что обогащает дальнейшие предложения.
Openai GPT3.5 API не понимает "все личные местоимения"
Просим по-другому:
Замени все "он", "она", "ее", "его" на полное наименование объекта в тексте.
Результат:
LLAMA2 13B
OpenAssistant/llama2-13b-orca-8k-3319 не понимает промпты Openai.
Предыдущие промпты в любом случае подходят для обработки не очень большого объема текстов, ибо очень дорогие по времени исполнения из-за того, что модель генерирует весь текст с заменами заново, формулируя и склоняя по правилам языка.
Необходимо:
- Предварительно анализировать текст методами языка программирования - находим в тексте местоимения. Главное чтобы не было повторяющихся местоимений в одном запросе.
- По каждому местоимению отправляем запрос в LLM модель
- Замены местоимений на наименования в тексте делать языком программирования через строковые функции.
Это будет гораздо быстрее и дешевле, потому что модель будет генерировать длину токена равную лишь наименованию объекта. Однако может потребуется цикл многоэтапной замены предложения за предложением. Каждая итерация работает сразу с ближайшими предложениями. Ниже приведен простой пример, когда блок текста уже известен и найдено два местоимения "она" и "ее".
1. Просим сначала расшифровку для "она":
Укажи только наименование объекта, к которому относится "она"?
2. Теперь для "ее":
Укажи только наименование объекта, к которому относится "ее"?
3. Обогатим текст еще больше и спросим, что это вообще такое:
Определи тип объекта NVIDIA RTX A5500.
Можно протестировать шаблоны вывода на разных текстах и парсить тип объекта. Нужно быть осторожным, ибо модель по одному и тому же промпту может выдавать ответ в разной форме.
Далее нужно сделать простую замену местоимений в тексте на "видеокарта NVIDIA RTX A5500".
Минус такого подхода по сравнению с OpenAI в том, что окончания могут не соответствовать. Но поскольку мы делаем текст в первую очередь для машины - окончания не сильно важны.
Если же хочется читабельного текста, то можно попробовать перефразировать по предложениям. Поскольку уже знаем в каком предложении какое местоимение ссылается на объект. Можно явно указать:
В ее стационарную версию поместили 24 ГБ видеопамяти GDDR6.
Перефразируй предложение - "ее" замени на "видеокарта NVIDIA RTX A5500".
Итого мы получили такой же результат как GPT3.5.
2. Расшифровываем аббревиатуры
Подход такой же как с местоимениями. В текстах могут однажды указать значение сокращений и далее по всем тексту только их и использовать. Это существенно снижает релевантность в поиске.
Исходный текст
Openai GPT3.5 API справился
Замени все аббревиатуры полным написанием в тексте.
LLAMA2 13B
OpenAssistant/llama2-13b-orca-8k-3319 не понимает промпты Openai.
Любопытно, что если спросить
Show all abbreviations:
GBD.
Покажи все сокращения в тексте:
GBD (Global Burden of Disease)
Часто замечал, что на русском языке модели по-другому реагирует, иногда даже более четко понимают, что от нее требуется.
Как видим все сокращения модель не выдала. Возможно можно как-то сформулировать по-другому промпт. Но возможно проще через регулярные выражения найти все сокращения.
Чтобы исправить предложения можно также сделать замену через строковые функции или попросить LLM:
According to the GBD (Global Burden of Disease) 2015 collaborative group on neurological disorders, the incidence rate of ND is associated with some criteria, including cash flow and per capita income, education, and fertility of each country.
переформулируй текст вместо сокращения ND напиши neurological disorders
3. Используем полные имена людей
Во многих текстах один раз упоминается человек с именем и фамилией, а дальше может упоминается по имени или фамилии.
Исходный текст
Openai GPT3.5 API справился
Замени все имена и фамилии полным именем и фамилией персоны в тексте.
Исходный текст содержит полное имя только для Оппенгейера, но не содержит имена Гровса и Паш. Предполагается, что они упоминались ранее в тексте, и мы их сохранили уже в словарь. Поэтому после первого шага сделаем обработку со словарем. Этот процесс всегда многоэтапный, поскольку тексты могут быть очень большими и разбиваются на части. Придется делать несколько проходов.
Замени все имена и фамилии полным именем и фамилией персоны в тексте. Используй также словарь: Лесли Гровс, Борис Паш.
В текстах редко встречаются однофамильцы, чаще могут быть одинаковые имена. Конечно, дополнительный анализ не помешает на этот счет.
LLAMA2 13B
OpenAssistant/llama2-13b-orca-8k-3319 не понимает эти промпты Openai.
Сначала составим список имен через NER или спросим модель:
Составь список имен.
Обычный NER выдал бы отдельно фамилии и имена. Далее нам необходимо по каждому предложению, где есть искомое сделать обработку строковыми функциями или формулировку через LLM.
В результате на Роберта был собран компрометирующий материал.
переформулируй текст вместо имени Роберт напиши полное имя Роберт Оппенгеймер
Потом соединяем все обработки и на выходе получим тот же текст как и с GPT3.5
4. Составляем вопросы
Модели LLM умеют составлять вопросы к тексту, что также полезно, поскольку формулировка вопроса может существенно отличается от написанного текста. Правда не все составленные вопросы будут полезны, что создаст дополнительные издержки по хранению лишних вопросов.
- Логично этот этап делать после всех прочих расшифровок в тексте, это позволит более полно формулировать вопросы. Но это необязательно.
- Чтобы получить все варианты вопросов, лучше запрашивать формулировки на небольших абзацах, наборе из нескольких предложений. Либо указывать составь Х вопросов, где Х заметно больше чем объем текста.
- Чтобы сформулировать главные вопросы полезно запрашивать через большой блок текста.
Исходный текст:
GPT3.5 API
Если запросить на весь текст, то получим список самых главных вопросов.
Составь полный список вопросов
Дополнительные вопросы лучше запросить по куску текста:
Полученный список
LLAMA2 13B
На моделях LLAMA2 примерно такой же эффект, не буду разбирать подробнее. Составим список вопросов по блоку текста. Такой ответ даже лучше с точки зрения поискового индекса, т.к. сразу указывает конкретную модель.
5. Список ключевых слов
Ну и в заключении разберем наиболее простой способ - это извлечение ключевых слов и фраз из текста. Этот список можно сохранить в базе сбоку от основного текста и дополнительно учитывать в ранжировании или фильтрах. Например, искать только по полю ключевых слов.
Составь список 10 самых важных терминов без объяснения.
GPT3.5 API
LLAMA2 13B
Если нашли неточность в описании - буду рад поправкам. Если есть вопросы - пишите, чем смогу помогу. Замечу, что я лишь энтузиаст-исследователь, а не профессиональный ИИ-программист. Также вы можете подписаться на мой ТГ-канал, где я делюсь своими находками и опытом.