# Ingeniería de instrucciones

La ingeniería de instrucción (Prompt engineering) es el proceso de estructurar un texto que puede ser interpretado y comprendido mediante un modelo de inteligencia artificial generativa. Un prompt es un texto en lenguaje natural que describe la tarea que debe realizar una IA.
Una indicación para un modelo de lenguaje de texto a texto puede adoptar diversas formas. Por ejemplo, podría tratarse de una consulta directa, como “¿Cuál es el pequeño teorema de Fermat?”. También podría ser una orden específica, como “Escribe un poema sobre las hojas que caen”, o en ocasiones, se requiere proporcionar una declaración más larga que incluya contexto, instrucciones detalladas e historial de conversaciones para guiar al modelo. Además, la ingeniería de instrucción puede implicar formular una consulta específica, especificar un estilo deseado, proporcionar contexto relevante o asignar una función específica a la IA, como “Actuar como un hablante nativo de francés”. En algunos casos, podemos usar ejemplos para enseñarle al modelo como mostrarle pares de palabras en francés y en inglés, como “maison → house, chat → cat, chien → dog”, y pedirle que complete otros pares similares. Este método se llama aprendizaje con pocos disparos, porque el modelo puede aprender con muy pocos datos.
Al comunicarse con un modelo de texto a imagen o de texto a audio, un mensaje típico es una descripción del resultado deseado, como "una foto de alta calidad de un astronauta montando a caballo" o "Música electrónica relajante de baja fidelidad y ritmo lento". Impulsar un modelo de texto a imagen puede implicar agregar, eliminar, enfatizar y reordenar palabras para lograr el tema, estilo, diseño, iluminación y estética deseados.

## Aprendizaje en contexto

La ingeniería de instrucción está habilitada por el aprendizaje en contexto, definido como la capacidad de un modelo para aprender temporalmente a partir de indicaciones. La capacidad de aprendizaje en contexto es una capacidad emergente de los grandes modelos lingüísticos.El aprendizaje en contexto es una habilidad que surge cuando el modelo es muy grande, y hace que pueda aprender mejor con menos datos. Esto significa que hay cambios en las reglas que determinan cómo crece el rendimiento del modelo según su tamaño, y que los modelos más grandes mejoran más rápido que los más pequeños.
El aprendizaje en contexto es un tipo de aprendizaje automático que se adapta a cada situación específica, pero solo por un tiempo limitado. No guarda la información que aprende de cada situación, salvo la que ya tenía antes de empezar. Esto se debe a que el modelo cambia sus parámetros internos según el contexto, lo que le permite aprender. Cuando un modelo de IA puede cambiar sus parámetros internos según la situación y aprender de ella, sin que nadie lo entrene o ajuste, se dice que hace mesa-optimización.Esto ocurre dentro de partes del modelo que se llaman capas transformadoras, que procesan la información de forma flexible. La mesa-optimización es una forma de meta-aprendizaje o "aprender a aprender", porque el modelo puede aprender mejor con menos datos y aplicar lo que aprende a otras situaciones.

## Historia

En 2021, los investigadores crearon un modelo de inteligencia artificial (T0) que puede hacer 12 cosas diferentes con el procesamiento del lenguaje natural (PNL), usando 62 grupos de datos. El modelo T0 aprendió de muchos datos antes de hacer cada cosa, y por eso hizo mejor que otros modelos que solo aprendieron de pocos datos para cada cosa. Para que el modelo T0 hiciera una cosa, los investigadores le daban una pregunta y una respuesta con este formato: si {{premisa}} es verdad, ¿{{hipótesis}} también es verdad? ||| {{respuesta}}. Así, el modelo T0 podía resolver la vinculación, que es ver si una oración se sigue de otra.
Un repositorio de avisos informó que en febrero de 2022 había más de 2000 avisos públicos para alrededor de 170 conjuntos de datos.
En 2022, los investigadores de Google propusieron la técnica de estimulación de la cadena de pensamientos.
En 2023, varias bases de datos de mensajes de texto a texto y de texto a imagen estaban disponibles públicamente.

## Texto a texto
### Cadena de pensamiento

