⚗️ Un Agent Local Avec ADK Et Docker Model Runner
An English version is available here.
⛅ L’utilisation de l’IA sur le Cloud
Je suis le premier à le faire, j’utilise des modèles IA mis à disposition sur le Cloud. En tant qu’utilisateur, cela me va très bien. Les modèles sont puissants et répondent correctement à mes besoins.
Mais est-ce que le périmètre de ces modèles est adapté à mes besoins? Ils y répondent, c’est un fait, mais ne sont-ils pas trop généralistes pour mon utilisation?
L’utilisation de modèles en local n’est pas nouveau. C’était même l’une des premières exigences qui est apparue pour essayer de déployer un modèle sur une machine lambda.
L’émergence des Small Language Models (SLM) a offert une réponse concrète à ce problème, permettant d’adapter les modèles à un cas d’usage et faciliter leur déploiement.
Il existe désormais différentes alternatives pour déployer ces modèles. Je pense en premier à Ollama qui a été, si je ne me trompe pas, un des premiers outils à simplifier cette demande.
Si vous êtes intéressés par les Small Language Model, je vous recommande les articles de Philippe Charrière disponibles sur son blog.
J’ai pris un peu de temps pour me faire ma propre expérience et c’est celle que je vais vous partager dans cet article.
🧩 Mon contexte
Pour cette expérience, j’ai voulu reprendre le framework d’agent que je préfère pour sa simplicité : Agent Development Kit (ADK) de Google : https://google.github.io/adk-docs/.
Un agent Java peut rapidement être créé avec ADK de la manière suivante :
public static BaseAgent initAgent() {
return LlmAgent.builder().name("trip-planner-agent")
.description("A simple trip helper with ADK")
.model(System.getProperty("gemini.model"))
.instruction("""
You are A simple Trip Planner Agent. Your goal is to give me information about one destination.
""").build();
}
🐳 Docker Model Runner
Concernant la mise à disposition du modèle en local, j’avais déjà testé Ollama pour faire tourner un modèle sur ma machine. Mais pour cette expérimentation je voulais essayer la solution de Docker : Docker Model Runner (DMR). Ce projet met à disposition de nouvelles commandes Docker pour récupérer, exécuter et lister les modèles disponibles sur votre machine.
docker model pull
docker model list
docker model run
Une configuration est nécessaire dans les settings de Docker Desktop pour pouvoir profiter de ce service :
Après cela, DMR vous permet de récupérer facilement un modèle et de l’exécuter sur votre machine. Par exemple, pour utiliser le modèle “gemma3”, il suffit de lancer la commande suivante. Le modèle sera téléchargé si vous ne l’avez pas déjà récupéré :
docker model run gemma3
Une fois démarré, l’agent peut vous répondre comme dans cet exemple :
🧩 Le lien ADK / DMR
La librairie langchain4jva permettre de faire le lien entre le modèle spécifié dans ADK et le modèle mis à disposition par DMR. Elle s’ajoute simplement avec cette dépendance :
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>1.1.0</version>
</dependency>
Le code va être légèrement impacté. Le modèle n’est plus à mentionner avec une chaîne de caractères mais une instance de la classe *LangChain4j *définie avec une instance de la classe OpenAiChatModel.
OpenAiChatModel chatModel = OpenAiChatModel.builder()
.baseUrl(modelUrl)
.apiKey("not-needed-for-local")
.modelName(modelName)
.maxRetries(1)
.timeout(Duration.ofMinutes(2))
.build();
var adkModel = new LangChain4j(chatModel);
return LlmAgent.builder()
.name("Travel Agent")
.description("Expert en voyage utilisant un modèle local")
.model(adkModel)
.build();
🙌 Un agent disponible en local
L’agent est désormais branché sur un modèle local. L’application peut être démarrée avec la commande Maven mvn compile exec:java -Dexec.mainClass=adk.agent.TravelAgent après avoir démarré votre modèle avec Docker Modèle Runner. Pour le développement cela est suffisant.
Une fois l’application fonctionnelle, j’ai opté pour l’initialisation d’un fichier docker-compose.yml qui va démarrer le modèle et l’application avec cette unique commande :
docker compose up -d --build && docker attach adk-app
💡Pour éviter que le packaging de l’application soit fait à chaque fois, un cache est mis en place dans le Dockerfile.
TADA ! 🥳
🤔 Un futur “local”?
Ce projet n’était qu’une expérimentation mais cela laisse à réfléchir. Mon principal usage de l’IA concerne le développement. Ne vaudrait-il pas mieux consacrer un agent déployé en local pour cette activité ?
Lorsque je crée des agents ayant vocation à être déployés sur le Cloud, peut-être qu’un modèle local suffirait largement lors du développement de cette application ? Toutes ces questions ont été répondues par d’autres personnes ayant testés cela, mais dans un contexte d’entreprise est=ce que cela peut-être mis en place (et rapidement?).
On peut bien sûr aller encore plus loin à fabriquer son propre modèle pour notre contexte mais ça c’est un autre sujet 😁.