À mesure que les applications basées sur les LLM passent de prototypes mono-locataire à des plateformes SaaS multi-locataire à haut volume, la complexité de l'observabilité se multiplie. Il ne suffit plus de simplement vérifier si un prompt a réussi ; vous devez vous assurer que le locataire A ne peut pas voir les données du locataire B, et vous devez savoir exactement combien coûte l'utilisation de chaque client pour votre infrastructure. Langfuse, une plateforme open source d'ingénierie LLM, fournit les briques de base pour résoudre ces défis, mais leur implémentation correcte en production nécessite une approche structurée.
Le défi de l'état partagé dans les architectures multi-locataires
Dans une architecture microservices traditionnelle, l'isolation des données est souvent gérée au niveau de la base de données ou du conteneur. Dans l'observabilité IA, cependant, les données circulent à travers les traces de prompts, les générations et les évaluations. Si vous utilisez un projet Langfuse global unique pour tous les locataires, vous vous exposez à deux risques critiques : la fuite de données et la confusion des coûts. Une trace d'un client du secteur de la santé ne doit jamais apparaître dans un tableau de bord de services financiers, et vous ne pouvez pas simplement faire la moyenne des coûts des jetons lors de la facturation de différents niveaux de clients.
Stratégie 1 : Isolation au niveau du projet via les clés API
Le moyen le plus robuste de garantir l'isolation dans Langfuse est d'exploiter sa prise en charge native de projets multiples. Chaque projet Langfuse agit comme un espace de noms distinct avec ses propres clés API, ses politiques de rétention et ses contrôles d'accès.
Création dynamique de projets lors de l'inscription
Lorsqu'un nouveau locataire s'inscrit à votre plateforme SaaS, votre backend doit créer programmatically un nouveau projet Langfuse (ou les assigner à un pool pré-créé) et générer des clés Publiques et Secrètes uniques. Stockez ces clés en toute sécurité dans votre magasin de métadonnées de locataire, et non dans le code côté client.
// Exemple : Attribution des identifiants Langfuse lors de l'inscription du locataire
async function provisionTenant(tenantId, email) {
// 1. Créer ou obtenir un projet Langfuse
const project = await langfuseAdminClient.createProject({
name: `tenant-${tenantId}`,
metadata: { ssa_tenant_id: tenantId }
});
// 2. Générer des clés API spécifiques à ce projet
const keys = await langfuseAdminClient.createApiKeys({
publicKey: `pk-${tenantId}`,
secretKey: await generateSecureSecret(),
projectId: project.id
});
// 3. Stocker en toute sécurité dans votre base de données (chiffré)
await db.tenants.update({
where: { id: tenantId },
data: {
langfuse_public_key: keys.publicKey,
langfuse_secret_key: keys.secretKey
}
});
}
Stratégie 2 : Attribution précise des coûts avec des balises de métadonnées
Si la création d'un projet séparé par locataire est trop lourde sur le plan opérationnel pour les cas d'usage à haut volume (par exemple, des centaines de milliers de petits locataires), vous pouvez utiliser un projet partagé unique mais imposer une isolation logique stricte en utilisant metadata et tags.
Langfuse vous permet d'attacher des paires clé-valeur arbitraires à chaque trace, span et génération. En injectant de manière cohérente votre identifiant de locataire interne dans ces champs, vous pouvez filtrer et agréger les coûts par locataire.
Mise en œuvre du suivi des coûts
Langfuse capture automatiquement l'utilisation des jetons et la tarification des modèles. Pour attribuer les coûts, vous devez vous assurer que vos traces sont correctement balisées. Voici comment intégrer cela dans votre couche applicative :
import { Langfuse } from 'langfuse';
const langfuse = new Langfuse({
publicKey: 'pk-shared',
secretKey: 'sk-shared',
baseUrl: 'https://cloud.langfuse.com'
});
export function logLLMGeneration(tenantId, model, input, output, tokens) {
return langfuse.generation({
name: "customer-support-bot",
model: model,
input: input,
output: output,
usage: {
promptTokens: tokens.prompt,
completionTokens: tokens.completion
},
// CRUCIAL : Baliser avec l'ID du locataire pour l'isolation et la facturation
metadata: {
tenantId: tenantId,
feature: "auto-response",
version: "v2.1"
},
tags: [`tenant:${tenantId}`]
});
}
Intégration de la facturation et confidentialité des données
Avec des données correctement balisées ou isolées, vous pouvez maintenant construire un pipeline de facturation. Pour l'isolation au niveau du projet, vous pouvez extraire les métriques directement depuis le projet de chaque locataire. Pour les projets partagés, utilisez l'API Langfuse pour interroger les journaux de génération filtrés par metadata.tenantId.
Conclusion
Implémenter l'observabilité multi-locataire dans un environnement SaaS ne consiste pas seulement à voir les journaux ; il s'agit de protéger les limites des données et de fournir une visibilité transparente et granulaire sur les coûts. Que vous choisissiez la sécurité stricte des projets Langfuse par locataire ou la scalabilité du balisage basé sur les métadonnées dans un projet partagé, Langfuse fournit les accroches nécessaires pour construire une pile d'observabilité IA de qualité production. Commencez par votre flux d'inscription, assurez un balisage cohérent et construisez votre logique de facturation sur la base de données de traces vérifiées.