Applicazione Web che utilizza OpenAI e Langchain

 | Intelligenza-Artificiale

introduzione

In questo articolo vedremo come realizzare un’applicazione web utilizzando OpenAI con l’aiuto di Langchain. Questa app Web consente agli utenti di convertire e-mail non strutturate in inglese formattato correttamente. Gli utenti possono inserire il testo dell’e-mail, specificare il tono e il dialetto desiderati (formale/informale e inglese americano/britannico) e l’app fornirà un’e-mail splendidamente formattata nello stile selezionato. Non possiamo creare applicazioni su larga scala ogni volta, limitandoci semplicemente a copiare e incollare le istruzioni con le nostre query; invece, iniziamo e creiamo questo straordinario strumento “Scrittore di posta elettronica professionale”.

Applicazione Web che utilizza OpenAI |  Langchain

obiettivi formativi

  • Per imparare come creare una bellissima applicazione web utilizzando Streamlit.
  • Comprendere cos’è il prompt engineering e come creare prompt efficaci per la generazione di email.
  • Per informazioni su come eseguire query su OpenAI LLM utilizzando PromptTemplate di Langchain.
  • Per imparare come distribuire applicazioni Python utilizzando Streamlit.

Questo articolo è stato pubblicato come parte del Blogathon sulla scienza dei dati.

Configurazione semplificata

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

pip installa streamlit

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

python -m streamlit run (tuo_nome_file.py)

Verrà avviata un’app streamlit vuota nell’indirizzo localhost:8501. Apri il 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 aggiornerà automaticamente la tua app nel browser.

Costruisci frontend

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

#Importing Streamlit library.
import streamlit as st
# Set up Streamlit app with Header and Title
st.set_page_config(page_title="Professional Email Writer", page_icon=":robot:")
st.header("Professional Email Writer")

Produzione:

Applicazione Web che utilizza OpenAI |  Langchain

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

# Get the user input email text
def getEmail():
    input_text = st.text_area(label="Email Input", label_visibility='collapsed',
                              placeholder="Your Email...", key="input_text")
    return input_text

input_text = getEmail()

Produzione:

    Fonte: Autore

Successivamente, dobbiamo avere due menu a discesa per chiedere all’utente quale tono si aspetta nella sua email, ad esempio formale e informale, e anche quale dialetto inglese l’utente si aspetta, ad esempio inglese americano, inglese britannico.

# Display dropdowns for selecting tone and dialect
column1, column2 = st.columns(2)
with column1:
    tone_drop_down = st.selectbox(
        'Which tone would you like your email to have?',
        ('Formal', 'Informal'))

with column2:
    dialect_drop_down = st.selectbox(
        'Which English Dialect would you like?',
        ('American', 'British'))

Il codice precedente creerà due colonne, ciascuna contenente un menu a discesa utilizzando la funzione selectbox().

Produzione:

    Fonte: Autore

Dobbiamo sottolineare che ogni volta che gli utenti aggiornano queste selezioni, l’intera app dovrebbe essere eseguita nuovamente per noi. Consideralo come un grande aggiornamento ogni volta che attivi qualcosa nei menu a discesa.

Ingegneria rapida

Ora dobbiamo prendere l’input e-mail fornito dall’utente e passarlo con un modello di prompt tramite Langchain con la configurazione che l’utente ha selezionato dai menu a discesa. Quindi dobbiamo ottenere l’output formattato correttamente da OpenAI.

Per fare ciò, dobbiamo impostare un modello di prompt. È necessario eseguire alcune operazioni di ingegneria dei prompt per ottimizzare l’output in questo modello di prompt. Il prompt engineering è un processo di costruzione di prompt utilizzando il quale possiamo porre le nostre query a modelli linguistici e ottenere risultati accurati. Puoi modificare questo modello in base alle tue esigenze.

1. Il prompt deve descrivere chiaramente l’input che l’utente sta fornendo. Per esempio,

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

2. Il prompt dovrebbe spiegare chiaramente quale modello linguistico dovrebbe fornire output. Per esempio,

Il tuo obiettivo è:

  • Formatta correttamente l’e-mail
  • Converti l’e-mail di input nel tono specificato tra parentesi graffe.
  • Converti l’e-mail di input nel dialetto specificato tra parentesi graffe.
  • Si prega di iniziare l’e-mail con una calorosa introduzione. Aggiungi l’introduzione se necessario.

