Управление изображениями в контексте ИИ

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

Проблема

Современные большие языковые модели (LLM) поддерживают несколько модальностей. Все крупные вендоры теперь поддерживают ввод изображений, а некоторые (в частности, Google) также поддерживают вывод изображений.

Это создает для Discourse AI определенную проблему: как нам передавать «изображения» в LLM.

Конкретно, если у нас есть такой пример поста:

Привет, вот фото меня: 

![image|531x401](upload://xd5Pv36uPIVKBqya8N5BzZGsJrN.png)

А вот еще одно

![Сэм стоит у окна|531x401](upload://xd5Pv36uPIVKBqya8N5BzZGsJrN.png)

Конец

Как нам передать это в LLM:

Вариант 1: Сохранение Markdown, изображения добавлены в конец

Подход: Оставить весь текст вместе, добавить изображения в конец.

[
  "Привет, вот фото меня: 

![image|531x401](upload://xd5Pv36uPIVKBqya8N5BzZGsJrN.png)

А вот еще одно

![Сэм стоит у окна|531x401](upload://xd5Pv36uPIVKBqya8N5BzZGsJrN.png)

Конец",
  image1,
  image2
]

Вариант 2: Сохранение Markdown, изображения встроены по ходу текста

Подход: Чередовать текст и изображения для сохранения контекста и порядка.

[
  "Привет, вот фото меня: 

![image|531x401](upload://xd5Pv36uPIVKBqya8N5BzZGsJrN.png)",
  image1,
  "А вот еще одно

![Сэм стоит у окна|531x401](upload://xd5Pv36uPIVKBqya8N5BzZGsJrN.png)",
  image2,
  "Конец"
]

Вариант 3: Удаление Markdown, изображения добавлены в конец

Подход: Полностью удалить синтаксис Markdown для изображений, добавить сами изображения в конец.

[
  "Привет, вот фото меня: 

А вот еще одно

Конец",
  image1,
  image2
]

Вариант 4: Сохранение описаний, упрощение Markdown

Подход: Убрать специфичный для Discourse форматирование, но сохранить описания изображений для контекста.

[
  "Привет, вот фото меня: 

А вот еще одно
Сэм стоит у окна

Конец",
  image1,
  image2
]

Вариант 5: Описания по ходу текста, изображения встроены

Подход: Заменить Markdown описаниями по ходу текста, затем встроить соответствующие изображения.

[
  "Привет, вот фото меня:",
  image1,
  "А вот еще одно
Сэм стоит у окна",
  image2,
  "Конец"
]

На данный момент наша реализация соответствует варианту (1). Частично это объясняется «наследием»: старые модели не позволяли нам позиционировать изображения. Кроме того, часто пользователи используют Discourse для переформатирования поста; если мы удалим маркеры загрузки, LLM подумает, что мы сказали что-то другое, и не сможет переформатировать пост с изображениями.

Кроме того, рекомендации от вендоров LLM, таких как Anthropic, гласят: всегда размещать изображения в конце. Это упрощает интерпретацию для LLM.

Однако такой подход очень проблематичен для такой LLM, как Nano Banana: Image editing in Google Gemini gets a major upgrade.

Когда я попытался это реализовать, LLM начала галлюцинировать маркеры загрузки вместо рендеринга изображений.

В retrospect это кажется логичным.

Если мы скажем LLM, что она только что написала: upload://xd5Pv36uPIVKBqya8N5BzZGsJrN.png, не удивляйтесь, если она снова скажет что-то подобное.

Я колеблюсь насчет перехода на вариант (2), и кажется, что вариант (3) — единственный разумный способ для «эхо-ответа LLM, чтобы избежать галлюцинаций»… Так что наше решение этой сложной проблемы несколько противоречиво.

Во время этой работы я исследовал возможность создания универсального решения, где вывод и ввод обрабатываются одинаково, но, похоже, это непрактично. (Я также пробовал сохранять описания загрузки, когда они достаточно длинные, и так далее)

Пока что:

(1) для ввода в LLM
(3) для вывода из LLM

В долгосрочной перспективе:

(2) для ввода стоит исследовать

а также удаление, но сохранение контекстного положения для вывода тоже стоит исследовать.


Жаль, что ни один вендор LLM сейчас не позволяет передавать дополнительные метаданные для изображения вместе с самим изображением.

4 лайка