Dans cet épisode, Emmanuel et Guillaume reviennent sur les nouveautés de l’écosystème Java (Java 21, SDKman, Temurin, JBang, Quarkus, LangChain4J, …) mais aussi sur des sujets plus généraux comme Unicode, WebAssembly, les bases de données vectorielles, et bien d’autres sujets orientés IA (LLM, ChatGPT, Anthropic, …).

Enregistré le 20 octobre 2023

Téléchargement de l’épisode LesCastCodeurs-Episode-301.mp3

News Langages

Gérer facilement des versions multiples de Java grâce à SDKman https://foojay.io/today/easily-manage-different-java-versions-on-your-machine-with-sdkman/

  • sdkman support java mais aussi graalVM, jbang, Quarkus, Micronaut etc (les CLIs)
  • la CLI UI est toujours un peu chelou donc cet article est utile pour un rappel

Tous les changements de Java 8 à Java 21 https://advancedweb.hu/a-categorized-list-of-all-java-and-jvm-features-since-jdk-8-to-21/

  • Nous avons déjà partagé ce lien par le passé, mais l’article est mis à jour à chaque release majeure de Java pour couvrir les dernières nouveautés. Et en particulier, Java 21 qui vient de sortir.

Eclipse Temurin ne va pas sortir son Java 21 tout de suite https://adoptium.net/en-GB/blog/2023/09/temurin21-delay/

  • Apparemment, une nouvelle licence pour le TCK (qui valide la compliance) doit être approuvée
  • Oracle semble avoir sorti de nouveaux termes, à quelques jours de la sortie officielle de Java 21
  • la mise a jour du TCK est arrivée le 9 octobre.
  • comment Microsoft a pu sortir le sien avant?

Le Financial Times propose un bel article avec des animations graphiques expliquant le fonctionnement de l’architecture de réseau de neurones de type transformers, utilisé dans les large language model https://ig.ft.com/generative-ai/

  • LLM via relation entre les mots
  • notion de transformer qui parse les “phrases” entières ce qui capture le contexte
  • discute le beam search vs greedy search pour avoir pas le prochain mot mais l’ensemble de prochains mots
  • parle d’hallucination
  • l’article parle de texte/vector embeddings pour représenter les tokens et leurs relations aux autres
  • il décrit le processus d’attention qui permet aux LLM de comprendre les associations fréquentes entre tokens
  • le sujet des hallucinations est couvert
  • et pour éviter des hallucinations, utilisation du “grounding”

The Absolute Minimum Every Software Developer Must Know About Unicode in 2023 https://tonsky.me/blog/unicode/

  • Un bel article qui explique Unicode, les encodings comme UTF-8 ou UTF-16, les code points, les graphèmes, les problèmes pour mesurer une chaîne de caractères, les normalisation de graphèmes pour la comparaison de chaîne
  • Si vous voulez mieux comprendre Unicode, c’est l’article à lire !
  • unicode c’est un mapping chiffre - caractère en gros
  • 1,1 millions disponibles dont 15% définis et 11% pour usage privé, il reste de la place. Et non les meojis ne prennent pas beaucoup de place.
  • usage prive est par exemple utilise par apple pour délivrer le logo apple dans les fonts du mac (mais pas ailleurs)
  • UTF est l’encoding du chiffre de l’unicode
  • UTF-32: 4 bytes tout le temps, UTF-8, encodage variable de 1 a 4 bytes (compatible avec ASCII) ; il a aussi un peu de détection d’erreurs (prefix des bytes différents),
  • optimise pour le latin et les textes techniques genre HTML
  • problème principal, on peut pas déterminer la taille en contant les bytes ni aller au milieu d’une chaine directement (variable)
  • UTF-16 utilise 2 ou plus de bytes et est plus sympa pour les caractères asiatiques
  • un caractère c’est en fait un graphème qui peut être fait de plusieurs codepoints : é = e U+0065 + ´ U+0301 ; ☹️ (smiley qui pleure) is U+2639 + U+FE0F
  • D’ailleurs selon le langage “:man-facepalming::skin-tone-3:”.length = 5, 7 (java) ou 17 (rust) ou 1 (swift). Ça dépend de l’encodage de la chaine (UTF-?).
  • ““I know, I’ll use a library to do strlen()!” — nobody, ever.”
  • En java utiliser ICU https://github.com/unicode-org/icu
  • Attention java.text.BreakIterator supporte une vieille version d’unicode donc c’est pas bon.
  • Les règles de graphème change a chaque version majeure d’unicode (tous les ans)
  • certains caractères comme Å ont plusieurs représentations d’encodage, donc il ya de la normalisation: NFD qui éclate en pleins de codepoints ou NDC qui regroupe au max
  • normaliser avant de chercher dans les chaines
  • certains unicode sont représentés différemment selon le LOCALE (c’est la life)
  • et ça continue dans l’article

JBang permet d’appeler Java depuis Python via un pypi https://jbang.dev/learn/python-with-jbang/

  • c’est particulièrement interessant pour appeler Java de son Jupyter notebook
  • ça fait un appel a un autre process (mais installe jbang et java au besoin)
Librairies

Quarkus 3.4 est sorti https://quarkus.io/blog/quarkus-3-4-1-released/

  • un CVE donc mettez a jour vos Quarkus
  • support de Redis 7.2
  • plus de granularité sur la desactivation de flyway globalement ou par data source. Depuis l’activation transparente et automatique en 3.3
  • quarkus update est l’approche recommandée pour mettre à jour.

Comment tester si un thread virtuel “pin” https://quarkus.io/blog/virtual-threads-3/

  • exemple avec quarkus
  • comment générer la stackstrace
  • et un utilitaire JUnit qui fait échouer le test quand le thread pin
  • une série d’articles de Clements sur les threads virtuels et comment les utiliser dans quarkus https://quarkus.io/blog/virtual-thread-1/

À la découverte de LangChain4J, l’orchestration pour l’IA générative en Java https://glaforge.dev/posts/2023/09/25/discovering-langchain4j/

  • Guillaume nous parle du jeune projet LangChain4J, inspiré du projet Python LangChain, qui permet d’orchestrer différents composants d’une chaine d’IA générative
  • Grâce à ce projet, les développeurs Java ne sont pas en reste, et n’ont pas besoin de se mettre à coder en Python
  • LangChain4J s’intègre avec différentes bases vectorielles comme Chroma ou WeAviate, ainsi qu’une petite base en mémoire fort pratique
  • LangChain4J supporte l’API PaLM de Google, mais aussi OpenAI
  • Il y a différents composants pour charger / découper des documents et pour calculer les vector embeddings des extraits de ces documents
  • Vidéo enregistrée à Devoxx sur ce thème : https://www.youtube.com/watch?v=ioTPfL9cd9k
Infrastructure

OpenTF devient OpenTofu https://www.linuxfoundation.org/press/announcing-opentofu

Dans les Dockerfiles, on peut utiliser la notation “heredocs”