Markitdown-as-a-Service: de l’IA à la production sur Clever Cloud

Markitdown-as-a-Service: from AI to production on Clever Cloud
Chaque jour, de nouveaux outils sont rendus disponibles, l'IA apporte de nouvelles perspectives, vous avez de nouvelles idées. C'est l'un des objectifs de Clever Cloud que de vous aider à les développer et les tester en conditions réelles sans effort, avant de pouvoir les mettre à disposition de tous.

Dans cet article, nous allons voir comment nos services peuvent être utilisés conjointement avec des outils de création de code assisté par l’IA pour initier une idée et qu’elle prenne forme en ligne. Pour cela, nous avons pris l’exemple de Markitdown, un outil Python sous licence MIT, servant à convertir de nombreux formats de documents en Markdown.

Notre objectif est d’en faire un service de conversion disponible sur Clever Cloud, sous la forme d’un site et d’une API minimale. Pour disposer rapidement d’un premier prototype, nous allons utiliser un éditeur intégrant une assistance par l’IA, Cursor, mais cela pourrait aussi bien être Jetbrains, VS Code, l’un de ses autres dérivés (Pear, Void, Windsurf) ou encore Zed.

Markitdown, comment ça marche en pratique ?

Markitdown étant un outil Python, nous l’utiliserons donc dans une application Python avec le package manager uv. Développé en Rust, il a l’avantage d’être très efficace et facile à prendre en main. De plus, il est nativement disponible au sein de l’image Python de Clever Cloud. Pour suivre cet exemple, vous aurez besoin de :

Commençons donc par initier un projet avec Markitdown comme première dépendance. Un dépôt git sera créé automatiquement par uv ainsi que certains fichiers annexes comme .gitignore (les fichiers et dossiers à ne pas suivre dans le dépôt) et pyproject.toml pour la gestion du projet Python :

cd markitdown-converter
uv init markitdown-converter --no-readme
mv hello.py app.py # uv créé un fichier hello.py par défaut, on le renomme
uv add markitdown

La documentation de Markitdown indique que son utilisation est très simple :

from markitdown import MarkItDown

markitdown = MarkItDown()
result = markitdown.convert("test.xlsx")
print(result.text_content)

Un mode permet également d’utiliser un modèle d’OpenAI pour convertir une image en une description Markdown:

from markitdown import MarkItDown
from openai import OpenAI

client = OpenAI()
md = MarkItDown(mlm_client=client, mlm_model="gpt-4o")
result = md.convert("example.jpg")
print(result.text_content)

Nous ajoutons ces informations ainsi que la liste des formats supportés au sein d’un fichier usage_instructions.md que l’on place à la racine de notre projet. Il nous servira à donner du contexte à l’IA qui ne connaitra pas Markitdown qui vient d’être rendu disponible en open source. Il est d’ailleurs temps de lancer notre éditeur dans le dossier courant et de procéder à de premiers essais.

L’IA, une aide pour démarrer…

Notre principal objectif est de disposer d’un site que nous pourrons héberger sur Clever Cloud. Notre service respectant la plupart des standards et ne nécessitant que très peu d’adaptation spécifique, nous n’avons pas tellement de règles à fournir à l’IA dans cette première étape.

Dans le cas de Cursor, nous utilisons la fonctionnalité Composer qui permet facilement de passer les instructions comme contexte à travers un fichier, accompagné d’un prompt pour initier une première version du site :

Aide moi à développer un site web qui utilise Markitdown.
Il propose de convertir des documents au format Markdown. 
Ses instructions d'usage sont dans le fichiers 'usage_instructions.md'.
 
Je dois pouvoir passer le fichier sous la forme:
- D'une URL
- D'un fichier sélectionné ou glissé-déposé dans l'interface

Puis obtenir le resultat dans un bloc de code brut.

Selon votre modèle (claude-3.5-sonnet lors de nos essais), vous aurez un premier résultat plus ou moins convaincant. Dans notre cas, c’était un peu trop basique et violet, mais réussi dans l’ensemble:

… mais qu’il faut savoir guider

On s’aperçoit néanmoins rapidement à l’usage des manques et petites erreurs faites par l’IA. En effet, dans le format Markdown, un saut de ligne simple n’est pas interprété, le texte continue comme si de rien n’était. Markitdown a tendance à couper les lignes longues au bout d’un certain nombre de caractères. Une règle que notre assistant n’a pas anticipé et que nous avons dû prendre en compte dans le bloc d’affichage du résultat.

Une fois que le résultat est assez convaincant, on peut passer à une phase d’amélioration de ce “PoC” (Proof of Concept). Pour cela, nous avons commencé par l’ajout d’un bouton pour copier le résultat dans le presse-papiers et la gestion de la variable d’environnement OPENAI_API_KEY qui est nécessaire pour l’utilisation de l’API OpenAI. Si elle est présente dans le système du serveur, elle est prise en compte. Sinon, l’utilisateur voit un champ pour la saisir.

Comme le design initial du site, nous avons demandé à notre assistant de le revoir, afin d’utiliser des teintes bleues sombres. Puis d’ajouter des tags META pour le référencement de la page. Ici, il a ajouté des liens vers des icônes et images… sans les fournir. Nous avons donc fait appel à une IA tierce pour cela.

