У нас возникли внутренние вопросы по управлению изображениями в контексте ИИ, поэтому я хотел обсудить некоторые аспекты в публичном формате.
Проблема
Современные большие языковые модели (LLM) поддерживают несколько модальностей. Все крупные вендоры теперь поддерживают ввод изображений, а некоторые (в частности, Google) также поддерживают вывод изображений.
Это создает для Discourse AI определенную проблему: как нам передавать «изображения» в LLM.
Конкретно, если у нас есть такой пример поста:
Привет, вот фото меня:

А вот еще одно

Конец
Как нам передать это в LLM:
Вариант 1: Сохранение Markdown, изображения добавлены в конец
Подход: Оставить весь текст вместе, добавить изображения в конец.
[
"Привет, вот фото меня:

А вот еще одно

Конец",
image1,
image2
]
Вариант 2: Сохранение Markdown, изображения встроены по ходу текста
Подход: Чередовать текст и изображения для сохранения контекста и порядка.
[
"Привет, вот фото меня:
",
image1,
"А вот еще одно
",
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 сейчас не позволяет передавать дополнительные метаданные для изображения вместе с самим изображением.