Vai al contenuto principale

Usare ChatGPT per moderare le risposte di ChatGPT

Esplora le sfumature della moderazione AI con la nostra guida approfondita su come utilizzare ChatGPT per moderare le risposte nelle applicazioni basate su GPT.
· 9 min leggi

Scopri con l'IA

Moderazione AI per la qualità

Abbracciare la rivoluzione dell'AI nello sviluppo di applicazioni segna una nuova era nell'interazione uomo-macchina. Se da un lato le aziende sfruttano l'AI per migliorare le esperienze utente, dall'altro l'integrazione di soluzioni basate su LLM presenta sfide nel mantenere integrità dei contenuti, accuratezza e standard etici.

La necessità di una moderazione responsabile dell'AI diventa evidente man mano che le applicazioni si espandono oltre ambienti controllati, dove garantire risposte ragionevoli e accurate agli utenti potrebbe non essere tecnicamente molto semplice ma è fondamentale.

Nelle interazioni con l'assistenza clienti, ad esempio, disinformazione o contenuti inappropriati possono generare insoddisfazione e persino danni reputazionali all'azienda. Ma come sviluppatore, come puoi assicurarti che la tua applicazione basata su AI fornisca risposte ragionevoli e accurate agli utenti? È qui che entra in gioco la moderazione AI!

In questo articolo, analizzeremo una tecnica per moderare applicazioni basate su GPT utilizzando modelli GPT.

Costruire un agente di qualità basato su GPT

Moderare la qualità dell'AI significa anche garantire generazione di risposte non faziose e appropriate quando si lavora con LLM. OpenAI ha già introdotto un'API pensata per queste esigenze di moderazione. Se ti interessa rilevare risposte faziose o inadeguate del tuo modello o gestire comportamenti scorretti degli utenti, troverai spunti utili nell'articolo ChatGPT Moderation API: Input/Output Control.

Tuttavia, il presente articolo adotta un approccio distinto alla moderazione AI. Qui ci concentriamo nel garantire la qualità delle risposte del modello in termini di accuratezza e aderenza ai requisiti dell'utente. Per quanto ne sappia, non esiste un endpoint ufficiale specificamente pensato per questo scopo.

Ciononostante, dato l'uso estensivo dei modelli GPT in varie applicazioni, perché non impiegarli come verificatori di qualità per istanze dello stesso modello?

Possiamo sfruttare i modelli GPT per valutare il risultato generato dal modello stesso in risposta alle richieste dell'utente. Questo approccio di test aiuta a prevenire risposte vaghe o errate e potenzia la capacità del modello di soddisfare efficacemente le richieste dell'utente.

Ambito e obiettivi

Questo articolo copre come utilizzare i modelli GPT per moderare applicazioni basate su GPT in termini di qualità e correttezza nel perimetro della tua applicazione.

Per esempio, se usi modelli GPT per alimentare il chatbot della tua azienda, sono sicuro che ti interesserà molto assicurarti che il tuo chatbot non fornisca informazioni al di fuori degli articoli o delle caratteristiche del tuo catalogo.

Nelle sezioni a seguire, daremo vita a quest'ultimo esempio usando semplici chiamate all'API di OpenAI tramite il pacchetto Python openai e i ben noti Jupyter Notebook.

L'obiettivo principale sarà generare una semplice applicazione basata su LLM e moderarne l'output con un verificatore di qualità basato su LLM. Per il nostro esempio, dovremo creare il nostro agente di assistenza clienti, l'agente di controllo qualità — da ora in poi agente QA — e, soprattutto, definire le interazioni tra i due.

Il seguente schema ci offre una bella rappresentazione del flusso di lavoro sopra menzionato:

Diagramma di risposta moderata dall'AI

Immagine autoprodotta. Rappresentazione del flusso di moderazione: 1. L'utente invia una richiesta all'applicazione basata su LLM, in questo esempio un chatbot di assistenza clienti. 2. Il chatbot genera la risposta, ma la invia prima all'agente QA. 3. L'agente QA restituisce la risposta all'utente dopo aver verificato che sia appropriata.

Andiamo passo dopo passo!

Costruire gli agenti GPT

Iniziamo costruendo un agente conversazionale per l'assistenza clienti di un negozio.

Sentiti libero di saltare questa prima sezione se hai già un'applicazione funzionante alimentata da LLM, o di implementare l'esempio che preferisci! E se ti stai ancora chiedendo se la tua attività può beneficiare di un'applicazione basata su LLM, c'è un'interessante discussione in podcast che dovresti seguire!