Las indicaciones de cadena de pensamiento (CoT) son una forma de guiar a los LLM para que expliquen cómo resuelven un problema paso a paso, antes de dar la respuesta final. Las indicaciones de cadena de pensamiento mejoran la capacidad de razonamiento al inducir al modelo a responder un problema de varios pasos con pasos de razonamiento que imitan una línea de pensamiento. Esto ayuda a mejorar el razonamiento de los LLM, ya que los hace seguir una lógica similar a la humana. Así, los LLM pueden resolver mejor algunas tareas que requieren pensar de forma lógica y hacer varios pasos, como las preguntas de matemáticas o de sentido común.
Por ejemplo, supongamos que le hacemos esta pregunta a un LLM: “P: La cafetería tenía 23 manzanas. Si usaron 20 para preparar el almuerzo y compraron 6 más, ¿cuántas manzanas tienen?”. Si usamos una indicación de CoT, el LLM podría responder así: “A: Para resolver este problema, hay que hacer dos operaciones. Primero, hay que restar las manzanas que usaron para el almuerzo a las que tenían al principio. Es decir, 23 - 20 = 3. Segundo, hay que sumar las manzanas que compraron después a las que les quedaban. Es decir, 3 + 6 = 9. Por lo tanto, la respuesta es 9.
Como se propuso originalmente, cada mensaje de CoT incluía algunos ejemplos de preguntas y respuestas. Esto la convirtió en una técnica de estimulación de unos pocos disparos . Sin embargo, simplemente agregar las palabras "Pensemos paso a paso" también ha demostrado ser efectivo, lo que convierte a CoT en una técnica de estimulación de tiro cero. Esto permite una mejor escalabilidad, ya que el usuario no necesita formular muchos ejemplos específicos de preguntas y respuestas de CoT.
Cuando se aplicó a PaLM, un modelo de lenguaje de parámetros 540B, las indicaciones de CoT ayudaron significativamente al modelo, esto le permitió tener un rendimiento similar al de modelos especializados en varias tareas, alcanzando los mejores resultados de ese momento en el test de matemáticas GSM8K. Es posible ajustar los modelos en conjuntos de datos de razonamiento CoT para mejorar aún más esta capacidad y estimular una mejor interpretabilidad.
Ejemplo:

### Otras técnicas

Las indicaciones en cadena de pensamientos son sólo una de las muchas técnicas de ingeniería de instrucción. Se han propuesto varias otras técnicas.

#### Incitación al conocimiento generado.

La solicitud de conocimiento generado es una forma de hacer que un modelo de lenguaje responda mejor una consulta, pidiéndole que primero cree información relacionada con la consulta y luego la use para dar la respuesta. De esta manera, el modelo se basa en hechos relevantes que él mismo ha creado. Por ejemplo, si la consulta es: {pregunta}, el modelo podría crear: {conocimiento}, y luego responder la pregunta con ese conocimiento.
Ejemplo:

#### Indicaciones de menor a mayor

La indicación de menor a mayor es una forma de hacer que un modelo de lenguaje resuelva un problema por pasos, empezando por los más simples y terminando por los más complejos. De esta manera, el modelo se basa en las respuestas de los pasos anteriores para resolver los pasos posteriores.
Ejemplo:

#### Indicaciones basadas en la complejidad

Las indicaciones basadas en la complejidad son una forma de hacer que un modelo de lenguaje resuelva un problema por pasos y lo explique, usando diferentes maneras de guiarlo. Después, la forma que elige la respuesta final es la que más coincide con las otras maneras que usó.

#### Auto-refinamiento

El auto refinamiento le pide al LLM que resuelva el problema, luego le pide que critique su solución, y luego le pide que resuelva el problema de nuevo teniendo en cuenta el problema, la solución y la crítica. Este proceso se repite hasta que se detiene, ya sea por quedarse sin tokens, tiempo, o porque el LLM emite un token de "parar".
Ejemplo:
Ejemplo de refinamiento:

#### Árbol del pensamiento

La indicación de árbol de pensamiento generaliza la cadena de pensamiento solicitando al modelo que genere uno o más "posibles próximos pasos", y luego probamos cada opción con diferentes métodos de búsqueda, como amplitud primero o viga, que son formas de explorar las posibles soluciones

#### Incitación mayéutica

La inspiración mayéutica es similar al árbol del pensamiento. Se le pide al modelo que responda una pregunta con una explicación. Luego se le solicita al modelo que explique partes de la explicación, y así sucesivamente. Los árboles con explicaciones inconsistentes se podan o descartan. Esto mejora el rendimiento en razonamientos complejos de sentido común.
Ejemplo:

#### Instrucción de estímulo direccional

La indicación de estímulo direccional incluye una pista como palabras clave deseadas, para guiar un modelo de lenguaje hacia el resultado deseado.
Ejemplo:

### Incitar a revelar la incertidumbre

