Zephyrnet Logosu

Amazon SageMaker JumpStart, Llama 2 ve Vector Engine ile Amazon OpenSearch Serverless'ı kullanarak finansal hizmetler için bağlamsal bir sohbet robotu oluşturun | Amazon Web Hizmetleri

Tarih:

Finansal hizmet (FinServ) endüstrisi, alana özgü veriler, veri güvenliği, düzenleyici kontroller ve sektör uyumluluk standartlarıyla ilgili benzersiz üretken yapay zeka gereksinimlerine sahiptir. Ayrıca müşteriler, en performanslı ve uygun maliyetli makine öğrenimi (ML) modelini seçmek için seçenekler ve iş kullanım durumlarına uyacak şekilde gerekli özelleştirmeyi (ince ayar) gerçekleştirme olanağı arıyor. Amazon SageMaker Hızlı Başlangıç gerekli veri güvenliği kontrollerini sağladığı ve uyumluluk standartları gereksinimlerini karşıladığı için FinServ müşterilerinin üretken yapay zeka kullanım durumları için idealdir.

Bu yazıda, basit bir finansal alan kullanım örneği kullanarak SageMaker JumpStart'ta büyük dil modelleri (LLM'ler) ile Alma Artırılmış Nesil (RAG) tabanlı bir yaklaşım kullanarak soru yanıtlama görevlerini gösteriyoruz. RAG, LLM'yi bir bilgi alma (IR) sistemiyle birleştirerek metin oluşturma kalitesini artırmaya yönelik bir çerçevedir. LLM metni oluşturur ve IR sistemi ilgili bilgiyi bir bilgi tabanından alır. Alınan bilgiler daha sonra LLM'nin girdisini artırmak için kullanılır; bu, model tarafından oluşturulan metnin doğruluğunun ve alaka düzeyinin artırılmasına yardımcı olabilir. RAG'ın soru yanıtlama ve özetleme gibi çeşitli metin oluşturma görevlerinde etkili olduğu gösterilmiştir. Metin oluşturma modellerinin kalitesini ve doğruluğunu artırmak için umut verici bir yaklaşımdır.

SageMaker JumpStart'ı kullanmanın avantajları

SageMaker JumpStart ile makine öğrenimi uygulayıcıları, içerik yazma, görüntü oluşturma, kod oluşturma, soru yanıtlama, metin yazma, özetleme, sınıflandırma, bilgi alma ve daha fazlası gibi kullanım durumları için geniş bir yelpazedeki son teknoloji modeller arasından seçim yapabilir. ML uygulayıcıları temel modelleri özel olarak dağıtabilir Amazon Adaçayı Yapıcı izole edilmiş bir ağ ortamından bulut sunucuları oluşturun ve model eğitimi ve konuşlandırma için SageMaker'ı kullanarak modelleri özelleştirin.

SageMaker JumpStart, FinServ müşterilerinin üretken yapay zeka kullanım durumları için idealdir çünkü aşağıdakileri sunar:

  • Özelleştirme yetenekleri – SageMaker JumpStart, temel modellerin alan uyarlamasına ilişkin adım adım rehberlik için örnek not defterleri ve ayrıntılı gönderiler sağlar. İnce ayar, etki alanı uyarlaması ve temel modellerin eğitimi veya RAG tabanlı uygulamalar oluşturmak için bu kaynakları takip edebilirsiniz.
  • Veri güvenliği – Çıkarım yükü verilerinin güvenliğinin sağlanması çok önemlidir. SageMaker JumpStart ile modelleri, tek kiracılı uç nokta provizyonuyla ağ yalıtımında dağıtabilirsiniz. Ayrıca, bireysel güvenlik gereksinimlerine uygun olarak, özel model merkezi özelliği aracılığıyla seçilen modellere erişim kontrolünü yönetebilirsiniz.
  • Düzenleyici kontroller ve uyumluluklar – HIPAA BAA, SOC123, PCI ve HITRUST CSF gibi standartlarla uyumluluk SageMaker'ın temel bir özelliğidir ve finans sektörünün sıkı düzenleyici ortamına uyum sağlar.
  • Model seçenekleri – SageMaker JumpStart, sektörde tanınan HELM kriterlerinde sürekli olarak üst sıralarda yer alan son teknoloji ürünü ML modellerinden oluşan bir seçki sunar. Bunlar arasında Llama 2, Falcon 40B, AI21 J2 Ultra, AI21 Summarize, Hugging Face MiniLM ve BGE modelleri yer alır ancak bunlarla sınırlı değildir.