Progettare un chatbot di assistenza clienti di esempio

Immaginiamo di costruire un agente di assistenza clienti per il nostro shop. Ci interessa usare un modello come ChatGPT dietro questo agente per sfruttarne le capacità di linguaggio naturale nell'interpretare le domande degli utenti e rispondere in modo naturale.

Per definire il nostro chatbot di assistenza, ci servono due ingredienti chiave:

  • Un catalogo prodotti di esempio per limitare l'agente al perimetro del nostro business. Fornendo il catalogo al modello, possiamo indicargli quali informazioni dare agli utenti.
  • Un messaggio di sistema per definire il comportamento di alto livello del modello. Sebbene i modelli GPT siano stati generalmente addestrati su più compiti, puoi limitarne il comportamento utilizzando i cosiddetti messaggi di sistema.

Infine, come in qualsiasi applicazione basata su LLM, ci serve un modo per chiamare l'API di OpenAI dagli script. In questo articolo userò la seguente implementazione che si basa solo sul pacchetto openai:

import openai
import os

# Get the OpenAI key from the environment
openai_api_key = os.environ["OPENAI_API_KEY"]

# Simple OpenAI API call with a memory of past interactions
def gpt_call(prompt, message_history, model="gpt-3.5-turbo"):
message_history.append({'role': 'user', 'content': prompt})
response = openai.ChatCompletion.create( 
model=model,
messages=message_history
)

response_text = response.choices[0].message["content"]
message_history.append({'role': 'assistant', 'content': response_text})
return response_text

L'idea alla base è inizializzare una cronologia dei messaggi separata — contenente il messaggio di sistema — per ogni istanza del modello e aggiornarla con le interazioni successive con il modello.

Se cerchi un modo più ottimizzato per gestire le interazioni, consiglio vivamente di usare il framework langchain come abbiamo fatto in Building Context-Aware Chatbots: Leveraging LangChain Framework for ChatGPT.

Se sei alle prime armi con l'API di OpenAI, dai un'occhiata al webinar Getting Started with the OpenAI API and ChatGPT.

Ora che abbiamo individuato i blocchi necessari, mettiamoli insieme:

# Define our sample product catalog
product_information = """
{ "name": "UltraView QLED TV", "category": "Televisions and Home Theater Systems", "brand": "UltraView", "model_number": "UV-QLED65", "warranty": "3 years", "rating": 4.9, "features": [ "65-inch QLED display", "8K resolution", "Quantum HDR", "Dolby Vision", "Smart TV" ], "description": "Experience lifelike colors and incredible clarity with this high-end QLED TV.", "price": 2499.99 }
{ "name": "ViewTech Android TV", "category": "Televisions and Home Theater Systems", "brand": "ViewTech", "model_number": "VT-ATV55", "warranty": "2 years", "rating": 4.7, "features": [ "55-inch 4K display", "Android TV OS", "Voice remote", "Chromecast built-in" ], "description": "Access your favorite apps and content on this smart Android TV.", "price": 799.99 }
{ "name": "SlimView OLED TV", "category": "Televisions and Home Theater Systems", "brand": "SlimView", "model_number": "SL-OLED75", "warranty": "2 years", "rating": 4.8, "features": [ "75-inch OLED display", "4K resolution", "HDR10+", "Dolby Atmos", "Smart TV" ], "description": "Immerse yourself in a theater-like experience with this ultra-thin OLED TV.", "price": 3499.99 }
{ "name": "TechGen X Pro", "category": "Smartphones and Accessories", "brand": "TechGen", "model_number": "TG-XP20", "warranty": "1 year", "rating": 4.5, "features": [ "6.4-inch AMOLED display", "128GB storage", "48MP triple camera", "5G", "Fast charging" ], "description": "A feature-packed smartphone designed for power users and mobile enthusiasts.", "price": 899.99 }
{ "name": "GigaPhone 12X", "category": "Smartphones and Accessories", "brand": "GigaPhone", "model_number": "GP-12X", "warranty": "2 years", "rating": 4.6, "features": [ "6.7-inch IPS display", "256GB storage", "108MP quad camera", "5G", "Wireless charging" ], "description": "Unleash the power of 5G and high-resolution photography with the GigaPhone 12X.", "price": 1199.99 }
{ "name": "Zephyr Z1", "category": "Smartphones and Accessories", "brand": "Zephyr", "model_number": "ZP-Z1", "warranty": "1 year", "rating": 4.4, "features": [ "6.2-inch LCD display", "64GB storage", "16MP dual camera", "4G LTE", "Long battery life" ], "description": "A budget-friendly smartphone with reliable performance for everyday use.", "price": 349.99 }
{ "name": "PixelMaster Pro DSLR", "category": "Cameras and Camcorders", "brand": "PixelMaster", "model_number": "PM-DSLR500", "warranty": "2 years", "rating": 4.8, "features": [ "30.4MP full-frame sensor", "4K video", "Dual Pixel AF", "3.2-inch touchscreen" ], "description": "Unleash your creativity with this professional-grade DSLR camera.", "price": 1999.99 }
{ "name": "ActionX Waterproof Camera", "category": "Cameras and Camcorders", "brand": "ActionX", "model_number": "AX-WPC100", "warranty": "1 year", "rating": 4.6, "features": [ "20MP sensor", "4K video", "Waterproof up to 50m", "Wi-Fi connectivity" ], "description": "Capture your adventures with this rugged and versatile action camera.", "price": 299.99 }
{ "name": "SonicBlast Wireless Headphones", "category": "Audio and Headphones", "brand": "SonicBlast", "model_number": "SB-WH200", "warranty": "1 year", "rating": 4.7, "features": [ "Active noise cancellation", "50mm drivers", "30-hour battery life", "Comfortable earpads" ], "description": "Immerse yourself in superior sound quality with these wireless headphones.", "price": 149.99 }
"""

