Ce projet fait partie d'un Travail de Bachelor réalisé à l'HEIG-VD, dans la filière Informatique et systèmes de communication (ISC) par Lazar Pavicevic et supervisé par le Professeur Marcel Graf.
Le Travail de Bachelor est également composé d'une application web accessible sur ce repository :
LLM-Structurizer est une API suivant la spécification OpenAPI 3, qui propose des outils pour faciliter l'extraction et la structuration de données issues du langage naturel. L'API met à disposition deux catégories d'endpoints :
- Les
Parsers
: endpoints pour lire et récupérer le texte de certains types de fichiers comme les pdf, csv ou les docx. - Les
Structurizers
: endpoints pour manipuler et extraire des données structurées selon un format de sortie voulu comme le json ou le xml.
L'API est au stade de Proof of Concept, elle propose actuellement la récupération du texte des fichiers pdf sans reconnaissance optique de caractères (OCR) avec poppler-utils
et l'extraction de données au format json.
L'API a été principalement développée avec les modèles d'OpenAI et fonctionne avec :
gpt-3.5-turbo
gpt-3.5-turbo-16k
gpt-4
La communication avec les LLMs se fait avec la librairie LangChain. Une famille de modèles de langage supportée par la librairie peut être intégrée facilement au projet.
- NodeJS >= version 16
- NPM >= version 8
- Poppler-utils disponible sur Ubuntu/Debian et macOS via Homebrew
- PostgreSQL version 15
- Docker
- Clé d'API OpenAI pour le lancement des tests unitaires
git clone git@github.com:Lazzzer/llm-structurizer.git
cd llm-structurizer
npm install
Créer un fichier .env
à partir du fichier .env.example et mettez-y vos valeurs.
Exemple:
NODE_ENV=development
# Valeurs à disposition: 'log, warn, error, debug, verbose'
LOG_LEVEL='debug, verbose'
# Format: postgresql://[POSTGRES_USER]:[POSTGRES_PASSWORD]@[DB_HOST]:[DB_PORT]/[DB_NAME]?schema=[DB_SCHEMA]&connect_timeout=300
DATABASE_URL=postgresql://postgres:root@localhost:5432/llm-structurizer?schema=public&connect_timeout=300
# Chemin de l'exécutable de poppler-utils
# Pour macOS: /opt/homebrew/bin
POPPLER_BIN_PATH=/usr/bin
# Optionnel, pour lancer les tests
OPENAI_API_KEY=sk-...
npx prisma db push
# Optionnel : seeding de la base de données pour avoir une clé d'API prête à l'emploi
npx prisma db seed
Note
La base de données doit être initialisée et accessible par le serveur de l'API.
npm run start:dev
Les liens suivants sont disponibles :
Note
La clé d'API OpenAI doit figurer dans le fichier.env
.
npm run test
La branche main
est protégée et les pull requests doivent passer l'action ci
pour être mergées.
La CI est gérée avec une Github Action qui sépare le processus en trois étapes.
D'abord, elle effectue une installation des dépendances et une mise en cache pour les prochains runs.
Ensuite, elle lance le linting, le formatage et les tests unitaires en parallèle. Pour les tests, une instance d'une base de données Postgres est créée et poppler-utils
est installé avec l'action cache-apt-packages.
Note
Pour que les tests passent, il faut que la clé d'API OpenAI soit présente dans lessecrets
du repository.
Finalement, si les étapes précédentes sont validées, elle vérifie le build du projet.
Ce workflow s'inspire fortement de l'excellent article de Maxime Heckel sur le sujet.
Note
Docker est nécessaire pour cette étape.
L'environnement de production se lance à l'aide de docker compose, dont un template est disponible dans le fichier docker-compose.example.yml. Il ne dépend pas de l'installation précédente.
Vous pouvez créer un nouveau fichier à partir du template ou tout simplement lancer directement cette dernière, toutes les variables d'environnement sont déjà configurées correctement.
cd llm-structurizer
# Ajoutez -f docker-compose.example.yml si vous utilisez le template
docker compose [-f docker-compose.example.yml] build
L'image du serveur se trouve dans le fichier Dockerfile, basée sur Debian 10 avec poppler-utils
d'installé.
docker compose up
Il est préférable que la base de données soit initialisée avant de lancer le container du serveur. Dans ce cas, vous pouvez lancer les commandes suivantes:
# Lancement de la base de données [en background s'il le faut]
docker compose up db [-d]
# Lancement de l'application
docker compose up app [-d]
Le serveur de l'API est initialisé, si ce dernier ne tourne pas en fond, ouvrez une nouvelle instance de votre terminal et lancer les commandes suivantes:
docker exec -it llm-structurizer-app npx prisma migrate deploy
docker exec -it llm-structurizer-app npx prisma db seed
La base de données reste accessible localement avec les valeurs présentes dans DATABASE_URL
.
L'API est maintenant disponible sur les mêmes liens que précédemment :
docker compose down
Le Dockerfile avec ses variables d'environnement suffit pour avoir une API fonctionnelle. L'image n'est actuellement pas dans un container registry.
Lors du premier déploiement, il faut s'assurer que la base de données associée ait bien reçu les migrations avec npx prisma migrate deploy
. La commande peut se lancer depuis un container actif du serveur. Il est également possible de lancer la commande localement depuis la racine du projet, après avoir modifié la variable d'environnement DATABASE_URL
avec la connection string de la base de données de production.
Le déploiement du projet a été testé sur App Platform de Digital Ocean.