Estrategias de ingeniería de consejos

Esta guía comparte estrategias y tácticas para obtener mejores resultados de modelos de lenguaje grandes (a veces denominados modelos GPT) como GPT-4. Los métodos descritos aquí a veces se pueden implementar en combinación para obtener un mayor efecto. Animamos a experimentar para encontrar los métodos que funcionen mejor para ti.

Algunos de los ejemplos demostrados aquí actualmente solo funcionan con nuestro modelo más capaz, gpt-4. En general, si encuentras que un modelo falla en una tarea y hay disponible un modelo más capaz, a menudo vale la pena intentarlo de nuevo con el modelo más capaz.

Consejos: Este tutorial es una traducción de la Guía de Ingeniería de Consejos oficial de OpenAI. El tutorial explica la estrategia/táctica de escribir palabras de consejos y cómo instruir al modelo de lenguaje para que devuelva el resultado deseado a través de la inscripción.

Seis estrategias para obtener mejores resultados

Escribir instrucciones claras

Estos modelos no pueden leer tu mente. Si las salidas son demasiado largas, pide respuestas breves. Si las salidas son demasiado simples, pide escritura a nivel de experto. Si no te gusta el formato, demuestra el formato que te gustaría ver. Cuanto menos tenga que adivinar el modelo lo que deseas, más probable es que lo obtengas.

Tácticas:

  • Incluir detalles en tu consulta para obtener respuestas más relevantes
  • Pedir al modelo que adopte una personalidad
  • Usar delimitadores para indicar claramente partes distintas de la entrada
  • Especificar los pasos necesarios para completar una tarea
  • Proporcionar ejemplos
  • Especificar la longitud deseada de la salida

Proporcionar texto de referencia

Los modelos de lenguaje pueden inventar con confianza respuestas falsas, especialmente cuando se les pregunta sobre temas esotéricos o para citas y URL. De la misma manera que una hoja de notas puede ayudar a un estudiante a desempeñarse mejor en un examen, proporcionar texto de referencia a estos modelos puede ayudar a responder con menos invenciones.

Tácticas:

  • Instruir al modelo para responder utilizando un texto de referencia
  • Instruir al modelo para responder con citas de un texto de referencia

Dividir tareas complejas en subtareas más simples

Así como es una buena práctica en la ingeniería de software descomponer un sistema complejo en un conjunto de componentes modulares, lo mismo es cierto para las tareas enviadas a un modelo de lenguaje. Las tareas complejas tienden a tener tasas de error más altas que las tareas más simples. Además, las tareas complejas a menudo se pueden redefinir como un flujo de trabajo de tareas más simples en las que las salidas de las tareas anteriores se utilizan para construir las entradas de las tareas posteriores.

Tácticas:

  • Usar clasificación de intención para identificar las instrucciones más relevantes para una consulta de usuario
  • Para aplicaciones de diálogo que requieran conversaciones muy largas, resumir o filtrar el diálogo anterior
  • Resumir documentos largos por partes y construir un resumen completo de forma recursiva

Dar tiempo al modelo para "pensar"

Si se le pide que multiplique 17 por 28, es posible que no lo sepas al instante, pero aún puedes resolverlo con tiempo. De manera similar, los modelos cometen más errores de razonamiento al intentar responder de inmediato, en lugar de tomarse tiempo para encontrar una respuesta. Pedir una "cadena de pensamiento" antes de una respuesta puede ayudar al modelo a razonar de manera más confiable hacia respuestas correctas.

Tácticas:

  • Instruir al modelo para resolver su propia solución antes de llegar a una conclusión apresurada
  • Usar monólogo interno o una secuencia de consultas para ocultar el proceso de razonamiento del modelo
  • Preguntar al modelo si se perdió algo en pases anteriores

Usar herramientas externas

Compensa las debilidades del modelo alimentándolo con las salidas de otras herramientas. Por ejemplo, un sistema de recuperación de texto (a veces llamado RAG o generación aumentada de recuperación) puede informar al modelo sobre documentos relevantes. Un motor de ejecución de código como el Intérprete de Código de OpenAI puede ayudar al modelo a hacer cálculos y ejecutar código. Si una tarea se puede realizar de manera más confiable o eficiente mediante una herramienta en lugar de un modelo de lenguaje, transfierela para obtener lo mejor de ambos.

Tácticas:

  • Usar búsqueda basada en incrustaciones para implementar la recuperación eficiente de conocimientos
  • Utilizar la ejecución de código para realizar cálculos más precisos o llamar a API externas
  • Dar al modelo acceso a funciones específicas

Probar cambios sistemáticamente

