Want to Become a Sponsor? Contact Us Now!🎉

claude
Clude-cepción: Enseñando a Claude a Ingeniar sus Propias Prompts con LangChain

Clude-cepción: Enseñando a Claude a Ingeniar sus Propias Prompts con LangChain

Published on

Este artículo demuestra un enfoque innovador para la ingeniería automatizada de prompts utilizando el potente modelo de IA Claude 3 de Anthropic y el framework LangChain. La idea principal es aprovechar las propias capacidades de ingeniería de prompts de Claude para mejorar de forma iterativa los prompts para una tarea dada a través de un bucle de retroalimentación.

Introducción

Claude, el poderoso asistente de IA de Anthropic, ha demostrado notables capacidades de comprensión y generación de lenguaje. El modelo Claude 3 recientemente lanzado, especialmente la variante Opus, es excelente en ingeniería de prompts, el arte de diseñar prompts efectivos para obtener salidas de alta calidad de los modelos de lenguaje.

Esto abre una posibilidad emocionante: ¿qué pasaría si pudiéramos aprovechar la destreza de ingeniería de prompts de Claude para mejorar de forma iterativa sus propios prompts? Al hacer que Claude 3 analice la calidad de las salidas generadas a partir de un prompt inicial y sugiera mejoras, podríamos crear un bucle de retroalimentación automatizado para optimizar prompts para una tarea dada.

En este artículo, veremos cómo implementar esta estrategia de auto-mejoramiento de prompts utilizando Claude 3 Opus y LangChain, un framework popular para construir aplicaciones con modelos de lenguaje. Lo aplicaremos a la tarea de resumir papers académicos en el estilo atractivo del investigador de IA Elvis Saravia (@omarsar0 (opens in a new tab) en Twitter).

Anakin AI - The Ultimate No-Code AI App Builder

Flujo de Trabajo de Ingeniería de Prompts

Alex Albert (@alexalbert__ (opens in a new tab) en Twitter) compartió recientemente un flujo de trabajo efectivo para la ingeniería de prompts con Claude 3 Opus:

  1. Escribir un prompt inicial para la tarea
  2. Generar un conjunto de pruebas de entradas para evaluar el prompt
  3. Ejecutar el prompt en los casos de prueba
  4. Revisar y calificar manualmente las salidas
  5. Alimentar los ejemplos calificados a Claude 3 Opus y pedirle que revise el prompt
  6. Repetir

Will Hinthorn (@WHinthorn (opens in a new tab)) y Ross Lance Martin (@rlancemartin (opens in a new tab)) demuestran cómo agilizar este proceso utilizando LangSmith:

  1. Crear un conjunto de datos de casos de prueba
  2. Anotar las salidas generadas con retroalimentación
  3. Pasar la retroalimentación a Claude 3 Opus para reescribir el prompt
  4. Ejecutar esto como un bucle de mejora iterativa

Veamos cómo implementar este enfoque para la tarea de resumir papers académicos en el estilo de los excelentes hilos de Twitter de Elvis Saravia.

Paso 1: Cargar los Papers en un Conjunto de Datos

Primero, seleccionamos algunos papers sobre los que Elvis ha twitteado y los cargamos utilizando ArxivLoader de LangChain:

from langchain_community.document_loaders import ArxivLoader
 
ids = ["2403.05313", "2403.04121", "2402.15809"] 
 
docs = []
for paper_id in ids:
    doc = ArxivLoader(query=paper_id, load_max_docs=1).load() 
    docs.extend(doc)

Luego agregamos el texto de los papers a un conjunto de datos de LangSmith:

from langsmith import Client
 
client = Client()
 
nombre_conjunto_datos = "Generador de Tweets"  
conjunto_datos = client.create_dataset(dataset_name=nombre_conjunto_datos)
client.create_examples(
    inputs=[{"paper": doc.page_content} for doc in docs], dataset_id=conjunto_datos.id
)

Paso 2: Prueba con un Prompt Inicial

A continuación, escribimos un prompt inicial razonable para que Claude 3 Opus genere resúmenes de los papers en forma de tweets:

from langchain_anthropic import ChatAnthropic
from langchain_core.prompts import ChatPromptTemplate
 
chat = ChatAnthropic(temperature=0, model_name="claude-3-opus-20240229")
 
sistema = (
    "<rol> Eres un asistente que genera Tweets para destilar/resumir"
    " un paper académico o un proyecto de código abierto. Debe ser" 
    " bien elaborado pero evitar los trucos o la dependencia excesiva de palabras de moda. </rol>"
)
humano = "Aquí tienes un paper para convertir en un Tweet: <paper> {paper} </paper>"
prompt_actual_str = sistema + humano
prompt = ChatPromptTemplate.from_messages([("system", sistema), ("human", humano)])
 
generador_tweets = prompt | chat

Podemos probarlo con un ejemplo de paper:

ejemplo_tweet = generador_tweets.invoke({"paper": docs[0].page_content})
print(ejemplo_tweet)

Esto genera un resumen de tweet inicial decente del paper.

Paso 3: Ejecutar en el Conjunto de Datos