Après ces différents ajouts et corrections, des petits bugs sont apparus, nous les avons donc détectés et corrigés les uns après les autres. N’hésitez d’ailleurs pas dans ces étapes à générer et ajouter des tests unitaires qui vous aideront à vérifier qu’un changement n’a pas été cassant. Pensez également à effectuer un commit au sein de votre dépôt git après chaque modification importante, afin de pouvoir retourner à un état fonctionnel en cas de souci suite à des modifications infructueuses.

Dans le chemin qui nous a mené à notre site “final”, nous avons demandé à l’IA de nous générer quelques autres fonctionnalités qui étaient prévues ou non dans le cahier des charges initial : un message de chargement pendant la conversion, valider l’URL par un appui sur la touche Entrée, le fonctionnement en API avec l’ajout d’instructions sur le site. Voyez cela comme une sorte de processus itératif.

Puis vient le moment de se préparer à “la mise en production”. Bien entendu, dans le cadre d’un service professionnel, on pousserait plus loin la gestion d’erreurs et les tests, ainsi que la fiabilisation du code généré par l’IA. Dans le cadre de cette démonstration, nous lui avons simplement demandé d’utiliser le serveur ASGI uvicorn, ce qui nous a mené à remplacer Flask par Quart, un framework web orienté sur les usages asynchrones.

Là aussi, le travail de l’IA est perfectible car il faut de temps à autre lui demander de nettoyer son code, de mieux l’organiser et l’on irait parfois plus vite en faisant certaines étapes directement. A l’inverse, elle est très utile pour massivement commenter le code existant, détecter et expliquer un bug ou opérer des changements à travers différents fichiers, etc.

Comme souvent, l’usage de tels outils complète bien le travail des développeurs, permet à un plus grand nombre de produire un résultat fonctionnel, mais ne reste qu’une assistance. Le dernier test était d’ailleurs à l’image de ce constat: lorsque nous lui avons demandé comment déployer sur Clever Cloud.

Clever deploy

Ici, le modèle utilisé a fourni de base des instructions plutôt correctes. Mais les Clever Tools ont largement évolué cette année avec de nombreuses améliorations et simplifications. De plus, nous avons nativement intégré uv à la plateforme ce qui simplifie son usage.

Nous avons donc retravaillé à la main les instructions du README.md généré par l’IA, elles servent principalement à configurer l’application:

clever create -t python
clever env set QUART_ENV production
clever env set CC_PRE_BUILD_HOOK "uv sync"
# Les applications Python doivent écouter le port 9000, pas le 8080
clever env set CC_RUN_COMMAND "uvicorn app:app --host 0.0.0.0 --port 9000 --workers 4"
clever env set OPENAI_API_KEY  # Si vous voulez préintégrer votre clé d'API OpenAI

Une fois que tout est prêt et que votre code final a fait l’objet d’un commit, il vous suffit de le pousser sur Clever Cloud afin qu’il soit déployé au sein de notre infrastructure, puis rendu disponible automatiquement au sein de l’une de nos machines virtuelles. Il sera alors accessible via un domaine qui lui sera attribué par défaut avec un certificat pour l’accès HTTPS, mais vous pouvez aussi configurer le domaine de votre choix.

clever deploy
clever open

Comment tester Markitdown-converter sur votre compte Clever Cloud?

Si jamais vous souhaitez simplement tester Markitdown-converter sur votre compte Clever Cloud, vous pouvez le forker dans votre compte GitHub et procéder à un déploiement depuis la Console (pensez à configurer les variables d’environnement), ou dans un terminal en quelques commandes via les Clever Tools:

git clone https://github.com/CleverCloud/markitdown-converter
cd markitdown-converter

clever create -t python
clever env set QUART_ENV production
clever env set CC_PRE_BUILD_HOOK "uv sync"
clever env set CC_RUN_COMMAND "uvicorn app:app --host 0.0.0.0 --port 9000 --workers 4"

clever deploy
clever open

Blog

À lire également

Clever Cloud obtient la certification HDS (Hébergeur de Données de Santé)

Clever Cloud, leader européen des solutions de solutions cloud de type Platform as a Service, annonce aujourd'hui l'obtention de la certification Hébergeur de Données de Santé (HDS), dans sa version actualisée et en vigueur depuis le 16 mai 2024, sur l'intégralité des 6 activités de la norme. Cette certification renforce la position de Clever Cloud comme partenaire de confiance pour les entreprises et organisations du secteur de la santé.
Presse

Clever Tools : une année d’évolutions au service de vos déploiements, cap sur la v4

Une interface en ligne de commandes (CLI) est au cœur de l'expérience développeur. Chez Clever Cloud, cela fait bientôt 10 ans que nous proposons les Clever Tools.
Engineering Fonctionnalités

Otoroshi with LLM : simplifiez la gestion de vos API et services IA sur Clever Cloud

Vos applications et services évoluent dans un environnement de plus en plus complexe, nécessitant une gestion efficace des API et des interactions avec des modèles d'intelligence artificielle tels que les très populaires LLM (Large Language Models).
Fonctionnalités