Mejorar el rendimiento es más fácil si puedes medirlo. En algunos casos, una modificación en una instrucción logrará un mejor rendimiento en unos pocos ejemplos aislados, pero conducirá a un peor rendimiento en general en un conjunto más representativo de ejemplos. Por lo tanto, para asegurarse de que un cambio sea positivo en términos de rendimiento, puede ser necesario definir una suite de pruebas integral (también conocida como "eval").

Táctica:

  • Evaluar las salidas del modelo con referencia a respuestas de referencia de calidad

Tácticas

Cada una de las estrategias enumeradas anteriormente se puede concretar con tácticas específicas. Estas tácticas están destinadas a proporcionar ideas de cosas para probar. De ninguna manera son completamente exhaustivas y debes sentirte libre de probar ideas creativas que no estén representadas aquí.

Descripción de ejemplo de palabra clave de la consulta

Todos sabemos que el API del Modelo de Chat que llama a OpenAI tiene tres tipos de mensajes, SISTEMA, USUARIO, y ASISTENTE, y las funciones de estos tres mensajes son las siguientes:

Tipo de mensaje (correspondiente al parámetro de rol del API) Descripción
SISTEMA El mensaje del sistema ayuda a configurar el comportamiento del asistente. Por ejemplo, puedes modificar la personalidad del asistente o proporcionar instrucciones específicas sobre cómo debería comportarse a lo largo de la conversación. Sin embargo, ten en cuenta que el mensaje del sistema es opcional y es probable que el comportamiento del modelo sin un mensaje del sistema sea similar al uso de un mensaje genérico como "Eres un asistente útil."
USUARIO Un mensaje del usuario es una cuestión de entrada del usuario.
ASISTENTE Los mensajes del asistente representan lo que GPT devuelve.

Los ejemplos de palabras clave en este tutorial se explicarán en el siguiente formato:

// Mensaje del SISTEMA
Esto muestra cómo configurar la palabra clave del mensaje del SISTEMA.

// Mensaje del USUARIO
Esto muestra cómo configurar la palabra clave del mensaje del USUARIO.

// Mensaje del ASISTENTE
Esto demuestra lo que GPT podría devolver.

Estrategia: Escribir instrucciones claras

Táctica: Incluir detalles en tu consulta para obtener respuestas más relevantes

Para obtener una respuesta altamente relevante, asegúrate de que las solicitudes proporcionen cualquier detalle o contexto importante. De lo contrario, estás dejando que el modelo adivine lo que quieres decir.

Peor Mejor
¿Cómo sumo números en Excel? ¿Cómo sumo una fila de cantidades en dólares en Excel? Quiero hacer esto automáticamente para toda una hoja de filas con todos los totales terminando en la columna derecha llamada "Total".
¿Quién es el presidente? ¿Quién fue el presidente de México en 2021, y con qué frecuencia se celebran las elecciones?
Escribe código para calcular la secuencia de Fibonacci. Escribe una función en TypeScript para calcular eficientemente la secuencia de Fibonacci. Comenta el código de manera liberal para explicar qué hace cada parte y por qué está escrito así.
Resumir las notas de la reunión. Resuma las notas de la reunión en un solo párrafo. Luego escribe una lista en formato markdown de los oradores y cada uno de sus puntos clave. Finalmente, lista los próximos pasos o actividades sugeridas por los oradores, si los hay.

Táctica: Pedir al modelo que adopte una personalidad

El mensaje del sistema se puede usar para especificar la personalidad utilizada por el modelo en sus respuestas.

// Mensaje del SISTEMA
Cuando me pido ayuda para escribir algo, responderás con un documento que contenga al menos un chiste o comentario juguetón en cada párrafo.

// Mensaje del USUARIO
Escribe una nota de agradecimiento a mi proveedor de pernos de acero por entregar a tiempo y con poco aviso. Esto hizo posible que entreguemos un pedido importante.

Táctica: Utilizar delimitadores para indicar claramente partes distintas de la entrada

Los delimitadores como comillas triples, etiquetas XML, títulos de secciones, etc. pueden ayudar a demarcar secciones de texto que se deben tratar de manera diferente.

// Mensaje del USUARIO
Resume el texto delimitado por comillas triples con un haiku.

"""inserta el texto aquí"""
// Mensaje del SISTEMA
Se te proporcionarán un par de artículos (delimitados con etiquetas XML) sobre el mismo tema. Primero resume los argumentos de cada artículo. Luego indica cuál de ellos presenta un mejor argumento y explica por qué.

// Mensaje del USUARIO
<article> inserta aquí el primer artículo </article>
<article> inserta aquí el segundo artículo </article>
// Mensaje del SISTEMA
Se te proporcionará un resumen de la tesis y un título sugerido para la misma. El título de la tesis debe dar al lector una buena idea del tema de la tesis pero también debe ser llamativo. Si el título no cumple con estos criterios, sugiere 5 alternativas.