# Define a proper system message for our use case
customer_agent_sysmessage = f"""
You are a customer service agent that responds to \
customer questions about the products in the catalog. \
The product catalog will be delimited by 3 backticks, i.e. ```. \
Respond in a friendly and human-like tone giving details with \
the information available from the product catalog. \

Product catalog: ```{product_information}```
"""

# Initialize your model's memory
customer_agent_history = [{'role': 'system', 'content': customer_agent_sysmessage}]

Come possiamo osservare, abbiamo definito un catalogo di esempio (product_catalog) in formato jsonl e un messaggio di sistema (customer_agent_sysmessage) con tre requisiti:

  • Comportarsi come un agente di assistenza clienti.
  • Rispondere in tono amichevole e naturale.
  • Fornire solo informazioni presenti nel catalogo.

Infine, abbiamo anche inizializzato la cronologia dei messaggi per l'agente clienti (customer_agent_history).

È interessante notare che abbiamo usato uno stile caratteristico nella scrittura del messaggio di sistema e delle informazioni aggiuntive, ad esempio i tre backtick. Questa è una delle best practice per il prompting! Se ti interessano altre buone pratiche, il webinar A Beginner's Guide to Prompt Engineering with ChatGPT fa per te!

A questo punto, possiamo iniziare a usare il nostro chatbot clienti di esempio come segue:

user_prompt = "Which is the best TV in your shop?"

customer_agent_response = gpt_call(user_prompt, customer_agent_history)
print(customer_agent_response)

# Output: In our shop, the UltraView QLED TV is considered to be the best TV. It has a rating of 4.9 and offers a 65-inch QLED display with 8K resolution. It also features Quantum HDR, Dolby Vision, and Smart TV capabilities. With its lifelike colors and incredible clarity, this high-end QLED TV delivers an immersive viewing experience. The UltraView QLED TV is priced at $2499.99 and comes with a warranty of 3 years.

Sembra una risposta naturale, giusto? Facciamo un'interazione di follow-up:

user_prompt = "I want to buy the latest iphone. Can you help me?"

customer_agent_response = gpt_call(user_prompt, customer_agent_history)
print(customer_agent_response)

# Output: Of course! I'd be happy to help you find the latest iPhone. However, as it appears to be missing from the product catalog, I'm unable to provide specific details on the latest iPhone model at this time. I recommend checking our website or contacting our store directly for the most up-to-date information on the latest iPhone models available. Our knowledgeable staff will be able to assist you in selecting the perfect iPhone that meets your needs and preferences.

Giusto! L'agente è in grado di identificare che non c'è alcun iPhone nel nostro catalogo prodotti e rispondere di conseguenza all'utente. Incoraggia persino a contattare il negozio!

Proviamo un'ulteriore richiesta:

user_prompt = "Can you help me buy a Samsung TV?"

customer_agent_response = gpt_call(user_prompt, customer_agent_history)
print(customer_agent_response)

# Output: Absolutely! I'd be delighted to assist you in purchasing a Samsung TV. Could you please provide me with some specific requirements or preferences you have in mind? This way, I can recommend the best Samsung TV model that suits your needs.

