Un guide pour les débutants sur le développement de modèles de langage large personnalisables pour résoudre des cas d'utilisation simples
Auteur : Rachel Martinez | Fonction : Développeur | Étiquette : AI Agents
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 agent de modèle linguistique grand (LLM) 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 à sélectionner 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 de 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 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, en 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 par un processus en deux étapes:
- Input: L'utilisateur entre dans le système les sections Professional Summary et Experience de son CV et demande au LLM de générer une version plus polissée du texte.
- Review: L'utilisateur passe en revue 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 du pouvoir du LLM pour créer un CV convaincant qui se démarque des 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
Lors du choix du bon LLM pour vos besoins, il y a deux catégories principales à considérer: LLM open source et LLM propriétaire. Nous allons discuter des options populaires des deux groupes, en nous concentrant sur les avantages du choix des LLM open source.
Les LLM open source
Exemples: Mistral AI, Phi 3, LLaMa 3.
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.
- Customizabilité: L'accès au code source permet des modifications et des adaptations adaptées aux cas d'utilisation spécifiques.
- Transparence: La compréhension du fonctionnement interne du modèle est cruciale pour les applications avec des directives éthiques ou de confidentialité strictes.
Les LLM de propriété
Exemples: GPT-4.
Avantages: performances impressionnantes et caractéristiques uniques.
Limitations:
- ** Manque de personnalisabilité**: Il est limité à l'utilisation du modèle tel qu'il est.
- Cost: Les frais basés sur l'utilisation peuvent s'accumuler au fil du temps.
- ** Nature opaque**: Difficile de comprendre la mécanique sous-jacente, ce qui peut être préoccupant pour ceux qui donnent la priorité à la transparence et à l'explicabilité.
En conclusion, alors que les LLM open source et propriétaires ont 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.
Étape 2: Découvrez 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 auprès de 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:
| LLM | Détails | Longueur du contexte | Coût |
|---|---|---|---|
| Le mélangeur 8x7B | MoE LLM par Mistral A | Formés: 8192 jetons | Les jetons $0.7/1M (ce sont des jetons) |
| Le mélangeur 8x22B | Successeur de Mixtral | Formés: 32768 jetons | Tokens de 2 millions de dollars (disponible) |
| LLaMa 3 70B | Modèle non-MoE de la société Met | Formés: 2048 jetons | Les jetons $0.02/1K (Azu) |
| - Je suis en train de faire une demande. | - Multimodal-SLM par moi | Formation et nombre total: 3 | Les jetons $0.002/1K (Az) |
| GPT-4 Turbo | Propriétaire LLM par O | 16K par défaut, plus élevé | Pas disponible sur AWS |
Étape 3: Test à l'aide d'API publiques conformes à OpenRouter
La sélection et le test du meilleur LLM nécessitent une méthode rationalisée pour accéder et évaluer les différents modèles. OpenRouter, une norme open source API, permet de passer en douceur entre différents modèles et services AI. Nous avons choisi Fireworks AI comme fournisseur parce que:
- ** Diversité de modèle**: Offre une grande variété de modèles AI, y compris des LLM open source populaires comme Mistral AI, Phi 3 et LLaMa 3.
- Facile à intégrer: Conformément à la norme OpenRouter, l'intégration dans les infrastructures existantes est simplifiée.
- Scalabilité: Conçu pour gérer des volumes élevés de demandes et pour une évolution fluide.
Voici une fonction d'échantillon pour invoquer les réponses du modèle et les résultats de latence en utilisant le 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èle | La latence | Commentaires |
|---|---|---|
| Le mélangeur 8x7B | 2.1s | Modèle le plus léger, perf |
| Le mélangeur 8x22B | 5.3s | Modèle successeur, sim |
| LLaMa 3 70B | 2,6s | Une réponse décente mais |
| - Je suis en train de faire une demande. | 1.5 min | Modèle multimodal |
Une barrière de protection et une entrée très simples ont été utilisées pour tester les éléments ci-dessus:
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,
J'ai dirigé l'équipe qui a développé des outils d'analyse financière avancés basés sur AI pour traiter des centaines de millions de dossiers en une seule année.
Il a également créé la version initiale du pipeline de données propriétaires de la société. Dans mon rôle, j'étais responsable de
la conception de solutions et la mise en œuvre de multiples API. "L'année dernière, j'ai dirigé une équipe axée sur les solutions blockchain.
"Expérience": "Instructeur en logiciel",
"société": "TechCorp",
"emplacement": "Sydney",
"start_date": "2011-01",
"date de fin": "2018-12",
"Highlights": ['- Systèmes de base de données évolutifs conçus pour un projet majeur qui ont amélioré la vitesse de traitement des données client de 40%.',
" - A la tête d'une équipe axée sur les solutions AI".,
" - Des outils d'analyse financière AI développés pour traiter plus de 100 millions de documents dans des environnements distribués. "
"- Pipeline de données propriétaires de la société créée".,
" - Équipe gérée sur les solutions blockchain en dernière année. "
In conclusion, since the response quality was fairly comparable among all these models, it came down to latency and cost. The experiment was run 3 times achieving very similar results. So we chose Mistral AI’s Mixtral 8x7B due to its favorable balance of latency and cost.
Step 4: Building an Orchestration Layer
Managing and coordinating multiple large-scale language models or a single model across various applications is crucial for optimal performance and adaptability. Instead of building from scratch using vanilla PyTorch, employing an orchestration framework is more practical and efficient. Here are three options:
Langchain
Advantages: Vast array of integrations, supports Python and JavaScript, extensive community support.
Drawbacks: Introduces an additional dependency, potential learning curve.
LlamaIndex
Advantages: Backed by Meta, offers interoperability with Langchain.
Drawbacks: Less developer-friendly syntax.
Haystack
Advantages: User-friendly syntax, supported by prominent tech corporations.
Drawbacks: Limited integrations as it’s still maturing.
Using an orchestration framework simplifies development, improves scalability, and provides access to a supportive community, making it a more favorable choice for our project.
Design and Data Flow
The following image shows the design diagram:
The data flow within our AI-driven system is an essential aspect of ensuring a seamless and efficient user experience. While the design diagram provides a visual representation of the process, a detailed explanation can help clarify the steps involved:
- User Input: The journey begins when the user enters their details, such as the “about” and “experience” sections of their resume, into the system.
- Prompt Generation: The user’s input is then processed and transformed into one or more prompts, which will be used to query the Large Language Model (LLM) for a more polished and impressive version of the text.
- LLM Integration via Langchain: The generated prompts are passed to Langchain, our chosen orchestrator framework, which facilitates the interaction with the LLM client. Langchain leverages a Pydantic schema in the form of a class to parse and validate the data using kor, ensuring that it adheres to the required format.
- JSONResponse Generation: Once the data is validated, it is converted into a final JSONResponse, a structured and easy-to-work-with data format that simplifies further processing and manipulation.
- Content Extraction and Indexing: The content part of the JSONResponse is extracted using kor and indexed by computing embeddings, which are mathematical representations of the text. These embeddings are then stored in a vector database, such as Qdrant, for efficient retrieval and comparison during subsequent queries.
- Caching for Context Module: The entire JSONResponse is cached for the context module to function correctly. This ensures that the system can maintain the context of the user’s input and the LLM’s output during follow-up queries.
- Follow-up Queries: When the user provides additional input or requests further refinement of the generated text, the cached JSONResponse is modified according to the new context and chained to the updated prompt. This modified prompt then goes through the entire process again, from LLM integration to content extraction and indexing, to provide the user with a tailored and accurate response.
By understanding the data flow within our system, we can appreciate the importance of each step and the role of the orchestrator framework in streamlining the process, ultimately resulting in an efficient and user-friendly AI-driven solution.
Construction rapide et chaîne à l'aide de LCEL
Il s'agit d'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 du champ d'application 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 de 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-métrage pratique donné par la spécification LCEL (LangChain Language of Expression). Cela nous permettrait de relier 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 haute dimension, tels que les intégrations de texte générées par les LLM. Voici une comparaison des options les plus populaires:
D'autres produits
Avantages: haute performance, intégration facile, communauté active.
Aucune signification.
Le Milvus
Avantages: Mesures de distance multiples, outil de visualisation des données.
Retour en arrière: courbe d'apprentissage plus rapide.
Le chrome
Avantages: facile à utiliser Python API, conception modulaire.
Résultats de révision: Un soutien communautaire relativement nouveau et moins étendu.
PGVector
Avantages: Leur utilisation des capacités de PostgreSQLs, des requêtes basées sur SQL.
Retours de vue: moins performant pour la recherche vectorielle haute dimension.
FAISS
Avantages: recherche à haute performance, support GPU.
Résultats de la recherche: nécessite une intégration avec d'autres bases de données.
L'évolutivité, la facilité d'intégration et le développement actif de Qdrant® en font un choix adapté pour notre solution AI.
Leur 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:
- ** Pré-traitement du texte**: Nettoyer et pré-traiter les données de texte brut.
- Génération d'intégration de texte: Convertir le texte préprocessé en vecteurs haute dimension à l'aide d'un LLM.
- Embeddings stockés dans VectorDB: Embeddings d'index pour une recherche efficace.
- ** Traitement des requêtes**: Préprocesser et convertir les requêtes utilisateur en intégrations.
- Réservation de similitude: effectuer une recherche de similitude dans VectorDB pour trouver des emblèmes pertinents.
- Ranking et affichage Results: Rangoir les emblèmes récupérés et les convertir à nouveau en texte pour affichage.
En suivant ce processus et en utilisant VectorDBs, nous pouvons construire un système IR efficace et efficace.