Generatywna analiza danych

Porozmawiaj ze swoją platformą zjeżdżalni, korzystając z multimodalnych modeli fundamentów hostowanych na Amazon Bedrock – część 2 | Usługi internetowe Amazona

Data:

In Część 1 z tej serii zaprezentowaliśmy rozwiązanie wykorzystujące technologię Multimodalne osadzania Amazon Titan model umożliwiający konwersję poszczególnych slajdów z zestawu slajdów na elementy osadzone. Zapisaliśmy osady w wektorowej bazie danych, a następnie wykorzystaliśmy plik Duży asystent językowo-wzrokowy (LLaVA 1.5-7b) model do generowania odpowiedzi tekstowych na pytania użytkowników na podstawie najbardziej podobnego slajdu pobranego z bazy wektorów. Korzystaliśmy z usług AWS m.in Amazońska skała macierzysta, Amazon Sage Maker, Amazon OpenSearch bez serwera w tym rozwiązaniu.

W tym poście pokazujemy inne podejście. Używamy Antropiczny Claude 3 Sonet model do generowania opisów tekstowych dla każdego slajdu w zestawie slajdów. Opisy te są następnie konwertowane na osadzony tekst za pomocą narzędzia Osadzanie tekstu Amazon Titan modelu i przechowywany w bazie danych wektorowych. Następnie za pomocą modelu Claude 3 Sonnet generujemy odpowiedzi na pytania użytkowników w oparciu o najbardziej odpowiedni opis tekstowy pobrany z bazy wektorów.

Możesz przetestować oba podejścia dla swojego zbioru danych i ocenić wyniki, aby zobaczyć, które podejście daje najlepsze wyniki. W części 3 tej serii oceniamy wyniki obu metod.

Omówienie rozwiązania

Rozwiązanie zapewnia implementację odpowiadania na pytania z wykorzystaniem informacji zawartych w tekstach i elementach wizualnych slidera. Projekt opiera się na koncepcji generacji rozszerzonej odzyskiwania (RAG). Tradycyjnie RAG kojarzono z danymi tekstowymi, które można przetwarzać za pomocą dużych modeli językowych (LLM). W tej serii rozszerzamy RAG o obrazy. Zapewnia to zaawansowane możliwości wyszukiwania w celu wyodrębnienia treści odpowiednich kontekstowo z elementów wizualnych, takich jak tabele i wykresy, wraz z tekstem.

To rozwiązanie zawiera następujące elementy:

  • Amazon Titan Text Embeddings to model osadzania tekstu, który konwertuje tekst w języku naturalnym, w tym pojedyncze słowa, frazy, a nawet duże dokumenty, na reprezentacje numeryczne, które można wykorzystać do wspomagania zastosowań, takich jak wyszukiwanie, personalizacja i grupowanie w oparciu o podobieństwo semantyczne.
  • Claude 3 Sonnet to kolejna generacja najnowocześniejszych modeli firmy Anthropic. Sonnet to wszechstronne narzędzie, które może obsłużyć szeroki zakres zadań, od złożonego wnioskowania i analizy po szybkie wyniki, a także wydajne wyszukiwanie i odzyskiwanie ogromnych ilości informacji.
  • OpenSearch Serverless to bezserwerowa konfiguracja na żądanie dla usługi Amazon OpenSearch. Używamy OpenSearch Serverless jako wektorowej bazy danych do przechowywania osadzań generowanych przez model Amazon Titan Text Embeddings. Indeks utworzony w kolekcji OpenSearch Serverless służy jako magazyn wektorów dla naszego rozwiązania RAG.
  • Przetwarzanie Amazon OpenSearch (OSI) to w pełni zarządzany, bezserwerowy moduł gromadzący dane, który dostarcza dane do domen usługi OpenSearch i kolekcji OpenSearch Serverless. W tym poście używamy interfejsu API potoku OSI do dostarczania danych do magazynu wektorów OpenSearch Serverless.

