Applicazione web Linguistic Email Composer utilizzando OpenAI e Langchain

Web application Linguistic Email Composer using OpenAI and Langchain

Introduzione

In questo articolo vedremo come costruire un’applicazione web utilizzando OpenAI con l’aiuto di Langchain. Questa app web consente agli utenti di convertire email non strutturate in inglese correttamente formattato. Gli utenti possono inserire il testo della loro email, specificare il tono e il dialetto desiderati (formale/informale e inglese americano/britannico), e l’app fornirà una email bellamente formattata nello stile selezionato. Non possiamo costruire applicazioni su larga scala ogni volta, semplicemente copiando e incollando gli input con le nostre richieste; invece, iniziamo e costruiamo questo incredibile strumento “Scrittore di Email Professionali”.

Obiettivi di Apprendimento

  • Imparare come costruire una bella applicazione web utilizzando Streamlit.
  • Capire cos’è l’ingegneria delle richieste e come creare richieste efficaci per generare email.
  • Imparare come interrogare OpenAI LLM utilizzando PromptTemplate di Langchain.
  • Imparare come distribuire applicazioni Python utilizzando Streamlit.

Questo articolo è stato pubblicato come parte del Data Science Blogathon.

Configurazione di Streamlit

Prima di tutto, dobbiamo capire cos’è Streamlit, come funziona e come configurarlo per il nostro caso d’uso. Streamlit ci permette di creare applicazioni web in Python e ospitarle in locale e sul web. Per prima cosa, vai al tuo terminale e installa streamlit utilizzando il comando seguente

pip install streamlit

Crea un file Python vuoto per il nostro script ed esegui il file utilizzando il comando seguente

python -m streamlit run [nome_del_tuo_file.py]

Questo avvierà un’applicazione streamlit vuota all’indirizzo localhost:8501. Apri il tuo browser e cerca questo indirizzo per visualizzare l’app. Una delle cose interessanti di questa app è che puoi apportare modifiche alla tua base di codice e verrà automaticamente aggiornata nell’app nel browser.

Costruire il Frontend

Iniziamo il nostro codice aggiungendo un’intestazione e un titolo di pagina alla nostra applicazione. Lo chiamo “Scrittore di Email Professionali”

# Importazione della libreria Streamlit
import streamlit as st
# Configura l'app Streamlit con Intestazione e Titolo
st.set_page_config(page_title="Scrittore di Email Professionali", page_icon=":robot:")
st.header("Scrittore di Email Professionali")

Output:

Successivamente, abbiamo bisogno dell’input dall’utente per sapere quale email desidera l’utente. Per questo, utilizziamo la funzione text_area fornita da streamlit.

# Ottieni il testo dell'email inserito dall'utente
def getEmail():
    input_text = st.text_area(label="Input Email", label_visibility='collapsed',
                              placeholder="La tua email...", key="input_text")
    return input_text

input_text = getEmail()

Output:

Inoltre, abbiamo bisogno di due menu a tendina per chiedere all’utente quale tono desidera nell’email, cioè Formale e Informale, e anche quale dialetto dell’inglese desidera, cioè inglese americano, inglese britannico.

# Mostra i menu a tendina per selezionare il tono e il dialetto
colonna1, colonna2 = st.columns(2)
with colonna1:
    tone_drop_down = st.selectbox(
        'Quale tono vuoi che abbia la tua email?',
        ('Formale', 'Informale'))

with colonna2:
    dialect_drop_down = st.selectbox(
        'Quale dialetto dell'inglese preferisci?',
        ('Americano', 'Britannico'))

Il codice sopra creerà due colonne, ognuna contenente un menu a tendina utilizzando la funzione selectbox().

Output:

Dobbiamo sottolineare che ogni volta che gli utenti aggiornano queste selezioni, dovrebbe eseguire nuovamente l’intera app per noi. Pensalo come un grosso aggiornamento ogni volta che attivi qualcosa nei menu a tendina.

Ingegneria delle istruzioni

Ora dobbiamo prendere l’input dell’email fornito dall’utente e passarlo con un modello di istruzioni attraverso Langchain con la configurazione selezionata dall’utente dai menu a tendina. Successivamente, dobbiamo ottenere l’output correttamente formattato da OpenAI.