3. Il prompt dovrebbe contenere esempi per garantire che il modello sia consapevole delle aspettative di output.

4. Infine, il prompt dovrebbe indicare chiaramente quali sono gli input dell’utente e a cosa si riferisce ciascun input.

Di seguito è riportato il prompt che abbiamo creato seguendo le regole di cui sopra

# Define the template for the email conversion task
template = """
    Below is an email that may be unstructured and poorly worded.
    Your goal is to:
    - Format the email properly
    - Convert the input email into the tone specified in curly braces. 
    - Convert the input email into the dialect specified in curly braces.

    Take these examples of different tones as reference:
    - Formal: We went to Hyderabad for the weekend. We have a lot of things to tell you.
    - Informal: Went to Hyderabad for the weekend. Lots to tell you.  

    Below are some examples of words in different dialects:
    - American: Garbage, cookie, green thumb, parking lot, pants, windshield, 
      French Fries, cotton candy, apartment
    - British: Green fingers, car park, trousers, windscreen, chips, candyfloss, 
      flag, rubbish, biscuit

    Example Sentences from each dialect:
    - American: As they strolled through the colorful neighborhood, Sarah asked her 
                friend if he wanted to grab a coffee at the nearby café. The fall 
                foliage was breathtaking, and they enjoyed the pleasant weather, 
                chatting about their weekend plans.
    - British: As they wandered through the picturesque neighbourhood, Sarah asked her 
               friend if he fancied getting a coffee at the nearby café. The autumn 
               leaves were stunning, and they savoured the pleasant weather, chatting 
               about their weekend plans.

    Please start the email with a warm introduction. Add the introduction if you need to.
    
    Below is the email, tone, and dialect:
    TONE: {tone}
    DIALECT: {dialect}
    EMAIL: {email}
    
    YOUR {dialect} RESPONSE:
"""

Ora crea il prompt utilizzando la classe PromptTemplate di Langchain, utilizzando la quale possiamo inserire gli input dell’utente nel prompt.

#Importing PromptTemplate class
from langchain import PromptTemplate
# Create a PromptTemplate instance to manage the input variables and the template
prompt = PromptTemplate(
    input_variables=("tone", "dialect", "email"),
    template=query_template,
)

Carica modello linguistico

Assicurati di avere con te le chiavi API OpenAI. In caso contrario, seguire i passaggi seguenti.

  • Vai su https://openai.com/ e crea il tuo account.
  • Accedi al tuo account e seleziona “API” sulla dashboard.
  • Ora fai clic sull’icona del tuo profilo, quindi seleziona “Visualizza chiavi API”.
  • Seleziona “Crea nuova chiave segreta”, copiala e salvala.
Applicazione Web che utilizza OpenAI |  Langchain |  Modello linguistico di grandi dimensioni

Codice per la chiave API OpenAI

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

# Display text input for OpenAI API Key
def fetchAPIKey():
    input_text = st.text_input(
        label="OpenAI API Key ",  placeholder="Ex: vk-Cb8un42twmA8tf...", key="openai_api_key_input")
    return input_text

# Get the OpenAI API Key from the user
openai_api_key = fetchAPIKey()

Produzione:

Chiave API OpenAI |  Applicazione Web che utilizza OpenAI |  Langchain

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

Passaggi per le variabili ambientali

Seguire i passaggi seguenti per creare variabili ambientali:

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

2: Creare un file denominato “.env”.

3: Conserva la tua chiave API nel formato seguente

API_KEY=la tua_api_key_qui

4: Carica il pacchetto dotenv e recupera le variabili ambientali utilizzando quel pacchetto

from dotenv import load_dotenv
import os

# Load the environment variables from the .env file
load_dotenv()

# Access the API key using 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. Mantieni questo file al sicuro invece di condividerlo pubblicamente.

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

#Importing OpenAI Library
from langchain.llms import OpenAI
# Function to load the Language Model
def loadLanguageModel(api_key_openai):
    llm = OpenAI(temperature=.7, openai_api_key=api_key_openai)
    return llm

Esempio

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

# Function to update the text box with an example email
def textBoxUpdateWithExample():
    print("in updated")
    st.session_state.input_text = "Vinay I am starts work at yours office from monday"