Projekt rozwiązania składa się z dwóch części: pozyskiwania i interakcji z użytkownikiem. Podczas przetwarzania przetwarzamy wejściowy zestaw slajdów, konwertując każdy slajd na obraz, generując opisy i osadzony tekst dla każdego obrazu. Następnie wypełniamy magazyn danych wektorowych osadzonymi elementami i opisem tekstowym każdego slajdu. Te kroki są wykonywane przed etapami interakcji z użytkownikiem.

W fazie interakcji z użytkownikiem pytanie użytkownika jest konwertowane na osadzony tekst. W bazie wektorów przeprowadzane jest wyszukiwanie podobieństwa w celu znalezienia opisu tekstowego odpowiadającego slajdowi, który potencjalnie mógłby zawierać odpowiedzi na pytanie użytkownika. Następnie przekazujemy opis slajdu i pytanie użytkownika do modelu Claude 3 Sonnet w celu wygenerowania odpowiedzi na zapytanie. Cały kod tego wpisu jest dostępny w pliku GitHub repozytorium.

Poniższy diagram ilustruje architekturę pozyskiwania.

Przepływ pracy składa się z następujących kroków:

  1. Slajdy są konwertowane do plików graficznych (po jednym na slajd) w formacie JPG i przekazywane do modelu Claude 3 Sonnet w celu wygenerowania opisu tekstowego.
  2. Dane są wysyłane do modelu Amazon Titan Text Embeddings w celu wygenerowania osadzania. W tej serii używamy zjeżdżalni Trenuj i wdrażaj Stable Diffusion przy użyciu AWS Trainium i AWS Inferentia ze szczytu AWS w Toronto w czerwcu 2023 r., aby zademonstrować rozwiązanie. Przykładowa talia zawiera 31 slajdów, dlatego generujemy 31 zestawów osadzania wektorów, każdy o 1536 wymiarach. Dodajemy dodatkowe pola metadanych, aby wykonywać zaawansowane zapytania wyszukiwania, korzystając z potężnych możliwości wyszukiwania OpenSearch.
  3. Osadzenia są pobierane do potoku OSI przy użyciu wywołania API.
  4. Potok OSI pobiera dane w postaci dokumentów do indeksu OpenSearch Serverless. Indeks jest skonfigurowany jako ujście dla tego potoku i jest tworzony jako część kolekcji OpenSearch Serverless.

Poniższy diagram ilustruje architekturę interakcji użytkownika.

Przepływ pracy składa się z następujących kroków:

  1. Użytkownik przesyła pytanie dotyczące przetworzonego zestawu slajdów.
  2. Dane wprowadzone przez użytkownika są konwertowane na osadzanie przy użyciu modelu Amazon Titan Text Embeddings, do którego dostęp można uzyskać za pomocą Amazon Bedrock. Wyszukiwanie wektorów usługi OpenSearch Service odbywa się przy użyciu tych osadzania. Przeprowadzamy wyszukiwanie k-najbliższego sąsiada (k-NN), aby pobrać najbardziej odpowiednie osadzania pasujące do zapytania użytkownika.
  3. Metadane odpowiedzi z OpenSearch Serverless zawierają ścieżkę do obrazu i opis odpowiadający najodpowiedniejszemu slajdowi.
  4. Podpowiedź tworzona jest poprzez połączenie pytania użytkownika i opisu obrazu. Podpowiedź jest dostarczana do Claude 3 Sonnet hostowanego na Amazon Bedrock.
  5. Wynik tego wnioskowania jest zwracany użytkownikowi.

W poniższych sekcjach omówimy kroki dla obu etapów i podajemy szczegółowe informacje na temat wyników.

Wymagania wstępne

Aby wdrożyć rozwiązanie podane w tym poście, powinieneś mieć plik Konto AWS oraz znajomość FM, Amazon Bedrock, SageMaker i OpenSearch Service.

To rozwiązanie wykorzystuje modele Claude 3 Sonnet i Amazon Titan Text Embeddings hostowane na Amazon Bedrock. Upewnij się, że te modele są włączone do użytku, przechodząc do Dostęp do modelu na konsoli Amazon Bedrock.

Jeśli modele są włączone, Stan dostępu stwierdzi Dostęp przyznany.