Per farlo, dobbiamo configurare un modello di istruzioni. Dobbiamo effettuare un’ingegneria delle istruzioni per ottenere un output ottimizzato in questo modello di istruzioni. L’ingegneria delle istruzioni è un processo di costruzione di istruzioni attraverso le quali possiamo fare le nostre domande ai modelli di linguaggio e ottenere risultati accurati. Puoi modificare questo modello in base alle tue esigenze.

1. L’istruzione dovrebbe descrivere chiaramente cosa sta fornendo l’utente in input. Ad esempio,

Di seguito è riportata un’email che potrebbe essere non strutturata e mal formulata.

2. L’istruzione dovrebbe spiegare chiaramente quale modello di linguaggio dovrebbe dare in output. Ad esempio,

Il tuo obiettivo è:

  • Formattare correttamente l’email
  • Convertire l’email di input nel tono specificato tra parentesi graffe.
  • Convertire l’email di input nel dialetto specificato tra parentesi graffe.
  • Inserisci un’introduzione calorosa all’inizio dell’email. Aggiungi l’introduzione se necessario.

3. L’istruzione dovrebbe contenere esempi per garantire che il modello sia consapevole delle aspettative di output.

4. Infine, l’istruzione dovrebbe indicare chiaramente quali input dell’utente ci sono e a cosa si riferisce ciascun input.

Di seguito è riportata l’istruzione che abbiamo creato seguendo le regole sopra indicate:

# Definisci il modello per il compito di conversione dell'email
modello = """
    Di seguito è riportata un'email che potrebbe essere non strutturata e mal formulata.
    Il tuo obiettivo è:
    - Formattare correttamente l'email
    - Convertire l'email di input nel tono specificato tra parentesi graffe.
    - Convertire l'email di input nel dialetto specificato tra parentesi graffe.

    Prendi questi esempi di toni diversi come riferimento:
    - Formale: Siamo andati a Hyderabad per il fine settimana. Abbiamo molte cose da dirti.
    - Informale: Siamo andati a Hyderabad per il fine settimana. Tante cose da dirti. 

    Di seguito ci sono alcuni esempi di parole in diversi dialetti:
    - Americano: Spazzatura, biscotto, pollice verde, parcheggio, pantaloni, parabrezza, 
      Patatine Fritte, zucchero filato, appartamento
    - Britannico: Dita verdi, parcheggio auto, pantaloni, parabrezza, patatine, zucchero filato, 
      bandiera, spazzatura, biscotto

    Frasi di esempio per ogni dialetto:
    - Americano: Mentre passeggiavano per il quartiere colorato, Sarah chiese al suo 
                amico se voleva prendere un caffè al café nelle vicinanze. Il fogliame 
                autunnale era mozzafiato e hanno goduto del piacevole clima, 
                chiacchierando dei loro piani per il fine settimana.
    - Britannico: Mentre si aggiravano per il quartiere pittoresco, Sarah chiese al suo 
               amico se gli andava di prendere un caffè al café nelle vicinanze. Le foglie 
               autunnali erano stupefacenti e hanno gustato il piacevole clima, chiacchierando 
               dei loro piani per il fine settimana.

    Inizia l'email con un'introduzione calorosa. Aggiungi l'introduzione se necessario.
    
    Di seguito sono riportate l'email, il tono e il dialetto:
    TONO: {tono}
    DIALETTO: {dialetto}
    EMAIL: {email}
    
    LA TUA RISPOSTA IN {dialetto}:
"""

Ora crea l’istruzione utilizzando la classe PromptTemplate di Langchain, con cui è possibile inserire gli input dell’utente nell’istruzione.

# Importa la classe PromptTemplate
da langchain import PromptTemplate
# Crea un'istanza di PromptTemplate per gestire le variabili di input e il modello
istruzione = PromptTemplate(
    input_variables=["tono", "dialetto", "email"],
    template=modello,
)

Carica il modello di linguaggio

Assicurati di avere a disposizione le tue chiavi API di OpenAI. Se non le hai, segui i passaggi seguenti.

  • Vai su ‘https://openai.com/ e crea il tuo account.
  • Esegui l’accesso al tuo account e seleziona ‘API’ nel tuo cruscotto.
  • Ora fai clic sull’icona del tuo profilo, quindi seleziona ‘Visualizza chiavi API’.
  • Seleziona ‘Crea nuova chiave segreta’, copiala e salvatela.

