Recuperación contextual en antrópico utilizando bases de conocimiento de roca madre de Amazon

Para que un modelo de IA se desempeñe de manera efectiva en dominios especializados, requiere acceso a un conocimiento previo relevante. Un asistente de chat de atención al cliente, por ejemplo, necesita información detallada sobre el negocio al que sirve, y una herramienta de análisis legal debe recurrir a una base de datos completa de casos pasados.

Para equipar modelos de idiomas grandes (LLMS) Con este conocimiento, los desarrolladores a menudo usan Generación aumentada de recuperación (TRAPO). Esta técnica recupera la información pertinente de una base de conocimiento y la incorpora a la solicitud del usuario, mejorando significativamente las respuestas del modelo. Sin embargo, una limitación clave de los sistemas de RAG tradicionales es que a menudo pierden matices contextuales al codificar datos, lo que lleva a recuperaciones irrelevantes o incompletas de la base de conocimiento.

Desafíos en el trapo tradicional

En el trapo tradicional, los documentos a menudo se dividen en trozos más pequeños para optimizar la eficiencia de recuperación. Aunque este método funciona bien en muchos casos, puede introducir desafíos cuando los fragmentos individuales carecen del contexto necesario. Por ejemplo, si una política establece que el trabajo remoto requiere “6 meses de tenencia” (fragmento 1) y “aprobación de recursos humanos para excepciones” (fragmento 3), pero omite la fragmentación media que vincula las excepciones con la aprobación del gerente, un usuario que pregunta sobre la elegibilidad para un empleado de 3 meses de tenencia podría recibir un “no” inquieto en lugar de la “solo con la aprobación de la HR”. Esto ocurre porque los fragmentos aislados no pueden preservar las dependencias entre las cláusulas, destacando una limitación clave de las estrategias básicas de fragmentación en los sistemas de trapo.

La recuperación contextual mejora el RAG tradicional al agregar un contexto explicativo específico de fragmento a cada fragmento antes de generar incrustaciones. Este enfoque enriquece la representación vectorial con información contextual relevante, lo que permite una recuperación más precisa del contenido relacionado semánticamente al responder a las consultas de los usuarios. Por ejemplo, cuando se le pregunta sobre la elegibilidad del trabajo remoto, obtiene tanto el requisito de tenencia como la cláusula de excepción de recursos humanos, lo que permite que el LLM proporcione una respuesta precisa como “Normalmente no, pero HR puede aprobar excepciones”. Al coser de manera inteligente la información fragmentada, la recuperación contextual mitiga las trampas de la fragmentación rígida, entregando respuestas más confiables y matizadas.

En esta publicación, demostramos cómo usar la recuperación contextual con antropía y roca de Amazon Bases de conocimiento.

Descripción general de la solución

Esta solución utiliza bases de conocimiento de roca madre de Amazon, incorporando una función lambda personalizada para transformar datos durante el proceso de ingestión de la base de conocimiento. Esta función lambda procesa documentos de Servicio de almacenamiento simple de Amazon (Amazon S3), los fragmenta en piezas más pequeñas, enriquece cada fragmento con información contextual utilizando Claude de Anthrope en la roca madre de Amazon, y luego guarda los resultados a un cubo S3 intermedio. Aquí hay una explicación paso a paso:

  1. Lea los archivos de entrada de un cubo S3 especificado en el evento.
  2. Datos de entrada de fragmentos en fragmentos más pequeños.
  3. Genere información contextual para cada fragmento utilizando Claude 3 Haiku de Anthrope
  4. Escriba trozos procesados ​​con sus metadatos de regreso al cubo S3 intermedio

El siguiente diagrama es la arquitectura de la solución.

Requisitos previos

Para implementar la solución, complete los siguientes pasos de requisito previo:

Antes de comenzar, puede implementar esta solución descargando los archivos requeridos y siguiendo las instrucciones en sus correspondientes Repositorio de Github. Esta arquitectura se basa en la solución de fragmentación propuesta para implementar la recuperación contextual utilizando las bases de conocimiento de Amazon Bedrock.

Implementar la recuperación contextual en la roca madre de Amazon

En esta sección, demostramos cómo usar la solución de fragmentación personalizada propuesta para implementar la recuperación contextual utilizando las bases de conocimiento de Amazon Bedrock. Los desarrolladores pueden usar estrategias de fragmentación personalizadas en Amazon Bedrock para optimizar cómo los documentos o conjuntos de datos grandes se dividen en piezas más pequeñas y más manejables para procesar por modelos de base (FMS). Este enfoque permite un manejo más eficiente y efectivo del contenido de forma larga, mejorando la calidad de las respuestas. Al adaptar el método de fragmentación a las características específicas de los datos y los requisitos de la tarea en cuestión, los desarrolladores pueden mejorar el rendimiento de las aplicaciones de procesamiento del lenguaje natural construidas en el lecho de roca de Amazon. La fragmentación personalizada puede involucrar técnicas como segmentación semántica, ventanas deslizantes con superposición o usar estructura de documentos para crear divisiones lógicas en el texto.

Para implementar la recuperación contextual en Amazon Bedrock, complete los siguientes pasos, que se pueden encontrar en el cuaderno en el Repositorio de Github.

Para configurar el entorno, siga estos pasos:

  1. Instale las dependencias requeridas:
    %pip install --upgrade pip --quiet %pip install -r requirements.txt --no-deps

  2. Importar las bibliotecas requeridas y configurar clientes AWS:
    import os
    import sys
    import time
    import boto3
    import logging
    import pprint
    import json
    from pathlib import Path
    
    # AWS Clients Setup
    s3_client = boto3.client('s3')
    sts_client = boto3.client('sts')
    session = boto3.session.Session()
    region = session.region_name
    account_id = sts_client.get_caller_identity()["Account"]
    bedrock_agent_client = boto3.client('bedrock-agent')
    bedrock_agent_runtime_client = boto3.client('bedrock-agent-runtime')
    
    # Configure logging
    logging.basicConfig(
        format="[%(asctime)s] p%(process)s {%(filename)s:%(lineno)d} %(levelname)s - %(message)s",
        level=logging.INFO
    )
    logger = logging.getLogger(__name__)

  3. Definir los parámetros de la base de conocimiento:
    # Generate unique suffix for resource names
    timestamp_str = time.strftime("%Y%m%d%H%M%S", time.localtime(time.time()))[-7:]
    suffix = f"{timestamp_str}"
    
    # Resource names
    knowledge_base_name_standard = 'standard-kb'
    knowledge_base_name_custom = 'custom-chunking-kb'
    knowledge_base_description = "Knowledge Base containing complex PDF."
    bucket_name = f'{knowledge_base_name_standard}-{suffix}'
    intermediate_bucket_name = f'{knowledge_base_name_standard}-intermediate-{suffix}'
    lambda_function_name = f'{knowledge_base_name_custom}-lambda-{suffix}'
    foundation_model = "anthropic.claude-3-sonnet-20240229-v1:0"
    
    # Define data sources
    data_source=[{"type": "S3", "bucket_name": bucket_name}]

Crear bases de conocimiento con diferentes estrategias de fragmentación

Para crear bases de conocimiento con diferentes estrategias de fragmentación, use el siguiente código.

  1. Fragmentación estándar fija:
    # Create knowledge base with fixed chunking
    knowledge_base_standard = BedrockKnowledgeBase(
        kb_name=f'{knowledge_base_name_standard}-{suffix}',
        kb_description=knowledge_base_description,
        data_sources=data_source,
        chunking_strategy="FIXED_SIZE",
        suffix=f'{suffix}-f'
    )
    
    # Upload data to S3
    def upload_directory(path, bucket_name):
        for root, dirs, files in os.walk(path):
            for file in files:
                file_to_upload = os.path.join(root, file)
                if file not in ["LICENSE", "NOTICE", "README.md"]:
                    print(f"uploading file {file_to_upload} to {bucket_name}")
                    s3_client.upload_file(file_to_upload, bucket_name, file)
                else:
                    print(f"Skipping file {file_to_upload}")
    
    upload_directory("../synthetic_dataset", bucket_name)
    
    # Start ingestion job
    time.sleep(30)  # ensure KB is available
    knowledge_base_standard.start_ingestion_job()
    kb_id_standard = knowledge_base_standard.get_knowledge_base_id()

  2. Formas personalizadas con la función Lambda
    # Create Lambda function for custom chunking
    def create_lambda_function():
        with open('lambda_function.py', 'r') as file:
            lambda_code = file.read()
       
        response = lambda_client.create_function(
            FunctionName=lambda_function_name,
            Runtime="python3.9",
            Role=lambda_role_arn,
            Handler="lambda_function.lambda_handler",
            Code={'ZipFile': lambda_code.encode()},
            Timeout=900,
            MemorySize=256
        )
        return response['FunctionArn']
    
    # Create knowledge base with custom chunking
    knowledge_base_custom = BedrockKnowledgeBase(
        kb_name=f'{knowledge_base_name_custom}-{suffix}',
        kb_description=knowledge_base_description,
        data_sources=data_source,
        lambda_function_name=lambda_function_name,
        intermediate_bucket_name=intermediate_bucket_name,
        chunking_strategy="CUSTOM",
        suffix=f'{suffix}-c'
    )
    
    # Start ingestion job
    time.sleep(30)
    knowledge_base_custom.start_ingestion_job()
    kb_id_custom = knowledge_base_custom.get_knowledge_base_id()

Evaluar el rendimiento utilizando el marco ragas

Para evaluar el rendimiento utilizando el marco Ragas, siga estos pasos:

  1. Configurar la evaluación de ragas:
    from ragas import SingleTurnSample, EvaluationDataset
    from ragas import evaluate
    from ragas.metrics import (
    context_recall,
    context_precision,
    answer_correctness
    )
    
    # Initialize Bedrock models for evaluation
    TEXT_GENERATION_MODEL_ID = "anthropic.claude-3-haiku-20240307-v1:0"
    EVALUATION_MODEL_ID = "anthropic.claude-3-sonnet-20240229-v1:0"
    
    llm_for_evaluation = ChatBedrock(model_id=EVALUATION_MODEL_ID, client=bedrock_client)
    bedrock_embeddings = BedrockEmbeddings(
    model_id="amazon.titan-embed-text-v2:0",
    client=bedrock_client
    )

  2. Prepare el conjunto de datos de evaluación:
    # Define test questions and ground truths
    questions = [
    "What was the primary reason for the increase in net cash provided by operating activities for Octank Financial in 2021?",
    "In which year did Octank Financial have the highest net cash used in investing activities, and what was the primary reason for this?",
    # Add more questions...
    ]
    
    ground_truths = [
    "The increase in net cash provided by operating activities was primarily due to an increase in net income and favorable changes in operating assets and liabilities.",
    "Octank Financial had the highest net cash used in investing activities in 2021, at $360 million...",
    # Add corresponding ground truths...
    ]
    
    def prepare_eval_dataset(kb_id, questions, ground_truths):
    samples = []
    for question, ground_truth in zip(questions, ground_truths):
    # Get response and context
    response = retrieve_and_generate(question, kb_id)
    answer = response["output"]["text"]
    
    # Process contexts
    contexts = []
    for citation in response["citations"]:
    context_texts = [
    ref["content"]["text"]
    for ref in citation["retrievedReferences"]
    if "content" in ref and "text" in ref["content"]
    ]
    contexts.extend(context_texts)
    
    # Create sample
    sample = SingleTurnSample(
    user_input=question,
    retrieved_contexts=contexts,
    response=answer,
    reference=ground_truth
    )
    samples.append(sample)
    
    return EvaluationDataset(samples=samples)

  3. Ejecutar la evaluación y comparar los resultados:
    # Evaluate both approaches
    contextual_chunking_dataset = prepare_eval_dataset(kb_id_custom, questions, ground_truths)
    default_chunking_dataset = prepare_eval_dataset(kb_id_standard, questions, ground_truths)
    
    # Define metrics
    metrics = [context_recall, context_precision, answer_correctness]
    
    # Run evaluation
    contextual_chunking_result = evaluate(
    dataset=contextual_chunking_dataset,
    metrics=metrics,
    llm=llm_for_evaluation,
    embeddings=bedrock_embeddings,
    )
    
    default_chunking_result = evaluate(
    dataset=default_chunking_dataset,
    metrics=metrics,
    llm=llm_for_evaluation,
    embeddings=bedrock_embeddings,
    )
    
    # Compare results
    comparison_df = pd.DataFrame({
    'Default Chunking': default_chunking_result.to_pandas().mean(),
    'Contextual Chunking': contextual_chunking_result.to_pandas().mean()
    })
    
    # Visualize results
    def highlight_max(s):
    is_max = s == s.max()
    return ['background-color: #90EE90' if v else '' for v in is_max]
    
    comparison_df.style.apply(
    highlight_max,
    axis=1,
    subset=['Default Chunking', 'Contextual Chunking']

Puntos de referencia de rendimiento

Para evaluar el rendimiento del enfoque de recuperación contextual propuesto, Utilizamos la Guía de decisión de AWS: Elegir un servicio de IA generativo Como documento para pruebas de trapo. Configuramos dos bases de conocimiento de roca madre de Amazon para la evaluación:

  • Una base de conocimiento con la estrategia de fragmentación predeterminada, que utiliza 300 tokens por fragmento con una superposición del 20%
  • Otra base de conocimiento con el enfoque de fragmentación de recuperación contextual personalizada, que tiene un transformador de lambda de recuperación contextual personalizada además de la estrategia de fragmentación fija que también usa 300 tokens por fragmento con una superposición del 20%

Utilizamos el marco Ragas para evaluar el rendimiento de estos dos enfoques utilizando pequeños conjuntos de datos. Específicamente, observamos las siguientes métricas:

  • context_recall – El recuerdo del contexto mide cuántos de los documentos relevantes (o piezas de información) se recuperaron con éxito
  • context_precision – La precisión del contexto es una métrica que mide la proporción de trozos relevantes en el retrieved_contexts
  • answer_correctness – La evaluación de la corrección de la respuesta implica medir la precisión de la respuesta generada en comparación con la verdad del suelo
from ragas import SingleTurnSample, EvaluationDataset
from ragas import evaluate
from ragas.metrics import (
    context_recall,
    context_precision,
    answer_correctness
)

#specify the metrics here
metrics = [
    context_recall,
    context_precision,
    answer_correctness
]

questions = [
    "What are the main AWS generative AI services covered in this guide?",
    "How does Amazon Bedrock differ from the other generative AI services?",
    "What are some key factors to consider when choosing a foundation model for your use case?",
    "What infrastructure services does AWS offer to support training and inference of large AI models?",
    "Where can I find more resources and information related to the AWS generative AI services?"
]
ground_truths = [
    "The main AWS generative AI services covered in this guide are Amazon Q Business, Amazon Q Developer, Amazon Bedrock, and Amazon SageMaker AI.",
    "Amazon Bedrock is a fully managed service that allows you to build custom generative AI applications with a choice of foundation models, including the ability to fine-tune and customize the models with your own data.",
    "Key factors to consider when choosing a foundation model include the modality (text, image, etc.), model size, inference latency, context window, pricing, fine-tuning capabilities, data quality and quantity, and overall quality of responses.",
    "AWS offers specialized hardware like AWS Trainium and AWS Inferentia to maximize the performance and cost-efficiency of training and inference for large AI models.",
    "You can find more resources like architecture diagrams, whitepapers, and solution guides on the AWS website. The document also provides links to relevant blog posts and documentation for the various AWS generative AI services."
]

Los resultados obtenidos utilizando la estrategia de fragmentación predeterminada se presentan en la siguiente tabla.

Los resultados obtenidos utilizando la estrategia de fragmentación de recuperación contextual se presentan en la siguiente tabla. Demuestra un rendimiento mejorado en las métricas clave evaluadas, incluido el recuerdo del contexto, la precisión del contexto y la corrección de respuestas.

Al agregar los resultados, podemos observar que el enfoque de fragmentación contextual superó la estrategia de fragmentación predeterminada en todo el context_recall, context_precisiony answer_correctness métrica. Esto indica los beneficios de las técnicas de recuperación contextuales más sofisticadas implementadas.

Consideraciones de implementación

Al implementar la recuperación contextual utilizando el lecho de roca de Amazon, varios factores necesitan una consideración cuidadosa. Primero, la estrategia de fragmentación personalizada debe optimizarse tanto para el rendimiento como para la precisión, lo que requiere pruebas exhaustivas en diferentes tipos y tamaños de documentos. La asignación de memoria y la configuración de tiempo de espera de la función Lambda deben calibrarse en función de los requisitos esperados de complejidad y procesamiento de documentos, con recomendaciones iniciales de memoria de 1024 MB y tiempo de espera de 900 segundos que sirven como configuraciones de referencia. Las organizaciones también deben configurar los roles de IAM con el principio de menor privilegio mientras mantienen permisos suficientes para que Lambda interactúe con Amazon S3 y Amazon Bedrock Services. Además, el proceso de vectorización y la configuración de la base de conocimiento deben ajustarse para equilibrar entre la precisión de la recuperación y la eficiencia computacional, particularmente al escalar a conjuntos de datos más grandes.

La escalabilidad de la infraestructura y las consideraciones de monitoreo son igualmente cruciales para la implementación exitosa. Las organizaciones deben implementar mecanismos sólidos de manejo de errores dentro de la función Lambda para administrar varios formatos de documentos y fallas potenciales de procesamiento con gracia. Se deben establecer sistemas de monitoreo para rastrear las métricas clave, como el rendimiento de la fragmentación, la precisión de la recuperación y la latencia del sistema, permitiendo la optimización y el mantenimiento proactivos.

El uso de Langfuse con el lecho de roca de Amazon es una buena opción para introducir la observabilidad de esta solución. La estructura del cubo S3 para el almacenamiento de fuente e intermedia debe diseñarse con políticas claras del ciclo de vida y controles de acceso y considerar los requisitos de disponibilidad y residencia de datos regionales. Además, la implementación de un enfoque de implementación por etapas, comenzando con un subconjunto de datos antes de escalar a las cargas de trabajo de producción completa, puede ayudar a identificar y abordar posibles cuellos de botella u oportunidades de optimización al principio del proceso de implementación.

Limpieza

Cuando haya terminado de experimentar con la solución, limpie los recursos que creó para evitar incurrir en cargos futuros.

Conclusión

Al combinar los modelos lingüísticos sofisticados de Anthrope con la robusta infraestructura de la roca madre de Amazon, las organizaciones ahora pueden implementar sistemas inteligentes para la recuperación de información que ofrecen respuestas matizadas profundamente contextualizadas. Los pasos de implementación descritos en esta publicación proporcionan una vía clara para que las organizaciones usen capacidades de recuperación contextual a través de Amazon Bedrock. Siguiendo el proceso de configuración detallado, desde la configuración de los permisos de IAM hasta la implementación de estrategias de fragmentación personalizadas, los desarrolladores y organizaciones pueden desbloquear todo el potencial de los sistemas AI conscientes del contexto.

Al aprovechar los modelos lingüísticos de Anthrope, las organizaciones pueden ofrecer resultados más precisos y significativos a sus usuarios mientras se mantienen a la vanguardia de la innovación de IA. Puede comenzar hoy con la recuperación contextual utilizando los modelos lingüísticos de Anthrope a través de Amazon Bedrock y transformar cómo su IA procesa la información con una prueba de concepto a pequeña escala utilizando sus datos existentes. Para una guía personalizada sobre la implementación, comuníquese con su equipo de cuenta de AWS.


Sobre los autores

Suheel farooq es ingeniero principal en la ingeniería de apoyo de AWS, especializada en IA generativa, inteligencia artificial y aprendizaje automático. Como experto en la materia en Amazon Bedrock y Sagemaker, ayuda a los clientes empresariales a diseñar, construir, modernizar y escalar sus cargas de trabajo AI/ML y AI generativas en AWS. En su tiempo libre, a Suheel le gusta hacer ejercicio y caminar.

Autor QingweiQingwei Li es especialista en aprendizaje automático en Amazon Web Services. Recibió su Ph.D. En la investigación de operaciones después de que rompió la cuenta de subvenciones de investigación de su asesor y no pudo entregar el Premio Nobel que prometió. Actualmente ayuda a los clientes en la industria de servicios financieros y de seguros a construir soluciones de aprendizaje automático en AWS. En su tiempo libre, le gusta leer y enseñar.

Vinita es un arquitecto de soluciones especializadas sin servidor senior en AWS. Combina el conocimiento de AWS con una fuerte perspicacia empresarial con las soluciones innovadoras de arquitecto que generan un valor cuantificable para los clientes y ha sido excepcional para navegar en desafíos complejos. La experiencia técnica de Vinita en la modernización de aplicaciones, la genai, la computación en la nube y la capacidad de impulsar el impacto comercial medible le hacen mostrar un gran impacto en el viaje de los clientes con AWS.

Sharon Li es un arquitecto de soluciones especializadas de IA/ML en Amazon Web Services (AWS) con sede en Boston, Massachusetts. Con una pasión por aprovechar la tecnología de vanguardia, Sharon está a la vanguardia de desarrollar e implementar soluciones innovadoras de IA generativas en la plataforma AWS Cloud.

Venkata Moparthi es un arquitecto senior de soluciones, se especializa en migraciones en la nube, IA generativa y arquitectura segura para servicios financieros y otras industrias. Combina experiencia técnica con estrategias centradas en el cliente para acelerar la transformación digital e impulsar los resultados comerciales a través de soluciones en la nube optimizadas.