Openai+Deeplearning.AI: ChatGPT Prompt Engineering(六)

Me gustaría compartir con ustedes el curso en línea ChatGPT Prompt Engineering que recientemente aprendí Deeplearning.AI y openai crearon conjuntamente. Los siguientes son los primeros cinco blogs que escribí sobre el curso:

Ingeniería de avisos de ChatGPT(一)
Ingeniería de avisos de ChatGPT(二)
Ingeniería de avisos de ChatGPT(三)
Ingeniería de avisos de ChatGPT(四)
Ingeniería de avisos de ChatGPT(五)

Hoy llegamos a la quinta parte: los chatbots personalizados.

Un robot de chat personalizado se refiere a un modo de chat dedicado a tareas específicas para comunicarse con los usuarios para responder preguntas, resolver acertijos o completar una tarea específica. Pero primero debemos configurar el código principal para acceder a ChatGPT a través de la API:

import openai
 
openai.api_key ='YOUR_OPENAI_API_KEY'
def get_completion(prompt, model="gpt-3.5-turbo"):
    messages = [{"role": "user", "content": prompt}]
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=0, 
    )
    return response.choices[0].message["content"]

def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0):
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=temperature, 
    )
    return response.choices[0].message["content"]

Arriba definimos dos funciones get_completion y get_completion_from_messages para acceder a ChatGPT Estas dos funciones usan el modelo "gpt-3.5-turbo" de ChatGPT, y get_completion_from_messages tiene una temperatura de parámetro de entrada más que get_completion, lo que significa que get_completion_from_messages permite llamadas externas Modificar la temperatura parámetro del modelo al cambiar la función.Ya introduje la función del parámetro de temperatura en el blog anterior , por lo que no entraré en detalles aquí.

Comparado con el anterior "text-davinci-003", el modelo "gpt-3.5-turbo" es diferente en la estructura de datos del diálogo con el usuario. El modelo "gpt-3.5-turbo" agrega roles a ambos lados del diálogo. , aquí los roles se dividirán en 3 tipos: sistema, usuario, asistente. Tanto el sistema como el asistente son los roles de ChatGPT, el usuario es el rol del usuario y el sistema es el rol inicial de ChatGPT, que se usa para indicar qué rol jugará ChatGPT en la próxima conversación con el usuario. defínalo así Rol del sistema: "Eres un XXXX" (por ejemplo, eres abogado, eres profesor, eres programador...), los roles de asistente y usuario se utilizan para guardar la relación entre el chat robot y el usuario Contenido de la conversación. En general, para que ChatGPT recuerde el contexto del diálogo, guardaremos parte o todo el contenido del diálogo en la estructura del diálogo (mensajes), para que ChatGPT tenga la capacidad de recordar el contexto. Echemos un vistazo a la estructura de diálogo del ChatGPT simulado:

messages =  [  
{'role':'system', 'content':'You are an assistant that speaks like Shakespeare.'},    
{'role':'user', 'content':'tell me a joke'},   
{'role':'assistant', 'content':'Why did the chicken cross the road'},   
{'role':'user', 'content':'I don\'t know'}  ]

response = get_completion_from_messages(messages, temperature=1)
print(response)

messages =  [  
{'role':'system', 'content':'You are friendly chatbot.'},    
{'role':'user', 'content':'Hi, my name is Isa'}  ]
response = get_completion_from_messages(messages, temperature=1)
print(response)

 

messages =  [  
{'role':'system', 'content':'You are friendly chatbot.'},    
{'role':'user', 'content':'Yes,  can you remind me, What is my name?'}]
response = get_completion_from_messages(messages, temperature=1)
print(response)

 

messages =  [  
{'role':'system', 'content':'You are friendly chatbot.'},
{'role':'user', 'content':'Hi, my name is Isa'},
{'role':'assistant', 'content': "Hi Isa! It's nice to meet you. \
Is there anything I can help you with today?"},
{'role':'user', 'content':'Yes, you can remind me, What is my name?'}  ]
response = get_completion_from_messages(messages, temperature=1)
print(response)

Aquí llamamos a la función get_completion_from_messages, y pasamos los mensajes de estructura de diálogo y los parámetros de temperatura, y establecemos la temperatura en 1, lo que le dice a ChatGPT que puede generar resultados aleatorios. Por lo tanto, si ejecutamos la función get_completion_from_messages varias veces, ChatGPT puede generar respuestas con resultados diferentes cada vez. Al mismo tiempo, notamos que ChatGPT podía recordar el nombre del usuario como Isa en la última conversación. Esto se debe a que la conversación de Duolun entre el usuario y ChatGPT se almacenó en los últimos mensajes, que también contenían el nombre del usuario, por lo que ChatGPT finalmente puede Recuerde que el nombre del usuario es Isa, pero la conversación anterior ChatGPT no pudo recordar el nombre del usuario, porque el nombre del usuario no estaba registrado en los mensajes anteriores.

 orden robot

A continuación, dejaremos que ChatGPT actúe como un robot de pedidos a través del cual los usuarios piden pizza, y la tarea del robot es recopilar la información del pedido del usuario para una pizzería y responder a las preguntas del usuario sobre el pedido de pizza. Echemos un vistazo a la estructura de los mensajes:

def collect_messages(_):
    prompt = inp.value_input
    inp.value = ''
    context.append({'role':'user', 'content':f"{prompt}"})
    response = get_completion_from_messages(context) 
    context.append({'role':'assistant', 'content':f"{response}"})
    panels.append(
        pn.Row('User:', pn.pane.Markdown(prompt, width=600)))
    panels.append(
        pn.Row('Assistant:', pn.pane.Markdown(response, width=600, style={'background-color': '#F6F6F6'})))
 
    return pn.Column(*panels)
import panel as pn  # GUI
pn.extension()

panels = [] # collect display 

context = [ {'role':'system', 'content':"""
You are OrderBot, an automated service to collect orders for a pizza restaurant. \
You first greet the customer, then collects the order, \
and then asks if it's a pickup or delivery. \
You wait to collect the entire order, then summarize it and check for a final \
time if the customer wants to add anything else. \
If it's a delivery, you ask for an address. \
Finally you collect the payment.\
Make sure to clarify all options, extras and sizes to uniquely \
identify the item from the menu.\
You respond in a short, very conversational friendly style. \
The menu includes \
pepperoni pizza  12.95, 10.00, 7.00 \
cheese pizza   10.95, 9.25, 6.50 \
eggplant pizza   11.95, 9.75, 6.75 \
fries 4.50, 3.50 \
greek salad 7.25 \
Toppings: \
extra cheese 2.00, \
mushrooms 1.50 \
sausage 3.00 \
canadian bacon 3.50 \
AI sauce 1.50 \
peppers 1.00 \
Drinks: \
coke 3.00, 2.00, 1.00 \
sprite 3.00, 2.00, 1.00 \
bottled water 5.00 \
"""} ]  # accumulate messages


inp = pn.widgets.TextInput(value="Hi", placeholder='Enter text here…')
button_conversation = pn.widgets.Button(name="Chat!")

interactive_conversation = pn.bind(collect_messages, button_conversation)

dashboard = pn.Column(
    inp,
    pn.Row(button_conversation),
    pn.panel(interactive_conversation, loading_indicator=True, height=300),
)

dashboard

 La variable de contexto aquí es la estructura de la conversación entre ChatGPT y el cliente. El contenido del rol "sistema" en la variable de contexto se traduce al chino para que todos puedan entender mejor la definición del rol del sistema:

context1 = [ {'role':'system', 'content':"""
你是一个订单机器人,这是一项为比萨餐厅收集订单的自动化服务。 \
你先问候客户,然后收集订单,\
然后问是自取还是送货。 \
您等待收集整个订单,然后对其进行汇总并最后检查客户是否还想添加任何其他内容。 \
如果是送货,你索要一个地址。 \
最后你收款了。\
确保阐明所有选项、附加功能和尺寸,以便从菜单中唯一标识该项目。\
你以简短、非常友好的对话方式回应。 \
菜单包括\
意大利辣香肠披萨 12.95, 10.00, 7.00 \
芝士披萨 10.95, 9.25, 6.50 \
茄子披萨 11.95, 9.75, 6.75 \
薯条 4.50, 3.50 \
希腊沙拉 7.25 \
配料:\
额外的奶酪 2.00, \
蘑菇 1.50 \
香肠 3.00 \
加拿大培根 3.50 \
艾酱1.50\
辣椒 1.00 \
饮料:\
可乐 3.00, 2.00, 1.00 \
雪碧 3.00, 2.00, 1.00 \
瓶装水 5.00 \
"""} ]  # accumulate messages

Al definir el rol del sistema, primero le dijimos a ChatGPT que es un robot de pedidos cuya tarea principal es recolectar pedidos y esperar Después de explicar el proceso y los pasos para pedir pizza a ChatGPT, el siguiente paso es el contenido del menú, para que ChatGPT puede ordenar según el menú. Los clientes recomiendan diferentes tipos de pizza. Aquí está el chat con el bot de pedidos después de que ejecutamos el programa:

 

 

 Aquí tuvimos una conversación con ChatGPT en chino durante todo el proceso. Aunque usamos el inglés al definir los roles del sistema de ChatGPT, ChatGPT aún puede traducir el contenido del menú en inglés al chino y luego respondernos. Todo el proceso de conversación se ve muy profesional y liso.

A continuación mostramos la información del pedido en formato JSON:

messages =  context.copy()
messages.append(
{'role':'system', 'content':'create a json summary of the previous food order. Itemize the price for each item\
 The fields should be 1) pizza, include size 2) list of toppings 3) list of drinks, include size   4) list of sides include size  5)total price '},    
)
 

response = get_completion_from_messages(messages, temperature=0)
print(response)

 

 

insuficiencias

El ChatGPT que definimos aquí es un robot de pedidos. En principio, no debería responder a ninguna pregunta que no tenga nada que ver con los pedidos. Probé algunos temas que no tienen nada que ver con los pedidos. El robot de pedidos también puede responder normalmente, lo que muestra que nuestra definición de funciones del sistema aún tiene margen de mejora, se debe informar claramente que ChatGPT no debe responder a ninguna pregunta que no esté relacionada con los pedidos cuando se define la función del sistema.

 

 intenta mejorar

En la definición de roles del sistema anterior, no le dijimos a ChatGPT qué preguntas no deben responderse, por lo que el robot responderá cualquier pregunta que no tenga nada que ver con ordenar, lo que viola nuestra intención original. Con este fin, podemos agregar algunas palabras restrictivas al definir el rol del sistema. A través de estas palabras restrictivas, podemos intentar que el robot rechace cortésmente cualquier pregunta que no tenga nada que ver con ordenar. A continuación, insertaremos tales oraciones al definir el role:

 Esta oración significa: "Si la pregunta del cliente no está relacionada con pedir pizza, entonces estás diciendo: Lo siento, solo soy un robot de pedidos y no puedo responder ninguna pregunta que no esté relacionada con pedir pizza".

import panel as pn  # GUI
pn.extension()

panels = [] # collect display 

context = [ {'role':'system', 'content':"""
You are OrderBot, an automated service to collect orders for a pizza restaurant. \
You first greet the customer, then collects the order, \
and then asks if it's a pickup or delivery. \
You wait to collect the entire order, then summarize it and check for a final \
time if the customer wants to add anything else. \
If it's a delivery, you ask for an address. \
Finally you collect the payment.\
Make sure to clarify all options, extras and sizes to uniquely \
identify the item from the menu.\
You respond in a short, very conversational friendly style. \
If the customer's question has nothing to do with ordering pizza or \
ordering food, you say:Sorry, I'm an order bot and I can't answer questions \
not related to ordering pizza.\
The menu includes \
pepperoni pizza  12.95, 10.00, 7.00 \
cheese pizza   10.95, 9.25, 6.50 \
eggplant pizza   11.95, 9.75, 6.75 \
fries 4.50, 3.50 \
greek salad 7.25 \
Toppings: \
extra cheese 2.00, \
mushrooms 1.50 \
sausage 3.00 \
canadian bacon 3.50 \
AI sauce 1.50 \
peppers 1.00 \
Drinks: \
coke 3.00, 2.00, 1.00 \
sprite 3.00, 2.00, 1.00 \
bottled water 5.00 \
"""} ]  # accumulate messages


inp = pn.widgets.TextInput(value="Hi", placeholder='Enter text here…')
button_conversation = pn.widgets.Button(name="Chat!")

interactive_conversation = pn.bind(collect_messages, button_conversation)

dashboard = pn.Column(
    inp,
    pn.Row(button_conversation),
    pn.panel(interactive_conversation, loading_indicator=True, height=300),
)

dashboard

 En términos generales, nuestra mejora ha logrado ciertos resultados. Básicamente, el robot puede negarse a responder preguntas que no tienen nada que ver con el pedido, pero siempre siento que no es perfecto. Si queremos que el robot se niegue estrictamente a responder todas las preguntas que no tienen nada que ver con el pedido, parece que también es necesario enseñar al robot a identificar con precisión si existe una relación entre el problema del cliente y el evento de pedido, y la fuerza de esta relación. ¿Qué piensas sobre este asunto?

Sobre el parámetro del modelo Temperatura

Si el modelo tiene múltiples resultados opcionales, entonces cuando la temperatura sea 0, se seleccionará el resultado con mayor probabilidad, si se incrementa el valor de la temperatura, se incrementará la aleatoriedad del resultado de selección del modelo, es decir, la posibilidad Los resultados que no son altos también se pueden seleccionar, veamos un ejemplo:

Si mi preferencia real por los tres alimentos es: pizza 53%, sushi 30% y tocos 5%, es decir, mi comida favorita es la pizza, la que menos me gusta son los tacos y la del medio es el sushi. Cuando seleccionamos una Temperatura diferente, obtendremos los siguientes resultados:

 

 Cuando la temperatura sea 0, el modelo seleccionará pizza al 100 %, y cuando la temperatura sea 0,3, el modelo seleccionará pizza con una probabilidad de 2/3 y sushi con una probabilidad de 1/3. Cuando la temperatura sea 0,7, se seleccionarán tres alimentos La probabilidad de cada uno de ustedes es 1/3. Así que cuanto mayor sea la temperatura, mayor será la aleatoriedad. ¿Puedes entender el papel de la temperatura de esta manera?

Resumir

Hoy aprendimos a usar ChatGPT para desarrollar un robot de chat personalizado para que pueda reemplazar a los humanos para completar ciertas tareas, entre ellas, necesitamos definir en detalle el rol del sistema de la máquina para evitar que el robot responda preguntas que no tienen nada que ver. ver con la tarea en sí.

También introdujimos la función y operación del parámetro del modelo temperatura Por ejemplo, cuanto mayor sea la temperatura, más aleatoria será la salida del modelo.

Referencias

DLAI - Plataforma de aprendizaje Beta

Supongo que te gusta

Origin blog.csdn.net/weixin_42608414/article/details/130950530
Recomendado
Clasificación