Zephyrnet Logosu

Amazon SageMaker, Amazon OpenSearch Service, Streamlit ve LangChain ile güçlü bir soru yanıtlama botu oluşturun | Amazon Web Hizmetleri

Tarih:

Bir işletme ortamında üretken yapay zeka ve büyük dil modellerinin (LLM'ler) en yaygın uygulamalarından biri, kuruluşun bilgi birikimine dayalı olarak soruları yanıtlamaktır. Amazon Lex'i inşa etmek için çerçeve sağlar AI tabanlı sohbet botları. Önceden eğitilmiş temel modeller (FM'ler), çok çeşitli konularda özetleme, metin oluşturma ve soru yanıtlama gibi doğal dili anlama (NLU) görevlerinde iyi performans gösterir, ancak doğru (halüsinasyonlar olmadan) yanıtlar vermekte zorlanır veya ilgili soruları yanıtlamada tamamen başarısız olur. eğitim verilerinin bir parçası olarak görmedikleri içerik. Ayrıca FM'ler, verilerin belirli bir zamandaki enstantane görüntüsüyle eğitilir ve çıkarım zamanında taze verilere erişmek için doğal bir yeteneğe sahip değildir; bu yetenek olmadan, potansiyel olarak yanlış veya yetersiz yanıtlar verebilirler.

Bu sorunu çözmek için yaygın olarak kullanılan bir yaklaşım, Geri Alma Artırılmış Üretim (RAG) adı verilen bir teknik kullanmaktır. RAG tabanlı yaklaşımda, kullanıcı sorusunu bir LLM kullanarak vektör yerleştirmelerine dönüştürürüz ve ardından bu yerleştirmeler için kurumsal bilgi derleminin yerleştirmelerini tutan önceden doldurulmuş bir vektör veritabanında bir benzerlik araştırması yaparız. Az sayıda benzer belge (tipik olarak üç) başka bir LLM'ye sağlanan "soruya" kullanıcı sorusuyla birlikte bağlam olarak eklenir ve daha sonra bu LLM, bilgi isteminde bağlam olarak sağlanan bilgileri kullanarak kullanıcı sorusuna bir yanıt üretir. RAG modelleri tarafından tanıtıldı Lewis ve ark. 2020'de parametrik belleğin önceden eğitilmiş bir seq2seq modeli olduğu ve parametrik olmayan belleğin Wikipedia'nın önceden eğitilmiş bir nöral alıcı ile erişilen yoğun bir vektör dizini olduğu bir model olarak. RAG tabanlı bir yaklaşımın genel yapısını anlamak için bkz. Amazon SageMaker JumpStart'ta temel modellerle Retrieval Augmented Generation kullanarak soru yanıtlama.

Bu gönderide, soru yanıtlama botu gibi kurumsal kullanıma hazır bir RAG uygulaması oluşturmak için tüm yapı taşlarını içeren adım adım bir kılavuz sunuyoruz. Farklı AWS hizmetlerinin, açık kaynaklı temel modellerin (FLAN-T5 XXL metin üretimi için ve GPT-j-6B yerleştirmeler için) ve aşağıdakiler gibi paketler Dil Zinciri tüm bileşenlerle arayüz oluşturmak için ve Akışlı bot ön ucunu oluşturmak için.

Bu çözümü oluşturmak için gereken tüm kaynakları desteklemek için bir AWS Cloud Formation şablonu sağlıyoruz. Daha sonra her şeyi birbirine bağlamak için LangChain'in nasıl kullanılacağını gösteriyoruz:

  • Amazon SageMaker'da barındırılan LLM'lerle arayüz oluşturma.
  • Bilgi bankası belgelerinin parçalanması.
  • Belge yerleştirmelerini Amazon OpenSearch Service'e alma.
  • Soru cevaplama görevinin uygulanması.

Açık kaynak modelleri ile değiştirmek için aynı mimariyi kullanabiliriz. Amazon Titanı modeller. Sonrasında Amazon Ana Kayası piyasaya sürüldüğünde, benzer üretken AI uygulamalarının Amazon Bedrock kullanılarak nasıl uygulanacağını gösteren bir takip gönderisi yayınlayacağız, bu yüzden bizi izlemeye devam edin.

Çözüme genel bakış

Biz kullanın SageMaker belgeleri bu gönderi için bilgi külliyatı olarak. Bu sitedeki HTML sayfalarını daha küçük örtüşen bilgi parçalarına dönüştürüyoruz (parçalar arasında bazı bağlam sürekliliğini korumak için) ve ardından bu parçaları gpt-j-6b modelini kullanarak yerleştirmelere dönüştürüyor ve yerleştirmeleri OpenSearch Hizmetinde saklıyoruz. RAG işlevini, tüm isteklerin Lambda'ya yönlendirilmesi için Amazon API Gateway ile bir AWS Lambda işlevi içinde uyguluyoruz. Streamlit'te, API Ağ Geçidi aracılığıyla işlevi çağıran bir sohbet robotu uygulaması uyguluyoruz ve işlev, OpenSearch Service dizininde kullanıcı sorusunun katıştırmaları için benzerlik araması yapıyor. Eşleşen belgeler (parçalar), Lambda işlevi tarafından bilgi istemine bağlam olarak eklenir ve ardından işlev, kullanıcı sorusuna bir yanıt oluşturmak için bir SageMaker uç noktası olarak dağıtılan flan-t5-xxl modelini kullanır. Bu gönderi için tüm kod şu adreste mevcuttur: GitHub repo.

Aşağıdaki şekil, önerilen çözümün üst düzey mimarisini temsil etmektedir.

mimari

Şekil 1: Mimari

Adım adım açıklama:

  1. Kullanıcı, Streamlit web uygulaması aracılığıyla bir soru sağlar.
  2. Streamlit uygulaması, API Ağ Geçidi uç noktası REST API'sini çağırır.
  3. API Ağ Geçidi, Lambda işlevini çağırır.
  4. İşlev, kullanıcı sorusunu yerleştirmelere dönüştürmek için SageMaker uç noktasını çağırır.
  5. İşlev, kullanıcı sorusuna benzer belgeleri bulmak için bir OpenSearch Hizmet API'sini çağırır.
  6. İşlev, kullanıcı sorgusu ve bağlam olarak "benzer belgeler" ile bir "istem" oluşturur ve SageMaker uç noktasından bir yanıt oluşturmasını ister.
  7. Yanıt, işlevden API Ağ Geçidine sağlanır.
  8. API Ağ Geçidi, Streamlit uygulamasına yanıt sağlar.
  9. Kullanıcı, yanıtı Streamlit uygulamasında görüntüleyebilir,

Mimari şemasında gösterildiği gibi, aşağıdaki AWS hizmetlerini kullanıyoruz:

Bu çözümde kullanılan açık kaynaklı paketler açısından, Dil Zinciri OpenSearch Hizmeti ve SageMaker ile arayüz oluşturmak için ve HızlıAPI Lambda'da REST API arayüzünü uygulamak için.

Bu gönderide sunulan çözümü kendi AWS hesabınızda başlatmak için iş akışı aşağıdaki gibidir:

  1. Hesabınızda bu gönderiyle sağlanan CloudFormation şablonunu çalıştırın. Bu, bu çözüm için gereken tüm gerekli altyapı kaynaklarını oluşturacaktır:
    • LLM'ler için SageMaker uç noktaları
    • OpenSearch Hizmet kümesi
    • API ağ geçidi
    • Lambda işlevi
    • SageMaker Defter
    • IAM rolleri
  2. Çalıştır data_ingestion_to_vectordb.ipynb veri almak için SageMaker not defterindeki not defteri SageMaker belgeleri bir OpenSearch Hizmet dizinine.
  3. Streamlit uygulamasını Studio'daki bir terminalde çalıştırın ve uygulamanın URL'sini yeni bir tarayıcı sekmesinde açın.
  4. Streamlit uygulaması tarafından sağlanan sohbet arabirimi aracılığıyla SageMaker hakkındaki sorularınızı sorun ve LLM tarafından oluşturulan yanıtları görüntüleyin.

Bu adımlar aşağıdaki bölümlerde ayrıntılı olarak ele alınmıştır.

Önkoşullar

Bu gönderide sağlanan çözümü uygulamak için bir AWS hesabı ve LLM'ler, OpenSearch Hizmeti ve SageMaker ile aşinalık.

LLM'leri barındırmak için hızlandırılmış örneklere (GPU'lar) erişmemiz gerekiyor. Bu çözüm, ml.g5.12xlarge ve ml.g5.24xlarge'ın her bir örneğini kullanır; AWS hesabınızda bu örneklerin kullanılabilirliğini kontrol edebilir ve aşağıdaki ekran görüntüsünde gösterildiği gibi bu örnekleri bir Sevice Kota artırma isteği aracılığıyla gerektiği şekilde talep edebilirsiniz.

hizmet kotası artışı

Şekil 2: Hizmet Kotası Arttırma Talebi

Çözüm yığınını oluşturmak için AWS Cloud Formation'ı kullanın

adlı bir SageMaker not defteri oluşturmak için AWS CloudFormation kullanıyoruz. aws-llm-apps-blog ve adı verilen bir IAM rolü LLMAppsBlogIAMRole. Seçin Yığını Başlat kaynakları dağıtmak istediğiniz Bölge için. Sağlamanız gereken OpenSearch Hizmeti parolası dışında, CloudFormation şablonunun ihtiyaç duyduğu tüm parametreler önceden doldurulmuş varsayılan değerlere sahiptir. OpenSearch Hizmeti kullanıcı adını ve şifresini not edin, bunları sonraki adımlarda kullanırız. Bu şablonun tamamlanması yaklaşık 15 dakika sürer.

AWS Bölgesi Link
us-east-1
us-west-2
eu-west-1
ap-northeast-1

Yığın başarıyla oluşturulduktan sonra AWS CloudFormation konsolunda yığının Çıktılar sekmesine gidin ve şu değerleri not edin: OpenSearchDomainEndpoint ve LLMAppAPIEndpoint. Bunları sonraki adımlarda kullanırız.

CloudFormation yığın çıktıları

Şekil 3: Bulut Oluşumu Yığın Çıktıları

Verileri OpenSearch Hizmetine alın

Verileri almak için aşağıdaki adımları tamamlayın:

  1. SageMaker konsolunda, Defterler Gezinti bölmesinde.
  2. Not defterini seçin aws-llm-apps-blog Ve seç JupyterLab'ı aç.
    JupyterLab'ı aç

    Şekil 4: JupyterLab'ı açın

  3. Klinik data_ingestion_to_vectordb.ipynb JupyterLab'da açmak için. Bu not defteri SageMaker belgeleri adlı bir OpenSearch Hizmet dizinine llm_apps_workshop_embeddings.
    Not defteri yolu

    Şekil 5: Veri Alım Not Defterini Açın

  4. Not defteri açıkken, Çalıştır menüsünde Tüm Hücreleri Çalıştır bu not defterindeki kodu çalıştırmak için. Bu, veri kümesini yerel olarak not defterine indirecek ve ardından onu OpenSearch Service dizinine alacaktır. Bu not defterinin çalışması yaklaşık 20 dakika sürer. Not defteri ayrıca verileri, adı verilen başka bir vektör veritabanına alır. FAİS. FAISS dizin dosyaları yerel olarak kaydedilir ve Amazon Simple Storage Service'e (S3) yüklenir, böylece alternatif bir vektör veritabanı kullanımının bir örneği olarak Lambda işlevi tarafından isteğe bağlı olarak kullanılabilirler.
    Tüm hücreleri çalıştır

    Şekil 6: Notebook Tüm Hücreleri Çalıştır

Artık belgeleri parçalara ayırmaya hazırız, bunlar daha sonra OpenSearch'e alınmak üzere gömmelere dönüştürülebilir. LangChain'i kullanıyoruz RecursiveCharacterTextSplitter belgeleri parçalamak ve ardından LangChain'i kullanmak için sınıf SagemakerEndpointEmbeddingsJumpStart gpt-j-6b LLM'yi kullanarak bu parçaları gömmelere dönüştürmek için sınıf. Yerleştirmeleri LangChain aracılığıyla OpenSearch Hizmetinde depolarız OpenSearchVectorSearch sınıf. Bu kodu, SageMaker Processing Job'a özel bir kap aracılığıyla sağlanan Python betiklerinde paketliyoruz. Bkz. data_ingestion_to_vectordb.ipynb tam kod için not defteri.

  1. Özel bir kapsayıcı oluşturun, ardından içine LangChain ve opensearch-py Python paketlerini kurun.
  2. Bu kapsayıcı görüntüsünü Amazon Elastic Container Registry'ye (ECR) yükleyin.
  3. Birden çok düğümde çalışacak bir SageMaker İşleme işi oluşturmak için SageMaker ScriptProcessor sınıfını kullanıyoruz.
    • Amazon S3'te bulunan veri dosyaları, SageMaker İşleme iş eşgörünümlerinde otomatik olarak dağıtılır. s3_data_distribution_type='ShardedByS3Key' bir parçası olarak ProcessingInput işleme işine sağlanır.
    • Her düğüm, dosyaların bir alt kümesini işler ve bu, verileri OpenSearch Hizmetine almak için gereken toplam süreyi azaltır.
    • Her düğüm ayrıca dosya işlemeyi dahili olarak paralel hale getirmek için Python çoklu işlemeyi kullanır. Öyleyse, Biri bireysel düğümlerin işi (dosyaları) kendi aralarında dağıttığı küme düzeyinde, diğeri ise bir düğümdeki dosyaların aynı zamanda düğümde çalışan birden fazla işlem arasında bölündüğü düğüm düzeyinde olmak üzere iki paralelleştirme düzeyi vardır..
       # setup the ScriptProcessor with the above parameters
      processor = ScriptProcessor(base_job_name=base_job_name, image_uri=image_uri, role=aws_role, instance_type=instance_type, instance_count=instance_count, command=["python3"], tags=tags) # setup input from S3, note the ShardedByS3Key, this ensures that # each instance gets a random and equal subset of the files in S3.
      inputs = [ProcessingInput(source=f"s3://{bucket}/{app_name}/{DOMAIN}", destination='/opt/ml/processing/input_data', s3_data_distribution_type='ShardedByS3Key', s3_data_type='S3Prefix')] logger.info(f"creating an opensearch index with name={opensearch_index}")
      # ready to run the processing job
      st = time.time()
      processor.run(code="container/load_data_into_opensearch.py", inputs=inputs, outputs=[], arguments=["--opensearch-cluster-domain", opensearch_domain_endpoint, "--opensearch-secretid", os_creds_secretid_in_secrets_manager, "--opensearch-index-name", opensearch_index, "--aws-region", aws_region, "--embeddings-model-endpoint-name", embeddings_model_endpoint_name, "--chunk-size-for-doc-split", str(CHUNK_SIZE_FOR_DOC_SPLIT), "--chunk-overlap-for-doc-split", str(CHUNK_OVERLAP_FOR_DOC_SPLIT), "--input-data-dir", "/opt/ml/processing/input_data", "--create-index-hint-file", CREATE_OS_INDEX_HINT_FILE, "--process-count", "2"])

  4. Tüm hücreler hatasız çalıştıktan sonra not defterini kapatın. Verileriniz artık OpenSearch Hizmetinde mevcuttur. Belge sayısını almak için tarayıcınızın adres çubuğuna aşağıdaki URL'yi girin. llm_apps_workshop_embeddings dizin. Aşağıdaki URL'deki CloudFormation yığın çıktılarından OpenSearch Service etki alanı uç noktasını kullanın. Sizden OpenSearch Hizmeti kullanıcı adı ve şifresi istenecektir, bunlar CloudFormations yığınından temin edilebilir.
    https://your-opensearch-domain-endpoint/llm_apps_workshop_embeddings/_count

Tarayıcı penceresi aşağıdakine benzer bir çıktı göstermelidir. Bu çıktı, 5,667 belgenin sisteme alındığını gösterir. llm_apps_workshop_embeddings index. {"count":5667,"_shards":{"total":5,"successful":5,"skipped":0,"failed":0}}

Streamlit uygulamasını Studio'da çalıştırın

Artık soru yanıtlama botumuz için Streamlit web uygulamasını çalıştırmaya hazırız. Bu uygulama, kullanıcının bir soru sormasına izin verir ve ardından yanıtı /llm/rag Lambda işlevi tarafından sağlanan REST API uç noktası.

Studio, Streamlit web uygulamasını barındırmak için uygun bir platform sağlar. Aşağıdaki adımlarda, Streamlit uygulamasının Studio'da nasıl çalıştırılacağı açıklanmaktadır. Alternatif olarak, uygulamayı dizüstü bilgisayarınızda çalıştırmak için aynı prosedürü de uygulayabilirsiniz.

  1. Studio'yu açın ve ardından yeni bir terminal açın.
  2. Bu gönderi için kod deposunu klonlamak ve uygulamanın ihtiyaç duyduğu Python paketlerini yüklemek için terminalde aşağıdaki komutları çalıştırın:
    git clone https://github.com/aws-samples/llm-apps-workshop
    cd llm-apps-workshop/blogs/rag/app
    pip install -r requirements.txt

  3. CloudFormation yığın çıktısında bulunan API Ağ Geçidi uç nokta URL'sinin webapp.py dosyasında ayarlanması gerekir. Bu, aşağıdakileri çalıştırarak yapılır sed emretmek. değiştirin replace-with-LLMAppAPIEndpoint-value-from-cloudformation-stack-outputs değeri ile kabuk komutlarında LLMAppAPIEndpoint alanını CloudFormation yığın çıktısından alın ve ardından Studio'da bir Streamlit uygulaması başlatmak için aşağıdaki komutları çalıştırın.
    
    EP=replace-with-LLMAppAPIEndpoint-value-from-cloudformation-stack-outputs
    # replace __API_GW_ENDPOINT__ with output from the cloud formation stack
    sed -i "s|__API_GW_ENDPOINT__|$EP|g" webapp.py
    streamlit run webapp.py

  4. Uygulama başarılı bir şekilde çalıştığında aşağıdakine benzer bir çıktı göreceksiniz (Göreceğiniz IP adresleri bu örnekte gösterilenlerden farklı olacaktır). Çıkıştan bağlantı noktası numarasını (tipik olarak 8501) not edin sonraki adımda uygulamanın URL'sinin bir parçası olarak kullanmak için.
    sagemaker-user@studio$ streamlit run webapp.py Collecting usage statistics. To deactivate, set browser.gatherUsageStats to False. You can now view your Streamlit app in your browser. Network URL: http://169.255.255.2:8501
    External URL: http://52.4.240.77:8501

  5. Uygulamaya, Studio alan URL'nize benzer bir URL kullanarak yeni bir tarayıcı sekmesinden erişebilirsiniz. Örneğin, Studio URL'niz https://d-randomidentifier.studio.us-east-1.sagemaker.aws/jupyter/default/lab? ardından Streamlit uygulamanızın URL'si https://d-randomidentifier.studio.us-east-1.sagemaker.aws/jupyter/default/proxy/8501/webapp (dikkat edin lab ile değiştirildi proxy/8501/webapp). Önceki adımda belirtilen bağlantı noktası numarası 8501'den farklıysa, Streamlit uygulaması için URL'de 8501 yerine bunu kullanın.

Aşağıdaki ekran görüntüsü, uygulamayı birkaç kullanıcı sorusuyla birlikte göstermektedir.

Streamlit uygulaması

Lambda işlevindeki RAG uygulamasına daha yakından bakış

Artık uygulamayı uçtan uca çalıştırdığımıza göre, Lambda işlevine daha yakından bakalım. Lambda işlevi kullanır HızlıAPI RAG için REST API'sini uygulamak ve Mangum API'yi işlevde paketlediğimiz ve dağıttığımız bir işleyici ile sarmak için paket. İşlevi çağırmak ve yönlendirmeyi uygulamamız içinde dahili olarak işlemek için gelen tüm istekleri yönlendirmek için API Ağ Geçidini kullanırız.

Aşağıdaki kod parçacığı, kullanıcı sorusuna benzer belgeleri OpenSearch dizininde nasıl bulduğumuzu ve ardından soru ile benzer belgeleri birleştirerek nasıl bir bilgi istemi oluşturduğumuzu gösterir. Bu bilgi istemi daha sonra kullanıcı sorusuna bir yanıt oluşturmak için LLM'ye sağlanır.

@router.post("/rag")
async def rag_handler(req: Request) -> Dict[str, Any]: # dump the received request for debugging purposes logger.info(f"req={req}") # initialize vector db and SageMaker Endpoint _init(req) # Use the vector db to find similar documents to the query # the vector db call would automatically convert the query text # into embeddings docs = _vector_db.similarity_search(req.q, k=req.max_matching_docs) logger.info(f"here are the {req.max_matching_docs} closest matching docs to the query="{req.q}"") for d in docs: logger.info(f"---------") logger.info(d) logger.info(f"---------") # now that we have the matching docs, lets pack them as a context # into the prompt and ask the LLM to generate a response prompt_template = """Answer based on context:nn{context}nn{question}""" prompt = PromptTemplate( template=prompt_template, input_variables=["context", "question"] ) logger.info(f"prompt sent to llm = "{prompt}"") chain = load_qa_chain(llm=_sm_llm, prompt=prompt) answer = chain({"input_documents": docs, "question": req.q}, return_only_outputs=True)['output_text'] logger.info(f"answer received from llm,nquestion: "{req.q}"nanswer: "{answer}"") resp = {'question': req.q, 'answer': answer} if req.verbose is True: resp['docs'] = docs return resp

Temizlemek

Gelecekte masraflara maruz kalmamak için kaynakları silin. Aşağıdaki ekran görüntüsünde gösterildiği gibi CloudFormation yığınını silerek bunu yapabilirsiniz.

CloudFormation yığınını sil

Şekil 7: Temizleme

Sonuç

Bu gönderide, AWS hizmeti, açık kaynak LLM'ler ve açık kaynak Python paketlerinin bir kombinasyonunu kullanarak kurumsal kullanıma hazır bir RAG çözümünün nasıl oluşturulacağını gösterdik.

Keşfederek daha fazlasını öğrenmenizi öneririz. HızlıBaşlangıç, Amazon Titanı modelleri, Amazon Ana Kayası, ve Açık Arama Hizmeti ve bu gönderide sağlanan örnek uygulamayı ve işinizle ilgili bir veri kümesini kullanarak bir çözüm oluşturmak. Sorularınız veya önerileriniz varsa, yorum bırakın.


Yazarlar Hakkında

Amit Arora Amazon Web Services'ta Yapay Zeka ve Makine Öğrenimi Uzmanı Mimardır ve kurumsal müşterilerin yeniliklerini hızla ölçeklendirmek için bulut tabanlı makine öğrenimi hizmetlerini kullanmalarına yardımcı olur. Ayrıca Washington DC'deki Georgetown Üniversitesi'nde MS veri bilimi ve analitik programında yardımcı öğretim görevlisidir.

Xin HuangDoktor Xin Huang Amazon SageMaker JumpStart ve Amazon SageMaker yerleşik algoritmaları için Kıdemli Uygulamalı Bilim İnsanıdır. Ölçeklenebilir makine öğrenimi algoritmaları geliştirmeye odaklanıyor. Araştırma ilgi alanları, doğal dil işleme, tablo verileri üzerinde açıklanabilir derin öğrenme ve parametrik olmayan uzay-zaman kümelemenin sağlam analizi alanındadır. ACL, ICDM, KDD konferanslarında ve Royal Statistical Society: Series A'da birçok makale yayınladı.

Navneet Tuteja Amazon Web Services'ta Veri Uzmanıdır. Navneet, AWS'ye katılmadan önce veri mimarilerini modernize etmek ve kapsamlı AI/ML çözümleri uygulamak isteyen kuruluşlar için kolaylaştırıcı olarak çalıştı. Thapar Üniversitesi'nden mühendislik derecesine ve Texas A&M Üniversitesi'nden istatistik alanında yüksek lisans derecesine sahiptir.

spot_img

En Son İstihbarat

spot_img