// Mensaje del USUARIO
Resumen: inserta aquí el resumen

Título: inserta aquí el título

Para tareas sencillas como estas, el uso de delimitadores puede que no haga una diferencia en la calidad del resultado. Sin embargo, cuanto más compleja sea una tarea, más importante es desambiguar los detalles de la misma. No hagas que el modelo trabaje para entender exactamente lo que le estás pidiendo.

Táctica: Especificar los pasos requeridos para completar una tarea

Algunas tareas se pueden especificar mejor como una secuencia de pasos. Escribir los pasos explícitamente puede hacer que sea más fácil para el modelo seguirlos.

// Mensaje del SISTEMA

Utiliza las siguientes instrucciones paso a paso para responder a las entradas del usuario.

Paso 1 - El usuario te proporcionará texto entre comillas triples. Resume este texto en una sola frase con un prefijo que diga "Resumen: ".

Paso 2 - Traduce el resumen del Paso 1 al español, con un prefijo que diga "Traducción: ".

// Mensaje del USUARIO
"""inserta el texto aquí"""

Táctica: Proporcionar ejemplos

Proporcionar instrucciones generales que apliquen a todos los ejemplos suele ser más eficiente que demostrar todas las permutaciones de una tarea por ejemplo, pero en algunos casos proporcionar ejemplos puede ser más fácil. Por ejemplo, si pretendes que el modelo copie un estilo particular de responder a consultas de usuario que es difícil de describir explícitamente. Esto se conoce como "entrenamiento con pocas muestras".

// Mensaje del SISTEMA
Responde de manera consistente.

// Mensaje del USUARIO
Enséñame sobre la paciencia.

// Mensaje del ASISTENTE
El río que talla el valle más profundo fluye desde un manantial modesto; la sinfonía más grandiosa origina a partir de una sola nota; la tapicería más intricada comienza con un hilo solitario.

// Mensaje del USUARIO
Enséñame sobre el océano.

Táctica: Especificar la longitud deseada del resultado

Puedes pedirle al modelo que produzca salidas de una longitud objetivo dada. La longitud objetivo puede especificarse en términos de cantidad de palabras, frases, párrafos, viñetas, etc. Sin embargo, es importante tener en cuenta que instruir al modelo para generar un número específico de palabras no funciona con alta precisión. El modelo puede generar salidas de manera más confiable con un número específico de párrafos o viñetas.

// Mensaje del USUARIO
Resume el texto delimitado por comillas triples en aproximadamente 50 palabras.

"""inserta el texto aquí"""
// Mensaje del USUARIO
Resume el texto delimitado por comillas triples en 2 párrafos.

"""inserta el texto aquí"""
// Mensaje del USUARIO
Resume el texto delimitado por comillas triples en 3 viñetas.

"""inserta el texto aquí"""

Estrategia: Proporcionar texto de referencia

Táctica: Instruir al modelo para responder utilizando un texto de referencia

Si podemos proporcionar al modelo información confiable y relevante para la consulta actual, entonces podemos instruir al modelo para utilizar la información proporcionada para componer su respuesta.

// Mensaje del SISTEMA
Utiliza los artículos proporcionados delimitados por comillas triples para responder preguntas. Si la respuesta no se puede encontrar en los artículos, escribe "No pude encontrar una respuesta".

// Mensaje del USUARIO
<insertar artículos, cada uno delimitado por comillas triples>

Pregunta: <insertar pregunta aquí>

Dado que todos los modelos tienen ventanas de contexto limitadas, necesitamos alguna forma de buscar dinámicamente información relevante para la pregunta que se está haciendo. Embeddings se pueden utilizar para implementar una recuperación de conocimiento eficiente. Consulta la táctica "Usar búsqueda basada en embeddings para implementar una recuperación de conocimiento eficiente" para obtener más detalles sobre cómo implementar esto.

Táctica: Instruir al modelo para responder con citas de un texto de referencia

Si se ha complementado la entrada con conocimientos relevantes, es sencillo solicitarle al modelo que agregue citas a sus respuestas haciendo referencia a pasajes de los documentos proporcionados. Ten en cuenta que las citas en la salida pueden verificarse programáticamente mediante la coincidencia de cadenas dentro de los documentos proporcionados.

// Mensaje del SISTEMA
Se te proporcionará un documento delimitado por comillas triples y una pregunta. Tu tarea es responder la pregunta utilizando únicamente el documento proporcionado y citar el/los pasaje(s) del documento utilizados para responder la pregunta. Si el documento no contiene la información necesaria para responder a esta pregunta, simplemente escribe: "Información insuficiente". Si se proporciona una respuesta a la pregunta, esta debe estar anotada con una cita. Utiliza el siguiente formato para citar pasajes relevantes ({"cita": …}).