Bu yazıda, Llama 2 temel modeli ve RAG mimarisi kullanan finansal hizmet kuruluşları için bağlamsal bir sohbet robotu oluşturmayı araştırıyoruz. Sarılma Yüzü GPTJ-6B-FP16 gömme modeli, her ikisi de SageMaker JumpStart'ta mevcuttur. Biz de kullanıyoruz Vektör Motoru için Amazon OpenSearch Sunucusuz (şu anda önizleme aşamasındadır) yerleştirmeleri depolamak için vektör veri deposu olarak.

Büyük dil modellerinin sınırlamaları

LLM'ler büyük hacimli yapılandırılmamış veriler üzerinde eğitilmiştir ve genel metin oluşturmada uzmandır. Bu eğitim sayesinde Yüksek Lisans'lar gerçek bilgileri edinir ve saklar. Bununla birlikte, kullanıma hazır LLM'lerin sınırlamaları vardır:

  • Çevrimdışı eğitimleri onları güncel bilgilerden habersiz kılıyor.
  • Ağırlıklı olarak genelleştirilmiş veriler üzerine aldıkları eğitim, alana özgü görevlerdeki yeterliliklerini azaltır. Örneğin, bir finans firması Soru-Cevap robotunun yanıtları en son dahili belgelerinden almasını, böylece doğruluğu ve iş kurallarına uygunluğu sağlamasını tercih edebilir.
  • Gömülü bilgilere güvenmeleri yorumlanabilirliği tehlikeye atar.

Yüksek Lisans'ta belirli verileri kullanmak için üç yaygın yöntem mevcuttur:

  • Verilerin modele yerleştirilmesi, çıktı oluşturma sırasında bu bağlamın kullanılmasına olanak tanır. Bu, sıfır atış (örnek yok), birkaç atış (sınırlı örnekler) veya çok atış (bol örnek) olabilir. Bu tür bağlamsal yönlendirme, modelleri daha incelikli sonuçlara yönlendirir.
  • Bilgi istemleri ve tamamlama çiftlerini kullanarak modele ince ayar yapma.
  • RAG, harici verileri (parametrik olmayan) alır ve bu verileri istemlere entegre ederek bağlamı zenginleştirir.

Ancak ilk yöntem, bağlam boyutuna ilişkin model kısıtlamalarıyla boğuşmakta, bu da uzun belgelerin girilmesini zorlaştırmakta ve muhtemelen maliyetleri artırmaktadır. İnce ayar yaklaşımı güçlü olmasına rağmen, özellikle sürekli gelişen dış veriler nedeniyle kaynak yoğundur ve dağıtımların gecikmesine ve maliyetlerin artmasına neden olur. Yüksek Lisans ile birleştirilmiş RAG, daha önce bahsedilen sınırlamalara bir çözüm sunar.

Alma Artırılmış Nesil

RAG, harici verileri (parametrik olmayan) alır ve bu verileri ML istemlerine entegre ederek bağlamı zenginleştirir. Lewis ve ark. RAG modellerini 2020'de tanıttı ve bunları önceden eğitilmiş bir diziden diziye modelinin (parametrik bellek) ve bir sinir alıcı aracılığıyla erişilen yoğun bir Wikipedia vektör indeksinin (parametrik olmayan bellek) birleşimi olarak kavramsallaştırdı.

