Новая статья по Spring AI!
▶️ Spring AI: retrieval augmented generation ◀️
Spring AI, который только недавно получил первую стабильную версию, уже предоставляет довольно много возможностей для работы с RAG (retrieval augmented generation).
Благодаря этому подходу нейросеть перед тем, как дать ответ на запрос пользователя, выполнит поиск подходящей информации в векторном хранилище. Причём каждый документ хранится не в виде текста, а в виде массива чисел (т.н. «векторов»).
Процесс преобразования различных документов в такой векторный формат выполняется опять же с помощью LLM и называется embedding («встраивание»). Хорошая новость заключается в том, что всё это можно легко сделать с помощью Spring AI.
В статье я привожу пример, как можно распарсить несколько Excel-файлов, чтобы извлечь из них историю изменения курса доллара. Эту информацию мы преобразуем в эмбеддинги и сохраняем в векторном хранилище pgVector. Затем эмбеддинги можно подгружать в контекст LLM для выполнения различных аналитических запросов в диалогом режиме.
P.S. Эту же статью я опубликовал на Хабре. Жду ваших комментариев!
▶️ Spring AI: retrieval augmented generation ◀️
Spring AI, который только недавно получил первую стабильную версию, уже предоставляет довольно много возможностей для работы с RAG (retrieval augmented generation).
Благодаря этому подходу нейросеть перед тем, как дать ответ на запрос пользователя, выполнит поиск подходящей информации в векторном хранилище. Причём каждый документ хранится не в виде текста, а в виде массива чисел (т.н. «векторов»).
Процесс преобразования различных документов в такой векторный формат выполняется опять же с помощью LLM и называется embedding («встраивание»). Хорошая новость заключается в том, что всё это можно легко сделать с помощью Spring AI.
В статье я привожу пример, как можно распарсить несколько Excel-файлов, чтобы извлечь из них историю изменения курса доллара. Эту информацию мы преобразуем в эмбеддинги и сохраняем в векторном хранилище pgVector. Затем эмбеддинги можно подгружать в контекст LLM для выполнения различных аналитических запросов в диалогом режиме.
P.S. Эту же статью я опубликовал на Хабре. Жду ваших комментариев!
👍7🔥3
Продолжаем цикл статей по Spring AI!
▶️ Spring AI: model context protocol ◀️
Протокол контекста модели (Model Context Protocol, MCP) — это открытый стандарт, разработанный и представленный компанией Anthropic 25 ноября 2024 года. Основная цель MCP — создание унифицированного протокола взаимодействия между большими языковыми моделями (LLM) и внешними источниками данных и инструментами. MCP унифицирует определения вызовов интерфейса для доступа к возможностям различных инструментов.
Архитектура с использованием MCP состоит из MCP-клиента, который обращается к одному или нескольким MCP-серверам. Эти сервера интегрированы с целевыми инструментами и источниками данных.
Spring AI позволяет выполнить эту интеграцию в простом декларативном стиле. Вам даже не потребуется разбираться с протоколом, т.к. Spring будет генерить описания инструментов автоматически.
P.S. Эту же статью я опубликовал на Хабре - жду ваших комментов!
▶️ Spring AI: model context protocol ◀️
Протокол контекста модели (Model Context Protocol, MCP) — это открытый стандарт, разработанный и представленный компанией Anthropic 25 ноября 2024 года. Основная цель MCP — создание унифицированного протокола взаимодействия между большими языковыми моделями (LLM) и внешними источниками данных и инструментами. MCP унифицирует определения вызовов интерфейса для доступа к возможностям различных инструментов.
Архитектура с использованием MCP состоит из MCP-клиента, который обращается к одному или нескольким MCP-серверам. Эти сервера интегрированы с целевыми инструментами и источниками данных.
Spring AI позволяет выполнить эту интеграцию в простом декларативном стиле. Вам даже не потребуется разбираться с протоколом, т.к. Spring будет генерить описания инструментов автоматически.
P.S. Эту же статью я опубликовал на Хабре - жду ваших комментов!
🔥3👍2
Ехал я недавно на Сапсане и решил скоротать время за прослушиванием какого-нибудь подкаста. Под руку попался подкаст "Бреслав и Ложечкин" под названием Vibe Coding.
В этом подкасте ребята рассуждают про то, как изменится написание кода в ближайшем будущем с использованием LLM. Андрей Бреслав, известный как создатель языка Kotlin, анонсировал свой новый проект под названием CodeSpeak. (Вот ведь совпадение, учитывая, что ехал я в Питер, где находится остров Котлин).
Похоже, Андрей решил повторить свой успех и сделать новый инструмент для разработчиков. Он утверждает, что современные LLM вполне в состоянии писать хороший код, но они не могут залезть к вам в голову, чтобы понять, что именно вы от неё хотите. Требуется правильно написать спецификацию, в которой изложить все бизнес-требования (по сути большой промт). При этом LLM не требуется объяснять стандартные вещи вроде того, как подключаться к БД или настраивать мониторинг.
Такой инструмент позволит писать спецификации практически на естественном английском языке (хотя почему только на английском?). Если же он обнаружит, что какой-то термин может быть истолкован двояко, то тут же запросит у вас уточнение. Совсем как реальный человек, которому вы отдаёте разработку на аутсорс.
Другой момент, который подсвечивает Андрей (и я с ним полностью согласен), что диалоговый режим в виде чата не очень подходит для написания кода. CodeSpeak не пытается каждый раз заново писать весь код целиком, а вносит инкрементальные изменения и сохраняет общую структуру.
Ну и наверное самый интересный поинт, что в ближайшем будущем уже не будет иметь значения на чём написана программа: на Java, Python или javascript. Обладая спецификацией на естественном языке, система сможет написать реализацию на любом из них. Возможно, разработчики ближайшего будущего даже не будут задумываться, на каком языке будет генериться код. Ведь сами языки программирования были придуманы для того, что в конечном счёте получать готовый исполняемый файл, понятный машине.
P.S. Используете ли вы AI-инструменты для генерации кода? И если да, то в каком режиме: умный автокомплит в текущем контексте или генерация готовых методов и классов целиком?
В этом подкасте ребята рассуждают про то, как изменится написание кода в ближайшем будущем с использованием LLM. Андрей Бреслав, известный как создатель языка Kotlin, анонсировал свой новый проект под названием CodeSpeak. (Вот ведь совпадение, учитывая, что ехал я в Питер, где находится остров Котлин).
Похоже, Андрей решил повторить свой успех и сделать новый инструмент для разработчиков. Он утверждает, что современные LLM вполне в состоянии писать хороший код, но они не могут залезть к вам в голову, чтобы понять, что именно вы от неё хотите. Требуется правильно написать спецификацию, в которой изложить все бизнес-требования (по сути большой промт). При этом LLM не требуется объяснять стандартные вещи вроде того, как подключаться к БД или настраивать мониторинг.
Такой инструмент позволит писать спецификации практически на естественном английском языке (хотя почему только на английском?). Если же он обнаружит, что какой-то термин может быть истолкован двояко, то тут же запросит у вас уточнение. Совсем как реальный человек, которому вы отдаёте разработку на аутсорс.
Другой момент, который подсвечивает Андрей (и я с ним полностью согласен), что диалоговый режим в виде чата не очень подходит для написания кода. CodeSpeak не пытается каждый раз заново писать весь код целиком, а вносит инкрементальные изменения и сохраняет общую структуру.
Ну и наверное самый интересный поинт, что в ближайшем будущем уже не будет иметь значения на чём написана программа: на Java, Python или javascript. Обладая спецификацией на естественном языке, система сможет написать реализацию на любом из них. Возможно, разработчики ближайшего будущего даже не будут задумываться, на каком языке будет генериться код. Ведь сами языки программирования были придуманы для того, что в конечном счёте получать готовый исполняемый файл, понятный машине.
P.S. Используете ли вы AI-инструменты для генерации кода? И если да, то в каком режиме: умный автокомплит в текущем контексте или генерация готовых методов и классов целиком?
👍6
Нейросети отберут у вас львиную долю написания кода. Но это неплохо. И вот почему.
Попробовал я тут на днях Codex от OpenAI. Его релиз состоялся 16 мая 2025 года, т.е. два месяца назад. И возможно ещё не все успели его попробовать.
Это AI-агент, который подключается к вашему репозиторию (пока поддерживается только github) и подготавливает пулл реквест согласно той задаче, которую вы ему поставите в текстовом виде. Работает он в собственном окружении ("на своей виртуалке") и вы можете видеть в режиме реального времени, как он выкачивает проект и сканирует его посредством консольных команд.
После этого вы видите дифф изменений как в гите и можете проводить ревью. Вы можете либо уточнить задачу целиком, либо попросить поправить конкретные места. Если комменты есть - отправляем на вторую итерацию. Если всё ок - мержим в мастер.
О том, какой опыт я получил при использовании Codex и какие выводы сделал, читайте в моей новой статье на Хабре:
▶️ Как AI-агенты помогут достроить вашу Вавилонскую Башню
Попробовал я тут на днях Codex от OpenAI. Его релиз состоялся 16 мая 2025 года, т.е. два месяца назад. И возможно ещё не все успели его попробовать.
Это AI-агент, который подключается к вашему репозиторию (пока поддерживается только github) и подготавливает пулл реквест согласно той задаче, которую вы ему поставите в текстовом виде. Работает он в собственном окружении ("на своей виртуалке") и вы можете видеть в режиме реального времени, как он выкачивает проект и сканирует его посредством консольных команд.
После этого вы видите дифф изменений как в гите и можете проводить ревью. Вы можете либо уточнить задачу целиком, либо попросить поправить конкретные места. Если комменты есть - отправляем на вторую итерацию. Если всё ок - мержим в мастер.
О том, какой опыт я получил при использовании Codex и какие выводы сделал, читайте в моей новой статье на Хабре:
▶️ Как AI-агенты помогут достроить вашу Вавилонскую Башню
👍6❤3🔥2
🎉 Сегодня — День рождения Kotlin! 🎂
22 июля 2011 года на JVM Language Summit в Сан-Франциско компания JetBrains официально представила свою новую статически типизированную JVM-языковую платформу под названием Kotlin. Вот уже 14 лет он помогает разработчикам писать код проще, безопаснее и приятнее.
🔹 Разработка началась в 2010 году под руководством Андрея Бреслава.
🔹 22 июля 2011 года — официальное анонсирование Kotlin как нового JVM-языка.
🔹 Февраль 2012 — проект становится открытым исходным кодом под лицензией Apache 2.0.
🔹 15 февраля 2016 года вышла версия 1.0 — первая стабильная версия.
🔹 Май 2017 — Google объявил о поддержке Kotlin как одного из основных языков для Android.
🔹 2019 — Google официально признал Kotlin предпочтительным языком для Android.
С тех пор Kotlin активно развивается: появились Kotlin/Native, Kotlin/JS, мультиплатформенные возможности и новые стабильные версии до Kotlin 2.0 (май 2024).
✨ Присоединяйтесь к празднованию: расскажите в комментариях, когда вы впервые познакомились с Kotlin и что вам в нём нравится больше всего!
22 июля 2011 года на JVM Language Summit в Сан-Франциско компания JetBrains официально представила свою новую статически типизированную JVM-языковую платформу под названием Kotlin. Вот уже 14 лет он помогает разработчикам писать код проще, безопаснее и приятнее.
🔹 Разработка началась в 2010 году под руководством Андрея Бреслава.
🔹 22 июля 2011 года — официальное анонсирование Kotlin как нового JVM-языка.
🔹 Февраль 2012 — проект становится открытым исходным кодом под лицензией Apache 2.0.
🔹 15 февраля 2016 года вышла версия 1.0 — первая стабильная версия.
🔹 Май 2017 — Google объявил о поддержке Kotlin как одного из основных языков для Android.
🔹 2019 — Google официально признал Kotlin предпочтительным языком для Android.
С тех пор Kotlin активно развивается: появились Kotlin/Native, Kotlin/JS, мультиплатформенные возможности и новые стабильные версии до Kotlin 2.0 (май 2024).
✨ Присоединяйтесь к празднованию: расскажите в комментариях, когда вы впервые познакомились с Kotlin и что вам в нём нравится больше всего!
🎉6🔥3👍2
Лето подходит к концу, а вместе с ним и сезон отпусков. Но не стоит расстраиваться. Во-первых, впереди ещё бархатный сезон, а во-вторых, предстоящая осень обещает быть богатой на события в мире Java, Kotlin и Spring.
СЕНТЯБРЬ
12 сентября в Москве пройдёт big tech night — «ночь музеев» в мире IT. Целых пять компаний (Яндекс, Сбер, X5, Т-Банк и Lamoda) объединились, чтобы открыть двери своих офисов для тех, кто любит технологии.
16 сентября ожидается публичный релиз Java 25. Несмотря на то, что мажорная версия Java обновляется каждые полгода, эта будет ещё и long-term support. Последняя такая версия выходила два года назад. Поэтому выход LTS - весомый повод, чтобы обновляться.
ОКТЯБРЬ
В Петербурге с 17 по 18 октября пройдёт Joker 2025 - крупнейшая Java-конференция года.
НОЯБРЬ
C 6 по 7 ноября в Москве пройдёт Highload - крупнейшая конференция для разработчиков высоконагруженных приложений (тут не только про Java).
Ещё именно в ноябре ожидается релиз Spring 7 и Spring Boot 4.
Среди многочисленных улучшений в Spring наконец-то завезут механизм версионирования запросов. Такого механизма реально не хватало, потому что он позволяет обеспечивать обратную совместимость.
Также появится новый
Ещё появится
P.S. Это разумеется не все события из мира разработки, которые будут осенью. Вы можете дополнить этот список в комментариях)
СЕНТЯБРЬ
12 сентября в Москве пройдёт big tech night — «ночь музеев» в мире IT. Целых пять компаний (Яндекс, Сбер, X5, Т-Банк и Lamoda) объединились, чтобы открыть двери своих офисов для тех, кто любит технологии.
16 сентября ожидается публичный релиз Java 25. Несмотря на то, что мажорная версия Java обновляется каждые полгода, эта будет ещё и long-term support. Последняя такая версия выходила два года назад. Поэтому выход LTS - весомый повод, чтобы обновляться.
ОКТЯБРЬ
В Петербурге с 17 по 18 октября пройдёт Joker 2025 - крупнейшая Java-конференция года.
НОЯБРЬ
C 6 по 7 ноября в Москве пройдёт Highload - крупнейшая конференция для разработчиков высоконагруженных приложений (тут не только про Java).
Ещё именно в ноябре ожидается релиз Spring 7 и Spring Boot 4.
Среди многочисленных улучшений в Spring наконец-то завезут механизм версионирования запросов. Такого механизма реально не хватало, потому что он позволяет обеспечивать обратную совместимость.
Также появится новый
JmsClient вместо JmsTemplate, а также улучшения в JdbcClient. Вы же больше не используете JdbcTemplate?)Ещё появится
RestTestClient для тестирования REST API. Он ориентирован на создание интеграционных тестов и работу с заглушками.P.S. Это разумеется не все события из мира разработки, которые будут осенью. Вы можете дополнить этот список в комментариях)
🔥5⚡4❤🔥3👍3
Вчера вышла Java 25!
Это версия с долговременной поддержкой, поэтому имеет смысл переходить на неё в ближайшее время. Она привносит следующие изменения:
1) import module — меньше бойлерплейта (JEP 511)
Позволяет подтянуть экспортируемые пакеты модуля одной строкой — удобно для утилит и «скриптового» кода.
2) Compact Source Files and Instance Main Methods (JEP 512)
Можно запускать файл без создания явного класса. Метод
3) Flexible Constructor Bodies (JEP 513)
Flexible Constructor Bodies, которые были в preview три релиза (Java 22, Java 23, Java 24), стали постоянной фичей языка. Теперь можно писать инструкции в конструкторе перед явным вызовом конструктора (
4) Scoped Values (JEP 506)
Класс
5) Компактные заголовки объектов (JEP 519)
Включаются флагом
Конечно же, это далеко не все изменения в Java 25. Всё перечисленное выше - уже production-ready. Помимо этого в статусе очередного preview находятся ещё несколько интересных фич:
6) Примитивы в pattern/instanceof/switch — третий preview (JEP 507)
7) Stable Values — preview (JEP 502) - позволяет создавать неизменяемые поля с отложенной инициализацией
8) PEM-кодирование криптообъектов — preview (JEP 470)
9) Structured Concurrency — пятый preview (JEP 505)
10) Vector API (Tenth Incubator) (JEP 508)
P.S. Мне, как человеку, который делает обучающие материалы по Java, особенно интересные фичи 1 и 2.
А что показалось наиболее интересным вам? Планируете ли переход на Java 25 в ближайшее время? Пишите в комментариях!
Это версия с долговременной поддержкой, поэтому имеет смысл переходить на неё в ближайшее время. Она привносит следующие изменения:
1) import module — меньше бойлерплейта (JEP 511)
Позволяет подтянуть экспортируемые пакеты модуля одной строкой — удобно для утилит и «скриптового» кода.
// List, Map, Path и пр. без отдельных import
import module java.base;
void main() {
var names = List.of("James", "Bill", "Guy");
IO.println(names);
}
2) Compact Source Files and Instance Main Methods (JEP 512)
Можно запускать файл без создания явного класса. Метод
main() теперь не обязательно должен быть static. Мы можем писать код в "скриптовом" стиле, что удобно для начинающих.String msg = "Hello, Java 25!";
void main() {
IO.println(msg);
}
3) Flexible Constructor Bodies (JEP 513)
Flexible Constructor Bodies, которые были в preview три релиза (Java 22, Java 23, Java 24), стали постоянной фичей языка. Теперь можно писать инструкции в конструкторе перед явным вызовом конструктора (
super() или this()):public class PositiveBigInteger extends BigInteger {
public PositiveBigInteger(long value) {
if (value <= 0)
throw new IllegalArgumentException("non-positive value");
super(value);
}
}4) Scoped Values (JEP 506)
Класс
ScopedValue позволяет обмениваться иммутабельными данными без их передачи через аргументы методов. Он является более оптимизированной альтернативой существующему классу ThreadLocal.private static final ScopedValue<FrameworkContext> CONTEXT = ScopedValue.newInstance();
void serve(Request request, Response response) {
var context = createContext(request);
ScopedValue.where(CONTEXT, context)
.run(() -> Application.handle(request, response));
}
public PersistedObject readKey(String key) {
var context = CONTEXT.get();
var db = getDBConnection(context);
db.readKey(key);
}
5) Компактные заголовки объектов (JEP 519)
Включаются флагом
UseCompactObjectHeaders; экономят память и ускоряют сборку мусора.java -XX:+UseCompactObjectHeaders -jar app.jar
Конечно же, это далеко не все изменения в Java 25. Всё перечисленное выше - уже production-ready. Помимо этого в статусе очередного preview находятся ещё несколько интересных фич:
6) Примитивы в pattern/instanceof/switch — третий preview (JEP 507)
7) Stable Values — preview (JEP 502) - позволяет создавать неизменяемые поля с отложенной инициализацией
8) PEM-кодирование криптообъектов — preview (JEP 470)
9) Structured Concurrency — пятый preview (JEP 505)
10) Vector API (Tenth Incubator) (JEP 508)
P.S. Мне, как человеку, который делает обучающие материалы по Java, особенно интересные фичи 1 и 2.
А что показалось наиболее интересным вам? Планируете ли переход на Java 25 в ближайшее время? Пишите в комментариях!
👍5🎉4🔥2💅2⚡1
Почти как javascript
Однако это Java 25! Она принесла нам такие фичи как Compact Sources и Instance Main Methods (JEP 512). Теперь мы можем писать на Java как на скриптовом языке: без создания классов, без модификаторов доступа и без явных импортов.
Это значительно снижает порог входа для новичков, ведь раньше нужно было объяснять что такое класс, что такое public, static, маccив строк. Теперь демонстрировать фрагменты кода и обучать основам Java станет гораздо проще.
А ещё вспомним, что уже довольно давно, со времён Java 10, мы можем запускать исходники на Java без компиляции:
Более подробно читайте в моей новой статье
▶️ Compact Sources в Java ◀️
Однако это Java 25! Она принесла нам такие фичи как Compact Sources и Instance Main Methods (JEP 512). Теперь мы можем писать на Java как на скриптовом языке: без создания классов, без модификаторов доступа и без явных импортов.
Это значительно снижает порог входа для новичков, ведь раньше нужно было объяснять что такое класс, что такое public, static, маccив строк. Теперь демонстрировать фрагменты кода и обучать основам Java станет гораздо проще.
А ещё вспомним, что уже довольно давно, со времён Java 10, мы можем запускать исходники на Java без компиляции:
java Hello.java
Как вас зовут? Борис
Добро пожаловать, Борис!
Более подробно читайте в моей новой статье
▶️ Compact Sources в Java ◀️
🔥6👍5
🎭 Joker 2025 — закончился, но мысли только начались
Как всегда, не просто «послушали доклады», а словили то самое ощущение, за которое и ценишь Java-сообщество:
🧠 куча идей, которые теперь хочется провернуть в своих проектах,
💬 обсуждения в кулуарах, которые дают больше инсайтов, чем слайды,
🔥 и ощущение, что Java — всё ещё про драйв и эволюцию, а не просто «enterprise as usual».
Помимо докладов хочется также отметить:
Стенд Яндекса за не самую тривиальную загадку Эйнштейна.
Стенд ВК за то, что познакомили с игрой Новус (что то вроде бильярда, только с деревянными шайбами).
Стенды Axiom / OpenIDE / Amplicode за то, что предлагаете альтернативный инструментарий для разработчиков.
Как говорится, до встречи в следующем году!
P.S. Axiom анонсировал бесплатный митап JavaRockStars в декабре, поэтому есть возможность увидеться уже довольно скоро.
Как всегда, не просто «послушали доклады», а словили то самое ощущение, за которое и ценишь Java-сообщество:
🧠 куча идей, которые теперь хочется провернуть в своих проектах,
💬 обсуждения в кулуарах, которые дают больше инсайтов, чем слайды,
🔥 и ощущение, что Java — всё ещё про драйв и эволюцию, а не просто «enterprise as usual».
Помимо докладов хочется также отметить:
Стенд Яндекса за не самую тривиальную загадку Эйнштейна.
Стенд ВК за то, что познакомили с игрой Новус (что то вроде бильярда, только с деревянными шайбами).
Стенды Axiom / OpenIDE / Amplicode за то, что предлагаете альтернативный инструментарий для разработчиков.
Как говорится, до встречи в следующем году!
P.S. Axiom анонсировал бесплатный митап JavaRockStars в декабре, поэтому есть возможность увидеться уже довольно скоро.
👍12🔥3❤2
Пишем сервис на Spring c помощью Codex - новое видео
➡️ YouTube | RuTube | VK Видео
В этом видео я покажу основные подходы при разработке типовых rest-сервисов на Spring и Kotlin с помощью AI-агентов. В данном примере используется Codex от Open AI в режиме консольного агента. Эти подходы применимы и ко многим другим агентам (например, qwen code).
➡️ YouTube | RuTube | VK Видео
В этом видео я покажу основные подходы при разработке типовых rest-сервисов на Spring и Kotlin с помощью AI-агентов. В данном примере используется Codex от Open AI в режиме консольного агента. Эти подходы применимы и ко многим другим агентам (например, qwen code).
👍5🔥4❤2
Функциональные интерфейсы в Java - новое видео
➡️ YouTube | RuTube | VK Видео
В основе Stream API, которое значительно упрощает работу с коллекциями в Java, лежит понятие функциональных интерфейсов. Любой интерфейс можно назвать функциональным, если он содержит один-единственный метод. Такой интерфейс снабжается аннотацией
В данном видео рассмотрим наиболее употребимые функциональные интерфейсы стандартной библиотеки. Все эти интерфейсы находятся в пакете
➡️ YouTube | RuTube | VK Видео
В основе Stream API, которое значительно упрощает работу с коллекциями в Java, лежит понятие функциональных интерфейсов. Любой интерфейс можно назвать функциональным, если он содержит один-единственный метод. Такой интерфейс снабжается аннотацией
@FunctionalInterface.В данном видео рассмотрим наиболее употребимые функциональные интерфейсы стандартной библиотеки. Все эти интерфейсы находятся в пакете
java.util.function.👍7🔥4❤1
Stream API - новое видео
➡️ YouTube | RuTube | VK Видео
Stream API появился в Java 8 как более гибкий и эффективный способ работы с коллекциями.
Все методы Stream API можно разделить на две группы: промежуточные и терминальные (конечные). Промежуточные операции следует воспринимать как «отложенные», т.е. они не меняют сами данные, а только задают правила их изменения. А терминальные как раз инициируют всю цепочку преобразований и возвращают модифицированные данные.
➡️ YouTube | RuTube | VK Видео
Stream API появился в Java 8 как более гибкий и эффективный способ работы с коллекциями.
Все методы Stream API можно разделить на две группы: промежуточные и терминальные (конечные). Промежуточные операции следует воспринимать как «отложенные», т.е. они не меняют сами данные, а только задают правила их изменения. А терминальные как раз инициируют всю цепочку преобразований и возвращают модифицированные данные.
👍7🤝3🔥1
Как создавать документы в формате Markdown - новое видео
➡️ YouTube | RuTube | VK Видео
Markdown был создан в 2004 году как упрощённый язык разметки документов. Даже в его названии обыгрывается слово markup (разметка), что намекает нам на простоту использования. Сейчас этот язык поддерживается большинством IDE и сервисов по работе с исходным кодом типа github и bitbucket.
В этом ролике вы узнаете об основных возможностях формата markdown и уже через 5 минут без труда сможете сверстать свой первый
➡️ YouTube | RuTube | VK Видео
Markdown был создан в 2004 году как упрощённый язык разметки документов. Даже в его названии обыгрывается слово markup (разметка), что намекает нам на простоту использования. Сейчас этот язык поддерживается большинством IDE и сервисов по работе с исходным кодом типа github и bitbucket.
В этом ролике вы узнаете об основных возможностях формата markdown и уже через 5 минут без труда сможете сверстать свой первый
README.md👍7🔥5
Новая фича в Spring Initializr!
Не прошло и 7 лет (примерно столько я знаю про этот сервис) как в Spring Initializr появилась возможность выбирать формат конфига приложения. Если раньше в заготовке проекта всегда генерился
Я долго не мог понять, почему они не делают yaml по дефолту, ведь во многих современных системах используется именно этот формат (docker-compose, kubernetes, helm, ansible, gitlab). В самом спринге он поддерживается уже давно. И вот на днях я, наконец, увидел столь ожидаемую фичу)
P.S. И ещё хочу поделиться одним лайфхаком (вдруг вы не знали): любую конфигурацию проекта можно расшарить в виде обычной гиперссылки и отправить другим разработчикам, если воспользоваться кнопкой Share. Этот функционал доступен уже давно.
Не прошло и 7 лет (примерно столько я знаю про этот сервис) как в Spring Initializr появилась возможность выбирать формат конфига приложения. Если раньше в заготовке проекта всегда генерился
application.properties и мне приходилось вручную его преобразовывать в yaml, то теперь это больше не требуется и можно сразу его выбрать в настройках!Я долго не мог понять, почему они не делают yaml по дефолту, ведь во многих современных системах используется именно этот формат (docker-compose, kubernetes, helm, ansible, gitlab). В самом спринге он поддерживается уже давно. И вот на днях я, наконец, увидел столь ожидаемую фичу)
P.S. И ещё хочу поделиться одним лайфхаком (вдруг вы не знали): любую конфигурацию проекта можно расшарить в виде обычной гиперссылки и отправить другим разработчикам, если воспользоваться кнопкой Share. Этот функционал доступен уже давно.
👍8🔥4❤🔥3
Telegram-bot на Spring AI для ChatGPT - новое видео
➡️ YouTube | RuTube | VK Видео
#kotlin #telegram #spring #openai #chatgpt Из этого видео вы узнаете, как написать свой telegram-бот, который взаимодействует с нейросетью. Напишем его на Kotlin, причём таким образом, чтобы с нейросетью можно было вести диалог, т.е. рассмотрим, как сохранять контекст между сообщениями.
Для взаимодействия с нейросетью будем использовать фреймворк Spring AI из экосистемы Spring.
Текстовый вариант этого ролика доступен в виде статьи.
➡️ YouTube | RuTube | VK Видео
#kotlin #telegram #spring #openai #chatgpt Из этого видео вы узнаете, как написать свой telegram-бот, который взаимодействует с нейросетью. Напишем его на Kotlin, причём таким образом, чтобы с нейросетью можно было вести диалог, т.е. рассмотрим, как сохранять контекст между сообщениями.
Для взаимодействия с нейросетью будем использовать фреймворк Spring AI из экосистемы Spring.
Текстовый вариант этого ролика доступен в виде статьи.
👍5❤🔥2🔥1
Новое видео - продолжаем тему про ИИ
➡️ YouTube | RuTube | VK Видео
В Spring AI есть возможность использования retrieval augmented generation (генерация, дополненная поиском). RAG позволяет превратить любую LLM "общего назначения" в интерактивного помощника, знакомого с вашей предметной областью.
Перед тем, как дать ответ на запрос пользователя, выполним поиск подходящей информации в векторном хранилище среди заранее подготовленных документов. Причём каждый документ хранится не в виде текста, а в виде массива чисел (т.н. «векторов»). В качестве векторного хранилища мы будем использовать pgVector - расширение для postgres.
Также доступна статья по теме и пример на github.
➡️ YouTube | RuTube | VK Видео
В Spring AI есть возможность использования retrieval augmented generation (генерация, дополненная поиском). RAG позволяет превратить любую LLM "общего назначения" в интерактивного помощника, знакомого с вашей предметной областью.
Перед тем, как дать ответ на запрос пользователя, выполним поиск подходящей информации в векторном хранилище среди заранее подготовленных документов. Причём каждый документ хранится не в виде текста, а в виде массива чисел (т.н. «векторов»). В качестве векторного хранилища мы будем использовать pgVector - расширение для postgres.
Также доступна статья по теме и пример на github.
👍3🔥2👨💻1
Forwarded from Spring АйО
🎉 Встречаем Spring AI Agents и Spring AI Bench
Java-разработчикам теперь доступен мощный инструментарий для работы с агентными ИИ-системами: Spring AI представила проекты Agents и Bench.
В новом переводе от команды Spring АйО рассмотрим, как первый обеспечивает удобную абстракцию для работы с CLI ИИ-агентами, а второй — предлагает реалистичные бенчмарки для оценки их эффективности в задачах enterprise-разработки.
📚 Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/965294/
Java-разработчикам теперь доступен мощный инструментарий для работы с агентными ИИ-системами: Spring AI представила проекты Agents и Bench.
В новом переводе от команды Spring АйО рассмотрим, как первый обеспечивает удобную абстракцию для работы с CLI ИИ-агентами, а второй — предлагает реалистичные бенчмарки для оценки их эффективности в задачах enterprise-разработки.
📚 Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/965294/
🔥4👍2
Model Context Protocol в Spring AI - новое видео
➡️ YouTube | RuTube | VK Видео
#kotlin #spring #ai Протокол контекста модели (Model Context Protocol, MCP) — это открытый стандарт, разработанный и представленный компанией Anthropic 25 ноября 2024 года. Основная цель MCP — создание унифицированного протокола взаимодействия между большими языковыми моделями (LLM) и внешними источниками данных и инструментами. MCP унифицирует определения вызовов интерфейса для доступа к возможностям различных инструментов.
Статья по теме: https://devmark.ru/article/spring-ai-mcp
Пример mcp-сервера: https://github.com/devmarkru/mcp-server-example
Пример mcp-клиента: https://github.com/devmarkru/mcp-client-example
➡️ YouTube | RuTube | VK Видео
#kotlin #spring #ai Протокол контекста модели (Model Context Protocol, MCP) — это открытый стандарт, разработанный и представленный компанией Anthropic 25 ноября 2024 года. Основная цель MCP — создание унифицированного протокола взаимодействия между большими языковыми моделями (LLM) и внешними источниками данных и инструментами. MCP унифицирует определения вызовов интерфейса для доступа к возможностям различных инструментов.
Статья по теме: https://devmark.ru/article/spring-ai-mcp
Пример mcp-сервера: https://github.com/devmarkru/mcp-server-example
Пример mcp-клиента: https://github.com/devmarkru/mcp-client-example
🔥3👍2
Forwarded from Spring АйО
🔥 В Spring 7 завезли нативное версионирование API
База нововведения —
В контроллерах появляется новый атрибут
Хочешь гибкости — прописываешь
На клиентской стороне —
Тестовые клиенты работают по той же логике.
Статья на Хабр "Нативный API Versioning в Spring 7: долгожданная официальная поддержка"
Демо-проект с тестами и примерами
Документация
База нововведения —
ApiVersionStrategy. Он понимает, где искать версию (header, query, media type или путь), умеет её парсить как семантическую, знает поддерживаемый диапазон и может автоматически выставлять Deprecation/Sunset-заголовки. То есть вместо самодельных фильтров теперь есть один официальный механизм.В контроллерах появляется новый атрибут
version:
@GetMapping(path = "/account/{id}", version = "1.1")
public Account get() { ... }
Хочешь гибкости — прописываешь
"1.1+", и метод будет жить до тех пор, пока ты явно не создашь новую версию. Функциональные эндпоинты тоже подтянулись — у них теперь есть предикат version("1.2").На клиентской стороне —
ApiVersionInserter, который один раз настраиваешь:
RestClient client = RestClient.builder()
.baseUrl("http://localhost:8080")
.apiVersionInserter(ApiVersionInserter.useHeader("API-Version"))
.build();
// И дальше только версия
client.get().uri("/account/1")
.apiVersion(1.1)
.retrieve()
.body(Account.class);
Тестовые клиенты работают по той же логике.
Статья на Хабр "Нативный API Versioning в Spring 7: долгожданная официальная поддержка"
Демо-проект с тестами и примерами
Документация
👍4🔥3
Forwarded from Мир Plat.Form
Собираемся в тёплой компании, где обсудим:
❄️ Как реализовать справочники в реальном времени на PostgreSQL и Kafka.
❄️ Чем Virtual Threads отличается от реактивного подхода.
❄️ И узнаем, почему особенности обработки произвольного Unicode-текста могут ввести в ступор даже самого опытного разработчика.
Познакомьтесь со спикерами и их докладами и регистрируйтесь на митап по ссылке
Увидимся!
🟣 27 ноября, 18:00-22:00🟣 Москва, 3-й Красносельский переулок, 19, стр. 13
(Зал «Grey Green»)
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4