Embeddings
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:
- Regístrate en el sitio web de Voyage AI
- Obtén una clave API
- Establece la clave API como una variable de entorno para mayor comodidad:
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:
pip install -U voyageai
Luego, puedes crear un objeto cliente y comenzar a usarlo para embeber tus textos:
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:
[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 paravoyage-2
y 120K paravoyage-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 esNone
. 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 especificarinput_type
comoquery
odocument
, 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
- Cuando input_type se establece en
- 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
- Si es
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:
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:
{
"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 paravoyage-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 esNone
. 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
- Si es
- 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
- Si no se especifica (por defecto
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
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
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,
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.
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:
Modelo | Longitud de contexto | Dimensión de embedding | Descripción |
---|---|---|---|
voyage-large-2 | 16000 | 1536 | El modelo de embedding generalista más potente de Voyage AI. |
voyage-code-2 | 16000 | 1536 | Optimizado 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-2 | 4000 | 1024 | Modelo de embedding generalista base optimizado tanto para latencia como para calidad. |
voyage-lite-02-instruct | 4000 | 1024 | Ajustado 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:
- Suscríbete al paquete del modelo
- Navega a la página de listado del paquete del modelo y selecciona el modelo a implementar
- Haz clic en el botón
Continue to subscribe
- 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” - 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- Copia el ARN que corresponde a tu región seleccionada y úsalo en la siguiente celda
- 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.
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.
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.