# Button to show an example email
st.button("*Show an Example*", type="secondary",
          help="Click to see an example of the email you will be converting.", on_click=textBoxUpdateWithExample)
st.markdown("### Your Email:")

Produzione:

    Fonte: Autore

Successivamente, dobbiamo assicurarci che l’utente abbia inserito la sua chiave API e, inoltre, dovrebbe aver fornito alcune query nella casella di testo prima di invocare il modello linguistico. Se invoca il modello senza chiave API o API non valida, dobbiamo mostrare le istruzioni adeguate all’utente per recuperare la chiave segreta corretta.

# If the user has provided input_text, proceed with email conversion
if input_text:
    if not openai_api_key:
        # If API Key is not provided, show a warning
        st.warning(
            'Please insert OpenAI API Key. Instructions (here)(https://help.openai.com/en/articles/4936850-where-do-i-find-my-secret-api-key)', icon="⚠️")
        st.stop()
    # Load the Language Model with the provided API Key
    llm = loadLanguageModel(api_key_openai=openai_api_key)
    # Format the email using the PromptTemplate and the Language Model
    prompt_with_email = prompt.format(
        tone=tone_drop_down, dialect=dialect_drop_down, email=input_text)
    formatted_email = llm(prompt_with_email)
    # Display the formatted email
    st.write(formatted_email)

Produzione:

    Fonte: Autore

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

Distribuire l’applicazione

Seguire i passaggi seguenti per distribuire l’applicazione:

1: Per prima cosa dobbiamo inserire il nostro codice nel repository GitHub. Prima di inviare, crea un file require.txt contenente un elenco di tutte le dipendenze del nostro codice.

  • langchain
  • openai
  • illuminato

2: Vai a streamlit.io e creare un account autorizzando GitHub.

3: Accedi al tuo illuminato account.

4: Fare clic su crea una nuova app e passare tutti i dettagli del repository GitHub. Sotto il percorso del file principale, inserisci il nome del file che contiene lo script Python. Infine, fai clic su Distribuisci.

    Fonte: Autore

5: Salva l’URL dell’app. Dopo alcuni minuti, puoi vedere la tua applicazione live sul Web utilizzando quell’URL.

    Fonte: Autore

Implementazione completa

# Import required libraries
from langchain import PromptTemplate
import streamlit as st
from langchain.llms import OpenAI

# Define the template for the email conversion task
query_template = query_template = """
    Below is an email that may be unstructured and poorly worded.
    Your goal is to:
    - Format the email properly
    - Convert the input email into the tone specified in curly braces. 
    - Convert the input email into the dialect specified in curly braces.

    Take these examples of different tones as reference:
    - Formal: We went to Hyderabad for the weekend. We have a lot of things to tell you.
    - Informal: Went to Hyderabad for the weekend. Lots to tell you.  

    Below are some examples of words in different dialects:
    - American: Garbage, cookie, green thumb, parking lot, pants, windshield, 
                French Fries, cotton candy, apartment
    - British: Green fingers, car park, trousers, windscreen, chips, candyfloss, 
               flag, rubbish, biscuit

    Example Sentences from each dialect:
    - American: As they strolled through the colorful neighborhood, Sarah asked her 
                friend if he wanted to grab a coffee at the nearby café. The fall 
                foliage was breathtaking, and they enjoyed the pleasant weather, 
                chatting about their weekend plans.
    - British: As they wandered through the picturesque neighbourhood, Sarah asked her 
               friend if he fancied getting a coffee at the nearby café. The autumn 
               leaves were stunning, and they savoured the pleasant weather, chatting 
               about their weekend plans.

    Please start the email with a warm introduction. Add the introduction if you need to.
    
    Below is the email, tone, and dialect:
    TONE: {tone}
    DIALECT: {dialect}
    EMAIL: {email}
    
    YOUR {dialect} RESPONSE:
"""

# Create a PromptTemplate instance to manage the input variables and the template
prompt = PromptTemplate(
    input_variables=("tone", "dialect", "email"),
    template=query_template,
)

# Function to load the Language Model
def loadLanguageModel(api_key_openai):
    llm = OpenAI(temperature=.7, openai_api_key=api_key_openai)
    return llm

# Set up Streamlit app with Header and Title
st.set_page_config(page_title="Professional Email Writer", page_icon=":robot:")
st.header("Professional Email Writer")

# Create columns for the Streamlit layout
column1, column2 = st.columns(2)