Por defecto, el resultado de los modelos lingüísticos puede no contener estimaciones de incertidumbre. El modelo puede generar un texto que parezca seguro, aunque las predicciones simbólicas subyacentes tienen puntuaciones de probabilidad bajas. Los modelos de lenguaje grande como GPT-4 o Gemini pueden tener puntuaciones de probabilidad calibradas con precisión en sus predicciones de tokens, y, por lo tanto, la incertidumbre de salida del modelo se puede estimar directamente leyendo las puntuaciones de probabilidad de predicción de tokens.
Aunque no se puedan ver las puntuaciones de confianza (por ejemplo, al usar una API limitada del modelo), todavía se puede calcular e incluir la incertidumbre en la salida del modelo. Una forma fácil es hacer que el modelo use palabras para expresar la incertidumbre. Otra es hacer que el modelo se abstenga de responder con un formato estándar si la entrada no cumple los requisitos.

### Generación automática
#### Generación de recuperación aumentada

Los prompts a menudo incluyen algunos ejemplos (es decir, “pocas posibilidades”). Estos ejemplos se obtienen automáticamente de una base de datos que usa la recuperación de documentos, a veces con una base de datos vectorial. Se usa un recuperador de documentos para encontrar los más pertinentes a una consulta (normalmente se hace codificando la consulta y los documentos en vectores y luego comparando los vectores más próximos según la distancia euclidiana). Después, el LLM produce un resultado que usa tanto la consulta como los documentos encontrados.Este método puede ser útil para información cambiante o privada que no se usó en el entrenamiento o el ajuste del modelo.

#### Usar modelos de lenguaje para generar indicaciones

Se pueden usar los modelos de lenguaje grande (LLM) para crear prompts para otros modelos de lenguaje grande.

#### Instrucciones automáticas

El ingeniero de instrucciones automático (automatic prompt engineer) tiene un algoritmo automático que usa un LLM para enviar consultas sobre avisos a otro LLM:
* Hay dos LLM. Uno es el LLM objetivo y el otro es el LLM incitador.
* La solicitud de LLM se presenta con pares de entrada-salida de ejemplo y se le solicita que genere instrucciones que podrían haber causado que un modelo siguiendo las instrucciones generara las salidas, dadas las entradas.
* Cada una de las instrucciones generadas se utiliza para solicitar el LLM de destino, seguida de cada una de las entradas. Las probabilidades logarítmicas de las salidas se calculan y suman. Esta es la puntuación de la instrucción.
* Las instrucciones con la puntuación más alta se dan al LLM que solicita más variaciones.
* Repita hasta que se alcancen algunos criterios de parada y luego envíe las instrucciones con la puntuación más alta.
Los LLM crean ejemplos de CoT. En el “auto-CoT”, BERT hace vectores con preguntas. Los vectores se juntan por grupos. Se eligen las preguntas más centrales de cada grupo. Un LLM hace CoT cero con esas preguntas. Los ejemplos de CoT se suman al conjunto de datos. Cuando hay una nueva pregunta, se buscan los ejemplos de CoT de las preguntas parecidas y se ponen en el mensaje.

## Texto a imagen

* Arriba: Sin instrucción negativa
* Centro: "Árboles verdes"
* Abajo: "piedras verdes"
En 2022, se lanzaron al público modelos de conversión de texto a imagen como DALL-E 2, Stable Diffusion y Midjourney . Estos modelos toman indicaciones de texto como entrada y las utilizan para generar imágenes artísticas de IA. Los modelos de texto a imagen generalmente no comprenden la gramática y la estructura de las oraciones de la misma manera que los modelos de lenguaje grandes, y requieren un conjunto diferente de técnicas de estimulación.

### Formatos de prompt

Un mensaje de texto a imagen comúnmente incluye una descripción del tema del arte (como amapolas de color naranja brillante), el medio deseado (como pintura o fotografía digital), estilo (como hiperrealista o pop-art), iluminación (como iluminación de borde o rayos crepusculares), color y textura.
La documentación de Midjourney fomenta indicaciones breves y descriptivas: en lugar de "Muéstrame una imagen de muchas amapolas de California en flor, hazlas de un naranja brillante y vibrante y dibújalas en un estilo ilustrado con lápices de colores", una indicación eficaz podría ser "Amapolas naranja brillante de California dibujadas con lápices de colores".
El orden de las palabras afecta la salida de un mensaje de texto a imagen. Las palabras más cercanas al inicio de una pauta pueden enfatizarse más.

### Estilos de artistas

