Resumen de embeddings

Los embeddings de texto son representaciones numéricas de cadenas de texto, representadas como un vector de números de punto flotante. Puedes usar la distancia entre dos piezas de texto embebidas (ya sean palabras, frases u oraciones) para medir qué tan relacionadas están esas piezas de texto entre sí. Una medida popular es la similitud coseno, pero también puedes medir la similitud a través de otras funciones de distancia como la distancia euclidiana o los productos escalares (ver Preguntas frecuentes abajo). En general, distancias más pequeñas predicen mayor relación en términos de la relación semántica o sintáctica entre textos.

Comparar la similitud de cadenas, o agrupar cadenas por su distancia entre sí, permite una amplia variedad de aplicaciones, incluyendo búsqueda (popular en arquitecturas RAG), recomendaciones y detección de anomalías.


Cómo obtener embeddings con Anthropic

Al seleccionar un proveedor de embeddings, hay varios factores que puedes considerar según tus necesidades y preferencias:

  • Tamaño del conjunto de datos y especificidad del dominio: tamaño del conjunto de datos de entrenamiento del modelo y su relevancia para el dominio que deseas embeber. Datos más grandes o más específicos del dominio generalmente producen mejores embeddings en el dominio
  • Arquitectura del modelo: Diseño y complejidad del modelo. Técnicas y arquitecturas más modernas como los Transformers tienden a aprender y producir embeddings de mayor calidad
  • Rendimiento de inferencia: Velocidad de búsqueda de embeddings y latencia de extremo a extremo. Esta es una consideración particularmente importante para despliegues de producción a gran escala
  • Personalización: Opciones para entrenamiento continuo en datos privados, o especialización de modelos para dominios muy específicos. Esto puede mejorar el rendimiento en vocabularios únicos

Anthropic no ofrece su propio modelo de embeddings. Un proveedor de embeddings que tiene una amplia variedad de opciones y capacidades que abarcan las cuatro consideraciones anteriores es Voyage AI. Voyage AI crea modelos de embeddings state of the art y ofrece modelos personalizados para dominios industriales específicos como finanzas y salud, o modelos ajustados a medida para clientes individuales.

El resto de esta guía es para Voyage AI, pero te animamos a evaluar una variedad de proveedores de embeddings para encontrar el mejor ajuste para tu caso de uso específico.


Comenzando con Voyage AI

Consulta nuestro cuaderno de embeddings para ver un ejemplo de implementación de Voyage AI.

Para acceder a los embeddings de Voyage:

  1. Regístrate en el sitio web de Voyage AI
  2. Obtén una clave API
  3. Establece la clave API como una variable de entorno para mayor comodidad:
Python
export VOYAGE_API_KEY="<tu clave secreta>"

Puedes ejecutar los embeddings usando el paquete Python oficial de voyageai o solicitudes HTTP, como se describe a continuación.

Paquete Python de Voyage

El paquete voyageai se puede instalar usando el siguiente comando:

Python
pip install -U voyageai

Luego, puedes crear un objeto cliente y comenzar a usarlo para embeber tus textos:

Python
import voyageai

vo = voyageai.Client()
# Esto usará automáticamente la variable de entorno VOYAGE_API_KEY.
# Alternativamente, puedes usar vo = voyageai.Client(api_key="<tu clave secreta>")

texts = ["Texto de muestra 1", "Texto de muestra 2"]

result = vo.embed(texts, model="voyage-2", input_type="document")
print(result.embeddings[0])
print(result.embeddings[1])

result.embeddings será una lista de dos vectores de embedding, cada uno conteniendo 1024 números de punto flotante.

Después de ejecutar el código anterior, los dos embeddings se imprimirán en la pantalla:

Python
[0.02012746, 0.01957859, ...]  # embedding para "Texto de muestra 1"
[0.01429677, 0.03077182, ...]  # embedding para "Texto de muestra 2"

Al crear los embeddings, puedes especificar algunos otros argumentos para la función embed(). Aquí está la especificación:

voyageai.Client.embed(texts : List[str], model : str, input_type : Optional[str] = None, truncation : Optional[bool] = None)

  • texts (List[str]) - Una lista de textos como una lista de cadenas, como ["Me gustan los gatos", "También me gustan los perros"]. Actualmente, la longitud máxima de la lista es 128, y el número total de tokens en la lista es como máximo 320K para voyage-2 y 120K para voyage-large-2/voyage-code-2.
  • model (str) - Nombre del modelo. Opciones recomendadas: voyage-2, voyage-large-2, voyage-code-2.
  • input_type (str, opcional, por defecto None) - Tipo del texto de entrada. Por defecto es None. Otras opciones: query, document
    • Cuando input_type se establece en None, el texto de entrada se codificará directamente por el modelo de embedding de Voyage. Alternativamente, cuando las entradas son documentos o consultas, los usuarios pueden especificar input_type como query o document, respectivamente. En tales casos, Voyage antepondrá un prompt especial al texto de entrada y enviará las entradas extendidas al modelo de embedding
    • Para casos de uso de recuperación/búsqueda, recomendamos especificar este argumento al codificar consultas o documentos para mejorar la calidad de recuperación. Los embeddings generados con y sin el argumento input_type son compatibles
  • truncation (bool, opcional, por defecto None) - Si se deben truncar los textos de entrada para que quepan dentro de la longitud del contexto.
    • Si es True, los textos de entrada demasiado largos se truncarán para que quepan dentro de la longitud del contexto, antes de ser vectorizados por el modelo de embedding
    • Si es False, se generará un error si algún texto dado excede la longitud del contexto
    • Si no se especifica (por defecto None), Voyage truncará el texto de entrada antes de enviarlo al modelo de embedding si excede ligeramente la longitud de la ventana de contexto. Si excede significativamente la longitud de la ventana de contexto, se generará un error

API HTTP de Voyage

También puedes obtener embeddings solicitando la API HTTP de Voyage. Por ejemplo, puedes enviar una solicitud HTTP a través del comando curl en una terminal:

Shell
curl https://api.voyageai.com/v1/embeddings \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $VOYAGE_API_KEY" \
  -d '{
    "input": ["Texto de muestra 1", "Texto de muestra 2"],
    "model": "voyage-2"
  }'

La respuesta que obtendrías es un objeto JSON que contiene los embeddings y el uso de tokens:

Shell
{
  "object": "list",
  "data": [
    {
      "embedding": [0.02012746, 0.01957859, ...],
      "index": 0
    },
    {
      "embedding": [0.01429677, 0.03077182, ...],
      "index": 1
    }
  ],
  "model": "voyage-2",
  "usage": {
    "total_tokens": 10
  }
}

El endpoint de embedding de Voyage AI es https://api.voyageai.com/v1/embeddings (POST). El encabezado de la solicitud debe contener la clave API. El cuerpo de la solicitud es un objeto JSON que contiene los siguientes argumentos:

  • input (str, List[str]) - Una sola cadena de texto, o una lista de textos como una lista de cadenas. Actualmente, la longitud máxima de la lista es 128, y el número total de tokens en la lista es como máximo 320K para voyage-2 y 120K para voyage-large-2/voyage-code-2.
  • model (str) - Nombre del modelo. Opciones recomendadas: voyage-2, voyage-large-2, voyage-code-2.
  • input_type (str, opcional, por defecto None) - Tipo del texto de entrada. Por defecto es None. Otras opciones: query, document
  • truncation (bool, opcional, por defecto None) - Si se deben truncar los textos de entrada para que quepan dentro de la longitud del contexto
    • Si es True, los textos de entrada demasiado largos se truncarán para que quepan dentro de la longitud del contexto antes de ser vectorizados por el modelo de embedding
    • Si es False, se generará un error si algún texto dado excede la longitud del contexto
    • Si no se especifica (por defecto None), Voyage truncará el texto de entrada antes de enviarlo al modelo de embedding si excede ligeramente la longitud de la ventana de contexto. Si excede significativamente la longitud de la ventana de contexto, se generará un error
  • encoding_format (str, opcional, por defecto None) - Formato en el que se codifican los embeddings. Voyage actualmente admite dos opciones:
    • Si no se especifica (por defecto None): los embeddings se representan como listas de números de punto flotante
    • "base64": los embeddings se comprimen en codificaciones Base64

Ejemplo de embedding de Voyage

Ahora que sabemos cómo obtener embeddings con Voyage, veámoslo en acción con un breve ejemplo.

Supongamos que tenemos un pequeño corpus de seis documentos para recuperar

Python
documents = [
    "La dieta mediterránea enfatiza el pescado, el aceite de oliva y las verduras, se cree que reduce las enfermedades crónicas.",
    "La fotosíntesis en las plantas convierte la energía lumínica en glucosa y produce oxígeno esencial.",
    "Las innovaciones del siglo XX, desde radios hasta teléfonos inteligentes, se centraron en avances electrónicos.",
    "Los ríos proporcionan agua, riego y hábitat para especies acuáticas, vitales para los ecosistemas.",
    "La conferencia telefónica de Apple para discutir los resultados del cuarto trimestre fiscal y las actualizaciones comerciales está programada para el jueves 2 de noviembre de 2023 a las 2:00 p.m. PT / 5:00 p.m. ET.",
    "Las obras de Shakespeare, como 'Hamlet' y 'Sueño de una noche de verano', perduran en la literatura."
]

Primero usaremos Voyage para convertir cada uno de ellos en un vector de embedding

Python
import voyageai

vo = voyageai.Client()

# Embeber los documentos
doc_embds = vo.embed(
    documents, model="voyage-2", input_type="document"
).embeddings

Los embeddings nos permitirán hacer búsqueda/recuperación semántica en el espacio vectorial. Luego podemos convertir una consulta de ejemplo,

Python
query = "¿Cuándo está programada la conferencia telefónica de Apple?"

en un embedding, y luego realizar una búsqueda de vecinos más cercanos para encontrar el documento más relevante según la distancia en el espacio de embedding.

Python
import numpy as np

# Embeber la consulta
query_embd = vo.embed(
    [query], model="voyage-2", input_type="query"
).embeddings[0]

# Calcular la similitud
# Los embeddings de Voyage están normalizados a longitud 1, por lo tanto el producto escalar
# y la similitud coseno son lo mismo.
similarities = np.dot(doc_embds, query_embd)

retrieved_id = np.argmax(similarities)
print(documents[retrieved_id])

Ten en cuenta que usamos input_type="document" y input_type="query" para embeber el documento y la consulta, respectivamente. Más especificaciones se pueden encontrar aquí.

La salida sería el 5to documento, que de hecho es el más relevante para la consulta:

La conferencia telefónica de Apple para discutir los resultados del cuarto trimestre fiscal y las actualizaciones comerciales está programada para el jueves 2 de noviembre de 2023 a las 2:00 p.m. PT / 5:00 p.m. ET.

Modelos disponibles de Voyage

Voyage recomienda usar los siguientes modelos de embedding:

ModeloLongitud de contextoDimensión de embeddingDescripción
voyage-large-2160001536El modelo de embedding generalista más potente de Voyage AI.
voyage-code-2160001536Optimizado para recuperación de código (17% mejor que alternativas), y también SoTA en corpus de propósito general. Consulta este post del blog de Voyage para detalles.
voyage-240001024Modelo de embedding generalista base optimizado tanto para latencia como para calidad.
voyage-lite-02-instruct40001024Ajustado por instrucciones para tareas de clasificación, agrupamiento y similitud textual de oraciones, que son los únicos casos de uso recomendados para este modelo.

voyage-2 y voyage-large-2 son modelos de embedding generalistas, que logran un rendimiento state-of-the-art en todos los dominios y mantienen una alta eficiencia. voyage-code-2 está optimizado para el campo del código, ofreciendo una longitud de contexto 4 veces mayor para un uso más flexible, aunque con una latencia relativamente más alta.

Voyage está desarrollando activamente modelos más avanzados y especializados, y también ofrece servicios de ajuste fino para personalizar modelos a medida para clientes individuales. Envía un correo electrónico a tu gerente de cuenta de Anthropic o comunícate con el soporte de Anthropic para obtener más información sobre modelos a medida.

-voyage-finance-2: próximamente -voyage-law-2: próximamente -voyage-multilingual-2: próximamente -voyage-healthcare-2: próximamente


Voyage en AWS Marketplace

Los embeddings de Voyage también están disponibles en AWS Marketplace. Aquí están las instrucciones para acceder a Voyage en AWS:

  1. Suscríbete al paquete del modelo
    1. Navega a la página de listado del paquete del modelo y selecciona el modelo a implementar
    2. Haz clic en el botón Continue to subscribe
    3. Revisa cuidadosamente los detalles en la página Subscribe to this software. Si estás de acuerdo con el Acuerdo de licencia de usuario final (EULA) estándar, los precios y los términos de soporte, haz clic en “Accept Offer”
    4. Después de seleccionar Continue to configuration y elegir una región, se te presentará un Product Arn. Este es el ARN del paquete del modelo requerido para crear un modelo implementable usando Boto3
      1. Copia el ARN que corresponde a tu región seleccionada y úsalo en la siguiente celda
  2. Implementa el paquete del modelo

Desde aquí, crea un espacio JupyterLab en Sagemaker Studio, carga el cuaderno de Voyage y sigue las instrucciones dentro.


Preguntas frecuentes

¿Cómo calculo la distancia entre dos vectores de embedding?

La similitud coseno es una opción popular, pero la mayoría de las funciones de distancia funcionarán bien. Los embeddings de Voyage están normalizados a longitud 1, por lo tanto la similitud coseno es esencialmente lo mismo que el producto escalar entre dos vectores. Aquí hay un fragmento de código que puedes usar para calcular la similitud coseno entre dos vectores de embedding.

Python
import numpy

similarity = np.dot(embd1, embd2)
# Los embeddings de Voyage están normalizados a longitud 1, por lo tanto la similitud coseno
# es lo mismo que el producto escalar.

Si deseas encontrar los K vectores de embedding más cercanos en un gran corpus, recomendamos usar las capacidades integradas en la mayoría de las bases de datos vectoriales.

¿Puedo contar el número de tokens en una cadena antes de embeber?

¡Sí! Puedes hacerlo con el siguiente código.

Python
import voyageai

vo = voyageai.Client()
total_tokens = vo.count_tokens(["Texto de muestra"])

Precios

Visita la página de precios de Voyage para obtener los detalles de precios más actualizados.