Published · 10 min read

Construire un agent AI polyvalent

Guide d'un débutant pour développer des modèles linguistiques personnalisables pour résoudre des cas d'utilisation simples

L'auteur: Rachel Martinez Jeux de Jeux de Développeur Jeux de Tag: AI Agents


L'introduction

Bienvenue sur notre blog technique, où nous rendons les concepts complexes accessibles à tous, quel que soit leur contexte. Aujourd'hui, nous sommes plongés dans un projet passionnant: développer un grand modèle de langage (LLM) Agent qui peut s'adapter à diverses tâches.

Nous allons créer une solide infrastructure de récupération, d'augmentation et de génération (RAG) pour nous aider à choisir le LLM le plus approprié pour chaque tâche. Des entreprises comme H2O et HuggingFace ont déjà lancé des systèmes similaires, et nous avons reçu de l'intérêt des startups désireuses d'intégrer notre technologie AI dans leurs applications.

Notre cas d'utilisation particulier nécessite la possibilité de demander à la LLM en utilisant une seule entrée (une seule prise) ou en reliant plusieurs demandes. Cela nécessite la création de modules LLM personnalisables et conviviaux pour divers scénarios.

Restez à l'écoute pendant que nous entreprenons ce voyage, décomposant chaque étape de manière simple et engageante.

Cas d'utilisation actuel

Dans notre cas d'utilisation actuel, nous améliorons le contenu du CV d'un utilisateur à travers un processus en deux étapes:

  1. ****: L'utilisateur entre dans le système les sections Résumé professionnel et Expérience de son curriculum vitae et demande au LLM de générer une version plus nette du texte.
  2. Examen: L'utilisateur examine le contenu généré par LLM et fournit des instructions ou des conseils supplémentaires pour affiner et personnaliser la sortie, en s'assurant qu'elle s'aligne sur ses compétences et expériences uniques.

En suivant cette approche, les utilisateurs peuvent tirer parti de la puissance du LLM pour créer un CV convaincant qui se démarque pour les employeurs potentiels.

Cible

Nous visons à construire un module LLM entièrement personnalisable qui prend en charge notre cas d'utilisation et automatique au moins partiellement le processus de création de CV.

Mise en œuvre

Étape 1: Choisir le LLM

Lorsque vous choisissez le bon LLM pour vos besoins, il y a deux catégories principales à considérer: LLM open source et LLM propriétaire. Nous discuterons des options populaires des deux groupes, en mettant l'accent sur les avantages de choisir des LLM open source.

Les LLM open source

Exemples: Mistral AI, Phi 3, LLaMa 3.

Les avantages:

  • Aide communautaire: De grandes communautés actives de développeurs et d'utilisateurs fournissent des conseils, partagent des ressources et collaborent pour améliorer.
  • Personnalisabilité: L'accès au code source permet des modifications et des adaptations adaptées aux cas d'utilisation spécifiques.
  • Transparence: Comprendre le fonctionnement interne du modèle est crucial pour les applications avec des directives éthiques ou de confidentialité strictes.

MLL propriétaires

Exemples: GPT-4.

Avantages de: performances impressionnantes et caractéristiques uniques.

Limitations:

  • Manque de personnalisabilité: Il est limité à l'utilisation du modèle tel qu'il est.
  • Coût: Les frais basés sur l'utilisation peuvent s'accumuler au fil du temps.
  • Nature opaque: Difficile à comprendre les mécanismes sous-jacents, ce qui peut être préoccupant pour ceux qui donnent la priorité à la transparence et à l'explicabilité.

En conclusion, bien que les LLM open source et propriétaires aient leurs avantages et leurs inconvénients, les LLM open source comme Mistral AI, Phi 3 et LLaMa 3 offrent une accessibilité, une personnalisation et une transparence qui peuvent être très bénéfiques pour un large éventail d'utilisateurs.

Deuxième étape: examiner les coûts et les caractéristiques

Les LLM open-source sont généralement rentables car ils peuvent être hébergés sur vos propres serveurs ou avec des fournisseurs comme Azure ou AWS avec un modèle pay-as-you-go. Voici un résumé des coûts et caractéristiques de l'hébergement de divers LLM:

LLMDétailsLongueur du contexteLe coût
Le mélangeur 8x7BMoE LLM par Mistral AFormés: 8192 jetonsLes jetons $0.7/1M
Le mélangeur 8x22BSuccesseur de MixtralFormés: 32768 jetonsTokens de 2 millions de dollars (disponible)
LLaMa 3 70BModèle non-MoE de MetFormés: 2048 jetonsLes jetons $0.02/1K (Azu)
Phi 3 128KMultimodal-SLM par moiFormation et somme totale: 3Les jetons $0.002/1K (Az
GPT-4 TurboPropriété LLM par O16K par défaut, plus élevéPas disponible sur AWS

Étape 3: Test à l'aide d'API publiques conformes à OpenRouter

La sélection et l'essai du meilleur LLM nécessitent un moyen rationalisé d'accéder et d'évaluer les différents modèles. OpenRouter, une norme API open-source, permet de passer en douceur entre différents modèles et services AI. Nous avons choisi Fireworks AI comme fournisseur parce que:

  • Modèle Diversité: Offre une grande variété de modèles AI, y compris des LLM open source populaires comme Mistral AI, Phi 3 et LLaMa 3.
  • Facilité d'intégration: Conformément à la norme OpenRouter, l'intégration dans les infrastructures existantes est simplifiée.
  • Évolutivité: Conçu pour gérer des volumes élevés de demandes et pour évoluer de manière transparente.

Voici une fonction d'échantillon pour invoquer les réponses du modèle et les résultats de latence à l'aide du même matériel:

import json

def get_sanitized_json_response(user_input, guardrail):
    final = chain.invoke({"text": f"Sanitize {user_input}. Guardrail: {guardrail}"})
    final = chain.invoke({"text": final.content})
    return json.loads(final.content.replace("<json>", "").replace("</json>", "").replace("\n",""))
ModèleLa latenceCommentaires
Le mélangeur 8x7B2,1 sModèle le plus léger, perf
Le mélangeur 8x22B5,3sModèle successeur, sim
LLaMa 3 70G2,6sUne réponse décente mais
Phi 3128K1.5 minModèle multimodal

Une barrière de protection et une entrée très simples ont été utilisées pour tester ce qui précède:

guardrail = """Format details as bullets and use the XYZ method to format the relevant detail.
            For example:
            - I did X boosting Y percent resulting in Z.
"""

Nous avons reçu la réponse désinfectée suivante après son appel:

get_sanitized_json_response("""I served as Junior as a Software Engineer at TechCorp in Sydney in January 2011 and worked there until December 2018. During my tenure,
                            I led the team that developed advanced AI-driven financial analytics tools for processing hundreds of millions of records in a
                            distributed environment and created the initial version of the company's proprietary data pipeline. In my role, I was responsible for
                            designing solutions and implementing multiple APIs. In my last year managing a team focused on blockchain solutions.""", guardrail)

{'experience': [{'title': 'Software Engineer',
                'company': 'TechCorp',
                'location': 'Sydney',
                'start_date': '2011-01',
                'end_date': '2018-12',
                'highlights': ['- Engineered scalable database systems of a major project that improved client data processing speed by 40%.',
                              '- Spearheaded a team focused on AI-driven solutions.',
                              '- Developed AI-driven financial analytics tools processing 100M+ records in distributed environments.',
                              '- Created company\'s proprietary data pipeline.',
                              '- Managed team on blockchain solutions in final year.']}]}

En conclusion, comme la qualité de la réponse était assez comparable entre tous ces modèles, elle s'est réduite à la latence et au coût. L'expérience a été menée 3 fois avec des résultats très similaires. Nous avons donc choisi Mistral AIs Mixtral 8x7B en raison de son équilibre favorable entre latence et coût.

Étape 4: Construire une couche d'orchestration

La gestion et la coordination de plusieurs modèles linguistiques à grande échelle ou d'un seul modèle dans différentes applications sont cruciales pour une performance et une adaptabilité optimales. Au lieu de construire à partir de zéro en utilisant la vanille PyTorch, l'utilisation d'un cadre d'orchestration est plus pratique et efficace. Voici trois options:

Langchain

Avantages de: Un large éventail d'intégrations, prend en charge Python et JavaScript, un large soutien communautaire.

Les inconvénients: introduit une dépendance supplémentaire, une courbe d'apprentissage potentielle.

LlamaIndex

Avantages de: soutenu par Meta, offre une interoperabilité avec Langchain.

Les inconvénients de: une syntaxe moins adaptée aux développeurs.

La paille de foin

Avantages de: syntaxe conviviale, soutenue par des entreprises technologiques de premier plan.

Les inconvénients de lasont les intégrations limitées, car elle est encore en phase de maturation.

L'utilisation d'un cadre d'orchestration simplifie le développement, améliore l'évolutivité et fournit un accès à une communauté de soutien, ce qui en fait un choix plus favorable pour notre projet.

Conception et flux de données

L'image suivante montre le schéma de conception:

Le flux de données au sein de notre système AI est un aspect essentiel pour assurer une expérience utilisateur transparente et efficace. Bien que le diagramme de conception fournisse une représentation visuelle du processus, une explication détaillée peut aider à clarifier les étapes impliquées:

  1. User Input: Le parcours commence lorsque l'utilisateur entre ses détails, tels que les sections about et experience de son CV, dans le système.
  2. ****de génération rapide: Les données de l'utilisateur sont ensuite traitées et transformées en une ou plusieurs requêtes, qui seront utilisées pour consulter le Grand Modèle de langage (LLM) pour une version plus polissée et impressionnante du texte.
  3. LLM Intégration via Langchain: Les instructions générées sont transmises à Langchain, notre cadre d'orchestration choisi, ce qui facilite l'interaction avec le client LLM. Langchain utilise un schéma Pydantic sous la forme d'une classe pour analyser et valider les données à l'aide de kor, en veillant à ce qu'elle adhère au format requis.
  4. JSONResponse Generation: Une fois les données validées, elles sont converties en un JSONResponse final, un format de données structuré et facile à utiliser qui simplifie le traitement et la manipulation ultérieurs.
  5. Extraction et indexation de contenu: La partie contenue de la réponse JSON est extraite à l'aide de kor et indexée par des intégrations informatiques, qui sont des représentations mathématiques du texte. Ces intégrations sont ensuite stockées dans une base de données vectorielle, telle que Qdrant, pour une récupération et une comparaison efficaces lors des requêtes ultérieures.
  6. Cachage pour le module contextuel: L'ensemble de JSONResponse est mis en cache pour que le module contextuel fonctionne correctement. Cela garantit que le système peut maintenir le contexte des entrées de l'utilisateur et de la sortie des LLM lors des requêtes de suivi.
  7. ****: Lorsque l'utilisateur fournit des informations supplémentaires ou demande un raffinement supplémentaire du texte généré, la réponse JSONResponse mise en cache est modifiée en fonction du nouveau contexte et liée à l'interrogatoire mis à jour. Ce prompt modifié passe ensuite à nouveau par tout le processus, de l'intégration LLM à l'extraction et à l'indexation de contenu, pour fournir à l'utilisateur une réponse personnalisée et précise.

En comprenant le flux de données au sein de notre système, nous pouvons apprécier l'importance de chaque étape et le rôle du cadre d'orchestration dans la rationalisation du processus, ce qui se traduit par une solution efficace et conviviale basée sur AI.

Construction rapide et chaînage à l'aide de LCEL

Voici un exemple d'échantillon PromptTemplate:

from langchain.core.output_parsers import PydanticOutputParser
prompt = PromptTemplate(
    template="Please extract the following information from the given text and format it as a JSON object according to the schema:\n\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": output_parser.get_format_instructions()},
)

