Одна из давних проблем AI-моделей заключается в том, что нейронные сети не объясняют, как они производят свои результаты. Не всегда понятно, насколько это действительно является проблемой для искусственного интеллекта. Когда мы просим людей объяснить их рассуждения, они обычно рационализируют, как правило, даже не осознавая этого, давая наиболее правдоподобные объяснения своих действий без какого-либо представления о том, что на самом деле происходит в их головах.
Мы уже знаем, как заставить AI-модели придумывать правдоподобные ответы. Возможно, искусственный интеллект в этом отношении больше похож на людей, чем нам хотелось бы признать.
Пятьдесят лет назад американский философ Томас Нагель написал влиятельное эссе под названием Каково это — быть летучей мышью? Он утверждал, что должно быть что-то особенное в том, чтобы быть летучей мышью: видеть мир так, как его видит летучая мышь, и воспринимать существование так, как это делает летучая мышь. Однако, по мнению Нагеля, даже если бы мы знали все возможные факты о том, как работают мозг, органы чувств и тело летучей мыши, мы всё равно не знали бы, каково это — быть летучей мышью.
Объяснимость AI — это такая же проблема. Мы знаем все факты об AI-модели. Это просто множество чисел с конечной точностью, расположенных в последовательности матриц. Мы можем легко проверить, что каждый результат модели является следствием правильной арифметики, но эта информация бесполезна в качестве объяснения.
Для этой проблемы нет общего решения как для AI, так и для людей. Однако архитектура ColBERT, и особенно то, как она использует "позднее взаимодействие" при использовании в качестве ранжировщика, позволяет получить значимое понимание того, почему модель дает определенные результаты в конкретных случаях.
Эта статья показывает, как позднее взаимодействие обеспечивает объяснимость, используя модель Jina-ColBERT jina-colbert-v1-en и библиотеку Python Matplotlib.
tagКраткий обзор ColBERT
ColBERT был представлен в работе Khattab & Zaharia (2020) как расширение модели BERT, впервые представленной в 2018 году компанией Google. Модели Jina-ColBERT от Jina AI основаны на этой работе и более поздней архитектуре ColBERT v2, предложенной в работе Santhanam, et al. (2021). Модели типа ColBERT могут использоваться для создания эмбеддингов, но они имеют некоторые дополнительные возможности при использовании в качестве модели переранжирования. Главное преимущество — это позднее взаимодействие, которое представляет собой способ структурирования проблемы семантического сходства текстов иначе, чем в стандартных моделях эмбеддингов.
tagМодели эмбеддингов
В традиционной модели эмбеддингов мы сравниваем два текста, генерируя для них репрезентативные векторы, называемые эмбеддингами, а затем сравниваем эти эмбеддинги с помощью метрик расстояния, таких как косинусное или хэммингово расстояние. Количественная оценка семантического сходства двух текстов обычно следует общей процедуре.
Сначала мы создаем эмбеддинги для двух текстов по отдельности. Для каждого текста:
- Токенизатор разбивает текст на фрагменты примерно размером со слово.
- Каждый токен отображается в вектор.
- Векторы токенов взаимодействуют через систему внимания и сверточные слои, добавляя контекстную информацию к представлению каждого токена.
- Слой пулинга преобразует эти модифицированные векторы токенов в единый вектор эмбеддинга.

Затем, когда для каждого текста есть эмбеддинг, мы сравниваем их друг с другом, обычно используя косинусную метрику или расстояние Хэмминга.

Оценка происходит путем сравнения двух целых эмбеддингов друг с другом, без какой-либо конкретной информации о токенах. Все взаимодействие между токенами происходит "рано", то есть до того, как два текста сравниваются друг с другом.
tagМодели переранжирования
Модели переранжирования работают иначе.
Во-первых, вместо создания эмбеддинга для любого текста, она берет один текст, называемый запросом, и коллекцию других текстов, которые мы будем называть целевыми документами, и затем оценивает каждый целевой документ относительно текста запроса. Эти числа не нормализованы и не похожи на сравнение эмбеддингов, но их можно сортировать. Целевые документы, которые получают наивысшую оценку относительно запроса, являются текстами, которые наиболее семантически связаны с запросом согласно модели.
Давайте посмотрим, как это работает конкретно с моделью переранжировщика jina-colbert-v1-en, используя API Jina Reranker и Python.
Приведенный ниже код также находится в блокноте, который вы можете скачать или запустить в Google Colab.
Сначала вы должны установить последнюю версию библиотеки requests в вашу среду Python. Вы можете сделать это с помощью следующей команды:
pip install requests -U
Далее посетите страницу API Jina Reranker и получите бесплатный API-токен, который позволяет обработать до миллиона токенов текста. Скопируйте ключ API-токена из нижней части страницы, как показано ниже:

Мы будем использовать следующий текст запроса:
- "Elephants eat 150 kg of food per day."
И сравним этот запрос с тремя текстами:
- "Elephants eat 150 kg of food per day."
- "Every day, the average elephant consumes roughly 150 kg of plants."
- "The rain in Spain falls mainly on the plain."
Первый документ идентичен запросу, второй является перефразировкой первого, а последний текст совершенно не связан с темой.
Используйте следующий код Python для получения оценок, присвоив свой токен API Jina Reranker переменной jina_api_key:
import requests
url = "<https://api.jina.ai/v1/rerank>"
jina_api_key = "<YOUR JINA RERANKER API TOKEN HERE>"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {jina_api_key}"
}
data = {
"model": "jina-colbert-v1-en",
"query": "Elephants eat 150 kg of food per day.",
"documents": [
"Elephants eat 150 kg of food per day.",
"Every day, the average elephant consumes roughly 150 kg of food.",
"The rain in Spain falls mainly on the plain.",
],
"top_n": 3
}
response = requests.post(url, headers=headers, json=data)
for item in response.json()['results']:
print(f"{item['relevance_score']} : {item['document']['text']}")
Запуск этого кода из Python-файла или в блокноте должен дать следующий результат:
11.15625 : Elephants eat 150 kg of food per day.
9.6328125 : Every day, the average elephant consumes roughly 150 kg of food.
1.568359375 : The rain in Spain falls mainly on the plain.
Точное совпадение имеет самую высокую оценку, как мы и ожидали, в то время как перефразировка имеет вторую по величине оценку, а совершенно не связанный текст имеет гораздо более низкую оценку.
tagОценка с использованием ColBERT
Что отличает переранжирование ColBERT от оценки на основе эмбеддингов, так это то, что токены двух текстов сравниваются друг с другом во время процесса оценки. Два текста никогда не имеют собственных эмбеддингов.
Сначала мы используем ту же архитектуру, что и модели эмбеддингов, чтобы создать новые представления для каждого токена, включающие контекстную информацию из текста. Затем мы сравниваем каждый токен из запроса с каждым токеном из документа.
Для каждого токена в запросе мы определяем токен в документе, который имеет с ним самое сильное взаимодействие, и суммируем эти оценки взаимодействия для вычисления окончательного числового значения.