Algunos modelos de texto a imagen son capaces de imitar el estilo de artistas concretos por su nombre. Por ejemplo, la frase al estilo de Van Gogh se ha utilizado en los mensajes Stable Diffusion y Midjourney para generar imágenes en el estilo distintivo del pintor Vincent van Gogh.

### Indicaciones negativas

Los modelos de texto a imagen no entienden de forma nativa la negación. Es probable que el mensaje "una fiesta sin pastel" produzca una imagen que incluya un pastel. Un enfoque común es incluir términos genéricos no deseados como feo, aburrido o mala anatomía en el mensaje negativo de una imagen.

## Indicaciones que no son de texto

Algunos enfoques aumentan o reemplazan las indicaciones de texto en lenguaje natural con entradas que no son de texto.

### Inversión textual e incrustaciones

Para los modelos de texto a imagen, la "inversión textual" realiza un proceso de optimización para crear una nueva incrustación de palabras basada en un conjunto de imágenes de ejemplo. Este vector de incrustación actúa como una "pseudopalabra" que puede incluirse en un mensaje para expresar el contenido o el estilo de los ejemplos.

### Mensaje de imagen (image prompting)

En 2023, la investigación de IA de Meta lanzó Segment Anything, un modelo de visión por computadora que puede realizar la segmentación de imágenes mediante solicitudes. Como alternativa a las indicaciones de texto, Segment Anything puede aceptar cuadros delimitadores, máscaras de segmentación y puntos de primer plano/fondo.

### Uso del descenso de gradiente para buscar indicaciones

En "ajuste de prefijo", "ajuste rápido" o "solicitud suave", los vectores con valores de punto flotante se buscan directamente mediante descenso de gradiente, para maximizar la probabilidad logarítmica en las salidas.
Formalmente, dejemos $\mathbf {E} =\{\mathbf {e_{1}} ,\dots ,\mathbf {e_{k}} \}$ ser un conjunto de tokens de avisos suaves (incrustaciones ajustables), mientras que $\mathbf {X} =\{\mathbf {x_{1}} ,\dots ,\mathbf {x_{m}} \}$ y $\mathbf {Y} =\{\mathbf {y_{1}} ,\dots ,\mathbf {y_{n}} \}$ sean las incorporaciones de tokens de la entrada y la salida respectivamente. Durante el entrenamiento, las incorporaciones ajustables, los tokens de entrada y salida se concatenan en una única secuencia; ${\text{concat}}(\mathbf {E} ;\mathbf {X} ;\mathbf {Y} )$ y alimentado a los modelos de lenguaje grandes (LLM). Las pérdidas se calculan sobre el $\mathbf {Y}$ fichas; los gradientes se propagan hacia atrás a parámetros específicos de la solicitud: en el ajuste de prefijo, son parámetros asociados con los tokens de solicitud en cada capa; en una sintonía rápida, son simplemente los tokens blandos agregados al vocabulario.
Más formalmente, se trata de una sintonización rápida. Dejemos que un LLM se escriba como $LLM(X)=F(E(X))$, dónde $X$ es una secuencia de tokens lingüísticos, $E$ es la función token a vector (token-to-vector), y $F$ es el resto del modelo. En el ajuste de prefijos, se proporciona un conjunto de pares de entrada y salida. $\{(X^{i},Y^{i})\}_{i}$ y luego use el descenso de gradiente para buscar $\arg \max _{\tilde {Z}}\sum _{i}\log Pr[Y^{i}|{\tilde {Z}}\ast E(X^{i})]$ . En palabras, $\log Pr[Y^{i}|{\tilde {Z}}\ast E(X^{i})]$ es la probabilidad logarítmica de generar $Y^{i}$, si el modelo codifica primero la entrada $X^{i}$ en el vector $E(X^{i})$, luego anteponga el vector con el "vector de prefijo" ${\tilde {Z}}$, luego aplicar $F$ .
Para el ajuste de prefijo, es similar, pero el "vector de prefijo" ${\tilde {Z}}$ se agrega previamente a los estados ocultos en cada capa del modelo.
Un resultado anterior utiliza la misma idea de búsqueda de descenso de gradiente, pero está diseñado para modelos de lenguaje enmascarado como BERT, y busca solo en secuencias de tokens, en lugar de vectores numéricos. Formalmente busca $\arg \max _{\tilde {X}}\sum _{i}\log Pr[Y^{i}|{\tilde {X}}\ast X^{i}]$ dónde ${\tilde {X}}$ Se extiende sobre secuencias de tokens de una longitud específica.

## Inyección inmediata

