Abbiamo già visto come usare LangChain per la creazione di applicazioni basate su LLM e abbiamo provato ad integrarlo sia con Ollama che con OpenAI. Adesso proveremo una delle funzionalità più utili di questo framework ovvero la capacità di generare risposte strutturate in formato JSON.
Uno dei principali problemi del linguaggio naturale è proprio la sua natura non strutturata che lo rende impossibile da integrare con le classiche applicazioni basate su algoritmi deterministici. E’ quindi molto importante riuscire a ridurre la variabilità degli output generati forzando il modello a rispondere basandosi su dei template standardizzati.
I vantaggi del formato JSON
Il formato JSON (JavaScript Object Notation) è senza dubbio lo standard preferito dagli sviluppatori per diverse ragioni:
- Leggibilità: è facile da leggere e comprendere sia per gli esseri umani che per le macchine.
- Compatibilità: è supportato dalla maggior parte dei linguaggi di programmazione e delle piattaforme.
- Flessibilità: può rappresentare strutture di dati complesse in modo semplice e conciso.
- Integrazione: si integra facilmente con API RESTful, database NoSQL e molte altre tecnologie moderne.
Definire il modello con Pydantic
In questo tutorial useremo Pydantic, una libreria che consente di creare modelli di dati fortemente tipizzati in Python. Questi modelli possono poi essere utilizzati per la validazione e la serializzazione dei dati. A differenza di altre librerie di validazione, Pydantic utilizza le annotazioni per eseguire la validazione e la coercizione dei dati in modo automatico.
Per il nostro esempio proveremo a generare dei post per social media che siano caratterizzati da un testo e da alcuni tag:
from langchain_core.pydantic_v1 import BaseModel, Field
class SocialPost(BaseModel):
"""Posts for social media"""
tags: str = Field(description="Post tags")
text: str = Field(description="Plain text of the post")
Per definire il modello di un generico SocialPost
abbiamo:
- usato la docstring che descrive lo scopo della classe stessa;
- esteso il
BaseModel
di Pydantic che rappresenta la classe base del framework di validazione; - usato la funzione
Field
per definire gli attributi dell’oggetto con meta-informazioni aggiuntive (es: descrizioni, valori di default ecc…).
Usare i modelli Pydantic con LangChain
Dopo aver definito il template che vogliamo usare per il JSON di output, non resta che usarlo nel nostro applicativo LangChain:
from langchain_openai import ChatOpenAI
from langchain_core.pydantic_v1 import BaseModel, Field
class SocialPost(BaseModel):
"""Posts for social media"""
tags: str = Field(description="Post tags")
text: str = Field(description="Plain text of the post")
llm = ChatOpenAI(model="gpt-3.5-turbo")
structured_llm = llm.with_structured_output(SocialPost)
response = structured_llm.invoke("Can you write a post about a beach holiday?")
print(response)
Come si nota, il codice è molto simile a quello che abbiamo già visto nei precedenti articoli di questa guida con la differenza che questa volta abbiamo usato il metodo with_structured_output per generare output strutturati che rispettino il formato definito dalla classe SocialPost
.
Lanciando lo script in console possiamo verificare che il risultato sia quello atteso:
{
"tags": "#beach #holiday #vacation",
"text": "Dreaming of a beach holiday getaway! The sun, the sand, and the sea calling my name. Can't wait to relax and unwind by the ocean."
}
Come avrete sicuramente notato, LangChain offre una soluzione potente e flessibile per generare risposte strutturate in formato JSON, rendendo più semplice l’integrazione dei modelli di linguaggio nelle applicazioni moderne. Se l’argomento vi interessa vi invito a continuare ad approfondire l’argomento sul nostro blog!