curso
Compresión de prompts: guía con ejemplos en Python
En el panorama en rápida evolución de la inteligencia artificial, la optimización de los grandes modelos lingüísticos (LLM) no solo consiste en ampliar los límites de lo posible, sino también en garantizar la eficacia y la rentabilidad.
La compresión de prompts ha surgido como una técnica vital para mejorar el rendimiento de estos modelos, minimizando al mismo tiempo los gastos computacionales. Con la aparición de nuevas investigaciones casi semanalmente, mantenerse al día es todo un reto, pero comprender los fundamentos es esencial.
Este artículo cubre los fundamentos de la compresión de prompts, analiza cuándo debe utilizarse, su importancia en la reducción de costes en las canalizaciones RAG, y proporciona ejemplos utilizando el modelo gpt-3.5-turbo-0125 a través de la API de OpenAI.
Si quieres saber más, consulta este curso sobre ingeniería de prompts.
¿Qué es la compresión de prompts?
La compresión de prompts es una técnica utilizada en el procesamiento del lenguaje natural (PLN) para optimizar las entradas dadas a los LLM reduciendo su longitud sin alterar significativamente la calidad y relevancia de la salida. Esta optimización es crucial debido al impacto que tiene el número de tokens en las consultas sobre el rendimiento del LLM.
Los tokens son las unidades básicas de texto que utilizan los LLM, y representan palabras o subpalabras según el tokenizador del modelo lingüístico. Reducir el número de tokens en un prompt es beneficioso y a veces necesario por varias razones:
- Restricciones del límite de tokens: Los LLM tienen un límite máximo de tokens para las entradas. Superar este límite puede truncar información importante, reduciendo la claridad del resultado y la eficacia del modelo.
- Eficacia de procesamiento y reducción de costes: Menos tokens significan tiempos de procesamiento más rápidos y costes más bajos.
- Mayor relevancia de la respuesta: Una prompt legible por los humanos no siempre significa un buen prompt. A veces, los prompts que nos parecen buenos e informativos contienen información sin importancia para los LLM, como stop words ("a", "el", "es", etc.).
La compresión de prompts reduce el número de tokens empleando estrategias como eliminar la información redundante, resumir los puntos clave o utilizar algoritmos especializados para destilar la esencia de un prompt minimizando su número de tokens.
¿Cuándo debemos utilizar la compresión de prompts?
Exploremos los escenarios en los que podríamos utilizar la compresión de prompts.
Técnicas avanzadas de ingeniería de prompts
Las técnicas como el prompting Chain of Thought (CoT) o cadena de pensamiento, aunque son muy eficaces, a menudo dan lugar a estímulos largos que pueden alcanzar miles de tokens. Esto aumenta los tiempos y costes de procesamiento y puede superar los límites de tokens de algunos modelos.
La compresión de los prompts mitiga estos problemas reduciendo el número de tokens y manteniendo la eficacia de la instrucción.
Canalizaciones de generación mejorada por recuperación (RAG)
Las canalizaciones RAG combinan la recuperación de información con la generación de texto y suelen utilizarse en chatbots especializados y otras aplicaciones en las que la comprensión contextual es fundamental. Con frecuencia, estas canalizaciones necesitan amplios historiales de conversaciones o documentos recuperados como prompts, lo que conlleva un elevado recuento de tokens y mayores gastos.
La compresión de prompts es esencial en estos casos para mantener el contexto esencial minimizando los costes.
Aplicabilidad y limitaciones de la compresión de prompts
Es importante tener en cuenta que la compresión de prompts no es una solución universal y debe utilizarse con criterio. Por ejemplo, los modelos de asistente como ChatGPT, diseñados para contextos conversacionales, pueden no beneficiarse de una compresión agresiva de los avisos.
Estos modelos a menudo no cobran por token y tienen integradas funciones de resumen y memoria de chat para gestionar eficazmente el historial de conversaciones, lo que hace redundante la compresión.
También es importante tener en cuenta que, incluso cuando se trabaja con modelos que cobran por token, una compresión excesiva puede hacer que se pierdan matices o detalles importantes. Lograr el equilibrio adecuado entre reducir el tamaño y mantener la integridad del significado del mensaje es clave.
¿Cómo funciona la compresión de prompts?
Las técnicas de compresión de información pueden clasificarse en tres métodos principales: destilación del conocimiento, codificación y filtrado. Cada técnica aprovecha diferentes puntos fuertes para optimizar la duración y la eficacia de las indicaciones para los LLM.
Aunque hablaremos de cada una de estas técnicas, puedes encontrar un enfoque más completo en este documento: Efficient Prompting Methods for Large Language Models: A Survey. A lo largo de este artículo, me referiré a este documento como el “documento de la encuesta”.
Destilación de conocimientos
La destilación del conocimiento es una técnica del campo del machine learning, introducida por primera vez por Hinton et al. (2015), donde un modelo más pequeño y simple (el alumno) se entrena para replicar el comportamiento de un modelo más grande y complejo (el profesor).
Esta técnica se desarrolló inicialmente para abordar los retos computacionales del entrenamiento de un conjunto de modelos. En el contexto de la ingeniería de prompts, la destilación de conocimientos puede utilizarse para comprimir el prompt en lugar del modelo.
Esto se consigue aprendiendo a comprimir los prompts duros dentro de los LLM mediante el ajuste suave de los prompts. Para obtener información detallada, consulta los apartados 3.1 y el apéndice A.1.1 del documento de la encuesta.
Codificación
Los métodos de codificación transforman los textos de entrada en vectores, reduciendo la longitud del mensaje sin perder información importante. Estos vectores captan el significado esencial de las indicaciones, lo que permite a los LLM procesar entradas más cortas con eficacia.
Curiosamente, los LLM dominan otros lenguajes como Base64, que puede utilizarse en la codificación para reducir el tamaño de los tokens de la petición. Por ejemplo, la pregunta "Traduce el siguiente texto al francés: Hola, ¿cómo estás?" codificado en Base64 es "VHJhbnNsYXRlIHRoZSBmb2xsb3dpbmcgdGV4dCB0byBGcmVuY2g6ICdIZWxsbywgaG93IGFyZSB5b3UnPw==". Puedes intentar pedir a tu LLM favorito que lo pruebe.
Sorprendentemente, algunas técnicas de codificación también se utilizan para el jailbreaking o liberación de modelos, que consiste en manipular el LLM para eludir sus mecanismos de seguridad. Para más detalles sobre los métodos de codificación, consulta las secciones 3.2 y el apéndice A.1.2 del documento de la encuesta.
Filtrado
Mientras que los dos métodos anteriores intentan comprimir toda la petición, las técnicas de filtrado se centran en eliminar las partes innecesarias para mejorar la eficacia de los LLM.
Las técnicas de filtrado evalúan el contenido informativo de las distintas partes de un prompt y eliminan la información redundante, ya que no toda la información del aviso es beneficiosa para los LLM. Esto puede hacerse a varios niveles, como frases, oraciones o tokens.
El objetivo es retener solo las partes más relevantes del mensaje. En el artículo sobre Selective Context de Li et al. (2023), los investigadores utilizan métricas de autoinformación para filtrar la información redundante. En el documento LLMLingua: Compressing Prompts for Accelerated Inference of Large Language Models, investigadores de Microsoft refinan las instrucciones en componentes clave y ajustan dinámicamente los ratios de compresión de cada parte. Para más información, consulta los apartados 3.3 y el apéndice A.1.3 del documento de la encuesta.
Cómo implementar la compresión en Python
En esta sección, implementaré y probaré el algoritmo Selective Context, que es popular y se considera de vanguardia. Si solo quieres probar el algoritmo, no necesitas instalar nada: ya está alojado en la plataforma HuggingFace.
También existen otras técnicas de compresión convencionales, como Keep It Simple (KIS), SCLR y los algoritmos de la familia LLMLingua, pero no podremos abarcarlas en este breve artículo.
En la aplicación web Selective Context, puedes elegir el idioma del prompt que quieres comprimir (inglés o chino simplificado). También puedes establecer la relación de compresión y seleccionar si quieres filtrar frases, oraciones o tokens.
Implementar y probar Selective Context con la API de OpenAI
Ahora vamos a trabajar en la implementación de Python. También probaremos algunos prompts comprimidos con el modelo gpt-3.5-turbo-0125.
En primer lugar, tenemos que instalar todos los módulos necesarios. Tenemos que instalar la biblioteca selective-context
utilizando pip
:
pip install selective-context
También necesitamos descargar el modelo en_core_web_sm
de spacy
, esto se puede hacer con el siguiente comando:
python -m spacy download en_core_web_sm
Ahora tenemos que inicializar el objeto SelectiveContext
. Podemos elegir curie
o gpt-2
para el modelo y en
o zh
para el idioma. Para este ejemplo utilizaré gpt-2
.
sc = SelectiveContext(model_type = ‘gpt-2’, lang = ‘en’)
A continuación, podemos llamar a nuestro objeto SelectiveContext
sobre la cadena de texto que queremos comprimir. Podemos establecer los parámetros reduce_ratio
y reduce_level
. reduce_level
tiene que ser uno de los siguientes: ‘sent’,
‘phrase’
, o ‘token’
. La llamada al objeto devuelve una tupla (context, reduced_content)
, donde context
es el prompt comprimido y reduced_content
es una lista de frases, oraciones o tokens eliminados.
context, reduced_content = sc(text, reduce_ratio = 0.5, reduce_level = ‘sent’)
Ahora vamos a poner algunos ejemplos. Pediré al modelo gpt-3.5-turbo-0125
que resuma la sección "¿Cuándo debemos utilizar la compresión de prompts?" de este artículo. A continuación, comprimiremos la sección con una tasa de compresión de 0,5 utilizando los tres niveles de reducción: oración, frase y token. Pediremos al modelo que resuma de nuevo las versiones comprimidas y compararemos el recuento de tokens de cada indicación y el resultado del modelo.
Párrafo original y resumen
A continuación, puedes ver la llamada a la API que utilizaré: solo cambiaremos la variable text
en la cadena de formato. En primer lugar, pedimos al modelo que resuma el párrafo original sin comprimir:
from openai import OpenAI
client = OpenAI(api_key = key)
completion = client.chat.completions.create(
model = “gpt-3.5-turbo-0125”,
messages = [
{“role”: “user”, “content”: f”Summarize the following paragraph:\n {text}”}
]
)
Comprobando completion.usage
podemos ver que el prompt original tiene 304 tokens, y aquí está la salida:
[Prompt compression is useful in scenarios such as advanced prompt engineering techniques and retrieval-augmented generation pipelines to reduce token counts and costs while preserving effectiveness and context. However, it is not a universal solution and should be used judiciously, as excessive compression can lead to a loss of important details. It is important to strike a balance between reducing size and maintaining the prompt's meaning.]
Como puedes ver, el modelo resumía bastante bien el párrafo sin comprimir.
Reducción a nivel de token
Ahora probemos la versión reducida a tokens. El párrafo comprimido tiene este aspecto:
[When Should Prompt CompProm compression particularly following Advanced prompt engineering Techniques like chainofthought prompting while highly lengthy prompts reach thousands tokensThis increases processing costs and may exceed token limits of certain modelsProm compression mit these token count while prompt effectivenessRetri-au generationRAG pipelines R combine information retrieval text specialized chat contextual understandingThese pipelines frequently involve providing extensive conversation histories retrieved as prompts leading high token counts increased expensesProm compression essential such essential context while costsApplic prompt compression It prompt universal judFor instance assistant models like ChatGPT designed convers contexts benefit aggressive prompt compressionThese models often do charge per token integrated chat summar memory features conversation history effectively compression redundantIt even working models charge per token excessive compression could nuance importantSt reducing size maintaining prompt’s meaning is]
La consulta tiene 162 tokens, y aquí está el resumen del modelo:
[Prompt compression is recommended following advanced prompt engineering techniques like chain of thought prompting, especially when dealing with lengthy prompts that reach thousands of tokens. This helps reduce processing costs and ensure that the prompt remains effective for models like RAG pipelines, which involve extensive conversation histories. Prompt compression is essential for maintaining context while keeping costs low, particularly for models like ChatGPT that charge per token and benefit from aggressive compression. However, excessive compression could lead to loss of important nuances, so it is important to strike a balance between reducing size and maintaining the prompt's meaning.]
El párrafo no está resumido correctamente. Se perdió el matiz de que ChatGPT no se beneficia de una compresión agresiva.
Reducción a nivel de oración
A continuación, probemos la reducción del nivel de oración. El indicador reducido tiene 129 tokens:
[When Should We Use Prompt Compression? This increases processing times and costs and may exceed token limits of certain models. These pipelines frequently involve providing extensive conversation histories or retrieved documents as prompts, leading to high token counts and increased expenses. Prompt compression is essential in such cases to maintain essential context while minimizing costs. For instance, assistant models like ChatGPT, designed for conversational contexts, may not benefit from aggressive prompt compression. These models often do not charge per token and have integrated chat summarization and memory features to manage conversation history effectively, making compression redundant. ]
Aquí tienes el resumen del modelo:
[Prompt compression is necessary when processing times, costs, and token limits may be exceeded in pipelines involving extensive conversation histories or retrieved documents as prompts. However, for certain models like ChatGPT, designed for conversational contexts, aggressive prompt compression may not be beneficial as they already have features to manage conversation history effectively without the need for compression.]
Este resumen no contiene errores, pero le falta el debate sobre la generación mejorada por recuperación (RAG).
Reducción a nivel de frase
Por último, probemos la reducción a nivel de frase. El mensaje tiene 183 tokens:
[When Should Prompt Compression Prompt compression particularly beneficial Advanced prompt engineering techniques Techniques like chainofthought prompting while highly lengthy prompts reach thousands tokens This increases processing costs and may exceed token limits of certain models Prompt compression these issues token count while the prompt's effectiveness Retrieval-augmented generation (RAG) pipelines RAG pipelines combine information retrieval text generation specialized chatbots contextual understanding These pipelines frequently involve providing extensive conversation histories or retrieved as prompts leading high token counts increased expenses Prompt compression essential such cases to maintain essential context while costs Applicability prompt compression It's For instance assistant models like ChatGPT designed conversational contexts may benefit aggressive prompt compression These models often do charge per token have integrated chat summarization memory features manage conversation history effectively making compression redundant It even working models charge per token excessive compression could nuance important details reducing size maintaining the prompt’s meaning is
]
He aquí el resumen del modelo:
[Prompt compression is beneficial in advanced prompt engineering techniques, such as chainofthought prompting, which can involve lengthy prompts reaching thousands of tokens. Retrieval-augmented generation (RAG) pipelines combine information retrieval and text generation in specialized chatbots, requiring extensive conversation histories or retrieved prompts leading to high token counts and increased expenses. Prompt compression is essential in maintaining context while managing costs in such cases. For instance, assistant models like ChatGPT, which are designed for conversational contexts, may benefit from aggressive prompt compression to effectively manage conversation history and reduce costs. However, excessive compression could compromise important details, so maintaining the prompt's meaning is crucial.]
El resumen es correcto y coherente en su mayor parte. Sin embargo, entiende mal la parte en la que ChatGPT se beneficia de una compresión de prompts agresiva.
Evaluar la compresión de prompts
Comparando el recuento de tokens y el contenido de los resúmenes del modelo con distintos niveles de compresión, podemos ver el impacto de la compresión puntual en el resultado del modelo:
Nivel de compresión |
Recuento de tokens (el original tiene 304 de longitud) |
Precisión |
A nivel de token |
162 |
Se perdieron matices importantes sobre que ChatGPT no se beneficia de una compresión agresiva, y cometió errores. |
A nivel de oración |
129 |
No cometió ningún error, pero faltó algo de contexto sobre las canalizaciones RAG. |
A nivel de frase |
183 |
De forma similar al nivel de token, se ha afirmado incorrectamente que ChatGPT se beneficia de una compresión agresiva. |
En general, la compresión de prompts puede reducir significativamente el número de tokens conservando las ideas principales. Sin embargo, es esencial encontrar un equilibrio para evitar perder matices y contextos importantes.
Este ejercicio pone de manifiesto la necesidad de elegir cuidadosamente el nivel de compresión en función de la aplicación concreta y de la importancia de mantener ciertos detalles en el prompt.
Cabe señalar que realizamos todos los experimentos con una tasa de compresión de 0,5, que es relativamente alta. Tal vez quieras experimentar con varias tasas de compresión para distintos casos de uso, a fin de encontrar el equilibrio óptimo entre la reducción del tamaño del prompt y el mantenimiento de su integridad.
Conclusión
La compresión de prompts es una potente técnica para optimizar la eficacia y rentabilidad de los LLM. Hemos explorado sus fundamentos, tratando su importancia, diversas técnicas y detalles de aplicación.
Como el campo de la IA generativa sigue evolucionando, mantenerse al día de los últimos avances es crucial. Para mejorar aún más tus conocimientos y comprensión de la compresión de prompts y las técnicas relacionadas, te animo a que explores los documentos a los que se hace referencia en este artículo, así como las siguientes publicaciones completas del blog y los cursos de DataCamp:
Preguntas frecuentes sobre la compresión de prompts
¿Qué es la compresión de prompts y por qué es importante?
La compresión de prompts es una técnica utilizada para optimizar los prompts dados a los grandes modelos lingüísticos (LLM), reduciendo su longitud y manteniendo al mismo tiempo la calidad y relevancia de los resultados. Es importante porque ayuda a mantenerse dentro de los límites de los tokens, reduce el tiempo de procesamiento y los costes.
¿Cuáles son algunos de los retos habituales a la hora de aplicar la compresión de prompts?
Los retos más comunes son mantener el equilibrio entre la compresión y la conservación de la información esencial, manejar diversos tipos de datos de entrada y garantizar que la información comprimida siga produciendo resultados de alta calidad. Además, la aplicación de enfoques basados en el aprendizaje automático e híbridos puede requerir muchos recursos y ser compleja.
¿Cómo se gestiona la compresión de avisos para conversaciones de varios turnos en los chatbots?
En las conversaciones de varios turnos, la compresión de avisos debe garantizar que se conserva el contexto de las interacciones anteriores. Técnicas como el filtrado selectivo del contexto pueden ayudar reteniendo las partes críticas de la conversación mientras comprimen la información menos importante. Este enfoque ayuda a mantener la continuidad y la relevancia en las respuestas del chatbot.
¿Qué recursos puedo utilizar para mejorar mis habilidades de compresión de prompts?
Para mejorar aún más tus habilidades, explora los artículos de investigación, entradas de blog y cursos DataCamp mencionados en el artículo. Los temas incluyen la comprensión de la ingeniería de avisos, el ajuste de avisos y la generación aumentada por recuperación (RAG), todos ellos cruciales para dominar la compresión de avisos. Además, asegúrate de practicar las técnicas que has aprendido.
¿Existen consideraciones éticas al utilizar la compresión de prompts?
Sí, las consideraciones éticas incluyen garantizar que la compresión no introduzca inadvertidamente sesgos u omita información crítica que pueda conducir a resultados engañosos o perjudiciales. Además, las técnicas de compresión de prompts también podrían liberar inadvertidamente el modelo, haciendo que se comporte de forma impredecible o genere contenido inapropiado. Es importante controlar los efectos de la compresión de prompts en el rendimiento y los resultados del modelo, sobre todo en aplicaciones sensibles como la sanidad, las finanzas o el asesoramiento jurídico.
¡Aprende más sobre ingeniería de prompts!
curso
ChatGPT Prompt Engineering for Developers
curso
Developing LLM Applications with LangChain
blog
¿Qué es la ingeniería de prompts? Una guía detallada para 2024
blog
Las 23 mejores preguntas y respuestas de entrevistas sobre Python
tutorial
Una Introducción al Subproceso Python: Conceptos básicos y ejemplos
tutorial
Clasificación de textos en Python
tutorial
Stemming y lematización en Python
tutorial