Analyseur de sortie

Le modèle de langage LLM génère du contenu sous forme de texte, mais lors du développement d'applications d'IA, nous voulons recevoir du contenu formaté, comme convertir les résultats en objets cibles, des tableaux, etc., pour faciliter le traitement par le programme. Cela nécessite l'analyseur de sortie fourni par LangChain pour formater le contenu renvoyé par le modèle.

La fonction de l'analyseur de sortie est de formater les résultats renvoyés par le modèle de langage. Un analyseur de sortie doit implémenter deux méthodes nécessaires :

  • "get_format_instructions" : Renvoie une chaîne contenant des instructions sur le format dans lequel le modèle de langage doit renvoyer.
  • "parse" : Analyse le contenu renvoyé par le modèle dans le format cible.

Jetons maintenant un coup d'œil aux analyseurs de sortie intégrés dans LangChain.

Analyseur Pydantic

Ci-dessous se trouve l'analyseur de sortie principal PydanticOutputParser encapsulé par LangChain. Cet analyseur est basé sur la bibliothèque Python pydantic et est utilisé pour convertir le résultat de sortie du modèle en objets Python.

from langchain.output_parsers import PydanticOutputParser
from langchain.prompts import PromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field, validator
from langchain_openai import OpenAI

model = OpenAI(model_name="gpt-3.5-turbo-instruct", temperature=0.0)

class Joke(BaseModel):
    setup: str = Field(description="question to set up a joke")
    punchline: str = Field(description="answer to resolve the joke")

    @validator("setup")
    def question_ends_with_question_mark(cls, field):
        if field[-1] != "?":
            raise ValueError("Question mal formulée !")
        return field

parser = PydanticOutputParser(pydantic_object=Joke)

prompt = PromptTemplate(
    template="Répondre à la requête de l'utilisateur.\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)

prompt_and_model = prompt | model
output = prompt_and_model.invoke({"query": "Raconte-moi une blague."})
parser.invoke(output)

Résultat de retour d'exemple :

Joke(setup='Pourquoi le poulet a-t-il traversé la route ?', punchline='Pour se rendre de l'autre côté !')

Interface LCEL

Interface Runnable

L'analyseur de sortie implémente l'interface Runnable, qui est l'un des blocs de construction de base du LangChain Expression Language (LCEL). Il prend en charge des méthodes d'invocation telles que invoke, ainvoke, stream, astream, batch, abatch, astream_log, etc.

Application des analyseurs de sortie dans LCEL

L'analyseur de sortie peut accepter une chaîne ou un BaseMessage en entrée et renvoyer des données structurées de n'importe quel type. Nous pouvons construire et invoquer une chaîne d'analyseurs en ajoutant l'analyseur à une séquence Runnable.

chaîne = prompt | model | parser
chaîne.invoke({"query": "Raconte-moi une blague."})

Renvoie

Joke(setup='Pourquoi le poulet a-t-il traversé la route ?', punchline='Pour se rendre de l'autre côté !')

Certains analyseurs peuvent diffuser des objets d'analyse partiels, tels que SimpleJsonOutputParser, tandis que d'autres ne prennent pas en charge la diffusion. La sortie finale dépend de la capacité de l'analyseur à construire des objets d'analyse partiels.

from langchain.output_parsers.json import SimpleJsonOutputParser

modèle_json = PromptTemplate.from_template(
    "Renvoyer un objet JSON avec une clé `réponse` qui répond à la question suivante : {question}"
)
analyseur_json = SimpleJsonOutputParser()
chaîne_json = modèle_json | model | analyseur_json
list(chaîne_json.stream({"question": "Qui a inventé le microscope ?"}))
[{},
 {'answer': ''},
 {'answer': 'Fourmi'},
 {'answer': 'Anton'},
 {'answer': 'Antoine'},
 {'answer': 'Antoine van'},
 {'answer': 'Antoine van Lee'},
 {'answer': 'Antoine van Leeu'},
 {'answer': 'Antoine van Leeuwen'},
 {'answer': 'Antoine van Leeuwenho'},
 {'answer': 'Antoine van Leeuwenhoek'}]

En LCEL, nous pouvons construire des flux de traitement de données complexes en combinant différents analyseurs pour répondre à divers besoins.