Codice per la chiave API di OpenAI

Di seguito è riportato un codice per la funzione che richiede la chiave API di OpenAI in input dall’utente utilizzando la funzione text_input() e mostra la chiave API di esempio come segnaposto.

# Mostra l'input di testo per la chiave API di OpenAI
def fetchAPIKey():
    input_text = st.text_input(
        label="Chiave API di OpenAI",  placeholder="Es: vk-Cb8un42twmA8tf...", key="openai_api_key_input")
    return input_text

# Ottieni la chiave API di OpenAI dall'utente
openai_api_key = fetchAPIKey()

Output:

Dobbiamo assicurarci che la nostra chiave API sia presente nel nostro script, il che non è consigliato perché non vogliamo codificarla duramente da nessuna parte, o dovrebbe essere presente nelle nostre variabili d’ambiente che il nostro codice può estrarre. Un modo per creare variabili d’ambiente è utilizzare un file .env separato.

Passaggi per le variabili d’ambiente

Segui i seguenti passaggi per creare le variabili d’ambiente:

1: Apri il tuo terminale e installa il pacchetto python-dotenv usando il comando “pip install python-dotenv”.

2: Crea un file chiamato “.env”.

3: Memorizza la tua chiave API nel formato seguente

API_KEY=tua_chiave_api_qui

4: Carica il pacchetto dotenv e recupera le tue variabili d’ambiente utilizzando quel pacchetto

from dotenv import load_dotenv
import os

# Carica le variabili d'ambiente dal file .env
load_dotenv()

# Accedi alla chiave API utilizzando os.environ
openai_api_key = os.environ.get("API_KEY")

Questo metodo protegge le tue chiavi API dall’esposizione accidentale delle chiavi API direttamente nel tuo codice. Tieni questo file al sicuro anziché condividerlo pubblicamente.

Tuttavia, poiché l’API di OpenAI consente un numero limitato di richieste API, chiederemo agli utenti di inserire le proprie chiavi API anziché fornire le nostre. In questo caso, caricheremo OpenAI con una temperatura pari a 0,7, il che significa che sarà creativo. Il codice seguente ci restituisce un errore se passiamo una chiave API di OpenAI non valida. Inoltre, dobbiamo mostrare avvisi appropriati se l’utente inserisce chiavi non valide.

# Importazione della libreria OpenAI
from langchain.llms import OpenAI
# Funzione per caricare il modello di linguaggio
def loadLanguageModel(api_key_openai):
    llm = OpenAI(temperature=.7, openai_api_key=api_key_openai)
    return llm

Esempio

Diamo all’utente un esempio di esempio in modo che l’utente possa capire cosa dovrebbe inserire come input e cosa può aspettarsi in cambio. Creiamo un pulsante “Mostra un esempio” nella parte anteriore. La seguente funzione aggiorna la casella di testo con una query di posta elettronica di esempio non strutturata e mal formulata.

# Funzione per aggiornare la casella di testo con un esempio di posta elettronica
def textBoxUpdateWithExample():
    print("in updated")
    st.session_state.input_text = "Vinay I am starts work at yours office from monday"

# Pulsante per mostrare un esempio di posta elettronica
st.button("*Mostra un Esempio*", type='secondary',
          help="Clicca per vedere un esempio della e-mail che convertirai.", on_click=textBoxUpdateWithExample)
st.markdown("### La tua Email:")

Output:

Successivamente, dobbiamo assicurarci che l’utente abbia inserito la sua chiave API e anche che abbia fornito una query nella casella di testo prima di invocare il modello di linguaggio. Se invoca il modello senza la chiave API o con una chiave API non valida, dobbiamo mostrare istruzioni adeguate all’utente per ottenere la chiave segreta corretta.