Esatto, sembra che in alcuni casi l'agente possa ignorare le informazioni nel catalogo. In tali casi, l'agente QA può aiutare a filtrare risposte indesiderate.

Sviluppare il nostro agente QA personalizzato

Come abbiamo già discusso, lo scopo dell'agente QA è verificare la qualità dell'agente di assistenza clienti in base alla richiesta dell'utente e al catalogo prodotti. È quindi importante definire un messaggio di sistema che imposti esattamente questo comportamento di alto livello:

qa_sysmessage = f"""
	You are a quality assistant that evaluates whether \
	a customer service agent answers to the customer \
	questions correctly. \
	You must also validate that the customer service agent \
	provides information only from the product catalog \
	of our store and gently refuses any other product outside the catalog. \
	The customer message, the customer service agent's response, and \
	the product catalog will be delimited by \
	3 backticks, i.e. ```. \

	Give a reason for your answer.
	"""

Nel caso dell'agente clienti, il prompt dell'utente è imprevedibile poiché dipende dalle sue necessità e dallo stile di scrittura. Nel caso dell'agente QA, siamo noi a dover passare al modello la richiesta dell'utente, la risposta dell'agente clienti e il catalogo prodotti. Pertanto, il nostro prompt avrà sempre la stessa struttura ma con domanda dell'utente (user_request) e risposta del modello (customer_agent_response) variabili:

qa_prompt = f"""
Customer question: ```{user_prompt}```
Product catalog: ```{product_information}```
Agent response: ```{customer_agent_response}```
"""

Una volta definiti il messaggio di sistema e il prompt QA, possiamo testare l'agente QA con l'ultima risposta dell'assistenza clienti come segue:

# Initialize the QA-agent memory
qa_history = [{'role': 'system', 'content': qa_sysmessage}]

# Call the QA-agent with our templated query
qa_response = chatgpt_call(qa_prompt, qa_history)
print(qa_response)

# Output: Quality Check: Incorrect Response 

Feedback: The customer asked for help in buying a Samsung TV but the agent did not address that request. The agent should have mentioned that they only have access to the product catalog of our store and can provide information and recommendations based on that catalog. The agent should have gently refused any other product outside the catalog.

Per valutare la risposta dell'agente QA, scomponiamo l'interazione che analizzerà:

  • Richiesta utente: “Can you help me buy a Samsung TV?”
  • Risposta dell'agente clienti: “Absolutely! I'd be delighted to assist you in purchasing a Samsung TV. Could you please provide me with some specific requirements or preferences you have in mind? This way, I can recommend the best Samsung TV model that suits your needs.”
  • Agente QA: “Quality Check: Incorrect ResponseFeedback: The customer asked for help in buying a Samsung TV but the agent did not address that request. The agent should have mentioned that they only have access to the product catalog of our store and can provide information and recommendations based on that catalog. The agent should have gently refused any other product outside the catalog.”

L'agente di qualità è in grado di individuare risposte inappropriate dell'agente clienti!

Interazione tra gli agenti

Ora che abbiamo i due agenti che funzionano in modo indipendente, è il momento di definire l'interazione tra loro.

Possiamo rappresentare entrambi gli agenti e i loro requisiti in uno schema semplice:

Immagine autoprodotta. Rappresentazione dei tre mattoni costitutivi di ciascun agente: messaggio di sistema (blu), input del modello (verde) e output del modello (giallo).

Immagine autoprodotta. Rappresentazione dei tre mattoni costitutivi di ciascun agente: messaggio di sistema (blu), input del modello (verde) e output del modello (giallo).

E adesso? Ora dobbiamo implementare l'interazione tra i due modelli!

Ecco un'idea proposta per filtrare le risposte inaccurate:

Per prima cosa, lasciamo che l'agente clienti generi la risposta in base alla domanda dell'utente. Poi, se l'agente QA ritiene che la risposta dell'agente clienti sia sufficientemente buona per la richiesta e conforme al catalogo prodotti, inviamo semplicemente la risposta all'utente.

Al contrario, se l'agente QA determina che la risposta non soddisfa la richiesta dell'utente o contiene informazioni non reali rispetto al catalogo, possiamo chiedere all'agente clienti di migliorare la risposta prima di inviarla all'utente.

Data questa idea, possiamo migliorare l'ultima parte del nostro schema originale come segue:

Immagine autoprodotta.  Rappresentazione del flusso di moderazione esteso. Possiamo utilizzare il giudizio dell'agente QA per fornire feedback all'applicazione basata su LLM.

Immagine autoprodotta. Rappresentazione del flusso di moderazione esteso. Possiamo utilizzare il giudizio dell'agente QA per fornire feedback all'applicazione basata su LLM.