Jeśli modele nie są dostępne, włącz dostęp, wybierając Zarządzaj dostępem do modelu, wybór modeli i wybór Poproś o dostęp do modelu. Modele są natychmiast udostępniane do użytku.

Użyj AWS CloudFormation, aby utworzyć stos rozwiązań

Możesz użyć AWS CloudFormation, aby utworzyć stos rozwiązań. Jeśli utworzyłeś rozwiązanie dla Części 1 na tym samym koncie AWS, pamiętaj o usunięciu go przed utworzeniem tego stosu.

Region AWS Połączyć
us-east-1
us-west-2

Po pomyślnym utworzeniu stosu przejdź do karty Wyjścia stosu w konsoli AWS CloudFormation i zanotuj wartości dla MultimodalCollectionEndpoint i OpenSearchPipelineEndpoint. Użyjesz ich w kolejnych krokach.

Szablon CloudFormation tworzy następujące zasoby:

  • Role IAM - Następujące AWS Zarządzanie tożsamością i dostępem Tworzone są role (IAM). Zaktualizuj te role, aby zastosować uprawnienia o najniższych uprawnieniach, jak omówiono w Najlepsze praktyki w zakresie bezpieczeństwa.
    • SMExecutionRole w Usługa Amazon Simple Storage (Amazon S3), SageMaker, OpenSearch Service i Amazon Bedrock – pełny dostęp.
    • OSPipelineExecutionRole z dostępem do segmentu S3 i działań OSI.
  • Notatnik SageMakera – Cały kod tego posta jest uruchamiany przy użyciu tego notatnika.
  • Bezserwerowa kolekcja OpenSearch – Jest to baza danych wektorów służąca do przechowywania i wyszukiwania osadzonych elementów.
  • Rurociąg OSI – To jest potok pozyskiwania danych do OpenSearch Serverless.
  • Wiadro S3 – Wszystkie dane dla tego wpisu są przechowywane w tym zasobniku.

Szablon CloudFormation konfiguruje konfigurację potoku wymaganą do skonfigurowania potoku OSI z HTTP jako źródłem i indeksem OpenSearch Serverless jako ujściem. Notatnik SageMaker 2_data_ingestion.ipynb wyświetla sposób pozyskiwania danych do potoku przy użyciu metody wnioski Biblioteka HTTP.

Tworzy się również szablon CloudFormation sieć, szyfrowanie i dostęp do danych zasady wymagane dla Twojej kolekcji OpenSearch Serverless. Zaktualizuj te zasady, aby zastosować uprawnienia o najniższych uprawnieniach.

Nazwa szablonu CloudFormation i nazwa indeksu usługi OpenSearch Service znajdują się w notatniku SageMaker 3_rag_inference.ipynb. Jeśli zmienisz nazwy domyślne, pamiętaj o ich zaktualizowaniu w notatniku.

Przetestuj rozwiązanie

Po utworzeniu stosu CloudFormation możesz przetestować rozwiązanie. Wykonaj następujące kroki:

  1. W konsoli SageMaker wybierz Notebooki w okienku nawigacji.
  2. Wybierz MultimodalNotebookInstance i wybierz Otwórz JupyterLab.
  3. In Przeglądarka plików, przejdź do folderu notesów, aby wyświetlić notesy i pliki pomocnicze.

Zeszyty są ponumerowane w kolejności, w jakiej są prowadzone. Instrukcje i komentarze w każdym notatniku opisują działania wykonywane przez ten notatnik. Prowadzimy te notesy jeden po drugim.

  1. Dodaj 1_data_prep.ipynb aby otworzyć go w JupyterLab.
  2. Na run menu, wybierz Uruchom wszystkie komórki aby uruchomić kod w tym notatniku.

Ten notatnik pobierze publicznie dostępny plik zjeżdżalnia, przekonwertuj każdy slajd do formatu pliku JPG i prześlij go do zasobnika S3.

  1. Dodaj 2_data_ingestion.ipynb aby otworzyć go w JupyterLab.
  2. Na run menu, wybierz Uruchom wszystkie komórki aby uruchomić kod w tym notatniku.

