Месяц назад решил добавить поддержку Gemini в Feeds Fun и под это дело изучал топовые LLM фреймворки — писать свой велосипед не хотелось.
В итоге нашёл стыдный баг в интеграции с Gemini в LLamaIndex. Судя по коду, он есть и в Haystack и в плагине для LangChain. А корень проблемы вообще в SDK Google для Python.
При инициализации нового клиента для Gemini код фреймворка перетирает/подменяет API ключи во всех клиентах, созданных до этого. Потому что API ключ, по-умолчанию, хранится в синглетоне.
Смерти подобно, если у вас multi-tenant приложение, и незаметно во всех остальных случаях. Multi-tenant — это когда ваше приложение работает с несколькими пользователями.
Например, в моём случае, в Feeds Fun пользователь может ввести свой API ключ, чтобы улучшить качество сервиса. Представьте какой забавный казус мог бы случиться: пользователь ввёл API ключ для обработки своих рассылок, а потратил токенов (заплатил) за всех пользователей сервиса.
Репортил только в LLamaIndex как security issue и уже 3 недели ноль реакции, для Haystack и LangChain лень воспроизводить. Так что это ваш шанс зарепортить багу в топовый репозиторий. Под катом будет вся инфа, воспроизвести не сложно.
Ошибка примечательна многим:
В итоге я забил на эти фреймворки и впилил свой костыль, благо HTTP API для Gemini есть.
Мой вывод из этого безобразия такой: доверять коду, который под капотом у современных LLM фреймворков нельзя. Надо перепроверять, вычитывать. То, что у них написано «production ready», не значит, что они действительно production ready.
Далее расскажу подробнее про сам баг.
Зима не успела закончиться, а я уже выполнил один из планов на год :-D
Причём не только перевёл блог на новый движок, но и сам этот движок написал и заопенсорсил: https://github.com/Tiendil/brigid
Что будет интересным для вас.
На индексной странице появился крутой фильтр постов по тегам. Вдохновлённый feeds.fun. Попробуйте поиграть с ним. Пока он доступен только для больших экранов — на мобилках не увидите — поправлю в будущем.
Посты должны стать читаемее, сайт — удобнее, красивее, быстрее.
Никаких cookies и корпоративных трекеров. Как трекер пока использую облачный plausible.io позже подниму свой инстанс.
Мультиязычность. Большинство новых постов будут доступны на русском и английском. Постепенно буду переводить интересные старые посты.
Исходники постов также открыты и лежат в отдельном репозитории: https://github.com/Tiendil/tiendil-org-content
Задержался с постом, а между тем читалка уже работает и экономит мне 4-8 часов в неделю.
Для нетерпеливых и ленивых:
Суть:
elon-musk & twitter => score -100500
, procedural-content-generation & hentai => score +13
.Если есть просьбы по фичам — создавайте issue, постараюсь воплощать. Хочется, чтобы штука пошла в народ.
Потребовалось сделать регистрацию/логин пользователей для пет-проекта. А я это жуть как не люблю, прямо до скрежета в зубах. Поэтому решил поискать что-нибудь совсем готовое, чтобы минимум кода писать и можно было однотипно использовать в будущих проектах.
В итоге нашёл несколько интересных сервисов. Забавно, при узкой предметной области они заметно отличаются друг от друга.
Далее будет моё предвзятое и не особо компетентное мнение. Сугубо для закрепления в истории результатов раскопок.
Есть три проекта, которые вызвали мой интерес:
Фич у каждого сервиса много, даже не буду пытаться перечислять. Учтите, у каждого из них уникальные их наборы. Надо проверять, что выбранный сервис умеет всё что надо и как надо.
Изначально статья была опубликована на Хабре в 2013 году, но я решил вернуть её в блог. Изменений не делал, поэтому подача может немного отличаться от традиционной.
Несмотря на то, что вопрос автоматической генерации заданий в RPG достаточно древний, общедоступных работающих версий таких генераторов почти нет (скорее совсем нет), если не считать совсем примитивных вариантов. Работ по этой теме тоже не много, хотя, если активно гуглить, кое-что можно откопать. Поэтому надеюсь, что этот текст (и сам генератор, ссылка на репозиторий есть в конце статьи) будет полезен.
Для торопливых: визуализация одного из полученных заданий.