linkedin-ico github-ico

Mistral AI et Symfony

llphant logo

Page Précédente : 3 - PHP

Comment l'autowiring de Symfony simplifie encore l'intégration

Maintenant, alors que nous approchons de notre destination finale, il est temps de lever les yeux vers l'horizon et d'apercevoir les lumières scintillantes de Symfony et son autowiring, tel un phare guidant les navires vers un port sûr.

L'autowiring de Symfony est une fonctionnalité du conteneur de services qui simplifie grandement la gestion des services en réduisant la configuration nécessaire. Il fonctionne en lisant les indices de type dans les constructeurs (ou d'autres méthodes) de vos classes, permettant ainsi au conteneur de services de Symfony de résoudre automatiquement et d'injecter les dépendances requises pour vos services. En d'autres termes, l'autowiring permet à Symfony de "deviner" quels services ou objets vos classes nécessitent, en se basant sur leurs types déclarés, et de les fournir automatiquement sans que vous ayez besoin de configurer manuellement chaque service ou dépendance.

Pour intégrer Mistral AI dans un projet Symfony afin de générer des réponses automatiques. Voici comment l'autowiring de Symfony peut simplifier cette intégration (placez-vous dans votre projet Symfony préalablement créé) :

composer require theodo-group/llphant
# config/services.yaml
services:
    LLPhant\OpenAIConfig:
        properties:
            apiKey: '%env(MISTRAL_AI_API_KEY)%'
            model: '%env(MISTRAL_AI_MODEL)%'
    LLPhant\Embeddings\VectorStores\FileSystem\FileSystemVectorStore:
        arguments:
            $filepath: 'vectors' # Emplacement du store
    LLPhant\Embeddings\EmbeddingGenerator\Mistral\MistralEmbeddingGenerator:
        arguments:
            $config: '@LLPhant\OpenAIConfig'
    LLPhant\Chat\MistralAIChat:
        arguments:
            $config: '@LLPhant\OpenAIConfig'
    LLPhant\Query\SemanticSearch\QuestionAnswering:
        arguments:
            $vectorStoreBase: '@LLPhant\Embeddings\VectorStores\FileSystem\FileSystemVectorStore'
            $embeddingGenerator: '@LLPhant\Embeddings\EmbeddingGenerator\Mistral\MistralEmbeddingGenerator'
            $chat: '@LLPhant\Chat\MistralAIChat'
# .env
# Votre clé API Mistral AI
MISTRAL_AI_API_KEY=votre_clé_api_ici
# Nom du model utilisé
MISTRAL_AI_MODEL=mistral-small-latest
# src/Controller/ChatController
<?php
namespace App\Controller;

use LLPhant\Embeddings\Document;
use LLPhant\Embeddings\EmbeddingGenerator\Mistral\MistralEmbeddingGenerator;
use LLPhant\Embeddings\VectorStores\FileSystem\FileSystemVectorStore;
use LLPhant\Query\SemanticSearch\QuestionAnswering;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;

class ChatController extends AbstractController
{
    #[Route('/enregistrer', name: 'enregistrer')]
    public function enregistrer(MistralEmbeddingGenerator $embeddingGenerator, FileSystemVectorStore $store): Response
    {
        // Création du document (ici nous expliquons que notre entreprise s'appelle Kiora et que nous sommes une entreprise de développement web)
        $document = new Document();
        $document->content = 'Nous somme "Kiora", une entreprise de développement web';

        // Génération des embeddings
        $embeddingGenerator->embedDocument($document);

        // Enregistrement du document dans le store
        $store->addDocument($document);

        return new Response("Créé", Response::HTTP_CREATED);
    }

    #[Route('/question', name: 'question')]
    public function question(QuestionAnswering $questionAnswering): Response
    {
        // Récupération de la réponse
        $response = $questionAnswering->answerQuestion('Qui somme nous ?'); // Votre prompt
        
        // Affichage de la réponse
        return new Response($response);
    }
}

Dans cet exemple, Symfony s'occupe de l'injection de dépendance dans le contrôleur grâce à l'autowiring, simplifiant ainsi l'intégration et permettant aux développeurs de se concentrer sur la logique métier plutôt que sur la configuration. LLPhant s'intègre donc très facilement a un site web Symfony.