W tym notatniku utworzysz indeks w kolekcji OpenSearch Serverless. Ten indeks przechowuje dane osadzenia dla talii slajdów. Zobacz następujący kod:

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}")

Modele Claude 3 Sonnet i Amazon Titan Text Embeddings służą do konwertowania obrazów JPG utworzonych w poprzednim notatniku na osadzania wektorowe. Te osadzania i dodatkowe metadane (takie jak ścieżka S3 i opis pliku obrazu) są przechowywane w indeksie wraz z osadzaniami. Poniższy fragment kodu pokazuje, jak Claude 3 Sonnet generuje opisy obrazów:

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

Opisy obrazów są przekazywane do modelu Amazon Titan Text Embeddings w celu wygenerowania osadzania wektorowego. Te osadzania i dodatkowe metadane (takie jak ścieżka S3 i opis pliku obrazu) są przechowywane w indeksie wraz z osadzaniami. Poniższy fragment kodu przedstawia wywołanie modelu Amazon Titan Text Embeddings:

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

Dane są pobierane do indeksu OpenSearch Serverless poprzez wywołanie API do potoku OSI. Poniższy fragment kodu przedstawia wywołanie wykonane przy użyciu biblioteki Requests HTTP:

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. Dodaj 3_rag_inference.ipynb aby otworzyć go w JupyterLab.
  2. Na run menu, wybierz Uruchom wszystkie komórki aby uruchomić kod w tym notatniku.