Para evaluar el prompt de manera más exhaustiva, lo ejecutamos en nuestro conjunto completo de papers:

res = client.run_on_dataset(
    dataset_name=nombre_conjunto_datos, 
    llm_or_chain_factory=generador_tweets,
)

Paso 4: Evaluar Manualmente las Salidas

Podemos usar la función de cola de anotaciones de LangSmith para revisar manualmente y proporcionar retroalimentación sobre los tweets generados:

q = client.create_annotation_queue(name="Generador de Tweets")
client.add_runs_to_annotation_queue(
    q.id,
    run_ids=[
        r.id 
        for r in client.list_runs(project_name=res["project_name"], execution_order=1)
    ],  
)

Para guiar la evaluación, podemos consultar algunos de los verdaderos tweets de resumen de papers de Elvis como ejemplos del estilo y contenido objetivo.

Paso 5: Mejorar el Prompt

Después de anotar las salidas, incorporamos la retroalimentación estructurada:

formatted_feedback = get_formatted_feedback(res["project_name"])

Luego alimentamos esto nuevamente en Claude 3 Opus utilizando una plantilla de optimización de prompt de LangChain Hub:

from langchain import hub
from langchain_core.output_parsers import StrOutputParser
 
optimizador_prompt = hub.pull("rlm/prompt-optimizer-tweet-drafts") 
optimizador = optimizador_prompt | chat | StrOutputParser() | extract_new_prompt
nuevo_prompt_str = optimizador.invoke(
    {
        "prompt_actual": prompt_actual_str,
        "predicciones_anotadas": "\n\n".join(formatted_feedback).strip(),  
    }
)

Este genera una mejorada instrucción que incorpora el feedback para que coincida mejor con el estilo de escritura y estructura del hilo de Elvis.

Paso 6: Evaluar la nueva instrucción

Por último, podemos ejecutar la instrucción actualizada en nuestros datos de nuevo para verificar las mejoras:

new_prompt = ChatPromptTemplate.from_messages([("user", new_prompt_str)])
tweet_generator_v2 = new_prompt | chat
 
updated_results = client.run_on_dataset(
    dataset_name=ds_name,
    llm_or_chain_factory=tweet_generator_v2, 
)

Comparando las salidas de las instrucciones originales y revisadas muestra que el bucle de retroalimentación con Claude 3 Opus fue efectivo para ajustar la instrucción y producir resúmenes de artículos más atractivos al estilo de Elvis.

Por ejemplo, aquí están los tweets generados por las instrucciones iniciales y mejoradas para un nuevo artículo de prueba:

Instrucción inicial:

Nueva encuesta sobre el uso de modelos de lenguaje grandes (LLM) para tareas de datos tabulares, como predicción, generación y respuesta a preguntas. Cubre técnicas clave como la serialización, la ingeniería de instrucciones y los puntos de referencia. Identifica oportunidades y desafíos.

Instrucción mejorada:

Desbloqueando el potencial de los LLMs para datos tabulares 🔑

Esta exhaustiva encuesta explora cómo se pueden aplicar modelos de lenguaje grandes a datos tabulares para tareas como predicción, generación y comprensión.

Técnicas clave cubiertas:

  • Serializando tablas en formatos legibles por LLMs
  • Manipulaciones de tablas para adaptar la longitud del contexto
  • Trucos de ingeniería de instrucciones
  • Construcción de sistemas de extremo a extremo

El artículo proporciona una taxonomía de conjuntos de datos, métricas y métodos para cada área de aplicación. También se discuten las limitaciones actuales y las direcciones futuras de investigación.

Los LLMs muestran un gran potencial para trabajar con datos estructurados cuando se combinan con los pasos de preprocesamiento correctos y las estrategias de instrucciones adecuadas. Esto abre emocionantes posibilidades para sistemas más inteligentes y automatizados para analizar datos tabulares.

¿Qué otras aplicaciones innovadoras de los LLMs a datos estructurados prevés? 🤔

El tweet revisado hace un mejor trabajo desglosando los puntos clave, añade emojis para generar interés visual y termina con una pregunta provocadora para involucrar a la audiencia, todos elementos característicos del estilo de Elvis.

Conclusión

Al combinar las capacidades de ingeniería de instrucciones de Claude 3 Opus con los marcos de LangChain y LangSmith, pudimos crear un bucle de retroalimentación automatizado para optimizar progresivamente una instrucción para resumir artículos en un estilo de escritura específico.

Esto demuestra un enfoque general poderoso para ajustar modelos de lenguaje para realizar una tarea según especificaciones o emular un estilo objetivo. La misma técnica se podría aplicar para mejorar automáticamente las instrucciones para una amplia variedad de otras tareas de generación de texto.

A medida que los modelos de lenguaje sigan avanzando, podemos esperar ver herramientas y flujos de trabajo más sofisticados de ingeniería de instrucciones para maximizar su potencial. Marcos como LangChain desempeñarán un papel clave en hacer esto accesible a una gama más amplia de desarrolladores y abrir nuevas aplicaciones emocionantes.

Anakin AI - The Ultimate No-Code AI App Builder