Skip to content

LLM-Structurizer is an API that allows you to structure your data with the power of Large Language Models.

License

Notifications You must be signed in to change notification settings

Lazzzer/llm-structurizer

Repository files navigation

Main Page of Swagger Interface

LLM-Structurizer

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.

Stack

LLMs utilisés

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.

Prérequis

Optionnel

Environnement de développement

Clonage du repository

git clone git@github.com:Lazzzer/llm-structurizer.git

Installation des dépendances

cd llm-structurizer
npm install

Ajout des variables d'environnement

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-...

Initialisation de la base de données

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

Lancement du serveur de développement

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 :

Lancement des tests

Note
La clé d'API OpenAI doit figurer dans le fichier .env.

npm run test

CI

La branche main est protégée et les pull requests doivent passer l'action ci pour être mergées.

Screenshot CI pipelines

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 les secrets 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.

Environnement de production en local

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.

Création des images

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é.

Lancement des containers

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]

Lancement des migrations

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 :

Arrêt des containers

docker compose down

Considérations pour la mise en production

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.

About

LLM-Structurizer is an API that allows you to structure your data with the power of Large Language Models.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Languages