RAG şu şekilde çalışır:

  • Veri kaynakları – RAG, belge depoları, veritabanları veya API'ler dahil olmak üzere çeşitli veri kaynaklarından yararlanabilir.
  • veri biçimlendirme – Hem kullanıcının sorgusu hem de dokümanlar alaka karşılaştırmalarına uygun formata dönüştürülür.
  • kalıplamaların – Bu karşılaştırmayı kolaylaştırmak için sorgu ve belge koleksiyonu (veya bilgi kitaplığı), dil modelleri kullanılarak sayısal yerleştirmelere dönüştürülür. Bu yerleştirmeler metinsel kavramları sayısal olarak kapsar.
  • Uygunluk araması – Kullanıcı sorgusunun yerleştirmesi, belge koleksiyonunun yerleştirmeleriyle karşılaştırılır ve ilgili metin, yerleştirme alanındaki benzerlik araması yoluyla tanımlanır.
  • Bağlam zenginleştirme – Belirlenen ilgili metin kullanıcının orijinal istemine eklenir ve böylece bağlamı zenginleştirilir.
  • Yüksek Lisans işleme – Zenginleştirilmiş bağlamla istem, ilgili dış verilerin dahil edilmesi nedeniyle ilgili ve kesin çıktılar üreten LLM'ye beslenir.
  • Eşzamansız güncellemeler – Referans belgelerinin güncel kalmasını sağlamak için, yerleşik gösterimleriyle birlikte eşzamansız olarak güncellenebilirler. Bu, gelecekteki model yanıtlarının en son bilgilere dayanmasını sağlayarak doğruluğu garanti eder.

Temel olarak RAG, yüksek lisans eğitimlerine gerçek zamanlı, ilgili bilgileri aşılamak için dinamik bir yöntem sunarak kesin ve zamanında çıktıların üretilmesini sağlar.

Aşağıdaki diyagram, LLM'lerle RAG kullanmanın kavramsal akışını göstermektedir.

Çözüme genel bakış

Bir finansal hizmetler uygulamasına yönelik bağlamsal soru yanıtlayan bir sohbet robotu oluşturmak için aşağıdaki adımlar gereklidir:

  1. SageMaker JumpStart GPT-J-6B gömme modelini kullanarak her PDF belgesi için gömmeler oluşturun. Amazon Basit Depolama Hizmeti (Amazon S3) yükleme dizini.
  2. Aşağıdaki adımları kullanarak ilgili belgeleri tanımlayın:
    • Aynı modeli kullanarak kullanıcının sorgusu için bir yerleştirme oluşturun.
    • Gömme alanındaki en alakalı K belge dizinini aramak için vektör motoru özelliğiyle OpenSearch Serverless'ı kullanın.
    • Tanımlanan dizinleri kullanarak ilgili belgeleri alın.
  3. Alınan belgeleri kullanıcının istemi ve sorusuyla bağlam olarak birleştirin. Yanıt oluşturmak için bunu SageMaker LLM'ye iletin.

Bu süreci yönetmek için popüler bir çerçeve olan LangChain'i kullanıyoruz. LangChain, çeşitli LLM'ler için evrensel bir arayüz sunarak, LLM'ler tarafından desteklenen uygulamaları desteklemek üzere özel olarak tasarlanmıştır. Birden fazla LLM'nin entegrasyonunu kolaylaştırarak çağrılar arasında kesintisiz durum kalıcılığı sağlar. Ayrıca, özelleştirilebilir bilgi istemi şablonları, kapsamlı uygulama oluşturma aracıları ve arama ve erişim için özel dizinler gibi özelliklerle geliştirici verimliliğini artırır. Ayrıntılı bir anlayış için bkz. LangChain belgeleri.

Önkoşullar

Bağlama duyarlı sohbet robotumuzu oluşturmak için aşağıdaki ön koşullara ihtiyacınız vardır:

OpenSearch Sunucusuz vektör motorunun nasıl kurulacağına ilişkin talimatlar için bkz. Amazon OpenSearch Serverless için vektör motoruyla tanışın, şimdi önizlemede.

Aşağıdaki çözümün kapsamlı bir açıklaması için klonlayın GitHub repo ve bakın Jupyter defter.

SageMaker JumpStart'ı kullanarak ML modellerini dağıtma

