Ga naar hoofdinhoud

ChatGPT gebruiken om ChatGPT-antwoorden te modereren

Verken de nuances van AI-moderatie met onze diepgaande gids over het inzetten van ChatGPT voor het modereren van antwoorden in GPT-gebaseerde toepassingen.
· 9 min lezen

Verken met AI

AI-moderatie voor kwaliteit

De AI-revolutie omarmen in applicatieontwikkeling markeert een nieuw tijdperk in de interactie tussen mens en AI. Terwijl bedrijven AI inzetten om gebruikerservaringen te verbeteren, brengt de integratie van LLM-gebaseerde oplossingen ook uitdagingen met zich mee rond het waarborgen van integriteit, nauwkeurigheid en ethische standaarden van content.

De noodzaak van verantwoorde AI-moderatie wordt duidelijk naarmate toepassingen zich buiten gecontroleerde omgevingen bewegen, waar het zorgen voor redelijke en accurate antwoorden aan gebruikers misschien technisch niet heel eenvoudig is, maar wel cruciaal.

In klantenservice-interacties kan bijvoorbeeld desinformatie of ongepaste content leiden tot ontevreden klanten en zelfs reputatieschade voor het bedrijf. Maar hoe zorg je er als ontwikkelaar voor dat je AI-gebaseerde applicatie redelijke en accurate antwoorden geeft aan je gebruikers? Daar komt AI-moderatie om de hoek kijken!

In dit artikel duiken we in een techniek om GPT-gebaseerde toepassingen te modereren met behulp van GPT-modellen.

Een GPT-gebaseerde kwaliteitsagent bouwen

AI-kwaliteit modereren betekent ook zorgen voor onbevooroordeelde en passende antwoordgeneratie bij het werken met LLM’s. OpenAI heeft al een API geïntroduceerd die is ontworpen voor dit soort moderatiebehoeften. Als je graag vooringenomen of ongepaste antwoorden van je model wilt detecteren of gebruikersmisbruik wilt aanpakken, vind je waardevolle inzichten in het artikel ChatGPT Moderation API: Input/Output Control.

Dit artikel kiest echter een andere benadering van AI-moderatie. Onze focus ligt hier op het garanderen van de kwaliteit van modelantwoorden in termen van nauwkeurigheid en het voldoen aan gebruikersvereisten. Voor zover ik weet is er geen officieel endpoint dat specifiek voor dit doel is toegesneden.

Maar aangezien we GPT-modellen toch al op grote schaal inzetten in allerlei toepassingen, waarom zouden we ze dan niet gebruiken als kwaliteitscontroleurs voor instanties van hetzelfde model?

We kunnen GPT-modellen inzetten om de uitkomst te beoordelen die het model zelf heeft gegenereerd als reactie op de vraag van de gebruiker. Deze testaanpak helpt vage en onjuiste antwoorden te voorkomen en verbetert het vermogen van het model om effectief aan de verzoeken van de gebruiker te voldoen.

Reikwijdte en doelstellingen

Dit artikel behandelt hoe je GPT-modellen inzet om GPT-gebaseerde toepassingen te modereren op het gebied van kwaliteit en correctheid binnen de reikwijdte van je applicatie.

Als je bijvoorbeeld GPT-modellen gebruikt om je zakelijke chatbot aan te sturen, ben je er vast zeer in geïnteresseerd om ervoor te zorgen dat je chatbot geen informatie geeft buiten je catalogusartikelen of -kenmerken.

In de volgende secties brengen we dit laatste voorbeeld tot leven met eenvoudige aanroepen naar de OpenAI API via het openai Python-pakket en de welbekende Jupyter Notebooks.

Het hoofddoel is een eenvoudige LLM-gebaseerde applicatie te bouwen en de output ervan te modereren met een LLM-gebaseerde kwaliteitschecker. Voor ons voorbeeld maken we een voorbeeld-klantenserviceagent, de kwaliteitscontrole-agent — vanaf nu de QA-agent — en, nog belangrijker, definiëren we de interacties tussen de twee.

Het volgende schema geeft een mooie weergave van de hierboven beschreven workflow:

AI moderated response diagram

Zelfgemaakte afbeelding. Weergave van de moderatieworkflow: 1. De gebruiker stuurt een verzoek naar de LLM-gebaseerde applicatie, in dit voorbeeld een klantenservicechatbot. 2. De chatbot genereert het antwoord, maar stuurt het eerst naar de QA-agent. 3. De QA-agent stuurt het antwoord terug naar de gebruiker nadat is gecontroleerd dat het antwoord passend is.

Laten we stap voor stap te werk gaan!

De GPT-agents bouwen

We beginnen met het bouwen van een conversatieagent voor de klantenservice van een winkel.

Sla deze eerste sectie gerust over als je al een werkende LLM-gestuurde toepassing hebt of implementeer je eigen voorbeeld! En als je je nog afvraagt of jouw bedrijf kan profiteren van een LLM-gebaseerde toepassing, is er een interessante podcastdiscussie die je zeker moet beluisteren!

Een voorbeeld-chatbot voor klantenservice maken

Stel dat we een klantenserviceagent bouwen voor onze shop. We willen een model zoals ChatGPT achter deze klantenagent gebruiken om te profiteren van de natuurlijke taalcapaciteiten voor het begrijpen van gebruikersvragen en om op een natuurlijke manier te antwoorden.

Om onze klantenservicechatbot te definiëren, hebben we twee sleutelonderdelen nodig:

  • Een voorbeeldproductcatalogus om de agent te beperken tot onze bedrijfscontext. Door onze productcatalogus aan het model te voeren, kan het model weten welke informatie het aan onze gebruikers mag geven.
  • Een systeembericht om het gedrag van het model op hoog niveau te definiëren. Hoewel GPT-modellen in het algemeen zijn getraind op meerdere taken, kun je het modelgedrag beperken met de zogeheten systeemberichten.

Tot slot hebben we, zoals bij elke LLM-gebaseerde toepassing, een manier nodig om de OpenAI API vanuit onze scripts aan te roepen. In dit artikel gebruik ik de volgende implementatie die alleen op het openai-pakket steunt:

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

Het idee hierachter is om voor elke modelinstantie een aparte berichtgeschiedenis te initialiseren — met het systeembericht — en deze te blijven updaten met de komende interacties met het model.

Als je op zoek bent naar een meer geoptimaliseerde manier om je interacties te beheren, raad ik zeker het langchain-framework aan, zoals we deden in Contextbewuste chatbots bouwen: het LangChain-framework benutten voor ChatGPT.

Ben je nieuw bij de OpenAI API, bekijk dan het webinar Aan de slag met de OpenAI API en ChatGPT.

Nu we de vereiste bouwstenen hebben geïdentificeerd, zetten we ze bij elkaar:

# 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}]

Zoals we zien, hebben we een voorbeeldcatalogus (product_catalog) in jsonl-indeling gedefinieerd, en een systeembericht (customer_agent_sysmessage) met drie vereisten:

  • Gedraag je als een klantenserviceagent.
  • Antwoord in een vriendelijke, menselijke toon.
  • Geef alleen informatie uit de catalogus.

Tot slot hebben we ook de berichtgeschiedenis geïnitialiseerd voor de klantenagent (customer_agent_history).

Het is interessant om op te merken dat we een kenmerkende stijl hebben gebruikt bij het schrijven van het systeembericht en de extra informatie, zoals de triple backticks. Dit is een van de best practices voor prompten! Als je meer best practices wilt, is het webinar A Beginner's Guide to Prompt Engineering with ChatGPT iets voor jou!

Op dit punt kunnen we onze voorbeeldklantenchatbot als volgt gaan gebruiken:

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.

Klinkt als een natuurlijk antwoord, toch? Laten we een vervolgvraag doen:

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.

Heel redelijk! De agent kan vaststellen dat er geen iPhone in onze productcatalogus staat en reageert daar passend op. Hij moedigt de gebruiker zelfs aan om contact op te nemen met de winkel!

Laten we nog een verzoek proberen:

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.

Precies, het lijkt erop dat de agent in sommige gevallen de informatie in de catalogus kan negeren. In die gevallen kan de QA-agent helpen om ongewenste antwoorden te filteren.

Onze eigen QA-agent ontwikkelen

Zoals we al bespraken, is het doel van de QA-agent om de kwaliteit van de klantenserviceagent te controleren, gegeven de gebruikersvraag en de productcatalogus. Daarom is het belangrijk een systeembericht te definiëren dat precies dit hoge-niveau-gedrag vastlegt:

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.
	"""

In het geval van de klantenagent is de gebruikersprompt onvoorspelbaar, omdat deze afhangt van de behoefte en schrijfstijl van de gebruiker. Bij de QA-agent zijn wij degene die de gebruikersvraag, het antwoord van de klantenagent en de productcatalogus aan het model doorgeven. Onze prompt heeft dus altijd dezelfde structuur, maar met variërende gebruikersvraag (user_request) en modelantwoord (customer_agent_response):

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

Zodra het systeembericht en de QA-prompt zijn gedefinieerd, kunnen we de QA-agent testen met het laatste antwoord van de klantenservice als volgt:

# 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.

Om het antwoord van de QA-agent te evalueren, bekijken we de interactie die hij zal analyseren:

  • Verzoek van de gebruiker: “Can you help me buy a Samsung TV?”
  • Antwoord van de klantenagent: “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.”
  • QA-agent: “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.”

De kwaliteitsagent kan ongepaste antwoorden van de klantenagent herkennen!

Interactie tussen de agents

Nu we de twee agents onafhankelijk hebben werkend, is het tijd om de interactie ertussen te definiëren.

We kunnen beide agents en hun vereisten in een eenvoudig schema weergeven:

Self-made image. Representation of the three building blocks of each agent: system message (blue), model input (green), and model output (yellow).

Zelfgemaakte afbeelding. Weergave van de drie bouwstenen van elke agent: systeembericht (blauw), modelinvoer (groen) en modeluitvoer (geel).

Wat is de volgende stap? Nu moeten we de interactie tussen beide modellen implementeren!

Hier is een voorgesteld idee om onjuiste antwoorden te filteren:

Eerst laten we de klantenagent het antwoord genereren op basis van de gebruikersvraag. Als de QA-agent vervolgens vindt dat het antwoord van de klantenagent goed genoeg is voor de gebruikersvraag en in lijn met de productcatalogus, sturen we het simpelweg terug naar de gebruiker.

Als de QA-agent daarentegen bepaalt dat het antwoord niet aan het verzoek van de gebruiker voldoet of onjuiste informatie over de catalogus bevat, kunnen we de klantenagent vragen het antwoord te verbeteren voordat we het naar de gebruiker sturen.

Met dit idee in gedachten kunnen we het laatste deel van ons oorspronkelijke schema als volgt verbeteren:

Self-made image.  Representation of the extended moderation workflow. We can use the judgment of the QA agent to provide feedback to the LLM-based application.

Zelfgemaakte afbeelding. Weergave van de uitgebreide moderatieworkflow. We kunnen het oordeel van de QA-agent gebruiken om feedback te geven aan de LLM-gebaseerde applicatie.

De interactie tussen agents orkestreren

Om de QA-agent als filter te kunnen gebruiken, moeten we ervoor zorgen dat deze bij elke iteratie een consistent antwoord geeft.

Een manier om dat te bereiken is het systeembericht van de QA-agent licht te wijzigen en hem te vragen alleen True te geven als het antwoord van de klantenagent goed genoeg is, of False anders:

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
	"""

Daarom krijgen we, wanneer we opnieuw het laatste antwoord van de klantenagent evalueren, simpelweg een booleaanse output:

# 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

We kunnen vervolgens met deze booleaanse waarde werken om het antwoord naar de gebruiker te sturen — als de QA-agent True teruggeeft — of om het model een tweede kans te geven om een nieuw antwoord te genereren — als de QA-agent False teruggeeft.

De interactie van de agents demonstreren

Laten we alles samenbrengen!

Aangezien we de twee geheugens al hebben geïnitialiseerd — met hun respectieve systeemberichten en extra informatie — kan elk klantenverzoek als volgt worden verwerkt:

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)

Zoals hierboven beschreven, hebben we de antwoorden gefilterd op basis van hun correctheid. Ik laat het aan jou over om te beslissen wat te doen met de ongeschikte antwoorden. We hebben het idee voorgesteld om feedback naar de klantenagent te sturen en hem te laten herproberen, maar wat als je de QA-agent om een beter antwoord vraagt? Er zijn meerdere mogelijkheden!

Conclusie

In dit artikel hebben we de mogelijkheden verkend om GPT-modellen te gebruiken als moderatoren voor andere modelinstanties van hetzelfde type. We hebben laten zien dat dezelfde krachtige capaciteiten die ons hebben doen kiezen voor LLM-modellen in onze toepassingen, onze applicaties ook kunnen helpen om de nauwkeurigheid en integriteit van gebruikersinteracties te verbeteren.

In tegenstelling tot misvattingen impliceert het implementeren van moderatieniveaus niet per se dat onze applicatie complexer wordt en, zoals we hebben laten zien, kan het soms worden bereikt met een paar goed ontworpen regels code, waarmee de functionaliteit van de applicatie aanzienlijk wordt opgewaardeerd.

In de AI-gedreven wereld van vandaag is verantwoorde LLM-moderatie essentieel. Het is niet alleen een keuze, maar een ethische plicht. Door AI-moderatie te integreren, zorgen we ervoor dat onze applicaties niet alleen krachtig zijn, maar ook betrouwbaar en ethisch. Laten we verantwoord blijven ontwikkelen, zodat we kunnen blijven profiteren van AI en tegelijk de nauwkeurigheid waarborgen.

Hartelijk dank voor het lezen! Als je het onderwerp AI-moderatie interessant vond, raad ik je aan verder te gaan met Promoting Responsible AI: Content Moderation in ChatGPT als vervolgmateriaal!

Andrea Valenzuela

Auteur

Andrea Valenzuela

Andrea Valenzuela werkt momenteel aan het CMS-experiment bij de deeltjesversneller (CERN) in Genève, Zwitserland. Met zes jaar ervaring in data-engineering en -analyse omvatten haar taken data-analyse en softwareontwikkeling. Ze zet zich nu in voor het democratiseren van het leren van datagerelateerde technologieën via de Medium-publicatie ForCode'Sake.

Ze behaalde een bachelor in Engineering Physics aan de Polytechnische Universiteit van Catalonië en een master in Intelligent Interactive Systems aan de Pompeu Fabra Universiteit. Haar onderzoekservaring omvat professioneel werk met eerdere OpenAI-algoritmes voor beeldgeneratie, zoals Normalizing Flows.

Onderwerpen

Gerelateerd