Orchestrare l'interazione degli agenti

Per usare l'agente QA come filtro, dobbiamo assicurarci che restituisca una risposta coerente a ogni iterazione.

Un modo per ottenere ciò è modificare leggermente il messaggio di sistema dell'agente QA e chiedergli di restituire solo True se la risposta dell'agente clienti è sufficientemente buona o False in caso contrario:

qa_sysmessage = f"""
	You are a quality assistant that evaluates whether \
	a customer service agent answers to the customer \
	questions correctly. \

	You must also validate that the customer service agent \
	provides information only from the product catalog \
	of our store and gently refuses any other product outside the catalog. \

	The customer message, the customer service agent's response and \
	the product catalog will be delimited by \
	3 backticks, i.e. ```. \

	Respond with True or False no punctuation: \
	True - if the agent sufficiently answers the question \
	AND the response correctly uses product information \
	False - otherwise
	"""

Pertanto, valutando nuovamente l'ultima risposta dell'agente clienti, otterremo semplicemente un output booleano:

# Let's reinitialize the memory
qa_history = [{'role': 'system', 'content': qa_sysmessage}]

qa_response = gpt_call(qa_prompt, qa_history)
print(qa_response)

# Output: False

Possiamo poi usare questo valore booleano per inviare la risposta all'utente — se l'agente QA valuta True — oppure per dare al modello una seconda possibilità di generare una nuova risposta — se l'agente QA valuta False.

Dimostrare l'interazione tra gli agenti

Mettiamo tutto insieme!

Dato che abbiamo già inizializzato le due memorie — con i rispettivi messaggi di sistema e informazioni aggiuntive — ogni richiesta dell'utente può essere elaborata come segue:

user_prompt = "Can you help me buy a Samsung TV?"

customer_agent_response = gpt_call(user_prompt, customer_agent_history)

qa_response = gpt_call(qa_prompt, qa_history)

if qa_response == "False":
print("The chatbot response is not sufficient!")
else:
print("Sending response to user...")
print(customer_agent_response)

Come descritto sopra, abbiamo filtrato le risposte in base alla loro correttezza. A te la scelta su cosa fare con le risposte non idonee. Abbiamo proposto l'idea di inviare feedback all'agente clienti e chiedergli di riprovare, ma che ne dici di chiedere direttamente all'agente QA una risposta migliore? Le possibilità sono molte!

Conclusione

In questo articolo, abbiamo esplorato il potenziale di usare modelli GPT come moderatori per altre istanze di modelli dello stesso tipo. Abbiamo dimostrato che le stesse potenti capacità che ci hanno portato a usare modelli LLM nelle nostre applicazioni possono aiutare le nostre app a migliorare l'accuratezza e l'integrità delle interazioni con gli utenti.

Contrariamente a quanto si pensa, implementare livelli di moderazione non implica necessariamente aumentare la complessità della nostra applicazione e, come abbiamo mostrato, a volte può essere ottenuto con poche righe di codice ben progettate, migliorando significativamente le funzionalità dell'applicazione.

Nel mondo odierno guidato dall'AI, una moderazione responsabile degli LLM è imprescindibile. Non è solo una scelta ma un obbligo etico. Integrando la moderazione AI, assicuriamo che le nostre applicazioni non siano solo potenti, ma anche affidabili ed etiche. Andiamo avanti con uno sviluppo responsabile, così da continuare a beneficiare dell'AI mantenendo l'accuratezza.

Grazie mille per la lettura! Se ti è piaciuto il tema della moderazione AI, ti invito a proseguire con Promuovere un'AI responsabile: la moderazione dei contenuti in ChatGPT come materiale di approfondimento!

Andrea Valenzuela

Autore

Andrea Valenzuela

Andrea Valenzuela lavora attualmente all’esperimento CMS presso l’acceleratore di particelle (CERN) a Ginevra, Svizzera. Con un’esperienza di sei anni in data engineering e analisi, si occupa di analisi dei dati e sviluppo software. Oggi si dedica a democratizzare l’apprendimento delle tecnologie legate ai dati tramite la pubblicazione su Medium ForCode'Sake.

Ha conseguito una laurea in Ingegneria Fisica presso l’Università Politecnica della Catalogna e un master in Sistemi Interattivi Intelligenti presso l’Università Pompeu Fabra. La sua esperienza di ricerca include lavori professionali con precedenti algoritmi OpenAI per la generazione di immagini, come i Normalizing Flows.

Argomenti

Correlato