ML modellerini dağıtmak için aşağıdaki adımları tamamlayın:

  1. SageMaker JumpStart'tan Llama 2 LLM'yi dağıtın:
    from sagemaker.jumpstart.model import JumpStartModel
    llm_model = JumpStartModel(model_id = "meta-textgeneration-llama-2-7b-f")
    llm_predictor = llm_model.deploy()
    llm_endpoint_name = llm_predictor.endpoint_name

  2. GPT-J yerleştirme modelini dağıtın:
    embeddings_model = JumpStartModel(model_id = "huggingface-textembedding-gpt-j-6b-fp16")
    embed_predictor = embeddings_model.deploy()
    embeddings_endpoint_name = embed_predictor.endpoint_name
    

Verileri parçalayın ve bir belge yerleştirme nesnesi oluşturun

Bu bölümde verileri daha küçük belgelere ayırırsınız. Parçalama, büyük metinleri daha küçük parçalara bölmek için kullanılan bir tekniktir. Bu çok önemli bir adım çünkü RAG modelimiz için arama sorgusunun alaka düzeyini optimize ediyor ve bu da sohbet robotunun kalitesini artırıyor. Parça boyutu, belge türü ve kullanılan model gibi faktörlere bağlıdır. Bir paragrafın yaklaşık boyutu olduğundan chunk_size=1600 öbeği seçildi. Modeller geliştikçe bağlam penceresi boyutları artacak ve daha büyük parça boyutlarına olanak tanınacaktır.

Bakın Jupyter dizüstü bilgisayar Tam çözüm için GitHub deposunda.

  1. LangChain'i uzatın SageMakerEndpointEmbeddings Daha önce oluşturduğunuz gpt-j-6b-fp16 SageMaker uç noktasını kullanan özel bir yerleştirme işlevi oluşturmak için class'ı kullanın (yerleştirme modelini kullanmanın bir parçası olarak):
    from langchain.embeddings import SagemakerEndpointEmbeddings
    from langchain.embeddings.sagemaker_endpoint import EmbeddingsContentHandler
    
    logger = logging.getLogger(__name__)
    
    # extend the SagemakerEndpointEmbeddings class from langchain to provide a custom embedding function
    class SagemakerEndpointEmbeddingsJumpStart(SagemakerEndpointEmbeddings):
        def embed_documents(
            self, texts: List[str], chunk_size: int = 1
        ) → List[List[float]]:
            """Compute doc embeddings using a SageMaker Inference Endpoint.
     
            Args:
                texts: The list of texts to embed.
                chunk_size: The chunk size defines how many input texts will
                    be grouped together as request. If None, will use the
                    chunk size specified by the class.
    
            Returns:
                List of embeddings, one for each text.
            """
            results = []
            _chunk_size = len(texts) if chunk_size > len(texts) else chunk_size
            st = time.time()
            for i in range(0, len(texts), _chunk_size):
                response = self._embedding_func(texts[i : i + _chunk_size])
                results.extend(response)
            time_taken = time.time() - st
            logger.info(
                f"got results for {len(texts)} in {time_taken}s, length of embeddings list is {len(results)}"
            )
            print(
                f"got results for {len(texts)} in {time_taken}s, length of embeddings list is {len(results)}"
            )
            return results
    
    # class for serializing/deserializing requests/responses to/from the embeddings model
    class ContentHandler(EmbeddingsContentHandler):
        content_type = "application/json"
        accepts = "application/json"
     
        def transform_input(self, prompt: str, model_kwargs={}) → bytes:
     
            input_str = json.dumps({"text_inputs": prompt, **model_kwargs})
            return input_str.encode("utf-8")
     
        def transform_output(self, output: bytes) → str:
     
            response_json = json.loads(output.read().decode("utf-8"))
            embeddings = response_json["embedding"]
            if len(embeddings) == 1:
                return [embeddings[0]]
            return embeddings
    
    def create_sagemaker_embeddings_from_js_model(
        embeddings_endpoint_name: str, aws_region: str
    ) → SagemakerEndpointEmbeddingsJumpStart:
     
        content_handler = ContentHandler()
        embeddings = SagemakerEndpointEmbeddingsJumpStart(
            endpoint_name=embeddings_endpoint_name,
            region_name=aws_region,
            content_handler=content_handler,
        )
        return embeddings
    
    

  2. Katıştırmalar nesnesini oluşturun ve belge katıştırmalarının oluşturulmasını toplu olarak gerçekleştirin:
    embeddings = create_sagemaker_embeddings_from_js_model(embeddings_endpoint_name, aws_region)

  3. Bu yerleştirmeler LangChain kullanılarak vektör motorunda saklanır OpenSearchVectorSearch. Bu yerleştirmeleri bir sonraki bölümde saklarsınız. Belge yerleştirmeyi OpenSearch Serverless'ta saklayın. Artık yığın halindeki belgeler üzerinde yineleme yapmaya, yerleştirmeleri oluşturmaya ve bu yerleştirmeleri vektör arama koleksiyonlarında oluşturulan OpenSearch Sunucusuz vektör dizininde depolamaya hazırsınız. Aşağıdaki koda bakın:
    docsearch = OpenSearchVectorSearch.from_texts(
    texts = [d.page_content for d in docs],
    embedding=embeddings,
    opensearch_url=[{'host': _aoss_host, 'port': 443}],
    http_auth=awsauth,
    timeout = 300,
    use_ssl = True,
    verify_certs = True,
    connection_class = RequestsHttpConnection,
    index_name=_aos_index
    )

