Cree aplicaciones RAG con Jina Embeddings v2 en Amazon SageMaker JumpStart

Hoy, nos complace anunciar que el modelo Jina Embeddings v2, desarrollado por Jina AI, está disponible para los clientes a través de Inicio rápido de Amazon SageMaker para implementar con un clic para ejecutar la inferencia del modelo. Este modelo de última generación admite una impresionante longitud de contexto de 8192 tokens. Puede implementar este modelo con SageMaker JumpStart, un centro de aprendizaje automático (ML) con modelos básicos, algoritmos integrados y soluciones de ML prediseñadas que puede implementar con solo unos pocos clics.

La incrustación de texto se refiere al proceso de transformar texto en representaciones numéricas que residen en un espacio vectorial de alta dimensión. Las incrustaciones de texto tienen una amplia gama de aplicaciones en inteligencia artificial (IA) empresarial, incluidas las siguientes:

  • Búsqueda multimodal para comercio electrónico
  • Personalización de contenidos
  • Sistemas de recomendación
  • Análisis de datos

Jina Embeddings v2 es una colección de última generación de modelos de incrustación de texto, entrenados por Jina AI, con sede en Berlín, que cuenta con un alto rendimiento. en varios puntos de referencia públicos.

En esta publicación, explicamos cómo descubrir e implementar el jina-embeddings-v2 modelo como parte de un sistema de respuesta a preguntas basado en recuperación de generación aumentada (RAG) en SageMaker JumpStart. Puede utilizar este tutorial como punto de partida para una variedad de soluciones basadas en chatbot para servicio al cliente, soporte interno y sistemas de respuesta a preguntas basados ​​en documentos internos y privados.

¿Qué es RAG?

RAG es el proceso de optimizar el resultado de un modelo de lenguaje grande (LLM), de modo que haga referencia a una base de conocimiento autorizada fuera de sus fuentes de datos de entrenamiento antes de generar una respuesta.

Los LLM están capacitados con grandes volúmenes de datos y utilizan miles de millones de parámetros para generar resultados originales para tareas como responder preguntas, traducir idiomas y completar oraciones. RAG extiende las ya poderosas capacidades de los LLM a dominios específicos o a la base de conocimiento interna de una organización, todo sin la necesidad de volver a entrenar el modelo. Es un enfoque rentable para mejorar los resultados del LLM para que siga siendo relevante, preciso y útil en diversos contextos.

¿Qué aporta Jina Embeddings v2 a las aplicaciones RAG?

Un sistema RAG utiliza una base de datos vectorial para servir como recuperador de conocimientos. Debe extraer una consulta del mensaje de un usuario y enviarla a una base de datos vectorial para encontrar de manera confiable la mayor cantidad de información semántica posible. El siguiente diagrama ilustra la arquitectura de una aplicación RAG con Jina AI y Amazon SageMaker.

Jina Embeddings v2 es la opción preferida de los científicos experimentados en aprendizaje automático por las siguientes razones:

  • Rendimiento de última generación – Hemos demostrado en varios puntos de referencia de incrustación de texto que los modelos Jina Embeddings v2 sobresalen en tareas como clasificación, reclasificación, resumen y recuperación. Algunos de los puntos de referencia que demuestran su desempeño son MTEBun estudio independiente de combinar modelos de incrustación con modelos de reclasificación, y el Punto de referencia LoCo por un grupo de la Universidad de Stanford.
  • Longitud larga del contexto de entrada – Los modelos Jina Embeddings v2 admiten 8192 tokens de entrada. Esto hace que los modelos sean especialmente potentes en tareas como la agrupación de documentos largos, como textos legales o documentación de productos.
  • Soporte para entrada de texto bilingüe – Investigación reciente muestra que los modelos multilingües sin formación lingüística específica muestran fuertes sesgos hacia las estructuras gramaticales del inglés en las incrustaciones. Los modelos de integración bilingües de Jina AI incluyen jina-embeddings-v2-base-de, jina-embeddings-v2-base-zh, jina-embeddings-v2-base-esy jina-embeddings-v2-base-code. Fueron entrenados para codificar textos en una combinación de inglés-alemán, inglés-chino, Ingles Españoly Código inglésrespectivamente, permitiendo el uso de cualquier idioma como consulta o documento de destino en aplicaciones de recuperación.
  • Rentabilidad de la operación – Jina Embeddings v2 proporciona un alto rendimiento en tareas de recuperación de información con modelos relativamente pequeños y vectores de incrustación compactos. Por ejemplo, jina-embeddings-v2-base-de tiene un tamaño de 322 MB con una puntuación de rendimiento del 60,1%. Un tamaño de vector más pequeño significa una gran cantidad de ahorro de costos al almacenarlos en una base de datos de vectores.

¿Qué es SageMaker JumpStart?

Con SageMaker JumpStart, los profesionales del aprendizaje automático pueden elegir entre una lista cada vez mayor de modelos básicos de mejor rendimiento. Los desarrolladores pueden implementar modelos básicos en instancias dedicadas de SageMaker dentro de un entorno aislado de red y personalizar modelos utilizando SageMaker para el entrenamiento e implementación de modelos.

Ahora puede descubrir e implementar un modelo de Jina Embeddings v2 con unos pocos clics en Amazon SageMaker Estudio o mediante programación a través del SDK de Python de SageMaker, lo que le permite obtener el rendimiento del modelo y controles MLOps con funciones de SageMaker como Canalizaciones de Amazon SageMaker y Depurador de Amazon SageMaker. Con SageMaker JumpStart, el modelo se implementa en un entorno seguro de AWS y bajo los controles de su VPC, lo que ayuda a brindar seguridad de los datos.

Los modelos de Jina Embeddings están disponibles en Mercado de AWS para que pueda integrarlos directamente en sus implementaciones cuando trabaje en SageMaker.

AWS Marketplace le permite encontrar software, datos y servicios de terceros que se ejecutan en AWS y administrarlos desde una ubicación centralizada. AWS Marketplace incluye miles de listados de software y simplifica la concesión y adquisición de licencias de software con opciones de precios flexibles y múltiples métodos de implementación.

Descripción general de la solución

Hemos preparado un computadora portátil que construye y ejecuta un sistema de respuesta a preguntas RAG utilizando Jina Embeddings y Mixtral 8x7B LLM en SageMaker JumpStart.

En las siguientes secciones, le brindamos una descripción general de los pasos principales necesarios para darle vida a una aplicación RAG utilizando modelos de IA generativa en SageMaker JumpStart. Aunque omitimos algunos de los códigos estándar y los pasos de instalación en esta publicación por razones de legibilidad, puedes acceder a cuaderno completo de Python para correr usted mismo.

Conexión a un punto final de Jina Embeddings v2

Para comenzar a utilizar los modelos Jina Embeddings v2, complete los siguientes pasos:

  1. En SageMaker Studio, elija Buen inicio en el panel de navegación.
  2. Busque “jina” y verá el enlace a la página del proveedor y los modelos disponibles en Jina AI.
  3. Elegir Jina Embeddings v2 Base – esque es el modelo de incorporación en inglés de Jina AI.
  4. Elegir Desplegar.
  5. En el cuadro de diálogo que aparece, elija Suscribirque le redirigirá a la Listado de AWS Marketplace del modelodonde podrás suscribirte al modelo luego de aceptar los términos de uso.
  6. Después de suscribirte, regresa a Sagemaker Studio y elige Desplegar.
  7. Se le redirigirá a la página de configuración del punto final, donde podrá seleccionar la instancia más adecuada para su caso de uso y proporcionar un nombre para el punto final.
  8. Elegir Desplegar.

Después de crear el punto final, puede conectarse a él con el siguiente fragmento de código:

from jina_sagemaker import Client
 
client = Client(region_name=region)
# Make sure that you’ve given the same name my-jina-embeddings-endpoint to the Jumpstart endpoint in the previous step.
endpoint_name = "my-jina-embeddings-endpoint"
 
client.connect_to_endpoint(endpoint_name=endpoint_name)

Preparar un conjunto de datos para indexar

En esta publicación, utilizamos un conjunto de datos públicos de Kaggle (CC0: Dominio público) que contiene transcripciones de audio del popular canal de YouTube. Kurzgesagt – En pocas palabrasque tiene más de 20 millones de suscriptores.

Cada fila de este conjunto de datos contiene el título de un vídeo, su URL y la transcripción de texto correspondiente.

Ingrese el siguiente código:

Debido a que la transcripción de estos videos puede ser bastante larga (alrededor de 10 minutos), para encontrar solo el contenido relevante para responder las preguntas de los usuarios y no otras partes de las transcripciones que no estén relacionadas, puedes fragmentar cada una de estas transcripciones antes de indexarlas. :

def chunk_text(text, max_words=1024):
    """
    Divide text into chunks where each chunk contains the maximum number of full sentences under `max_words`.
    """
    sentences = text.split('.')
    chunk = []
    word_count = 0
 
    for sentence in sentences:
        sentence = sentence.strip(".")
        if not sentence:
          continue
 
        words_in_sentence = len(sentence.split())
        if word_count + words_in_sentence <= max_words:
            chunk.append(sentence)
            word_count += words_in_sentence
        else:
            # Yield the current chunk and start a new one
            if chunk:
              yield '. '.join(chunk).strip() + '.'
            chunk = [sentence]
            word_count = words_in_sentence
 
    # Yield the last chunk if it's not empty
    if chunk:
        yield ' '.join(chunk).strip() + '.'

El parámetro max_words define el número máximo de palabras completas que pueden estar en un fragmento de texto indexado. Muchos estrategias de fragmentación Existen en la literatura académica y no revisada por pares que son más sofisticados que un simple límite de palabras. Sin embargo, para simplificar, utilizamos esta técnica en esta publicación.

Incrustaciones de texto de índice para búsqueda vectorial

Después de fragmentar el texto de la transcripción, obtienes incrustaciones para cada fragmento y vinculas cada fragmento a la transcripción original y al título del vídeo:

def generate_embeddings(text_df):
    """
    Generate an embedding for each chunk created in the previous step.
    """

    chunks = list(chunk_text(text_df['Text']))
    embeddings = []
 
    for i, chunk in enumerate(chunks):
      response = client.embed(texts=[chunk])
      chunk_embedding = response[0]['embedding']
      embeddings.append(np.array(chunk_embedding))
 
    text_df['chunks'] = chunks
    text_df['embeddings'] = embeddings
    return text_df
 
print("Embedding text chunks ...")
df = df.progress_apply(generate_embeddings, axis=1)

El marco de datos df contiene una columna titulada embeddings que se puede colocar en cualquier base de datos vectorial de su elección. Luego, las incrustaciones se pueden recuperar de la base de datos de vectores usando una función como find_most_similar_transcript_segment(query, n)que recuperará los n documentos más cercanos a la consulta de entrada dada por un usuario.

Solicitar un punto final LLM generativo

Para responder preguntas basadas en un LLM, puede utilizar el modelo Mistral 7B-Instruct en SageMaker JumpStart:

from sagemaker.jumpstart.model import JumpStartModel
from string import Template

# Define the LLM to be used and deploy through Jumpstart.
jumpstart_model = JumpStartModel(model_id="huggingface-llm-mistral-7b-instruct", role=role)
model_predictor = jumpstart_model.deploy()

# Define the prompt template to be passed to the LLM
prompt_template = Template("""
  <s>[INST] Answer the question below only using the given context.
  The question from the user is based on transcripts of videos from a YouTube
    channel.
  The context is presented as a ranked list of information in the form of
    (video-title, transcript-segment), that is relevant for answering the
    user's question.
  The answer should only use the presented context. If the question cannot be
    answered based on the context, say so.
 
  Context:
  1. Video-title: $title_1, transcript-segment: $segment_1
  2. Video-title: $title_2, transcript-segment: $segment_2
  3. Video-title: $title_3, transcript-segment: $segment_3
 
  Question: $question
 
  Answer: [/INST]
""")

Consulta el LLM

Ahora, para una consulta enviada por un usuario, primero encuentra los n fragmentos de transcripciones semánticamente más cercanos de cualquier video de Kurzgesagt (usando la distancia vectorial entre las incrustaciones de fragmentos y la consulta de los usuarios), y proporciona esos fragmentos como contexto al LLM para respondiendo a la consulta de los usuarios:

# Define the query and insert it into the prompt template together with the context to be used to answer the question
question = "Can climate change be reversed by individuals' actions?"
search_results = find_most_similar_transcript_segment(question)
 
prompt_for_llm = prompt_template.substitute(
    question = question,
    title_1 = df.iloc[search_results[0][1]]["Title"].strip(),
    segment_1 = search_results[0][0],
    title_2 = df.iloc[search_results[1][1]]["Title"].strip(),
    segment_2 = search_results[1][0],
    title_3 = df.iloc[search_results[2][1]]["Title"].strip(),
    segment_3 = search_results[2][0]
)

# Generate the answer to the question passed in the propt
payload = {"inputs": prompt_for_llm}
model_predictor.predict(payload)

Con base en la pregunta anterior, el LLM podría responder con una respuesta como la siguiente:

Based on the provided context, it does not seem that individuals can solve climate change solely through their personal actions. While personal actions such as using renewable energy sources and reducing consumption can contribute to mitigating climate change, the context suggests that larger systemic changes are necessary to address the issue fully.

Limpiar

Una vez que haya terminado de ejecutar el cuaderno, asegúrese de eliminar todos los recursos que creó en el proceso para que se detenga su facturación. Utilice el siguiente código:

model_predictor.delete_model()
model_predictor.delete_endpoint()

Conclusión

Al aprovechar las características de Jina Embeddings v2 para desarrollar aplicaciones RAG, junto con el acceso optimizado a modelos de última generación en SageMaker JumpStart, los desarrolladores y las empresas ahora pueden crear soluciones sofisticadas de IA con facilidad.

La longitud de contexto extendida de Jina Embeddings v2, la compatibilidad con documentos bilingües y el tamaño pequeño del modelo permiten a las empresas crear rápidamente casos de uso de procesamiento de lenguaje natural basados ​​en sus conjuntos de datos internos sin depender de API externas.

Comience hoy con SageMaker JumpStart y consulte la repositorio de GitHub para obtener el código completo para ejecutar este ejemplo.

Conéctate con Jina AI

Jina AI sigue comprometida con el liderazgo para llevar al mundo tecnología de integración de IA asequible y accesible. Nuestros modelos de incrustación de texto de última generación admiten inglés y chino y pronto admitirán alemán, al que seguirán otros idiomas.

Para obtener más información sobre las ofertas de Jina AI, consulte el Sitio web de Jina AI o únete a nuestro comunidad en discordia.


Sobre los autores

Francesco Kruk Es pasante de gestión de productos en Jina AI y está completando su maestría en ETH Zurich en Gestión, Tecnología y Economía. Con una sólida experiencia empresarial y su conocimiento en aprendizaje automático, Francesco ayuda a los clientes a implementar soluciones RAG utilizando Jina Embeddings de una manera impactante.

Saahil Ognawala es Jefe de Producto en Jina AI con sede en Munich, Alemania. Lidera el desarrollo de modelos básicos de búsqueda y colabora con clientes de todo el mundo para permitir una implementación rápida y eficiente de productos de inteligencia artificial generativa de última generación. Con formación académica en aprendizaje automático, Saahil ahora está interesado en aplicaciones escaladas de IA generativa en la economía del conocimiento.

Roy Allela es un arquitecto senior de soluciones especializado en IA/ML en AWS con sede en Munich, Alemania. Roy ayuda a los clientes de AWS (desde pequeñas empresas emergentes hasta grandes empresas) a capacitar e implementar modelos de lenguaje grandes de manera eficiente en AWS. A Roy le apasionan los problemas de optimización computacional y la mejora del rendimiento de las cargas de trabajo de IA.