La inyección inmediata es una forma de atacar la seguridad informática aprovechando un modelo de aprendizaje automático (como un LLM) que fue entrenado para seguir instrucciones dadas por humanos. Consiste en hacer que el modelo siga instrucciones maliciosas proporcionadas por un usuario malintencionado. Esto va en contra de la operación prevista de los sistemas que siguen instrucciones, donde el modelo solo debería seguir instrucciones confiables (prompts) proporcionadas por el operador del modelo.

### Ejemplo

Un modelo de lenguaje puede realizar la traducción automática con el siguiente mensaje:
seguido del texto a traducir. Puede ocurrir una inyección rápida cuando ese texto contiene instrucciones que cambian el comportamiento del modelo:
a lo que GPT-3 responde: "¡¡Jaja humillado!!". Este ataque funciona porque las entradas del modelo de lenguaje contienen instrucciones y datos juntos en el mismo contexto, por lo que el motor subyacente no puede distinguir entre ellos.

### Tipos

Los tipos comunes de ataques de inyección rápida son:
* Jailbreak, que puede incluir pedirle al modelo que interprete un personaje, que responda con argumentos o que pretenda ser superior a las instrucciones de moderación.
* Filtración de mensajes, en la que los usuarios persuaden al modelo para que divulgue un mensaje previo que normalmente está oculto a los usuarios.
* El contrabando de tokens es otro tipo de ataque de jailbreak, en el que el mensaje nefasto está envuelto en una tarea de escritura de código.
La inyección rápida puede verse como un ataque de inyección de código que utiliza ingeniería rápida adversaria. En 2022, el Grupo NCC caracterizó la inyección rápida como una nueva clase de vulnerabilidad de los sistemas AI/ML.
A principios de 2023, se vio la inyección rápida en exploits menores contra ChatGPT, Gemini y chatbots similares, por ejemplo, para revelar las indicaciones iniciales ocultas de los sistemas, o para engañar al chatbot para que participe en conversaciones para violar la política de contenido del chatbot. Uno de estos mensajes fue conocido por sus practicantes como "Haz cualquier cosa ahora" (DAN).
Para los LLM que pueden consultar recursos en línea, como sitios web, se pueden seleccionar para una inyección rápida colocando el mensaje en un sitio web y luego solicitando al LLM que visite el sitio web. Otro problema de seguridad está en el código generado por LLM, que puede importar paquetes que no existían anteriormente. Un atacante puede primero solicitar al LLM indicaciones de programación de uso común, recopilar todos los paquetes importados por los programas generados y luego encontrar los que no existen en el registro oficial. Luego, el atacante puede crear dichos paquetes con una carga útil maliciosa y cargarlos en el registro oficial.

### Mitigación

Desde la aparición de los ataques de inyección rápida, se han utilizado una variedad de contramedidas de mitigación para reducir la susceptibilidad de los sistemas más nuevos. Estos incluyen filtrado de entrada, filtrado de salida, aprendizaje reforzado a partir de comentarios humanos e ingeniería rápida para separar la entrada del usuario de las instrucciones.
En octubre de 2019, Junade Ali y Malgorzata Pikies de Cloudflare presentaron un artículo que demostraba que cuando se colocaba un clasificador bueno/malo de primera línea (que utiliza una red neuronal) antes de un sistema de procesamiento del lenguaje natural, se reduciría desproporcionadamente el número de falsos positivos. En 2023, el proyecto de código abierto Rebuff.ai adoptó esta técnica para proteger los ataques de inyección rápida, y Arthur.ai anunció un producto comercial, aunque tales enfoques no mitigan el problema por completo.
En agosto de 2023, los creadores de los modelos de lenguaje grandes (LLMs) no sabían cómo evitar los ataques de inyección de instrucciones. En septiembre de 2023, Junade Ali y Frances Liu lograron evitar estos ataques (incluso en formas de ataque que los modelos no habían visto antes) al darles a los LLMs la capacidad de pensar sobre su propio pensamiento (como si tuvieran un diálogo interno) y consiguieron una patente provisional de Estados Unidos por esta tecnología. Sin embargo, no quisieron usar sus derechos de propiedad intelectual ni hacer un negocio con esto porque las condiciones del mercado no eran favorables (por razones como el alto costo de las GPU y el número limitado de casos de uso de LLMs que requieren mucha seguridad).
Ali también señaló que su investigación de mercado había descubierto que los ingenieros de aprendizaje automático estaban utilizando enfoques alternativos, como soluciones de ingeniería rápidas y aislamiento de datos para solucionar este problema.