Это взаимодействие является "поздним": токены взаимодействуют между двумя текстами, когда мы сравниваем их друг с другом. Но помните, что "позднее" взаимодействие не исключает "раннего" взаимодействия. Сравниваемые пары векторов токенов уже содержат информацию об их конкретных контекстах.
Эта схема позднего взаимодействия сохраняет информацию на уровне токенов, даже если эта информация зависит от контекста. Это позволяет нам частично видеть, как модель ColBERT вычисляет свою оценку, потому что мы можем определить, какие пары контекстуализированных токенов вносят вклад в итоговую оценку.
tagОбъяснение ранжирования с помощью тепловых карт
Тепловые карты - это метод визуализации, который полезен для понимания того, что происходит в Jina-ColBERT при создании оценок. В этом разделе мы будем использовать библиотеки seaborn и matplotlib для создания тепловых карт из слоя позднего взаимодействия jina-colbert-v1-en, показывающих, как токены запроса взаимодействуют с токенами целевого текста.
tagНастройка
Мы создали файл библиотеки Python, содержащий код для доступа к модели jina-colbert-v1-en и использования seaborn, matplotlib и Pillow для создания тепловых карт. Вы можете скачать эту библиотеку напрямую с GitHub, или использовать предоставленный блокнот в своей системе, или на Google Colab.
Сначала установите требования. Вам понадобится последняя версия библиотеки requests в вашей среде Python. Поэтому, если вы еще этого не сделали, выполните:
pip install requests -U
Затем установите основные библиотеки:
pip install matplotlib seaborn torch Pillow
Далее, скачайте jina_colbert_heatmaps.py с GitHub. Вы можете сделать это через веб-браузер или в командной строке, если установлен wget:
wget https://raw.githubusercontent.com/jina-ai/workshops/main/notebooks/heatmaps/jina_colbert_heatmaps.py
С установленными библиотеками нам нужно объявить только одну функцию для остальной части статьи:
from jina_colbert_heatmaps import JinaColbertHeatmapMaker
def create_heatmap(query, document, figsize=None):
heat_map_maker = JinaColbertHeatmapMaker(jina_api_key=jina_api_key)
# get token embeddings for the query
query_emb = heat_map_maker.embed(query, is_query=True)
# get token embeddings for the target document
document_emb = heat_map_maker.embed(document, is_query=False)
return heat_map_maker.compute_heatmap(document_emb[0], query_emb[0], figsize)
tagРезультаты
Теперь, когда мы можем создавать тепловые карты, давайте создадим несколько и посмотрим, что они нам расскажут.
Выполните следующую команду в Python:
create_heatmap("Elephants eat 150 kg of food per day.", "Elephants eat 150 kg of food per day.")Результатом будет тепловая карта, которая выглядит так:

Это тепловая карта уровней активации между парами токенов при сравнении двух идентичных текстов. Каждый квадрат показывает взаимодействие между двумя токенами, по одному из каждого текста. Дополнительные токены [CLS] и [SEP] указывают на начало и конец текста соответственно, а q и d вставляются сразу после токена [CLS] в запросах и целевых документах соответственно. Это позволяет модели учитывать взаимодействия между токенами и началом и концом текстов, а также позволяет представлениям токенов быть чувствительными к тому, находятся ли они в запросах или целевых документах.
Чем ярче квадрат, тем больше взаимодействие между двумя токенами, что указывает на их семантическую связь. Оценка взаимодействия каждой пары токенов находится в диапазоне от -1.0 до 1.0. Квадраты, выделенные красной рамкой, учитываются в итоговой оценке: для каждого токена в запросе его наивысший уровень взаимодействия с любым токеном документа является значением, которое учитывается.
Лучшие совпадения — самые яркие точки — и максимальные значения в красных рамках почти все находятся точно на диагонали и имеют очень сильное взаимодействие. Единственными исключениями являются "технические" токены [CLS], q и d, а также слово "of", которое является высокочастотным "стоп-словом" в английском языке, несущим очень мало независимой информации.
Давайте возьмем структурно похожее предложение — "Cats eat 50 g of food per day." — и посмотрим, как взаимодействуют его токены:
create_heatmap("Elephants eat 150 kg of food per day.", "Cats eat 50 g of food per day.")
Опять же, лучшие совпадения находятся в основном на диагонали, потому что слова часто одинаковы, и структура предложений почти идентична. Даже "cats" и "elephants" совпадают из-за их общих контекстов, хотя и не очень хорошо.
Чем менее похож контекст, тем хуже совпадение. Рассмотрим текст "Employees eat at the company canteen."
create_heatmap("Elephants eat 150 kg of food per day.", "Employees eat at the company canteen.")
Хотя структурно похожи, единственное сильное совпадение здесь — между двумя случаями "eat." Тематически это очень разные предложения, даже если их структура очень параллельна.
Глядя на темноту цветов в квадратах с красной рамкой, мы можем видеть, как модель ранжировала бы их как совпадения для "Elephants eat 150 kg of food per day", и jina-colbert-v1-en подтверждает эту интуицию:
| Score | Text |
|---|---|
| 11.15625 | Elephants eat 150 kg of food per day. |
| 8.3671875 | Cats eat 50 g of food per day. |
| 3.734375 | Employees eat at the company canteen. |
Теперь давайте сравним "Elephants eat 150 kg of food per day." с предложением, которое имеет практически то же значение, но другую формулировку: "Every day, the average elephant consumes roughly 150 kg of food."
create_heatmap("Elephants eat 150 kg of food per day.", "Every day, the average elephant consumes roughly 150 kg of food.")
Обратите внимание на сильное взаимодействие между словом "eat" в первом предложении и "consume" во втором. Разница в словарном запасе не мешает Jina-ColBERT распознать общий смысл.
Кроме того, "every day" хорошо соответствует "per day", даже несмотря на то, что они находятся в совершенно разных местах. Только малозначимое слово "of" является аномальным несовпадением.
Теперь давайте сравним тот же запрос с совершенно не связанным текстом: "The rain in Spain falls mainly on the plain."
create_heatmap("Elephants eat 150 kg of food per day.", "The rain in Spain falls mainly on the plain.")
Как видно, взаимодействия "лучших совпадений" имеют гораздо более низкие оценки для этой пары, и между словами в двух текстах практически нет взаимодействия. Интуитивно мы ожидаем, что этот текст получит низкую оценку по сравнению с "Every day, the average elephant consumes roughly 150 kg of food", и jina-colbert-v1-en с этим согласен:
| Score | Text |
|---|---|
| 9.6328125 | Every day, the average elephant consumes roughly 150 kg of food. |
| 1.568359375 | The rain in Spain falls mainly on the plain. |
tagДлинные тексты
Это лишь примеры для демонстрации работы моделей ранжирования типа ColBERT. В контексте информационного поиска, например при генерации с использованием извлечения, запросы обычно представляют собой короткие тексты, в то время как соответствующие документы-кандидаты, как правило, длиннее, часто достигая размера входного контекстного окна модели.
Все модели Jina-ColBERT поддерживают входной контекст размером 8192 токена, что примерно эквивалентно 16 стандартным страницам текста с одинарным интервалом.
Мы также можем создавать тепловые карты для этих асимметричных случаев. Например, возьмем первый раздел страницы Википедии об индийских слонах:

Чтобы увидеть этот текст в виде обычного текста, переданного в jina-colbert-v1-en, нажмите эту ссылку.
Этот текст содержит 364 слова, поэтому наша тепловая карта не будет квадратной:
create_heatmap("Elephants eat 150 kg of food per day.", wikipedia_elephants, figsize=(50,7))
Мы видим, что слово "elephants" совпадает во многих местах текста. Это неудивительно в тексте о слонах. Но мы также можем увидеть область, где взаимодействие намного сильнее:

Что здесь происходит? С помощью Jina-ColBERT мы можем найти часть более длинного текста, которой это соответствует. Оказывается, это четвертое предложение второго абзаца:
The species is classified as a megaherbivore and consume up to 150 kg (330 lb) of plant matter per day.
Здесь повторяется та же информация, что и в тексте запроса. Если мы посмотрим на тепловую карту только для этого предложения, мы увидим сильные совпадения:

Jina-ColBERT предоставляет средства для точного определения тех областей в длинном тексте, которые вызвали совпадение с запросом. Это ведет к лучшей отладке и большей объяснимости. Не требуется особых знаний, чтобы понять, как происходит сопоставление.
tagОбъяснение результатов ИИ с помощью Jina-ColBERT
Эмбеддинги являются основной технологией в современном ИИ. Практически все, что мы делаем, основано на идее, что сложные, обучаемые отношения во входных данных могут быть выражены в геометрии многомерных пространств. Однако простым людям очень сложно понять пространственные отношения в тысячах или миллионах измерений.
ColBERT - это шаг назад от этого уровня абстракции. Это не полное решение проблемы объяснения того, что делает модель ИИ, но оно прямо указывает на то, какие части наших данных ответственны за наши результаты.
Иногда ИИ должен быть черным ящиком. Гигантские матрицы, выполняющие всю тяжелую работу, слишком велики, чтобы любой человек мог удержать их в голове. Но архитектура ColBERT проливает немного света в этот ящик и демонстрирует, что возможно большее.
Модель Jina-ColBERT в настоящее время доступна только для английского языка (jina-colbert-v1-en), но на подходе больше языков и контекстов использования. Эта линейка моделей, которые не только выполняют современный информационный поиск, но и могут объяснить, почему они что-то сопоставили, демонстрирует приверженность Jina AI к тому, чтобы сделать технологии ИИ как доступными, так и полезными.






