Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Dividir documentos grandes en fragmentos más pequeños puede ayudarle a mantenerse bajo los límites máximos de entrada de tokens de modelos de incrustación. Por ejemplo, la longitud máxima del texto de entrada para el modelo Azure OpenAI text-embedding-ada-002 es de 8.191 tokens. Dado que cada token tiene alrededor de cuatro caracteres de texto para los modelos comunes de OpenAI, este límite máximo equivale a aproximadamente 6 000 palabras de texto. Si usas estos modelos para generar inserciones, es fundamental que el texto de entrada permanezca bajo el límite. La creación de particiones del contenido en fragmentos le ayuda a cumplir los requisitos del modelo de inserción y evita la pérdida de datos debido al truncamiento.
Se recomienda la vectorización integrada para la fragmentación e inserción de datos integrados. La vectorización integrada depende de los indexadores y conjuntos de aptitudes que dividen texto y generan incrustaciones. Si no puede usar la vectorización integrada, en este artículo se describen algunos enfoques alternativos para fragmentar el contenido.
Técnicas comunes de fragmentación
La fragmentación solo es necesaria si los documentos de origen son demasiado grandes para el tamaño máximo de entrada impuesto por los modelos, pero también es beneficioso si el contenido está mal representado como un solo vector. Considere una página wiki que cubre una gran cantidad de subtipos variados. Es posible que toda la página sea lo suficientemente pequeña como para cumplir los requisitos de entrada del modelo, pero es posible que obtenga mejores resultados si se fragmenta en un intervalo de agregación más preciso.
Estas son algunas técnicas comunes de fragmentación, asociadas a características integradas si usa indizadores y aptitudes.
Enfoque | Uso | Funcionalidad integrada |
---|---|---|
Fragmentos de tamaño fijo | Defina un tamaño fijo que sea suficiente para párrafos semánticamente significativos (por ejemplo, 200 palabras o 600 caracteres) y permita cierta superposición (por ejemplo, 10-15% del contenido) puede producir buenos fragmentos como entrada para insertar generadores de vectores. | Habilidad de Partición de Texto, partición por páginas (definidas por longitud de caracteres) |
Fragmentos de tamaño variable basados en características de contenido | Particione sus datos utilizando marcas de puntuación de fin de oración, marcadores de fin de línea o características de las bibliotecas de Procesamiento de Lenguaje Natural (NLP) que detectan la estructura del documento. El marcado incrustado, como HTML o Markdown, tiene sintaxis de encabezado que se puede usar para fragmentar datos por secciones. | Habilidad Diseño de Documento o Habilidad División de Texto, dividiendo por oraciones. |
Combinaciones personalizadas | Use una combinación de fragmentación fija y de tamaño variable o amplíe un enfoque. Por ejemplo, al trabajar con documentos grandes, puedes usar fragmentos de tamaño variable, pero también anexar el título del documento a fragmentos del centro del documento para evitar la pérdida de contexto. | Ninguno |
Análisis de documentos | Los indexadores pueden analizar documentos de origen más grandes en documentos de búsqueda más pequeños para la indexación. En términos estrictos, este enfoque no es fragmentado, pero a veces puede lograr el mismo objetivo. | Indexación de blobs y archivos Markdown o indexación de uno a varios o Indexación de blobs y archivos JSON |
Consideraciones de superposición de contenido
Al fragmentar datos en función del tamaño fijo, la superposición de una pequeña cantidad de texto entre fragmentos puede ayudar a conservar el contexto. Se recomienda comenzar con una superposición de aproximadamente el 10 %. Por ejemplo, dado un tamaño fijo de fragmento de 256 tokens, empezarías a probar con una superposición de 25 tokens. La cantidad real de superposición varía en función del tipo de datos y del caso de uso específico, pero encontramos que 10-15% funciona en muchos escenarios.
Factores para fragmentar datos
Cuando se trata de fragmentar datos, piensa en estos factores:
Forma y densidad de los documentos. Si necesitas texto o pasajes intactos, los fragmentos más grandes y la fragmentación variable que conserva la estructura de oraciones pueden generar mejores resultados.
Consultas de usuario: los fragmentos más grandes y las estrategias superpuestas ayudan a conservar el contexto y la riqueza semántica de las consultas destinadas a información específica.
Los modelos de lenguaje de gran tamaño (LLM) tienen directrices de rendimiento para el tamaño del fragmento. Encuentre un tamaño de fragmento que sea más eficaz para todos los modelos que está utilizando. Por ejemplo, si usas modelos para resúmenes e incrustaciones, elige un tamaño de fragmento óptimo que funcione para ambos.
Cómo encaja la fragmentación en el flujo de trabajo
Si tiene documentos grandes, inserte un paso de fragmentación en los flujos de trabajo de indexación y consulta que divida texto grande. Al usar la vectorización integrada, es habitual una estrategia de fragmentación predeterminada mediante la aptitud División de texto . También puede aplicar una estrategia de fragmentación personalizada mediante una aptitud personalizada. Algunas bibliotecas externas que proporcionan fragmentación incluyen:
La mayoría de las bibliotecas proporcionan técnicas comunes de fragmentación para un tamaño fijo, un tamaño variable o una combinación. También puede especificar una superposición que duplica una pequeña cantidad de contenido en cada fragmento para la conservación del contexto.
Ejemplos de fragmentación
Los siguientes ejemplos demuestran cómo se aplican las estrategias de fragmentación al archivo PDF Libro electrónico Earth at Night de la NASA:
Ejemplo de habilidad de división de texto
La fragmentación de datos integrada mediante la aptitud de división de texto está disponible con carácter general.
Esta sección se describe la fragmentación de datos integrada con un enfoque basado en aptitudes y parámetros de la aptitud de división de texto.
Puede encontrar un cuaderno de muestra para este ejemplo en el repositorio azure-search-vector-samples.
Establezca textSplitMode
para dividir el contenido en fragmentos más pequeños:
pages
(valor predeterminado). Los fragmentos se componen de varias oraciones.sentences
. Los fragmentos se componen de frases simples. Lo que constituye una "oración" depende del lenguaje. En inglés, se usa una puntuación final de oración estándar, como.
o!
. El idioma se controla mediante el parámetrodefaultLanguageCode
.
El parámetro pages
agrega parámetros adicionales:
maximumPageLength
define el número máximo de caracteres 1 o tokens 2 en cada fragmentoº. El separador de texto evita dividir las oraciones, por lo que el recuento de caracteres real depende del contenido.pageOverlapLength
define cuántos caracteres del final de la página anterior se incluyen al principio de la página siguiente. Si se establece, debe ser menor que la mitad de la longitud máxima de la página.maximumPagesToTake
define cuántas páginas o fragmentos se van a tomar de un documento. El valor predeterminado es 0, lo que significa tomar todas las páginas o fragmentos del documento.
1 Los caracteres no se alinean con la definición de un token. El número de tokens medidos por el LLM podría ser diferente del tamaño de carácter medido por la aptitud División de texto.
2 La fragmentación de tokens está disponible en la 2024-09-01-preview e incluye parámetros adicionales para especificar un tokenizador y cualquier token que no deba dividirse durante la fragmentación.
La siguiente tabla muestra cómo la elección de parámetros afecta el recuento total de fragmentos del libro electrónico Earth at Night:
textSplitMode |
maximumPageLength |
pageOverlapLength |
Recuento total de fragmentos |
---|---|---|---|
pages |
1 000 | 0 | 172 |
pages |
1 000 | 200 | 216 |
pages |
2000 | 0 | 85 |
pages |
2000 | 500 | 113 |
pages |
cinco mil | 0 | 34 |
pages |
cinco mil | 500 | 38 |
sentences |
No Disponible | No Disponible | 13361 |
El uso de un textSplitMode
de pages
da como resultado que la mayoría de los fragmentos tienen recuentos de caracteres totales cerca de maximumPageLength
. El recuento de caracteres de fragmento varía debido a las diferencias en las que los límites de oración se encuentran dentro del fragmento. La longitud del token de fragmento varía debido a las diferencias en el contenido del fragmento.
Los siguientes histogramas muestran cómo la distribución de la longitud de caracteres por fragmento se compara con la longitud de tokens por fragmento para gpt-35-turbo cuando se utiliza un textSplitMode
de pages
, un maximumPageLength
de 2000 y un pageOverlapLength
de 500 en el libro electrónico La Tierra por la noche:
El uso de un textSplitMode
de sentences
da como resultado un gran número de fragmentos que constan de oraciones individuales. Estos fragmentos son más pequeños que los generados por pages
y el recuento de tokens de los fragmentos coincide más estrechamente con los recuentos de caracteres.
Los histogramas siguientes muestran cómo la distribución de la longitud de caracteres de fragmento se compara con la longitud del token de fragmento para gpt-35-turbo cuando se usa un textSplitMode
de sentences
en el libro electrónico Earth at Night:
La elección óptima de parámetros depende de cómo se usen los fragmentos. Para la mayoría de las aplicaciones, se recomienda empezar con los siguientes parámetros predeterminados:
textSplitMode |
maximumPageLength |
pageOverlapLength |
---|---|---|
pages |
2000 | 500 |
Ejemplo de fragmentación de datos de LangChain
LangChain proporciona cargadores de documentos y divisores de texto. En este ejemplo se muestra cómo cargar un PDF, obtener recuentos de tokens y configurar un divisor de texto. Obtener recuentos de tokens le ayuda a tomar una decisión informada sobre el dimensionamiento de fragmentos.
Puede encontrar un cuaderno de muestra para este ejemplo en el repositorio azure-search-vector-samples.
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("./data/earth_at_night_508.pdf")
pages = loader.load()
print(len(pages))
La salida indica 200 documentos o páginas en el PDF.
Para obtener un recuento estimado de tokens para estas páginas, use TikToken.
import tiktoken
tokenizer = tiktoken.get_encoding('cl100k_base')
def tiktoken_len(text):
tokens = tokenizer.encode(
text,
disallowed_special=()
)
return len(tokens)
tiktoken.encoding_for_model('gpt-3.5-turbo')
# create the length function
token_counts = []
for page in pages:
token_counts.append(tiktoken_len(page.page_content))
min_token_count = min(token_counts)
avg_token_count = int(sum(token_counts) / len(token_counts))
max_token_count = max(token_counts)
# print token counts
print(f"Min: {min_token_count}")
print(f"Avg: {avg_token_count}")
print(f"Max: {max_token_count}")
La salida indica que ninguna página tiene cero tokens, la longitud media del token por página es de 189 tokens y el número máximo de tokens de cualquier página es 1583.
Conocer el tamaño medio y máximo del token le proporciona información sobre cómo establecer el tamaño del fragmento. Aunque podría usar la recomendación estándar de 2.000 caracteres con una superposición de 500 caracteres, en este caso tiene sentido optar por menos debido a los recuentos de tokens del documento de muestra. De hecho, establecer un valor de superposición demasiado grande puede provocar que no aparezca ninguna superposición.
from langchain.text_splitter import RecursiveCharacterTextSplitter
# split documents into text and embeddings
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len,
is_separator_regex=False
)
chunks = text_splitter.split_documents(pages)
print(chunks[20])
print(chunks[21])
La salida de dos fragmentos consecutivos muestra el texto del primer fragmento que se superpone al segundo fragmento. La salida se edita ligeramente para mejorar la legibilidad.
'x Earth at NightForeword\nNASA’s Earth at Night explores the brilliance of our planet when it is in darkness. \n It is a compilation of stories depicting the interactions between science and \nwonder, and I am pleased to share this visually stunning and captivating exploration of \nour home planet.\nFrom space, our Earth looks tranquil. The blue ethereal vastness of the oceans \nharmoniously shares the space with verdant green land—an undercurrent of gentle-ness and solitude. But spending time gazing at the images presented in this book, our home planet at night instantly reveals a different reality. Beautiful, filled with glow-ing communities, natural wonders, and striking illumination, our world is bustling with activity and life.**\nDarkness is not void of illumination. It is the contrast, the area between light and'** metadata={'source': './data/earth_at_night_508.pdf', 'page': 9}
'**Darkness is not void of illumination. It is the contrast, the area between light and **\ndark, that is often the most illustrative. Darkness reminds me of where I came from and where I am now—from a small town in the mountains, to the unique vantage point of the Nation’s capital. Darkness is where dreamers and learners of all ages peer into the universe and think of questions about themselves and their space in the cosmos. Light is where they work, where they gather, and take time together.\nNASA’s spacefaring satellites have compiled an unprecedented record of our \nEarth, and its luminescence in darkness, to captivate and spark curiosity. These missions see the contrast between dark and light through the lenses of scientific instruments. Our home planet is full of complex and dynamic cycles and processes. These soaring observers show us new ways to discern the nuances of light created by natural and human-made sources, such as auroras, wildfires, cities, phytoplankton, and volcanoes.' metadata={'source': './data/earth_at_night_508.pdf', 'page': 9}
Habilidad personalizada
Una muestra de generación de fragmentación e inserción de tamaño fijo muestra la generación de fragmentación e inserción de vectores mediante modelos de inserción de Azure OpenAI. En este ejemplo se usa una habilidad personalizada de Búsqueda de Azure AI en el repositorio Power Skills para encapsular el paso de fragmentación.