For AI agents: the complete documentation index is available at https://docs.ovhcloud.com/fr/llms.txt, the full documentation bundle is available at https://docs.ovhcloud.com/fr/llms-full.txt, and this page is available as Markdown at https://docs.ovhcloud.com/fr/guides/public-cloud/ai-machine-learning/ai-endpoints-function-calling-langchain4j.md.

AI Endpoints - Utiliser les appels de fonctions avec LangChain4J

Voir en Markdown

Apprenez à utiliser les appels de fonctions avec Java, LangChain4j et OVHcloud AI Endpoints

Info

AI Endpoints est couvert par les Conditions particulières OVHcloud Public Cloud (voir l’Annexe 10 – « Conditions spécifiques – AI Endpoints »).

Objectif

Stable Diffusion est un modèle d’intelligence artificielle puissant permettant de générer des images à partir de descriptions textuelles. Vous pouvez l’utiliser grâce à AI Endpoints en appelant simplement l’endpoint avec un prompt. Cependant, créer un bon prompt pour Stable Diffusion peut s’avérer difficile.

Le Function Calling permet au système d’IA d’effectuer des tâches plus complexes et dynamiques, et de tirer parti de connaissances et de services externes pour générer des réponses plus précises et informatives. Dans le contexte de la génération d’images, le function calling peut être utilisé pour améliorer la qualité des prompts en les optimisant grâce à un outil externe basé sur un LLM.

Dans ce tutoriel, nous allons vous montrer comment optimiser vos prompts à l’aide du Function Calling et d’OVHcloud AI Endpoints.

Pour cela, nous allons utiliser LangChain4j, un framework basé sur Java inspiré de LangChain, conçu pour simplifier l’intégration des LLM (Large Language Models) dans les applications. Notez que LangChain4j n’est pas officiellement maintenu par l’équipe de LangChain, malgré la ressemblance des noms.

Associé aux AI Endpoints d’OVHcloud, qui proposent à la fois des modèles LLM et des modèles d’embedding, il devient facile de créer des assistants avancés et prêts pour la production.

Illustration d'un robot humanoïde peignant sur une toile posée sur un chevalet en bois dans un atelier d'artiste

Définition

  • Function Calling : le function calling désigne la capacité d’un modèle de langage ou d’un système d’IA à demander, invoquer et exécuter des fonctions ou des tâches prédéfinies, telles que le traitement de données, des calculs ou des appels à des API externes, en réponse à une entrée utilisateur ou à un prompt.
  • LangChain4j : un framework basé sur Java inspiré de LangChain, conçu pour simplifier l’intégration des LLM (Large Language Models) dans les applications. Notez que LangChain4j n’est pas officiellement maintenu par l’équipe de LangChain, malgré la ressemblance des noms.
  • AI Endpoints : une plateforme serverless d’OVHcloud offrant un accès simplifié à une variété de modèles d’IA reconnus mondialement, dont Mistral, LLaMA, et bien d’autres. Cette plateforme est conçue pour être simple, sécurisée et intuitive, avec la confidentialité des données comme priorité absolue.

Prérequis

  • Un projet Public Cloud dans votre compte OVHcloud.
  • Un token d’accès pour OVHcloud AI Endpoints. Pour créer un token API, suivez les instructions du guide AI Endpoints - Premiers pas.
  • Cet exemple de code utilise JBang, un outil basé sur Java permettant de créer et d’exécuter des programmes Java sous forme de scripts. Pour plus d’informations sur JBang, consultez la documentation JBang.

En pratique

Pour créer notre application, nous allons utiliser LangChain4J afin de simplifier l’intégration des modèles d’IA et le mécanisme de function calling.

Création de l’outil

Pour utiliser le mécanisme de function calling, nous devons définir un outil.

Dans notre exemple, l’objectif de l’outil est d’appeler l’API Stable Diffusion pour générer une image.

⚠️ Ce n’est pas le modèle lui-même qui appelle l’outil, mais le client qui invoque le modèle. ⚠️

//Image generation tool
@Tool("""
Tool to create an image with Stable Diffusion XL given a prompt and a negative prompt.
""")
void generateImage(@P("Prompt that explains the image") String prompt, @P("Negative prompt that explains what the image must not contains") String negativePrompt) throws IOException, InterruptedException {
System.out.println("Prompt: " + prompt);
System.out.println("Negative prompt: " + negativePrompt);

HttpRequest httpRequest = HttpRequest.newBuilder()
        .uri(URI.create(System.getenv("OVH_AI_ENDPOINTS_SD_URL")))
        .POST(HttpRequest.BodyPublishers.ofString("""
                {"prompt": "%s", 
                        "negative_prompt": "%s"}
                """.formatted(prompt, negativePrompt)))
        .header("accept", "application/octet-stream")
        .header("Content-Type", "application/json")
        .header("Authorization", "Bearer " + System.getenv("OVH_AI_ENDPOINTS_SDXL_ACCESS_TOKEN"))
        .build();

HttpResponse<byte[]> response = HttpClient.newHttpClient()
        .send(httpRequest, HttpResponse.BodyHandlers.ofByteArray());

System.out.println("SDXL status code: " + response.statusCode());
Files.write(Path.of("generated-image.jpeg"), response.body());
}