Belgeler üzerinden soru ve cevap

Şu ana kadar büyük bir belgeyi daha küçük parçalara ayırdınız, vektör yerleştirmeler oluşturdunuz ve bunları bir vektör motorunda sakladınız. Artık bu belge verileriyle ilgili soruları yanıtlayabilirsiniz. Veriler üzerinde indeks oluşturduğunuz için anlamsal arama yapabilirsiniz; bu şekilde, yalnızca soruyu yanıtlamak için gereken en ilgili belgeler istem yoluyla LLM'ye iletilir. Bu, yalnızca ilgili belgeleri LLM'ye ileterek zamandan ve paradan tasarruf etmenizi sağlar. Belge zincirlerini kullanma hakkında daha fazla ayrıntı için bkz. evraklar.

Belgeleri kullanarak soruları yanıtlamak için aşağıdaki adımları tamamlayın:

  1. SageMaker LLM uç noktasını LangChain ile kullanmak için şunu kullanırsınız: langchain.llms.sagemaker_endpoint.SagemakerEndpointSageMaker LLM uç noktasını özetleyen. LangChain SageMaker entegrasyonu için aşağıdaki kodda gösterildiği gibi istek ve yanıt yükü için bir dönüşüm gerçekleştirirsiniz. Kullanmayı seçtiğiniz LLM modelinin content_type ve kabul biçimine göre ContentHandler'daki kodu ayarlamanız gerekebileceğini unutmayın.
    content_type = "application/json"
    accepts = "application/json"
    def transform_input(self, prompt: str, model_kwargs: dict) → bytes:
            payload = {
                "inputs": [
                    [
                        {
                            "role": "system",
                            "content": prompt,
                        },
                        {"role": "user", "content": prompt},
                    ],
                ],
                "parameters": {
                    "max_new_tokens": 1000,
                    "top_p": 0.9,
                    "temperature": 0.6,
                },
            }
            input_str = json.dumps(
                payload,
            )
            return input_str.encode("utf-8")
    
    def transform_output(self, output: bytes) → str:
        response_json = json.loads(output.read().decode("utf-8"))
        content = response_json[0]["generation"]["content"]
    
        return content
    
    content_handler = ContentHandler()
    
    sm_jumpstart_llm=SagemakerEndpoint(
            endpoint_name=llm_endpoint_name,
            region_name=aws_region,
            model_kwargs={"max_new_tokens": 300},
            endpoint_kwargs={"CustomAttributes": "accept_eula=true"},
            content_handler=content_handler,
        )