// Mensaje del USUARIO

"""<inserta el documento aquí>"""

Pregunta: <insertar pregunta aquí>

Táctica: Utilizar la clasificación de intenciones para identificar las instrucciones más relevantes para una consulta de usuario

Para tareas en las que se necesitan muchos conjuntos independientes de instrucciones para manejar diferentes casos, puede ser beneficioso clasificar primero el tipo de consulta y usar esa clasificación para determinar qué instrucciones son necesarias. Esto se puede lograr definiendo categorías fijas y codificando instrucciones relevantes para manejar tareas en una categoría dada. Este proceso también se puede aplicar de forma recursiva para descomponer una tarea en una secuencia de etapas. La ventaja de este enfoque es que cada consulta contendrá solo las instrucciones que se requieren para realizar la próxima etapa de una tarea, lo que puede resultar en tasas de error más bajas en comparación con el uso de una sola consulta para realizar toda la tarea. Esto también puede resultar en costos más bajos, ya que las indicaciones más grandes cuestan más para ejecutarse.

Supongamos, por ejemplo, que para una aplicación de servicio al cliente, las consultas podrían clasificarse útilmente de la siguiente manera:

// Mensaje del SISTEMA
Se le proporcionarán consultas de servicio al cliente. Clasifique cada consulta en una categoría principal y una categoría secundaria. Proporcione su salida en formato json con las claves: primaria y secundaria.

Categorías principales: Facturación, Soporte Técnico, Gestión de Cuentas o Consulta General.

Categorías secundarias de facturación:
- Darse de baja o actualizar
- Agregar un método de pago
- Explicación de cargos
- Disputar un cargo

Categorías secundarias de soporte técnico:
- Resolución de problemas
- Compatibilidad de dispositivos
- Actualizaciones de software

Categorías secundarias de gestión de cuentas:
- Restablecimiento de contraseña
- Actualización de información personal
- Cerrar cuenta
- Seguridad de la cuenta

Categorías secundarias de consulta general:
- Información del producto
- Precios
- Comentarios
- Hablar con una persona

// Mensaje del USUARIO
Necesito que vuelva a funcionar mi internet.

De acuerdo con la clasificación de la consulta del cliente, se puede proporcionar un conjunto de instrucciones más específicas a un modelo para que maneje los próximos pasos. Por ejemplo, suponga que el cliente necesita ayuda con "resolución de problemas".

// Mensaje del SISTEMA
Se le proporcionarán consultas de servicio al cliente que requieren resolución de problemas en un contexto de soporte técnico. Ayude al usuario por:

- Pedirles que verifiquen que todos los cables del enrutador estén conectados. Tenga en cuenta que es común que los cables se aflojen con el tiempo.
- Si todos los cables están conectados y el problema persiste, pregúnteles qué modelo de enrutador están usando.
- Ahora les indicará cómo reiniciar su dispositivo:
-- Si el número de modelo es MTD-327J, aconséjeles que presionen el botón rojo y lo mantengan durante 5 segundos, luego esperen 5 minutos antes de probar la conexión.
-- Si el número de modelo es MTD-327S, aconséjeles que lo desconecten y vuelvan a enchufarlo, luego esperen 5 minutos antes de probar la conexión.
- Si el problema del cliente persiste después de reiniciar el dispositivo y esperar 5 minutos, conéctelos al soporte de TI emitiendo {"Solicitud de soporte de TI"}.
- Si el usuario comienza a hacer preguntas que no están relacionadas con este tema, confirme si desean finalizar el chat actual sobre resolución de problemas y clasifique su solicitud de acuerdo con el siguiente esquema: 

<insertar esquema de clasificación primaria/secundaria de arriba aquí>

// Mensaje del USUARIO
Necesito que vuelva a funcionar mi internet.

Observe que se instruye al modelo a emitir cadenas especiales para indicar cuándo cambia el estado de la conversación. Esto nos permite convertir nuestro sistema en una máquina de estados donde el estado determina qué instrucciones se inyectan. Al llevar un registro del estado, qué instrucciones son relevantes en ese estado y también opcionalmente qué transiciones de estado están permitidas desde ese estado, podemos poner barreras alrededor de la experiencia del usuario que serían difíciles de lograr con un enfoque menos estructurado.

Táctica: Para aplicaciones de diálogo que requieren conversaciones muy largas, resumir o filtrar conversaciones anteriores

Dado que los modelos tienen una longitud de contexto fija, el diálogo entre un usuario y un asistente en el que toda la conversación está incluida en la ventana de contexto no puede continuar indefinidamente.

