Interface d'invocation
LangChain fournit des interfaces et des protocoles flexibles pour invoquer des chaînes. Que ce soit pour une chaîne simple ou une chaîne complexe avec plusieurs étapes, l’objectif est de pouvoir facilement intégrer et manipuler ces chaînes via des appels bien structurés.
Voici comment gérer cela en TypeScript :
1. Concepts principaux
Interface d’invocation
Une chaîne dans LangChain est essentiellement une classe qui expose une méthode d’entrée, souvent appelée call()
. Cette méthode :
- Accepte un dictionnaire (souvent de type
{ [key: string]: any }
) comme entrée. - Retourne un résultat (souvent un objet ou une chaîne).
Protocole d’invocation
Le protocole d’invocation repose sur :
- Entrées JSON-like : Les données d’entrée sont sérialisées au format clé-valeur.
- Sorties JSON-like : Les données renvoyées sont souvent des objets complexes, mais elles peuvent être des chaînes ou des nombres selon le cas.
2. Créer une interface d’invocation
Exemple d’interface TypeScript pour invoquer une chaîne
interface ChainInvocation { call(inputs: { [key: string]: any }): Promise<{ [key: string]: any }>;}
Chaque chaîne implémente cette interface en fournissant sa propre logique dans la méthode call
.
3. Implémenter une chaîne avec une interface
Voici un exemple où nous définissons une chaîne pour répondre à une question simple en utilisant un LLM.
import { OpenAI } from "langchain/llms/openai";import { SimpleChain } from "langchain/chains";
// Interface pour invoquer la chaîneinterface ChainInvocation { call(inputs: { [key: string]: any }): Promise<{ [key: string]: any }>;}
// Implémentation d'une chaîneclass QuestionAnsweringChain implements ChainInvocation { private chain: SimpleChain;
constructor(llm: OpenAI) { this.chain = new SimpleChain({ llm, promptTemplate: "Q: {question}\nA:", }); }
async call(inputs: { [key: string]: any }): Promise<{ [key: string]: any }> { const result = await this.chain.call(inputs); return { answer: result.text }; }}
// Utilisation de la chaîneasync function main() { const llm = new OpenAI({ openAIApiKey: process.env.OPENAI_API_KEY, temperature: 0.7, });
const qaChain = new QuestionAnsweringChain(llm); const response = await qaChain.call({ question: "Quelle est la capitale de la France ?" });
console.log("Réponse :", response.answer);}
main().catch(console.error);
4. Protocole HTTP pour invoquer les chaînes
Pour rendre vos chaînes accessibles via une API HTTP, vous pouvez utiliser un framework comme Fastify ou Express en TypeScript.
Exemple avec Express
Installer Express
npm install express body-parser
Serveur HTTP pour invoquer une chaîne
import express from "express";import bodyParser from "body-parser";import { OpenAI } from "langchain/llms/openai";import { SimpleChain } from "langchain/chains";
// Configuration du modèleconst llm = new OpenAI({ openAIApiKey: process.env.OPENAI_API_KEY, temperature: 0.7,});
// Création de la chaîneconst chain = new SimpleChain({ llm, promptTemplate: "Q: {question}\nA:",});
// Initialisation du serveur Expressconst app = express();app.use(bodyParser.json());
// Endpoint HTTP pour appeler la chaîneapp.post("/invoke-chain", async (req, res) => { const { question } = req.body; if (!question) { return res.status(400).json({ error: "La question est obligatoire." }); }
try { const result = await chain.call({ question }); res.json({ answer: result.text }); } catch (error) { console.error("Erreur lors de l'appel à la chaîne :", error); res.status(500).json({ error: "Une erreur s'est produite." }); }});
// Démarrage du serveurconst PORT = 3000;app.listen(PORT, () => { console.log(`Serveur démarré sur http://localhost:${PORT}`);});
5. Utilisation du protocole
Exemple d’appel via HTTP avec curl
curl -X POST http://localhost:3000/invoke-chain \-H "Content-Type: application/json" \-d '{"question": "Quelle est la capitale de la France ?"}'
Réponse attendue
{ "answer": "Paris"}
6. Étapes suivantes
- Ajouter des outils pour des chaînes plus complexes.
- Fournir des réponses enrichies (exemple : contexte, sources).
- Implémenter des validations d’entrées avec des bibliothèques comme Joi ou Zod.
- Conteneuriser l’API avec Docker pour faciliter le déploiement.