⚠️ L’un des points essentiels pour aider le LLM à choisir le bon outil à utiliser est de fournir une description claire et complète. ⚠️

Une fois l’outil prêt, indiquons au modèle qu’il peut l’utiliser !

Optimiser le modèle avec un outil

Commençons par créer un chatbot simple.

/// Chatbot definition.
/// The goal of the chatbot is to build a powerful prompt for Stable diffusion XML.
interface ChatBot {
    @SystemMessage("""
            Your are an expert of using the Stable Diffusion XL model.
            The user explains in natural language what kind of image he wants.
            You must do the following steps:
              - Understand the user's request.
              - Generate the two kinds of prompts for stable diffusion: the prompt and the negative prompt
              - the prompts must be in english and detailed and optimized for the Stable Diffusion XL model. 
              - once and only once you have this two prompts call the tool with the two prompts.
            If asked about to create an image, you MUST call the `generateImage` function.
            """)
    @UserMessage("Create an image with stable diffusion XLK following this description: {{userMessage}}")
    String chat(String userMessage);
}

Il n’est pas obligatoire de créer un message système aussi détaillé, mais cela aide le modèle à choisir l’outil au bon moment.

Ensuite, nous assemblons toutes les pièces :

// Chatbot with tool calling
void main() throws Exception {

    // Main chatbot configuration, choose on of the available models on the AI Endpoints catalog (https://www.ovhcloud.com/en-gb/public-cloud/ai-endpoints/catalog/)
    ChatModel chatModel = MistralAiChatModel.builder()
            .apiKey(System.getenv("OVH_AI_ENDPOINTS_ACCESS_TOKEN"))
            .baseUrl(System.getenv("OVH_AI_ENDPOINTS_MODEL_URL"))
            .modelName(System.getenv("OVH_AI_ENDPOINTS_MODEL_NAME"))
            .logRequests(false)
            .logResponses(false)
            // To have more deterministic outputs, set temperature to 0.
            .temperature(0.0)
            .build();

    // Add memory to fine tune the SDXL prompt.
    ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);

    // Build the chatbot thanks to LangChain4J AI Servises mode
    ChatBot chatBot = AiServices.builder(ChatBot.class)
            .chatModel(chatModel)
            .tools(new ImageGenTools())
            .chatMemory(chatMemory)
            .build();

    // Start the conversation loop (enter "exit" to quit)
    String userInput = "";
    Scanner scanner = new Scanner(System.in);
    while (true) {
        System.out.print("Enter your message: ");
        userInput = scanner.nextLine();
        if (userInput.equalsIgnoreCase("exit")) break;
        System.out.println("Response: " + chatBot.chat(userInput));
    }
    scanner.close();
}

ℹ️ Nous utilisons une boucle afin de pouvoir demander au modèle d’optimiser les paramètres de génération d’image en fonction de la réponse précédente. ℹ️ Et voilà !

Il est temps de tester notre optimiseur Stable Diffusion.

# Output for chatbot calling
$ jbang ImageGeneration.java


Enter your message: Un chat roux mignon photo réaliste

Prompt: A high-quality, realistic image of a cute red cat, with expressive eyes, soft fur, and a playful pose. 
The cat should be well-lit, with a warm and inviting atmosphere.

Negative prompt: No text, no watermarks, no low-quality images, no cartoon-style, no blurry or pixelated images, 
no cats with missing body parts, no cats with unnatural colors, no cats in unrealistic settings, no cats with human features, 
no cats with inappropriate content.

Response: I have successfully generated the image for you. The image should be a high-quality, 
realistic image of a cute red cat, with expressive eyes, soft fur, and a playful pose. The cat should be well-lit, 
with a warm and inviting atmosphere. If you have any issues or need further assistance, please let me know.

Enter your message: exit

ℹ️ Comme vous pouvez le voir, le modèle a traduit le prompt 😊

Voici le résultat du prompt :

Un chat roux mignon généré par Stable Diffusion

Conclusion

Dans cet article, nous avons vu comment utiliser le Function Calling avec OVHcloud AI Endpoints et LangChain4J.

Aller plus loin

Vous trouverez l’exemple de code complet dans le dépôt GitHub.

Parcourez la documentation AI Endpoints complète pour mieux comprendre les concepts principaux et démarrer.

Pour découvrir comment créer des applications complètes et performantes avec AI Endpoints, explorez nos guides AI Endpoints dédiés.

Pour une formation ou une assistance technique sur la mise en œuvre de nos solutions, contactez votre commercial ou consultez la page Professional Services pour obtenir un devis et faire analyser votre projet par nos experts.

Votre avis nous intéresse !

N’hésitez pas à nous faire part de vos questions, retours et suggestions concernant AI Endpoints et ses fonctionnalités :

  • Dans le canal #ai-endpoints du serveur Discord OVHcloud, où vous pouvez échanger avec la communauté et les équipes OVHcloud.
Cette page vous a-t-elle aidé ?