# Se l'utente ha fornito input_text, procedi con la conversione dell'email
if input_text:
    if not openai_api_key:
        # Se la chiave API non è stata fornita, mostra un avviso
        st.warning(
            'Inserisci la chiave API di OpenAI. Istruzioni [qui](https://help.openai.com/en/articles/4936850-where-do-i-find-my-secret-api-key)', icon="⚠️")
        st.stop()
    # Carica il modello di linguaggio con la chiave API fornita
    llm = loadLanguageModel(api_key_openai=openai_api_key)
    # Formatta l'email utilizzando il PromptTemplate e il modello di linguaggio
    prompt_with_email = prompt.format(
        tone=tone_drop_down, dialect=dialect_drop_down, email=input_text)
    formatted_email = llm(prompt_with_email)
    # Mostra l'email formattata
    st.write(formatted_email)

Output:

Se l’utente inserisce la chiave API corretta e il testo dell’email corretto nella casella di testo, formattiamo l’input utilizzando il testo dell’email e le configurazioni inserite dall’utente, ovvero tono e dialetto. Quindi passeremo questo input al nostro modello linguistico e il LLM ci restituirà la risposta come email correttamente formattata che mostreremo all’utente nella scheda “La tua email” utilizzando la funzione write() di streamlit.

Deploy dell’applicazione

Segui i seguenti passaggi per deployare l’applicazione:

1: Prima di tutto, dobbiamo caricare il nostro codice nel repository GitHub. Prima di caricare, crea un file requirements.txt contenente un elenco di tutte le dipendenze del nostro codice.

  • langchain
  • openai
  • streamlit

2: Vai su streamlit.io e crea un account autorizzando GitHub.

3: Accedi al tuo account streamlit.

4: Clicca su “Crea una nuova app” e inserisci tutti i dettagli del repository GitHub. Nel campo “Percorso del file principale”, inserisci il nome del file che contiene lo script Python. Infine, clicca su “Deploy”.

5: Salva l’URL dell’applicazione. Dopo alcuni minuti, potrai vedere la tua applicazione online utilizzando quell’URL.

Implementazione completa

# Importa le librerie necessarie
from langchain import PromptTemplate
import streamlit as st
from langchain.llms import OpenAI

# Definisci il template per il task di conversione dell'email
query_template = query_template = """
    Di seguito è riportata un'email che potrebbe essere non strutturata e mal formulata.
    Il tuo obiettivo è:
    - Formattare correttamente l'email
    - Convertire l'email di input nel tono specificato tra parentesi graffe.
    - Convertire l'email di input nel dialetto specificato tra parentesi graffe.

    Prendi questi esempi di toni diversi come riferimento:
    - Formale: Siamo andati a Hyderabad per il weekend. Abbiamo molte cose da dirti.
    - Informale: Siamo andati a Hyderabad per il weekend. Tante cose da dirti.  

    Di seguito sono riportati alcuni esempi di parole in diversi dialetti:
    - Americano: Spazzatura, biscotto, pollice verde, parcheggio, pantaloni, parabrezza, 
                patatine fritte, zucchero filato, appartamento
    - Britannico: Dita verdi, parcheggio auto, pantaloni, parabrezza, patatine, zucchero filato, 
               bandiera, spazzatura, biscotto

    Esempi di frasi per ogni dialetto:
    - Americano: Mentre passeggiavano per il quartiere colorato, Sarah chiese al suo 
                amico se voleva prendere un caffè al caffè nelle vicinanze. Il fogliame autunnale 
                era mozzafiato e hanno goduto del bel tempo, chiacchierando dei loro piani per il weekend.
    - Britannico: Mentre si aggiravano per il pittoresco quartiere, Sarah chiese al suo 
               amico se gli andava di prendere un caffè al caffè nelle vicinanze. Le foglie 
               autunnali erano splendide e hanno gustato il bel tempo, chiacchierando 
               dei loro piani per il weekend.

    Per favore inizia l'email con un'introduzione calorosa. Aggiungi l'introduzione se necessario.
    
    Di seguito sono riportati l'email, il tono e il dialetto:
    TONO: {tone}
    DIALETTO: {dialect}
    EMAIL: {email}
    
    LA TUA RISPOSTA IN {dialect}:
"""

# Crea un'istanza di PromptTemplate per gestire le variabili di input e il template
prompt = PromptTemplate(
    input_variables=["tone", "dialect", "email"],
    template=query_template,
)

# Funzione per caricare il Language Model
def loadLanguageModel(api_key_openai):
    llm = OpenAI(temperature=.7, openai_api_key=api_key_openai)
    return llm