chain = prompt | chat_model | output_parser

Un modèle typique se compose de deux arguments principaux (il en existe d' autres mais qui ne relèvent pas de la portée de ce blog) qui sont input_variables et template. Le premier argument accepte une liste de chaînes qui seraient injectées dans le modèle prompt à l'heure d'exécution. Cette variable agit généralement comme celle des chaînes Jinja2Template ou f. Le chat_model ici serait le LLM que nous utilisons et est enchaîné à l'interrupteur. L'opérateur | (pipe) similaire à l'opérateur BASH | représente une chaîne. Il s'agit d'un court court-métrage pratique donné par la spécification LCEL (LangChain Expression Language). Cela nous permettrait d'enchaîner la réponse d'un prompt à une entrée d'un autre. Il prend également en charge l'appel à la fonction, en d'autres termes, on peut chaîner des expressions lambda ou certaines fonctions pour désinfecter généralement la sortie. Cela réduit la complexité du code en écrivant simplement des chaînes au lieu de grandes fonctions.

Étape 5: Utilisation de VectorDBs

Les bases de données vectorielles (VectorDBs) stockent, gèrent et recherchent efficacement des vecteurs de haute dimension, tels que les intégrations de texte générées par les LLM. Voici une comparaison des options les plus populaires:

Le Qdrant

Avantages: haute performance, intégration facile, communauté active.

Les inconvénients: Aucun inconvénient important.

Milvus

Avantages: Mesures de distance multiples, outil de visualisation des données.

Les inconvénients de: une courbe d'apprentissage plus rapide.

Le chrome

Avantages: Facile à utiliser Python API, conception modulaire

Les inconvénients de: Un soutien communautaire relativement nouveau et moins étendu.

PGVector

Avantages de: Leur utilisation des capacités de PostgreSQLs, des requêtes basées sur SQL.

Les inconvénients: Moins performant pour la recherche vectorielle haute dimension.

FAISS

Avantages de: recherche à haute performance, support à GPU.

Les inconvénients: nécessite une intégration avec d'autres bases de données.

L'évolutivité de Qdrant, la facilité d'intégration et le développement actif en font un choix approprié pour notre solution AI.

L'utilisation de VectorDBs comme solution robuste de IR

La création d'une solution de récupération d'informations (IR) à l'aide de VectorDBs implique:

  1. Pré-traitement du texte: Nettoyer et pré-traiter les données de texte brut.
  2. Intégration de texte Génération: Convertir le texte pré-traité en vecteurs haute dimension à l'aide d'un LLM.
  3. Stockage des intégrations dans VectorDB: intégrations d'index pour une recherche efficace.
  4. Traitement des requêtes: Préprocesser et convertir les requêtes des utilisateurs en intégrations.
  5. Recherche de similitude: Effectuer une recherche de similitude dans VectorDB pour trouver des emblèmes pertinents.
  6. Rangotage et affichage des résultats: Rangolez les intégrations récupérées et convertissez-les en texte pour affichage.

En suivant ce processus et en utilisant VectorDBs, nous pouvons construire un système IR efficace et efficace.

Prêt à recruter avec précision ?

Commencez gratuitement, invitez toute votre équipe et voyez votre premier candidat noté en 15 minutes.

fr