Hay varias soluciones a este problema, una de las cuales es resumir turnos anteriores en la conversación. Una vez que el tamaño de la entrada alcanza una longitud predeterminada, esto podría desencadenar una consulta que resuma parte de la conversación y el resumen de la conversación anterior podría incluirse como parte del mensaje del sistema. Alternativamente, la conversación anterior podría resumirse de forma asíncrona en segundo plano durante toda la conversación.

Una solución alternativa es seleccionar dinámicamente partes anteriores de la conversación que son más relevantes para la consulta actual. Consulte la táctica "Utilizar la búsqueda basada en incrustaciones para implementar una recuperación eficiente de conocimientos".

Táctica: Resumir documentos largos por partes y construir un resumen completo de forma recursiva

Dado que los modelos tienen una longitud de contexto fija, no se pueden utilizar para resumir un texto más largo que la longitud del contexto menos la longitud del resumen generado en una sola consulta.

Para resumir un documento muy largo, como un libro, podemos usar una secuencia de consultas para resumir cada sección del documento. Los resúmenes de las secciones se pueden concatenar y resumir para producir resúmenes de resúmenes. Este proceso puede proceder de forma recursiva hasta resumir un documento entero. Si es necesario utilizar información sobre secciones anteriores para dar sentido a secciones posteriores, entonces un truco adicional que puede ser útil es incluir un resumen continuo del texto que precede cualquier punto dado en el libro al resumir el contenido en ese punto. La efectividad de este procedimiento para resumir libros ha sido estudiada en investigaciones previas realizadas por OpenAI utilizando variantes de GPT-3.

Estrategia: Darle tiempo a los modelos para "pensar"

Táctica: Instruir al modelo para que deduzca su propia solución antes de apresurarse a una conclusión

A veces obtenemos mejores resultados cuando instruimos explícitamente al modelo para razonar desde los primeros principios antes de llegar a una conclusión. Supongamos, por ejemplo, que queremos que un modelo evalúe la solución de un estudiante a un problema matemático. La forma más obvia de abordar esto es simplemente preguntar al modelo si la solución del estudiante es correcta o no.

// Mensaje del SISTEMA
Determina si la solución del estudiante es correcta o no.

// Mensaje del USUARIO
Enunciado del problema: Estoy construyendo una instalación de energía solar y necesito ayuda para calcular los aspectos financieros.
- El costo del terreno es de $100 por pie cuadrado
- Puedo comprar paneles solares por $250 por pie cuadrado
- Negocié un contrato de mantenimiento que me costará $100,000 al año, y un adicional de $10 por pie cuadrado
¿Cuál es el costo total para el primer año de operaciones en función del número de pies cuadrados?

Solución del estudiante: Sea x el tamaño de la instalación en pies cuadrados.
1. Costo del terreno: 100x
2. Costo de paneles solares: 250x
3. Costo de mantenimiento: 100,000 + 100x
Costo total: 100x + 250x + 100,000 + 100x = 450x + 100,000

// Mensaje del ASISTENTE
La solución del estudiante es correcta.

Pero la solución del estudiante en realidad no es correcta. Podemos lograr que el modelo se dé cuenta exitosamente de esto al pedirle al modelo que genere su propia solución primero.

// Mensaje del SISTEMA
Primero calcula tu propia solución al problema. Luego compara tu solución con la del estudiante y evalúa si la solución del estudiante es correcta o no. No decidas si la solución del estudiante es correcta hasta que hayas resuelto el problema tú mismo.

// Mensaje del USUARIO
Enunciado del problema: Estoy construyendo una instalación de energía solar y necesito ayuda para calcular los aspectos financieros.
- El costo del terreno es de $100 por pie cuadrado
- Puedo comprar paneles solares por $250 por pie cuadrado
- Negocié un contrato de mantenimiento que me costará $100,000 al año, y un adicional de $10 por pie cuadrado
¿Cuál es el costo total para el primer año de operaciones en función del número de pies cuadrados?

Solución del estudiante: Sea x el tamaño de la instalación en pies cuadrados.
1. Costo del terreno: 100x
2. Costo de paneles solares: 250x
3. Costo de mantenimiento: 100,000 + 100x
Costo total: 100x + 250x + 100,000 + 100x = 450x + 100,000

// Mensaje del ASISTENTE
Sea x el tamaño de la instalación en pies cuadrados.
1. Costo del terreno: 100x
2. Costo de paneles solares: 250x
3. Costo de mantenimiento: 100,000 + 10x
Costo total: 100x + 250x + 100,000 + 10x = 360x + 100,000

La solución del estudiante es incorrecta. Cometió un error en el cálculo del costo de mantenimiento, utilizando 100x en lugar de 10x. El costo total correcto para el primer año de operaciones es 360x + 100,000.