# Display text input for OpenAI API Key
def fetchAPIKey():
    input_text = st.text_input(
        label="OpenAI API Key ",  placeholder="Ex: vk-Cb8un42twmA8tf...", key="openai_api_key_input")
    return input_text

# Get the OpenAI API Key from the user
openai_api_key = fetchAPIKey()

# Display dropdowns for selecting tone and dialect
column1, column2 = st.columns(2)
with column1:
    tone_drop_down = st.selectbox(
        'Which tone would you like your email to have?',
        ('Formal', 'Informal'))

with column2:
    dialect_drop_down = st.selectbox(
        'Which English Dialect would you like?',
        ('American', 'British'))

# Get the user input email text
def getEmail():
    input_text = st.text_area(label="Email Input", label_visibility='collapsed',
                              placeholder="Your Email...", key="input_text")
    return input_text

input_text = getEmail()

# Check if the email exceeds the word limit
if len(input_text.split(" ")) > 700:
    st.write("Maximum limit is 700 words. Please enter a shorter email")
    st.stop()

# Function to update the text box with an example email
def textBoxUpdateWithExample():
    print("in updated")
    st.session_state.input_text = "Vinay I am starts work at yours office from monday"

# Button to show an example email
st.button("*Show an Example*", type="secondary",
          help="Click to see an example of the email you will be converting.", on_click=textBoxUpdateWithExample)
st.markdown("### Your Email:")

# If the user has provided input_text, proceed with email conversion
if input_text:
    if not openai_api_key:
        # If API Key is not provided, show a warning
        st.warning(
            'Please insert OpenAI API Key. Instructions (here)(https://help.openai.com/en/articles/4936850-where-do-i-find-my-secret-api-key)', icon="⚠️")
        st.stop()
    # Load the Language Model with the provided API Key
    llm = loadLanguageModel(api_key_openai=openai_api_key)
    # Format the email using the PromptTemplate and the Language Model
    prompt_with_email = prompt.format(
        tone=tone_drop_down, dialect=dialect_drop_down, email=input_text)
    formatted_email = llm(prompt_with_email)
    # Display the formatted email
    st.write(formatted_email)

Conclusione

In questo articolo abbiamo visto come creare una bellissima applicazione web utilizzando OpenAI LLM con l’aiuto di Langchain. Abbiamo iniziato con l’installazione e la configurazione di Streamlit. Quindi abbiamo creato un’interfaccia frontend per ricevere input dall’utente come tono, dialetto e testo e-mail dall’utente. Successivamente, abbiamo creato un prompt efficace per interrogare il modello linguistico utilizzando questi input. Successivamente, abbiamo inizializzato il modello OpenAI utilizzando le chiavi API passando il prompt 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.
  • La tempestiva progettazione è fondamentale per ottenere risultati ottimizzati dal modello linguistico.
  • 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 ulteriormente utilizzato per interrogare LLM.
  • Utilizzando la condivisione Streamlit, possiamo ospitare l’applicazione Python in Live URL.

Domande frequenti

Q1. Qual è l’uso della libreria Streamlit in Python?

R. Streamlit è una libreria Python open source che può essere utilizzata per creare applicazioni web interattive con semplici funzioni Python senza una conoscenza approfondita dello sviluppo web.

Q2. Come creare un’app con OpenAI?

R. Innanzitutto, devi scegliere lo stack tecnologico di sviluppo dell’applicazione e poi, utilizzando le chiavi segrete OpenAI, puoi sfruttare i vantaggi di OpenAI.

Q3. Posso usare ChatGPT per scrivere email?

R. Sì, puoi utilizzare ChatGPT per scrivere e-mail. Puoi generare contenuti e-mail fornendo istruzioni efficaci con descrizioni chiare delle aspettative e-mail a ChatGPT.

Q4. Qual è il modello OpenAI predefinito in LangChain?

R. Il modello OpenAI predefinito utilizzato in LangChain è OpenAI GPT-3.5-turbo.

Q5. Posso utilizzare OpenAI gratuitamente?

R. OpenAI fornisce servizi sia gratuiti che a pagamento. Puoi ottenere una richiesta API limitata, modello GPT-3 per il servizio gratuito. Puoi ottenere un maggiore accesso ai loro modelli e più richieste API utilizzando la versione a pagamento.

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *