Generativ dataintelligens

Tal med dit slide-dæk ved hjælp af multimodale fundamentmodeller hostet på Amazon Bedrock – Del 2 | Amazon Web Services

Dato:

In del 1 af denne serie præsenterede vi en løsning, der brugte Amazon Titan Multimodal Embeddings model til at konvertere individuelle dias fra et diasdæk til indlejringer. Vi gemte indlejringerne i en vektordatabase og brugte derefter Stor sprog- og synsassistent (LLaVA 1.5-7b) model til at generere tekstsvar på brugerspørgsmål baseret på det mest lignende dias hentet fra vektordatabasen. Vi brugte AWS-tjenester, herunder Amazonas grundfjeld, Amazon SageMakerog Amazon OpenSearch Serverløs i denne løsning.

I dette indlæg demonstrerer vi en anderledes tilgang. Vi bruger Antropiske Claude 3 sonet model til at generere tekstbeskrivelser for hvert dias i diasdækket. Disse beskrivelser konverteres derefter til tekstindlejringer ved hjælp af Amazon Titan-tekstindlejringer model og gemt i en vektordatabase. Derefter bruger vi Claude 3 Sonnet-modellen til at generere svar på brugerspørgsmål baseret på den mest relevante tekstbeskrivelse hentet fra vektordatabasen.

Du kan teste begge tilgange til dit datasæt og evaluere resultaterne for at se, hvilken tilgang der giver dig de bedste resultater. I del 3 af denne serie evaluerer vi resultaterne af begge metoder.

Løsningsoversigt

Løsningen giver en implementering til besvarelse af spørgsmål ved hjælp af information indeholdt i tekst og visuelle elementer i et diasspil. Designet bygger på konceptet Retrieval Augmented Generation (RAG). Traditionelt har RAG været forbundet med tekstdata, der kan behandles af store sprogmodeller (LLM'er). I denne serie udvider vi RAG til også at omfatte billeder. Dette giver en kraftfuld søgefunktion til at udtrække kontekstuelt relevant indhold fra visuelle elementer som tabeller og grafer sammen med tekst.

Denne løsning indeholder følgende komponenter:

  • Amazon Titan Text Embeddings er en tekstindlejringsmodel, der konverterer tekst i naturligt sprog, inklusive enkelte ord, sætninger eller endda store dokumenter, til numeriske repræsentationer, der kan bruges til kraftanvendelsestilfælde såsom søgning, personalisering og klyngedannelse baseret på semantisk lighed.
  • Claude 3 Sonnet er den næste generation af state-of-the-art modeller fra Anthropic. Sonnet er et alsidigt værktøj, der kan håndtere en bred vifte af opgaver, fra komplekse ræsonnementer og analyser til hurtige output, samt effektiv søgning og genfinding på tværs af enorme mængder af information.
  • OpenSearch Serverless er en on-demand serverløs konfiguration til Amazon OpenSearch Service. Vi bruger OpenSearch Serverless som en vektordatabase til lagring af indlejringer genereret af Amazon Titan Text Embeddings-modellen. Et indeks oprettet i OpenSearch Serverless-samlingen fungerer som vektorlageret for vores RAG-løsning.
  • Amazon OpenSearch-indtagelse (OSI) er en fuldt administreret, serverløs dataindsamler, der leverer data til OpenSearch Service-domæner og OpenSearch Serverless-samlinger. I dette indlæg bruger vi en OSI pipeline API til at levere data til OpenSearch Serverless vektorlager.

Løsningsdesignet består af to dele: indtagelse og brugerinteraktion. Under indtagelse behandler vi input-dias-dækket ved at konvertere hvert dias til et billede, generere beskrivelser og tekstindlejringer for hvert billede. Vi udfylder derefter vektordatalageret med indlejringerne og tekstbeskrivelsen for hvert dias. Disse trin udføres før brugerinteraktionstrinene.

I brugerinteraktionsfasen konverteres et spørgsmål fra brugeren til tekstindlejringer. Der køres en lighedssøgning på vektordatabasen for at finde en tekstbeskrivelse svarende til et slide, der potentielt kan indeholde svar på brugerspørgsmålet. Vi leverer derefter diasbeskrivelsen og brugerspørgsmålet til Claude 3 Sonnet-modellen for at generere et svar på forespørgslen. Al koden til dette indlæg er tilgængelig i GitHub hvile.

Følgende diagram illustrerer indtagelsesarkitekturen.

Arbejdsgangen består af følgende trin:

  1. Slides konverteres til billedfiler (én pr. slide) i JPG-format og videregives til Claude 3 Sonnet-modellen for at generere tekstbeskrivelse.
  2. Dataene sendes til Amazon Titan Text Embeddings-modellen for at generere indlejringer. I denne serie bruger vi slide deck Træn og implementer stabil diffusion ved hjælp af AWS Trainium & AWS Inferentia fra AWS-topmødet i Toronto, juni 2023 for at demonstrere løsningen. Prøvedækket har 31 dias, derfor genererer vi 31 sæt vektorindlejringer, hver med 1536 dimensioner. Vi tilføjer yderligere metadatafelter for at udføre omfattende søgeforespørgsler ved hjælp af OpenSearchs kraftfulde søgefunktioner.
  3. Indlejringerne indsættes i en OSI-pipeline ved hjælp af et API-kald.
  4. OSI-pipelinen indtager dataene som dokumenter i et OpenSearch Serverless-indeks. Indekset er konfigureret som sink for denne pipeline og oprettes som en del af OpenSearch Serverless-samlingen.

Følgende diagram illustrerer brugerinteraktionsarkitekturen.

Arbejdsgangen består af følgende trin:

  1. En bruger indsender et spørgsmål, der er relateret til den diasserie, der er blevet indtaget.
  2. Brugerinputtet konverteres til indlejringer ved hjælp af Amazon Titan Text Embeddings-modellen, der tilgås ved hjælp af Amazon Bedrock. En OpenSearch Service-vektorsøgning udføres ved hjælp af disse indlejringer. Vi udfører en k-nearest neighbor (k-NN) søgning for at hente de mest relevante indlejringer, der matcher brugerforespørgslen.
  3. Metadataene for svaret fra OpenSearch Serverless indeholder en sti til billedet og beskrivelse svarende til det mest relevante slide.
  4. En prompt oprettes ved at kombinere brugerspørgsmålet og billedbeskrivelsen. Prompten leveres til Claude 3 Sonnet, der er vært på Amazon Bedrock.
  5. Resultatet af denne slutning returneres til brugeren.

Vi diskuterer trinene for begge stadier i de følgende afsnit og inkluderer detaljer om outputtet.

Forudsætninger

For at implementere løsningen i dette indlæg, bør du have en AWS-konto og kendskab til FM'er, Amazon Bedrock, SageMaker og OpenSearch Service.

Denne løsning bruger modellerne Claude 3 Sonnet og Amazon Titan Text Embeddings, der er hostet på Amazon Bedrock. Sørg for, at disse modeller er aktiveret til brug ved at navigere til Modeladgang side på Amazon Bedrock-konsollen.

Hvis modeller er aktiveret, vil Adgangsstatus vil oplyse Adgang tildelt.

Hvis modellerne ikke er tilgængelige, aktiver adgang ved at vælge Administrer modeladgang, valg af modeller og valg Anmod om modeladgang. Modellerne er aktiveret til brug med det samme.

Brug AWS CloudFormation til at oprette løsningsstakken

Du kan bruge AWS CloudFormation til at oprette løsningsstakken. Hvis du har oprettet løsningen til del 1 i den samme AWS-konto, skal du sørge for at slette den, før du opretter denne stak.

AWS-regionen Link
us-east-1
us-west-2

Når stakken er oprettet, skal du navigere til stakkens Output-fane på AWS CloudFormation-konsollen og notere værdierne for MultimodalCollectionEndpoint , OpenSearchPipelineEndpoint. Du bruger disse i de efterfølgende trin.

CloudFormation-skabelonen opretter følgende ressourcer:

  • IAM roller - Det følgende AWS identitets- og adgangsstyring (IAM) roller oprettes. Opdater disse roller for at anvende de mindste privilegerede tilladelser, som diskuteret i Bedste praksis for sikkerhed.
    • SMExecutionRole med Amazon Simple Storage Service (Amazon S3), SageMaker, OpenSearch Service og Amazon Bedrock fuld adgang.
    • OSPipelineExecutionRole med adgang til S3 bucket og OSI handlinger.
  • SageMaker notesbog – Al kode til dette indlæg køres ved hjælp af denne notesbog.
  • OpenSearch Serverløs samling – Dette er vektordatabasen til lagring og hentning af indlejringer.
  • OSI pipeline – Dette er pipelinen til indlæsning af data i OpenSearch Serverless.
  • S3 spand – Alle data for dette indlæg er gemt i denne bøtte.

CloudFormation-skabelonen opsætter den pipeline-konfiguration, der kræves for at konfigurere OSI-pipelinen med HTTP som kilde og OpenSearch Serverless-indekset som sink. SageMaker notesbogen 2_data_ingestion.ipynb viser, hvordan man indtager data i pipelinen ved hjælp af Anmodninger HTTP-bibliotek.

CloudFormation-skabelonen opretter også netværk, kryptering , dataadgang politikker, der kræves for din OpenSearch Serverless-samling. Opdater disse politikker for at anvende de mindste privilegerede tilladelser.

Der henvises til CloudFormation-skabelonnavnet og OpenSearch Service-indeksnavnet i SageMaker-notesbogen 3_rag_inference.ipynb. Hvis du ændrer standardnavnene, skal du sørge for at opdatere dem i notesbogen.

Test løsningen

Når du har oprettet CloudFormation-stakken, kan du teste løsningen. Udfør følgende trin:

  1. Vælg på SageMaker-konsollen Notebooks i navigationsruden.
  2. Type MultimodalNotebookInstance Og vælg Åbn JupyterLab.
  3. In Filbrowser, gå til mappen notesbøger for at se notesbøger og understøttende filer.

Notesbøgerne er nummereret i den rækkefølge, de kører i. Instruktioner og kommentarer i hver notesbog beskriver de handlinger, der udføres af den pågældende notesbog. Vi kører disse notesbøger én efter én.

  1. Vælg 1_data_prep.ipynb for at åbne den i JupyterLab.
  2. Kør menu, vælg Kør alle celler for at køre koden i denne notesbog.

Denne notesbog vil downloade en offentlig tilgængelig glidedæk, konverter hvert dias til JPG-filformatet, og upload disse til S3-bøtten.

  1. Vælg 2_data_ingestion.ipynb for at åbne den i JupyterLab.
  2. Kør menu, vælg Kør alle celler for at køre koden i denne notesbog.

I denne notesbog opretter du et indeks i OpenSearch Serverless-samlingen. Dette indeks gemmer indlejringsdata for diasdækket. Se følgende kode:

session = boto3.Session()
credentials = session.get_credentials()
auth = AWSV4SignerAuth(credentials, g.AWS_REGION, g.OS_SERVICE)

os_client = OpenSearch(
  hosts = [{'host': host, 'port': 443}],
  http_auth = auth,
  use_ssl = True,
  verify_certs = True,
  connection_class = RequestsHttpConnection,
  pool_maxsize = 20
)

index_body = """
{
  "settings": {
    "index.knn": true
  },
  "mappings": {
    "properties": {
      "vector_embedding": {
        "type": "knn_vector",
        "dimension": 1536,
        "method": {
          "name": "hnsw",
          "engine": "nmslib",
          "parameters": {}
        }
      },
      "image_path": {
        "type": "text"
      },
      "slide_text": {
        "type": "text"
      },
      "slide_number": {
        "type": "text"
      },
      "metadata": { 
        "properties" :
          {
            "filename" : {
              "type" : "text"
            },
            "desc":{
              "type": "text"
            }
          }
      }
    }
  }
}
"""
index_body = json.loads(index_body)
try:
  response = os_client.indices.create(index_name, body=index_body)
  logger.info(f"response received for the create index -> {response}")
except Exception as e:
  logger.error(f"error in creating index={index_name}, exception={e}")

Du bruger modellerne Claude 3 Sonnet og Amazon Titan Text Embeddings til at konvertere JPG-billeder oprettet i den forrige notesbog til vektorindlejringer. Disse indlejringer og yderligere metadata (såsom S3-stien og beskrivelsen af ​​billedfilen) gemmes i indekset sammen med indlejringerne. Følgende kodestykke viser, hvordan Claude 3 Sonnet genererer billedbeskrivelser:

def get_img_desc(image_file_path: str, prompt: str):
    # read the file, MAX image size supported is 2048 * 2048 pixels
    with open(image_file_path, "rb") as image_file:
        input_image_b64 = image_file.read().decode('utf-8')
  
    body = json.dumps(
        {
            "anthropic_version": "bedrock-2023-05-31",
            "max_tokens": 1000,
            "messages": [
                {
                    "role": "user",
                    "content": [
                        {
                            "type": "image",
                            "source": {
                                "type": "base64",
                                "media_type": "image/jpeg",
                                "data": input_image_b64
                            },
                        },
                        {"type": "text", "text": prompt},
                    ],
                }
            ],
        }
    )
    
    response = bedrock.invoke_model(
        modelId=g.CLAUDE_MODEL_ID,
        body=body
    )

    resp_body = json.loads(response['body'].read().decode("utf-8"))
    resp_text = resp_body['content'][0]['text'].replace('"', "'")

    return resp_text

Billedbeskrivelserne videregives til Amazon Titan Text Embeddings-modellen for at generere vektorindlejringer. Disse indlejringer og yderligere metadata (såsom S3-stien og beskrivelsen af ​​billedfilen) gemmes i indekset sammen med indlejringerne. Følgende kodestykke viser opkaldet til Amazon Titan Text Embeddings-modellen:

def get_text_embedding(bedrock: botocore.client, prompt_data: str) -> np.ndarray:
    body = json.dumps({
        "inputText": prompt_data,
    })    
    try:
        response = bedrock.invoke_model(
            body=body, modelId=g.TITAN_MODEL_ID, accept=g.ACCEPT_ENCODING, contentType=g.CONTENT_ENCODING
        )
        response_body = json.loads(response['body'].read())
        embedding = response_body.get('embedding')
    except Exception as e:
        logger.error(f"exception={e}")
        embedding = None

    return embedding

Dataene indlæses i OpenSearch Serverless-indekset ved at foretage et API-kald til OSI-pipelinen. Følgende kodestykke viser opkaldet foretaget ved hjælp af Requests HTTP-biblioteket:

data = json.dumps([{
    "image_path": input_image_s3, 
    "slide_text": resp_text, 
    "slide_number": slide_number, 
    "metadata": {
        "filename": obj_name, 
        "desc": "" 
    }, 
    "vector_embedding": embedding
}])

r = requests.request(
    method='POST', 
    url=osi_endpoint, 
    data=data,
    auth=AWSSigV4('osis'))

  1. Vælg 3_rag_inference.ipynb for at åbne den i JupyterLab.
  2. Kør menu, vælg Kør alle celler for at køre koden i denne notesbog.

Denne notesbog implementerer RAG-løsningen: du konverterer brugerspørgsmålet til indlejringer, finder en lignende billedbeskrivelse fra vektordatabasen og giver den hentede beskrivelse til Claude 3 Sonnet for at generere et svar på brugerspørgsmålet. Du bruger følgende promptskabelon:

  llm_prompt: str = """

  Human: Use the summary to provide a concise answer to the question to the best of your abilities. If you cannot answer the question from the context then say I do not know, do not make up an answer.
  <question>
  {question}
  </question>

  <summary>
  {summary}
  </summary>

  Assistant:"""

Følgende kodestykke giver RAG-arbejdsgangen:

def get_llm_response(bedrock: botocore.client, question: str, summary: str) -> str:
    prompt = llm_prompt.format(question=question, summary=summary)
    
    body = json.dumps(
    {
        "anthropic_version": "bedrock-2023-05-31",
        "max_tokens": 1000,
        "messages": [
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": prompt},
                ],
            }
        ],
    })
        
    try:
        response = bedrock.invoke_model(
        modelId=g.CLAUDE_MODEL_ID,
        body=body)

        response_body = json.loads(response['body'].read().decode("utf-8"))
        llm_response = response_body['content'][0]['text'].replace('"', "'")
        
    except Exception as e:
        logger.error(f"exception while slide_text={summary[:10]}, exception={e}")
        llm_response = None

    return llm_response


# create prompt and convert to embeddings question: str = "How does Inf2 compare in performance to comparable EC2 instances? I need numbers." text_embedding = get_text_embedding(bedrock, question) # vector db search vector_db_response: Dict = find_similar_data(text_embeddings) # download image for local notebook display s3_img_path = vector_db_response.get('hits', {}).get('hits')[0].get('_source').get('image_path') logger.info(f"going to answer the question="{question}" using the image "{s3_img_path}"") !aws s3 cp {s3_img_path} . local_img_path = os.path.basename(s3_img_path) display(filename=local_img_path) # Ask Claude 3 Sonnet slide_text = vector_db_response.get('hits', {}).get('hits')[0].get('_source').get('slide_text') llm_response = get_llm_response(bedrock, question, slide_text) print(llm_response)

Resultater

Følgende tabel indeholder nogle brugerspørgsmål og -svar genereret af vores implementering. Det Spørgsmål kolonne fanger brugerspørgsmålet, og Svar kolonne er den tekstmæssige respons genereret af Claude 3 Sonnet. Det Billede kolonnen viser k-NN slide-matchet, der returneres af OpenSearch Serverless vektorsøgning.

Multimodale RAG resultater

Spørgsmål Svar Billede
Hvordan sammenligner Inf2 sig i ydeevne med sammenlignelige EC2-instanser? Jeg har brug for tal. Baseret på oplysningerne i resuméet er de nøgletal til sammenligning af ydeevne, der er givet for Amazon EC2 Inf2-forekomsterne sammenlignet med andre forekomster: 1. Op til 4x højere gennemløb. 2. Op til 10x lavere latenstid. Resuméet giver ikke specifikke tal, der sammenligner Inf2-instanserne med andre EC2-instanstyper. Det fremhæver dog gennemstrømnings- og latenstidsforbedringer som de vigtigste præstationsfordele ved Inf2-instanserne i forhold til sammenlignelige instanser til at køre generative AI-modeller.
Hvad giver AWS AI/ML-tjenesterne i henhold til AI/ML-svinghjulet? Baseret på oversigten giver AWS AI/ML-tjenesterne en række funktioner, der giver brændstof til et AI/ML-svinghjul. Dette svinghjul består af innovation i udvikling af nye og bedre algoritmer, muliggør flere use-cases og applikationer, driver bredere anvendelse og efterspørgsel, hvilket igen fører til yderligere investeringer i forskning og optimering for at drive mere innovation. AWS AI/ML-tjenesterne ser ud til at tilbyde værktøjerne, ressourcerne og infrastrukturen til at understøtte denne kontinuerlige cyklus af innovation, applikationsudvikling, adoption og geninvestering inden for kunstig intelligens og maskinlæring.
Hvor mange flere parametre har GPT-2 i forhold til GPT-3? Hvad er den numeriske forskel mellem parameterstørrelsen for GPT-2 og GPT-3? Ifølge oplysningerne i oversigten havde GPT-3 fra 2020 175B (175 milliarder) parametre, mens GPT-2 fra 2019 havde 1.5B (1.5 milliarder) parametre. Derfor er den numeriske forskel mellem parameterstørrelsen for GPT-2 og GPT-3 173.5 milliarder parametre. GPT-3 har cirka 115 gange flere parametre end GPT-2.
Hvad er kvarker i partikelfysik? Desværre indeholder det givne resumé ingen information om kvarker i partikelfysikken. Resuméet beskriver et billede relateret til udviklingen af ​​naturlig sprogbehandling og generative AI-teknologier, men det nævner ikke noget om partikelfysik eller begrebet kvarker.

Spørg dit indeks

Du kan bruge OpenSearch Dashboards til at interagere med OpenSearch API for at køre hurtige test på dit indeks og indlæste data.

Ryd op

Slet ressourcerne for at undgå fremtidige gebyrer. Du kan gøre dette ved at slette stakken ved hjælp af AWS CloudFormation-konsollen.

Konklusion

Virksomheder genererer nyt indhold hele tiden, og slide decks er en almindelig måde at dele og formidle information internt i organisationen og eksternt med kunder eller på konferencer. Over tid kan rig information forblive begravet og skjult i ikke-tekstmæssige modaliteter som grafer og tabeller i disse dias-dæk.

Du kan bruge denne løsning og kraften i multimodale FM'er såsom Amazon Titan Text Embeddings og Claude 3 Sonnet til at opdage ny information eller afdække nye perspektiver på indhold i slide-dæk. Du kan prøve forskellige Claude-modeller tilgængelige på Amazon Bedrock ved at opdatere CLAUDE_MODEL_ID i globals.py fil.

Dette er del 2 af en serie i tre dele. Vi brugte Amazon Titan Multimodal Embeddings og LLaVA-modellen i del 1. I del 3 vil vi sammenligne tilgangene fra del 1 og del 2.

Dele af denne kode frigives under Apache 2.0-licens.


Om forfatterne

Amit Arora er en AI og ML Specialist Architect hos Amazon Web Services, der hjælper virksomhedskunder med at bruge cloud-baserede maskinlæringstjenester til hurtigt at skalere deres innovationer. Han er også adjungeret lektor i MS data science and analytics-programmet ved Georgetown University i Washington DC

Manju Prasad er Senior Solutions Architect hos Amazon Web Services. Hun fokuserer på at yde teknisk vejledning inden for en række tekniske domæner, herunder AI/ML. Før hun kom til AWS, designede og byggede hun løsninger til virksomheder i den finansielle sektor og også til en startup. Hun brænder for at dele viden og skabe interesse for nye talenter.

Archana Inapudi er Senior Solutions Architect hos AWS, der støtter en strategisk kunde. Hun har over et årti af tværfaglig ekspertise, der leder strategiske tekniske initiativer. Archana er et håbefuldt medlem af AI/ML tekniske feltfællesskab hos AWS. Før Archana kom til AWS, ledede Archana en migration fra traditionelle siled datakilder til Hadoop hos en sundhedsvirksomhed. Hun brænder for at bruge teknologi til at accelerere vækst, give værdi til kunderne og opnå forretningsresultater.

Antara Raisa er en AI og ML Solutions Architect hos Amazon Web Services, der understøtter strategiske kunder baseret fra Dallas, Texas. Hun har også tidligere erfaring med at arbejde med store virksomhedspartnere hos AWS, hvor hun arbejdede som Partner Success Solutions Architect for digitalt centrerede kunder.

spot_img

Seneste efterretninger

spot_img

Chat med os

Hej! Hvordan kan jeg hjælpe dig?