Táctica: Usar monólogo interno o una secuencia de consultas para ocultar el proceso de razonamiento del modelo

La táctica anterior demuestra que a veces es importante que el modelo razone detalladamente sobre un problema antes de responder a una pregunta específica. Para algunas aplicaciones, el proceso de razonamiento que un modelo utiliza para llegar a una respuesta final sería inapropiado para compartirlo con el usuario. Por ejemplo, en aplicaciones de tutoría, podemos querer animar a los estudiantes a encontrar sus propias respuestas, pero el proceso de razonamiento de un modelo sobre la solución del estudiante podría revelar la respuesta al estudiante.

El monólogo interno es una táctica que se puede utilizar para mitigar esto. La idea del monólogo interno es instruir al modelo para poner partes de la salida que deben estar ocultas al usuario en un formato estructurado que facilite su análisis. Luego, antes de presentar la salida al usuario, la salida se analiza y solo se hace visible una parte de la misma.

// Mensaje del SISTEMA
Sigue estos pasos para responder a las consultas del usuario.

Paso 1 - Primero resuelve tu propia solución al problema. No te bases en la solución del estudiante ya que puede ser incorrecta. Encierra todo tu trabajo para este paso entre comillas triples (""").

Paso 2 - Compara tu solución con la solución del estudiante y evalúa si la solución del estudiante es correcta o no. Encierra todo tu trabajo para este paso entre comillas triples (""").