Artık mali belgeyle etkileşime geçmeye hazırsınız.

  1. Belgeyle ilgili sorular sormak için aşağıdaki sorgu ve bilgi istemi şablonunu kullanın:
    from langchain import PromptTemplate, SagemakerEndpoint
    from langchain.llms.sagemaker_endpoint import LLMContentHandler
    
    query = "Summarize the earnings report and also what year is the report for"
    prompt_template = """Only use context to answer the question at the end.
     
    {context}
     
    Question: {question}
    Answer:"""
    
    prompt = PromptTemplate(
        template=prompt_template, input_variables=["context", "question"]
    )
     
     
    class ContentHandler(LLMContentHandler):
        content_type = "application/json"
        accepts = "application/json"
    
        def transform_input(self, prompt: str, model_kwargs: dict) → bytes:
            payload = {
                "inputs": [
                    [
                        {
                            "role": "system",
                            "content": prompt,
                        },
                        {"role": "user", "content": prompt},
                    ],
                ],
                "parameters": {
                    "max_new_tokens": 1000,
                    "top_p": 0.9,
                    "temperature": 0.6,
                },
            }
            input_str = json.dumps(
                payload,
            )
            return input_str.encode("utf-8")
     
        def transform_output(self, output: bytes) → str:
            response_json = json.loads(output.read().decode("utf-8"))
            content = response_json[0]["generation"]["content"]
            return content
    
    content_handler = ContentHandler()
     
    chain = load_qa_chain(
        llm=SagemakerEndpoint(
            endpoint_name=llm_endpoint_name,
            region_name=aws_region,
            model_kwargs={"max_new_tokens": 300},
            endpoint_kwargs={"CustomAttributes": "accept_eula=true"},
            content_handler=content_handler,
        ),
        prompt=prompt,
    )
    sim_docs = docsearch.similarity_search(query, include_metadata=False)
    chain({"input_documents": sim_docs, "question": query}, return_only_outputs=True)
    

Temizlemek

Gelecekte ortaya çıkabilecek maliyetleri önlemek için bu not defterinde oluşturduğunuz SageMaker çıkarım uç noktalarını silin. Bunu SageMaker Studio not defterinizde aşağıdakileri çalıştırarak yapabilirsiniz:

# Delete LLM
llm_predictor.delete_model()
llm_predictor.delete_predictor(delete_endpoint_config=True)

# Delete Embeddings Model
embed_predictor.delete_model()
embed_predictor.delete_predictor(delete_endpoint_config=True)

Bu örnek için bir OpenSearch Sunucusuz koleksiyon oluşturduysanız ve artık buna ihtiyacınız yoksa, bunu OpenSearch Sunucusuz konsolu aracılığıyla silebilirsiniz.

Sonuç

Bu yazıda, Yüksek Lisans'lara alana özgü bağlam sağlamak için RAG'ı bir yaklaşım olarak kullanmayı tartıştık. Vektör veri deposu olarak bir vektör motoruyla Llama 2 ve OpenSearch Serverless'ı kullanan bir finansal hizmetler kuruluşu için RAG tabanlı bağlamsal bir sohbet robotu oluşturmak için SageMaker JumpStart'ın nasıl kullanılacağını gösterdik. Bu yöntem, ilgili bağlamı dinamik olarak tedarik ederek Lama 2'yi kullanarak metin oluşturmayı geliştirir. SageMaker JumpStart'ta özel verilerinizi getirdiğinizi ve bu RAG tabanlı stratejiyle yenilik yaptığınızı görmekten heyecan duyuyoruz!


yazarlar hakkında

Sunil Padmanabhan AWS'de Başlangıç ​​Çözümleri Mimarıdır. Eski bir startup kurucusu ve CTO olarak, makine öğrenimi konusunda tutkulu ve yeni başlayanların iş sonuçları için AI/ML'den yararlanmasına ve ML/AI çözümlerini geniş ölçekte tasarlayıp dağıtmasına yardımcı olmaya odaklanıyor.

Süleyman Patel Amazon Web Services'ta (AWS) Kıdemli Çözüm Mimarı olup, Makine Öğrenimi ve Modernizasyona özel olarak odaklanmıştır. Hem iş hem de teknoloji alanındaki uzmanlığından yararlanan Suleman, müşterilerin gerçek dünyadaki iş sorunlarını çözen çözümler tasarlamasına ve oluşturmasına yardımcı olur. Suleman kendini işine vermediği zamanlarda dışarıyı keşfetmeyi, yol gezilerine çıkmayı ve mutfakta lezzetli yemekler pişirmeyi seviyor.

spot_img

En Son İstihbarat

spot_img