# Imposta l'app Streamlit con Header e Titolo
st.set_page_config(page_title="Scrittore di Email Professionale", page_icon=":robot:")
st.header("Scrittore di Email Professionale")

# Crea colonne per il layout di Streamlit
column1, column2 = st.columns(2)

# Mostra l'input di testo per la chiave API di OpenAI
def fetchAPIKey():
    input_text = st.text_input(
        label="Chiave API OpenAI ",  placeholder="Es: vk-Cb8un42twmA8tf...", key="openai_api_key_input")
    return input_text

# Ottieni la chiave API di OpenAI dall'utente
openai_api_key = fetchAPIKey()

# Mostra i dropdown per selezionare il tono e il dialetto
column1, column2 = st.columns(2)
with column1:
    tone_drop_down = st.selectbox(
        'Quale tono vorresti che avesse la tua email?',
        ('Formale', 'Informale'))

with column2:
    dialect_drop_down = st.selectbox(
        'Quale dialetto inglese vorresti?',
        ('Americano', 'Britannico'))

# Ottieni il testo dell'email inserito dall'utente
def getEmail():
    input_text = st.text_area(label="Input Email", label_visibility='collapsed',
                              placeholder="La tua Email...", key="input_text")
    return input_text

input_text = getEmail()

# Verifica se l'email supera il limite di parole
if len(input_text.split(" ")) > 700:
    st.write("Il limite massimo è di 700 parole. Inserisci un'email più breve")
    st.stop()

# Funzione per aggiornare la casella di testo con un esempio di email
def textBoxUpdateWithExample():
    print("aggiornato")
    st.session_state.input_text = "Vinay inizia a lavorare nel tuo ufficio da lunedì"

# Bottone per mostrare un esempio di email
st.button("*Mostra un Esempio*", type='secondary',
          help="Clicca per vedere un esempio dell'email che stai convertendo.", on_click=textBoxUpdateWithExample)
st.markdown("### La Tua Email:")

# Se l'utente ha fornito input_text, procedi con la conversione dell'email
if input_text:
    if not openai_api_key:
        # Se la chiave API non viene fornita, mostra un avviso
        st.warning(
            'Inserisci la chiave API di OpenAI. Istruzioni [qui](https://help.openai.com/en/articles/4936850-where-do-i-find-my-secret-api-key)', icon="⚠️")
        st.stop()
    # Carica il Language Model con la chiave API fornita
    llm = loadLanguageModel(api_key_openai=openai_api_key)
    # Formatta l'email utilizzando il PromptTemplate e il Language Model
    prompt_with_email = prompt.format(
        tone=tone_drop_down, dialect=dialect_drop_down, email=input_text)
    formatted_email = llm(prompt_with_email)
    # Mostra l'email formattata
    st.write(formatted_email)

Conclusion

In questo articolo abbiamo visto come creare una bellissima applicazione web utilizzando OpenAI LLM con l’aiuto di Langchain. Abbiamo iniziato installando e configurando Streamlit. Poi abbiamo creato un’interfaccia front-end per acquisire input dall’utente come tono, dialetto e testo dell’email. Dopo di ciò, abbiamo creato un prompt efficace per interrogare il modello di linguaggio utilizzando questi input. Successivamente, abbiamo inizializzato il modello OpenAI utilizzando le chiavi API passando il prompt che abbiamo creato utilizzando Langchain. Infine, abbiamo distribuito l’applicazione sul web utilizzando Streamlit.

Punti chiave

  • Utilizzando la libreria Streamlit in Python, possiamo creare applicazioni web interattive.
  • L’ingegneria del prompt è fondamentale per ottenere risultati ottimizzati dal modello di linguaggio.
  • OpenAI LLM può essere facilmente utilizzato nelle nostre applicazioni Python utilizzando la libreria OpenAI e le sue chiavi segrete.
  • Utilizzando il PromptTemplate di Langchain, possiamo formattare correttamente il prompt in base all’input dell’utente che può essere utilizzato ulteriormente nell’interrogazione del LLM.
  • Utilizzando Streamlit share, possiamo ospitare l’applicazione Python in un URL live.

Domande frequenti

I media mostrati in questo articolo non sono di proprietà di Analytics Vidhya e sono utilizzati a discrezione dell’autore.