Paso 3 - Si el estudiante cometió un error, determina qué pista podrías dar al estudiante sin revelar la respuesta. Encierra todo tu trabajo para este paso entre comillas triples (""").

Paso 4 - Si el estudiante cometió un error, proporciona la pista del paso anterior al estudiante (fuera de comillas triples). En lugar de escribir "Paso 4 - ..." escribe "Pista:".

// Mensaje del USUARIO
Enunciado del problema: <inserta enunciado del problema>

Solución del estudiante: <inserta solución del estudiante>

Alternativamente, esto se puede lograr con una secuencia de consultas en las que todas, excepto la última, tengan su salida oculta para el usuario final.

Primero, podemos pedirle al modelo que resuelva el problema por su cuenta. Dado que esta consulta inicial no requiere la solución del estudiante, esta se puede omitir. Esto proporciona la ventaja adicional de que no hay posibilidad de que la solución del modelo esté sesgada por la solución intentada del estudiante.

// Mensaje del USUARIO
<inserta enunciado del problema>

Después, podemos pedirle al modelo que utilice toda la información disponible para evaluar la corrección de la solución del estudiante.

// Mensaje del SISTEMA
Compara tu solución con la solución del estudiante y evalúa si la solución del estudiante es correcta o no.

// Mensaje del USUARIO
Enunciado del problema: """<inserta enunciado del problema>"""

Tu solución: """<inserta solución generada por el modelo>"""

Solución del estudiante: """<inserta solución del estudiante>"""

Finalmente, podemos permitir que el modelo use su propio análisis para construir una respuesta en la persona de un tutor servicial.

// Mensaje del SISTEMA

Eres un tutor de matemáticas. Si el estudiante cometió un error, ofrece una pista al estudiante de una manera que no revele la respuesta. Si el estudiante no cometió un error, simplemente ofrécele un comentario de aliento.

// Mensaje del USUARIO

Enunciado del problema: """<inserta enunciado del problema>"""

Tu solución: """<inserta solución generada por el modelo>"""

Solución del estudiante: """<inserta solución del estudiante>"""

Análisis: """<inserta análisis generado por el modelo del paso anterior>"""

Táctica: Preguntarle al modelo si omitió algo en pasadas anteriores

Supongamos que estamos utilizando un modelo para listar extractos de una fuente que son relevantes para una pregunta en particular. Después de enlistar cada extracto, el modelo necesita determinar si debe comenzar a redactar otro o si debe detenerse. Si el documento fuente es grande, es común que un modelo se detenga demasiado pronto y no liste todos los extractos relevantes. En ese caso, a menudo se puede obtener un mejor rendimiento al pedirle al modelo consultas de seguimiento para encontrar cualquier extracto que haya omitido en pasadas anteriores.

// Mensaje del SISTEMA
Se le proporcionará un documento delimitado por comillas triples. Su tarea es seleccionar extractos que se relacionen con la siguiente pregunta: "¿Qué cambios de paradigma significativos han ocurrido en la historia de la inteligencia artificial?"

Asegúrate de que los extractos contengan todo el contexto relevante necesario para interpretarlos, en otras palabras, no extraigas pequeños fragmentos que carecen de contexto importante. Proporciona la salida en formato JSON de la siguiente manera:

[{"extracto": "..."},
...
{"extracto": "..."}]

// Mensaje del USUARIO
"""<inserta documento aquí>"""

// Mensaje del ASISTENTE
[{"extracto": "el modelo escribe un extracto aquí"},
...
{"extracto": "el modelo escribe otro extracto aquí"}]

// Mensaje del USUARIO
¿Hay más extractos relevantes? Asegúrate de no repetir extractos. También asegúrate de que los extractos contengan todo el contexto relevante necesario para interpretarlos, en otras palabras, no extraigas pequeños fragmentos que carecen de contexto importante.

Estrategia: Utilizar herramientas externas

Táctica: Utilizar búsqueda basada en vectores de palabras para implementar una recuperación eficiente de conocimientos

Un modelo puede aprovechar fuentes externas de información si se proporcionan como parte de su entrada. Esto puede ayudar al modelo a generar respuestas más informadas y actualizadas. Por ejemplo, si un usuario pregunta sobre una película específica, puede ser útil agregar información de alta calidad sobre la película (por ejemplo, actores, director, etc.) a la entrada del modelo. Los vectores de palabras se pueden utilizar para implementar una recuperación eficiente de conocimientos, de modo que la información relevante se pueda agregar dinámicamente a la entrada del modelo en tiempo de ejecución.

Un vector de palabras es un vector que puede medir la relación entre cadenas de texto. Las cadenas similares o relevantes estarán más cerca entre sí que las cadenas no relacionadas. Este hecho, junto con la existencia de algoritmos de búsqueda de vectores rápidos, significa que los vectores de palabras se pueden utilizar para implementar una recuperación eficiente de conocimientos. En particular, un corpus de texto se puede dividir en fragmentos, y cada fragmento se puede convertir en un vector y almacenarse. Luego, se puede convertir una consulta dada en un vector y se puede realizar una búsqueda de vectores para encontrar los fragmentos de texto del corpus que están más relacionados con la consulta (es decir, más cercanos en el espacio de vectores).

Táctica: Utilizar la ejecución de código para realizar cálculos más precisos o llamar a APIs externas

Los modelos de lenguaje no pueden confiarse para realizar cálculos aritméticos o largos de forma precisa por sí solos. En casos en los que esto sea necesario, se puede instruir a un modelo a escribir y ejecutar código en lugar de realizar sus propios cálculos. En particular, se puede instruir a un modelo para colocar el código que se debe ejecutar en un formato designado, como tres acentos invertidos. Después de que se produzca un resultado, el código se puede extraer y ejecutar. Finalmente, si es necesario, la salida del motor de ejecución de código (es decir, el intérprete de Python) se puede proporcionar como una entrada al modelo para la próxima consulta.

// MENSAJE DEL SISTEMA

Puedes escribir y ejecutar código Python encerrándolo entre tres acentos invertidos, por ejemplo: ```código aquí```. Utilízalo para realizar cálculos.

// MENSAJE DEL USUARIO

Encuentra todas las raíces reales del siguiente polinomio: 3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10.

Otro buen caso de uso para la ejecución de código es llamar a APIs externas. Si se instruye a un modelo sobre el uso adecuado de una API, puede escribir código que la utilice. Se puede instruir a un modelo sobre cómo utilizar una API proporcionándole documentación y/o ejemplos de código que muestren cómo utilizarla.

// MENSAJE DEL SISTEMA

Puedes escribir y ejecutar código Python encerrándolo entre tres acentos invertidos. También, ten en cuenta que tienes acceso al siguiente módulo para ayudar a los usuarios a enviar mensajes a sus amigos:

\`\`\`python
import message
message.write(to="John", message="¡Oye, ¿quieres encontrarte después del trabajo?")\`\`\`

ADVERTENCIA: Ejecutar el código producido por un modelo no es inherentemente seguro y se deben tomar precauciones en cualquier aplicación que busque hacerlo. En particular, se necesita un entorno de ejecución de código en sandbox para limitar el daño que el código no confiable podría causar.

Táctica: Dar al modelo acceso a funciones específicas

La API de Completado de Chat permite pasar una lista de descripciones de funciones en las solicitudes. Esto permite a los modelos generar argumentos de función de acuerdo con los esquemas proporcionados. Los argumentos de función generados son devueltos por la API en formato JSON y se pueden usar para ejecutar llamadas de función. La salida proporcionada por las llamadas de función luego se puede enviar de vuelta a un modelo en la siguiente solicitud para cerrar el ciclo. Esta es la forma recomendada de utilizar los modelos de OpenAI para llamar a funciones externas.

Estrategia: Probar cambios sistemáticamente

A veces puede resultar difícil saber si un cambio, como una nueva instrucción o un nuevo diseño, hace que tu sistema sea mejor o peor. Mirar algunos ejemplos puede dar pistas sobre cuál es mejor, pero con tamaños de muestra pequeños puede resultar difícil distinguir entre una verdadera mejora o pura suerte aleatoria. Tal vez el cambio mejore el rendimiento en algunas entradas, pero perjudique el rendimiento en otras.

Los procedimientos de evaluación (o "evals") son útiles para optimizar los diseños de sistemas. Buenas evals son:

  • Representativas del uso del mundo real (o al menos diversificadas)
  • Contienen muchos casos de prueba para una mayor potencia estadística (ver tabla a continuación para orientación)
  • Fáciles de automatizar o repetir
Diferencia a detectar Tamaño de muestra necesario para un 95% de confianza
30% ~10
10% ~100
3% ~1,000
1% ~10,000

La evaluación de salidas puede ser realizada por computadoras, humanos o una combinación de ambos. Las computadoras pueden automatizar evals con criterios objetivos (por ejemplo, preguntas con respuestas correctas únicas) así como algunos criterios subjetivos o difusos, en los que las salidas del modelo son evaluadas por otras consultas al modelo. OpenAI Evals es un marco de software de código abierto que proporciona herramientas para crear evals automatizadas.

Las evals basadas en modelos pueden ser útiles cuando existe un rango de posibles salidas que serían consideradas de igual calidad (por ejemplo, para preguntas con respuestas largas). El límite entre lo que puede ser evaluado de manera realista con una eval basada en modelos y lo que requiere que un humano lo evalúe es difuso y está constantemente cambiando a medida que los modelos se vuelven más capaces. Animamos a experimentar para descubrir qué tan bien pueden funcionar las evals basadas en modelos para tu caso de uso.

Táctica: Evaluar salidas del modelo con referencia a respuestas estándar

Supongamos que se sabe que la respuesta correcta a una pregunta debe hacer referencia a un conjunto específico de hechos conocidos. Entonces, podemos usar una consulta al modelo para contar cuántos de los hechos requeridos están incluidos en la respuesta.

Por ejemplo, utilizando el siguiente mensaje del sistema:

// Mensaje del SISTEMA
Se le proporcionará un texto delimitado por comillas triples que se supone que es la respuesta a una pregunta. Verifique si la siguiente información está directamente contenida en la respuesta:

- Neil Armstrong fue la primera persona en caminar sobre la luna.
- La fecha en que Neil Armstrong caminó por primera vez en la luna fue el 21 de julio de 1969.

Para cada uno de estos puntos, realice los siguientes pasos:

1 - Reformule el punto.
2 - Proporcione una cita de la respuesta que esté más cerca de este punto.
3 - Considere si alguien que lea la cita y no conozca el tema podría inferir directamente el punto. Explique por qué o por qué no antes de tomar una decisión.
4 - Escriba "sí" si la respuesta al paso 3 fue sí, de lo contrario escriba "no".

Finalmente, proporcione un recuento de cuántas respuestas "sí" hay. Proporcione este recuento como {"conteo": <inserte el conteo aquí>}.

Aquí hay un ejemplo de entrada donde se satisfacen ambos puntos:

// Mensaje del SISTEMA
<inserte el mensaje del sistema arriba>

// Mensaje del USUARIO
"""Neil Armstrong es famoso por ser la primera persona en poner un pie en la Luna. Este evento histórico tuvo lugar el 21 de julio de 1969, durante la misión Apolo 11."""

Aquí hay un ejemplo de entrada donde solo se satisface un punto:

// Mensaje del SISTEMA

<Inserte el mensaje del sistema arriba>

// Mensaje del USUARIO

"""Neil Armstrong hizo historia cuando descendió del módulo lunar, convirtiéndose en la primera persona que caminó en la luna."""

Aquí hay un ejemplo de entrada donde ninguno se satisface:

// Mensaje del SISTEMA

<Inserte el mensaje del sistema arriba>

// Mensaje del USUARIO

"""En el verano del '69, un viaje grandioso,
Apolo 11, audaz como la mano de la leyenda.
Armstrong dio un paso, la historia se desplegó,
"Un pequeño paso", dijo, para un nuevo mundo."""

// Mensaje del SISTEMA
<insertar mensaje del sistema arriba>

// Mensaje del USUARIO

Pregunta: """¿Por cuál evento es más famoso Neil Armstrong y en qué fecha ocurrió? Asumir hora UTC."""

Respuesta enviada: """Aproximadamente a las 02:56 UTC del 21 de julio de 1969, Neil Armstrong se convirtió en el primer ser humano en pisar la superficie lunar, marcando un logro monumental en la historia humana."""

Respuesta del Experto: """Neil Armstrong es más famoso por ser la primera persona en caminar en la luna. Este evento histórico ocurrió el 21 de julio de 1969."""