W tym notatniku zastosowano rozwiązanie RAG: konwertujesz pytanie użytkownika na osadzanie, znajdujesz podobny opis obrazu w bazie danych wektorowych i przekazujesz pobrany opis Claude 3 Sonnetowi, aby wygenerować odpowiedź na pytanie użytkownika. Używasz następującego szablonu podpowiedzi:

  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:"""

Poniższy fragment kodu przedstawia przepływ pracy RAG:

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)

Efekt

Poniższa tabela zawiera niektóre pytania i odpowiedzi użytkowników wygenerowane przez naszą implementację. The Question kolumna zawiera pytanie użytkownika, a Odpowiedź kolumna to odpowiedź tekstowa wygenerowana przez Claude 3 Sonnet. The Obraz kolumna pokazuje dopasowanie slajdu k-NN zwrócone przez wyszukiwanie wektorowe OpenSearch Serverless.

Wyniki multimodalnych RAG

Question Odpowiedź Obraz
Jak Inf2 wypada w porównaniu z porównywalnymi instancjami EC2? Potrzebuję numerów. Na podstawie informacji zawartych w podsumowaniu, najważniejsze dane porównawcze wydajności podane dla instancji Amazon EC2 Inf2 w porównaniu z innymi instancjami to: 1. Do 4x większa przepustowość. 2. Do 10 razy mniejsze opóźnienie. W podsumowaniu nie podano konkretnych liczb porównujących instancje Inf2 z innymi typami instancji EC2. Jednakże podkreśla poprawę przepustowości i opóźnień jako główne zalety wydajności instancji Inf2 w porównaniu z porównywalnymi instancjami do uruchamiania generatywnych modeli AI.
Co według koła zamachowego AI/ML zapewniają usługi AWS AI/ML? Podsumowując, usługi AWS AI/ML zapewniają szereg możliwości napędzających koło zamachowe AI/ML. Na to koło zamachowe składają się innowacje polegające na opracowywaniu nowych i lepszych algorytmów, umożliwiających większą liczbę przypadków użycia i zastosowań, stymulujących szersze przyjęcie i popyt, co z kolei prowadzi do dalszych inwestycji w badania i optymalizację w celu stymulowania większej liczby innowacji. Wydaje się, że usługi AWS AI/ML oferują narzędzia, zasoby i infrastrukturę do wspierania tego ciągłego cyklu innowacji, rozwoju aplikacji, wdrażania i ponownych inwestycji w dziedzinie sztucznej inteligencji i uczenia maszynowego.
O ile więcej parametrów ma GPT-2 w porównaniu do GPT-3? Jaka jest różnica liczbowa między rozmiarem parametru GPT-2 i GPT-3? Z informacji zawartych w podsumowaniu wynika, że ​​GPT-3 z 2020 r. miał 175B (175 miliardów) parametrów, natomiast GPT-2 z 2019 r. miał 1.5B (1.5 miliarda) parametrów. Zatem różnica liczbowa między wielkością parametrów GPT-2 i GPT-3 wynosi 173.5 miliarda parametrów. GPT-3 ma około 115 razy więcej parametrów niż GPT-2.
Czym są kwarki w fizyce cząstek elementarnych? Niestety podane zestawienie nie zawiera żadnych informacji na temat kwarków w fizyce cząstek elementarnych. Podsumowanie opisuje obraz związany z postępem przetwarzania języka naturalnego i technologii generatywnej sztucznej inteligencji, ale nie wspomina nic o fizyce cząstek elementarnych ani koncepcji kwarków.

Zapytaj o swój indeks

Pulpitów nawigacyjnych OpenSearch można używać do interakcji z interfejsem API OpenSearch w celu przeprowadzania szybkich testów indeksu i pozyskanych danych.

Oczyszczanie

Aby uniknąć przyszłych opłat, usuń zasoby. Możesz to zrobić, usuwając stos za pomocą konsoli AWS CloudFormation.

Wnioski

Przedsiębiorstwa cały czas generują nowe treści, a slajdy to powszechny sposób udostępniania i rozpowszechniania informacji wewnętrznie w organizacji i na zewnątrz, z klientami lub na konferencjach. Z czasem bogate informacje mogą pozostać ukryte w formach nietekstowych, takich jak wykresy i tabele na tych slajdach.

Możesz wykorzystać to rozwiązanie i moc multimodalnych FM, takich jak Amazon Titan Text Embeddings i Claude 3 Sonnet, aby odkryć nowe informacje lub odkryć nowe perspektywy dotyczące treści na slajdach. Możesz wypróbować różne modele Claude dostępne na Amazon Bedrock, aktualizując plik CLAUDE_MODEL_ID globals.py plik.

Jest to druga część trzyczęściowej serii. W Części 2 wykorzystaliśmy Multimodalne Embeddingi Amazon Titan i model LLaVA. W Części 1 porównamy podejścia z Części 3 i Części 1.

Części tego kodu są udostępniane w ramach Licencja Apache 2.0.


O autorach

Amit Arora jest architektem specjalizującym się w AI i ML w Amazon Web Services, pomagając klientom korporacyjnym w korzystaniu z usług uczenia maszynowego opartych na chmurze w celu szybkiego skalowania ich innowacji. Jest także adiunktem w programie MS Data Science and Analytics na Uniwersytecie Georgetown w Waszyngtonie

Manju Prasad jest starszym architektem rozwiązań w Amazon Web Services. Koncentruje się na zapewnianiu wskazówek technicznych w różnych dziedzinach technicznych, w tym AI/ML. Przed dołączeniem do AWS projektowała i budowała rozwiązania dla firm z sektora usług finansowych, a także dla startupu. Jej pasją jest dzielenie się wiedzą i wzbudzanie zainteresowania wschodzącymi talentami.

Archana Inapudi jest starszym architektem rozwiązań w AWS, wspierającym klienta strategicznego. Posiada ponad dziesięcioletnie doświadczenie międzybranżowe, kierując strategicznymi inicjatywami technicznymi. Archana jest aspirującym członkiem społeczności technicznej AI/ML w AWS. Przed dołączeniem do AWS Archana przeprowadziła migrację z tradycyjnych izolowanych źródeł danych do Hadoop w firmie z branży opieki zdrowotnej. Pasjonuje się wykorzystaniem technologii do przyspieszania wzrostu, zapewniania wartości klientom i osiągania wyników biznesowych.

Antara Raisa jest architektem rozwiązań AI i ML w Amazon Web Services, obsługującym klientów strategicznych z siedzibą w Dallas w Teksasie. Ma także wcześniejsze doświadczenie w pracy z dużymi partnerami korporacyjnymi w AWS, gdzie pracowała jako architekt rozwiązań dla partnerów sukcesu dla klientów skupionych na technologii cyfrowej.

spot_img

Najnowsza inteligencja

spot_img