شعار زيفيرنت

أنشئ روبوت محادثة سياقيًا للخدمات المالية باستخدام Amazon SageMaker JumpStart وLlama 2 وAmazon OpenSearch Serverless with Vector Engine | خدمات الويب الأمازون

التاريخ:

تتمتع صناعة الخدمات المالية (FinServ) بمتطلبات ذكاء اصطناعي توليدية فريدة تتعلق بالبيانات الخاصة بالمجال وأمن البيانات والضوابط التنظيمية ومعايير الامتثال للصناعة. بالإضافة إلى ذلك، يبحث العملاء عن خيارات لتحديد نموذج التعلم الآلي (ML) الأكثر أداءً وفعالية من حيث التكلفة والقدرة على إجراء التخصيص اللازم (الضبط الدقيق) ليناسب حالات استخدام أعمالهم. أمازون سيج ميكر جومب ستارت يعتبر مناسبًا بشكل مثالي لحالات استخدام الذكاء الاصطناعي التوليدي لعملاء FinServ لأنه يوفر ضوابط أمان البيانات اللازمة ويلبي متطلبات معايير الامتثال.

في هذا المنشور، نعرض مهام الإجابة على الأسئلة باستخدام النهج القائم على إنشاء الاسترجاع المعزز (RAG) مع نماذج اللغة الكبيرة (LLMs) في SageMaker JumpStart باستخدام حالة استخدام بسيطة للمجال المالي. RAG هو إطار عمل لتحسين جودة إنشاء النص من خلال الجمع بين LLM ونظام استرجاع المعلومات (IR). يتم إنشاء نص LLM، ويقوم نظام IR باسترداد المعلومات ذات الصلة من قاعدة المعرفة. يتم بعد ذلك استخدام المعلومات المستردة لزيادة مدخلات LLM، والتي يمكن أن تساعد في تحسين دقة وأهمية النص الذي تم إنشاؤه في النموذج. لقد ثبت أن RAG فعال في مجموعة متنوعة من مهام إنشاء النص، مثل الإجابة على الأسئلة والتلخيص. إنه نهج واعد لتحسين جودة ودقة نماذج إنشاء النص.

مزايا استخدام SageMaker JumpStart

باستخدام SageMaker JumpStart، يمكن لممارسي تعلم الآلة الاختيار من بين مجموعة واسعة من النماذج الحديثة لحالات الاستخدام مثل كتابة المحتوى، وإنشاء الصور، وإنشاء التعليمات البرمجية، والإجابة على الأسئلة، وكتابة النصوص، والتلخيص، والتصنيف، واسترجاع المعلومات، والمزيد. يمكن لممارسي ML نشر النماذج الأساسية لـ مخصصة الأمازون SageMaker مثيلات من بيئة شبكة معزولة وتخصيص النماذج باستخدام SageMaker للتدريب على النموذج ونشره.

يعتبر SageMaker JumpStart مناسبًا بشكل مثالي لحالات استخدام الذكاء الاصطناعي التوليدي لعملاء FinServ لأنه يقدم ما يلي:

  • قدرات التخصيص - يوفر SageMaker JumpStart نماذج لدفاتر الملاحظات ومنشورات تفصيلية للحصول على إرشادات خطوة بخطوة حول تكييف المجال للنماذج الأساسية. يمكنك متابعة هذه الموارد للضبط الدقيق وتكييف المجال وتعليمات النماذج الأساسية أو إنشاء تطبيقات قائمة على RAG.
  • أمن البيانات - ضمان أمن بيانات الحمولة الاستدلالية أمر بالغ الأهمية. باستخدام SageMaker JumpStart، يمكنك نشر النماذج بمعزل عن الشبكة من خلال توفير نقطة نهاية مستأجرة واحدة. علاوة على ذلك، يمكنك إدارة التحكم في الوصول إلى نماذج محددة من خلال إمكانية مركز النموذج الخاص، بما يتماشى مع متطلبات الأمان الفردية.
  • الضوابط التنظيمية والامتثال – يعد الامتثال لمعايير مثل HIPAA BAA وSOC123 وPCI وHITRUST CSF سمة أساسية لـ SageMaker، مما يضمن التوافق مع المشهد التنظيمي الصارم للقطاع المالي.
  • اختيارات النموذج – يقدم SageMaker JumpStart مجموعة مختارة من نماذج تعلم الآلة المتطورة التي تُصنف باستمرار بين أفضل معايير HELM المعترف بها في الصناعة. وتشمل هذه، على سبيل المثال لا الحصر، نماذج Llama 2 وFalcon 40B وAI21 J2 Ultra وAI21 Summarize وHugging Face MiniLM وBGE.

في هذا المنشور، نستكشف إنشاء روبوت دردشة سياقي لمؤسسات الخدمات المالية باستخدام بنية RAG مع نموذج الأساس Llama 2 و معانقة الوجه GPTJ-6B-FP16 نموذج التضمين، وكلاهما متاح في SageMaker JumpStart. نحن نستخدم أيضا محرك متجه For أمازون أوبن سيرش سيرفرليس (قيد المعاينة حاليًا) كمخزن بيانات متجه لتخزين التضمينات.

القيود المفروضة على نماذج اللغة الكبيرة

تم تدريب LLMs على كميات هائلة من البيانات غير المنظمة والتفوق في إنشاء النصوص العامة. من خلال هذا التدريب، يكتسب حاملو LLM المعرفة الواقعية ويخزنونها. ومع ذلك، فإن LLMs الجاهزة للاستخدام تفرض قيودًا:

  • إن تدريبهم خارج الإنترنت يجعلهم غير مطلعين على أحدث المعلومات.
  • إن تدريبهم على البيانات المعممة في الغالب يقلل من فعاليتهم في المهام الخاصة بالمجال. على سبيل المثال، قد تفضل إحدى الشركات المالية روبوت الأسئلة والأجوبة الخاص بها للحصول على الإجابات من أحدث وثائقها الداخلية، مما يضمن الدقة والامتثال لقواعد العمل الخاصة بها.
  • إن اعتمادهم على المعلومات المضمنة يضر بالقدرة على التفسير.

لاستخدام بيانات محددة في LLMs، توجد ثلاث طرق سائدة:

  • يطالب تضمين البيانات داخل النموذج، مما يسمح له بالاستفادة من هذا السياق أثناء إنشاء المخرجات. يمكن أن يكون هذا صفرًا (لا توجد أمثلة)، أو طلقات قليلة (أمثلة محدودة)، أو طلقات متعددة (أمثلة وفيرة). مثل هذا التحفيز السياقي يوجه النماذج نحو نتائج أكثر دقة.
  • ضبط النموذج باستخدام أزواج من المطالبات والإكمالات.
  • RAG، الذي يسترد البيانات الخارجية (غير المعلمية) ويدمج هذه البيانات في المطالبات، مما يؤدي إلى إثراء السياق.

ومع ذلك، فإن الطريقة الأولى تواجه قيود النموذج على حجم السياق، مما يجعل من الصعب إدخال مستندات طويلة وربما زيادة التكاليف. ورغم أن نهج الضبط الدقيق فعال، إلا أنه يستهلك الكثير من الموارد، لا سيما مع البيانات الخارجية دائمة التطور، مما يؤدي إلى تأخير عمليات النشر وزيادة التكاليف. تقدم RAG مع LLMs حلاً للقيود المذكورة سابقًا.

الجيل المعزز الاسترداد

تسترد RAG البيانات الخارجية (غير المعلمية) وتدمج هذه البيانات في مطالبات تعلم الآلة، مما يؤدي إلى إثراء السياق. لويس وآخرون. قدمت نماذج RAG في عام 2020، حيث تصورها على أنها مزيج من نموذج تسلسل إلى تسلسل مُدرب مسبقًا (ذاكرة حدودية) وفهرس ناقل كثيف لويكيبيديا (ذاكرة غير حدودية) يمكن الوصول إليه عبر المسترد العصبي.

وإليك كيفية عمل RAG:

  • مصادر البيانات - يمكن لـ RAG الاستفادة من مصادر بيانات متنوعة، بما في ذلك مستودعات المستندات أو قواعد البيانات أو واجهات برمجة التطبيقات.
  • تنسيق البيانات - يتم تحويل كل من استعلام المستخدم والمستندات إلى تنسيق مناسب لمقارنات الملاءمة.
  • التضمينات - لتسهيل هذه المقارنة، يتم تحويل الاستعلام ومجموعة المستندات (أو مكتبة المعرفة) إلى تضمينات رقمية باستخدام النماذج اللغوية. تقوم هذه التضمينات بتغليف المفاهيم النصية عدديًا.
  • البحث عن الصلة - تتم مقارنة تضمين استعلام المستخدم بتضمينات مجموعة المستندات، وتحديد النص ذي الصلة من خلال بحث التشابه في مساحة التضمين.
  • إثراء السياق - يتم إلحاق النص ذي الصلة المحدد بالموجه الأصلي للمستخدم، وبالتالي تعزيز سياقه.
  • معالجة LLM – مع السياق المخصب، يتم تغذية الموجه إلى LLM، والذي، بسبب إدراج البيانات الخارجية ذات الصلة، ينتج مخرجات ذات صلة ودقيقة.
  • تحديثات غير متزامنة - لضمان بقاء المستندات المرجعية محدثة، يمكن تحديثها بشكل غير متزامن مع تمثيلاتها المضمنة. ويضمن ذلك أن ترتكز الاستجابات النموذجية المستقبلية على أحدث المعلومات، مما يضمن الدقة.

في جوهر الأمر، تقدم RAG طريقة ديناميكية لتزويد ماجستير إدارة الأعمال بالمعلومات ذات الصلة في الوقت الفعلي، مما يضمن توليد مخرجات دقيقة وفي الوقت المناسب.

يوضح الرسم البياني التالي التدفق المفاهيمي لاستخدام RAG مع LLMs.

حل نظرة عامة

الخطوات التالية مطلوبة لإنشاء سؤال سياقي يجيب على chatbot لتطبيق الخدمات المالية:

  1. استخدم نموذج التضمين SageMaker JumpStart GPT-J-6B لإنشاء عمليات التضمين لكل مستند PDF في خدمة تخزين أمازون البسيطة (أمازون S3) دليل التحميل.
  2. تحديد المستندات ذات الصلة باستخدام الخطوات التالية:
    • قم بإنشاء تضمين لاستعلام المستخدم باستخدام نفس النموذج.
    • استخدم OpenSearch Serverless مع ميزة محرك المتجهات للبحث عن فهارس المستندات الأكثر صلة بـ K في مساحة التضمين.
    • استرجاع المستندات المقابلة باستخدام الفهارس المحددة.
  3. قم بدمج المستندات المستردة كسياق مع مطالبة المستخدم وسؤاله. قم بإرسال هذا إلى SageMaker LLM لتوليد الاستجابة.

نحن نستخدم LangChain، وهو إطار عمل شائع، لتنسيق هذه العملية. تم تصميم LangChain خصيصًا لدعم التطبيقات التي تدعمها LLMs، مما يوفر واجهة عالمية لمختلف LLMs. فهو يعمل على تبسيط عملية دمج LLMs المتعددة، مما يضمن استمرار الحالة بسلاسة بين المكالمات. علاوة على ذلك، فهو يعزز كفاءة المطورين بميزات مثل قوالب المطالبة القابلة للتخصيص، ووكلاء بناء التطبيقات الشاملين، والفهارس المتخصصة للبحث والاسترجاع. للحصول على فهم متعمق، راجع وثائق LangChain.

المتطلبات الأساسية المسبقة

أنت بحاجة إلى المتطلبات الأساسية التالية لإنشاء روبوت الدردشة المدرك للسياق الخاص بنا:

للحصول على إرشادات حول كيفية إعداد محرك متجه OpenSearch Serverless، راجع نقدم لكم المحرك المتجه لـ Amazon OpenSearch Serverless، وهو الآن قيد المعاينة.

للحصول على إرشادات شاملة للحل التالي، قم باستنساخ ملف جيثب ريبو والإشارة إلى دفتر جوبيتر.

انشر نماذج تعلم الآلة باستخدام SageMaker JumpStart

لنشر نماذج تعلم الآلة، أكمل الخطوات التالية:

  1. انشر Llama 2 LLM من SageMaker JumpStart:
    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:
    embeddings_model = JumpStartModel(model_id = "huggingface-textembedding-gpt-j-6b-fp16")
    embed_predictor = embeddings_model.deploy()
    embeddings_endpoint_name = embed_predictor.endpoint_name
    

قم بتجميع البيانات وإنشاء كائن تضمين المستند

في هذا القسم، تقوم بتقسيم البيانات إلى مستندات أصغر. Chunking هي تقنية لتقسيم النصوص الكبيرة إلى أجزاء أصغر. إنها خطوة أساسية لأنها تعمل على تحسين ملاءمة استعلام البحث لنموذج RAG الخاص بنا، والذي بدوره يعمل على تحسين جودة برنامج الدردشة الآلية. يعتمد حجم القطعة على عوامل مثل نوع المستند والنموذج المستخدم. تم تحديد قطعةchunk_size=1600 لأن هذا هو الحجم التقريبي للفقرة. مع تحسن النماذج، سيزداد حجم نافذة السياق الخاصة بها، مما يسمح بأحجام أكبر للأجزاء.

الرجوع إلى دفتر جوبيتر في GitHub repo للحصول على الحل الكامل.

  1. تمديد LangChain SageMakerEndpointEmbeddings لإنشاء وظيفة تضمينات مخصصة تستخدم نقطة نهاية gpt-j-6b-fp16 SageMaker التي قمت بإنشائها مسبقًا (كجزء من استخدام نموذج التضمين):
    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. قم بإنشاء كائن التضمينات وقم بإنشاء عمليات تضمين المستند دفعة واحدة:
    embeddings = create_sagemaker_embeddings_from_js_model(embeddings_endpoint_name, aws_region)

  3. يتم تخزين هذه التضمينات في محرك المتجهات باستخدام LangChain OpenSearchVectorSearch. يمكنك تخزين هذه التضمينات في القسم التالي. قم بتخزين تضمين المستند في OpenSearch Serverless. أنت الآن جاهز للتكرار على المستندات المقسمة، وإنشاء التضمينات، وتخزين هذه التضمينات في فهرس المتجهات OpenSearch Serverless الذي تم إنشاؤه في مجموعات بحث المتجهات. انظر الكود التالي:
    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
    )

سؤال وجواب على الوثائق

لقد قمت حتى الآن بتقسيم مستند كبير إلى مستند أصغر حجمًا، وإنشاء تضمينات متجهة، وتخزينها في محرك متجه. يمكنك الآن الإجابة على الأسئلة المتعلقة ببيانات هذا المستند. نظرًا لأنك أنشأت فهرسًا فوق البيانات، يمكنك إجراء بحث دلالي؛ بهذه الطريقة، يتم تمرير المستندات الأكثر صلة المطلوبة للإجابة على السؤال فقط عبر المطالبة إلى LLM. يتيح لك ذلك توفير الوقت والمال من خلال تمرير المستندات ذات الصلة إلى LLM فقط. لمزيد من التفاصيل حول استخدام سلاسل المستندات، راجع الوثائق .

أكمل الخطوات التالية للإجابة على الأسئلة باستخدام المستندات:

  1. لاستخدام نقطة نهاية SageMaker LLM مع LangChain، يمكنك استخدام langchain.llms.sagemaker_endpoint.SagemakerEndpoint، الذي يلخص نقطة نهاية SageMaker LLM. يمكنك إجراء تحويل لحمولة الطلب والاستجابة كما هو موضح في التعليمة البرمجية التالية لتكامل LangChain SageMaker. لاحظ أنك قد تحتاج إلى ضبط التعليمات البرمجية في ContentHandler استنادًا إلى content_type وقبول تنسيق نموذج LLM الذي تختار استخدامه.
    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,
        )

أنت الآن جاهز للتفاعل مع المستند المالي.

  1. استخدم الاستعلام التالي والقالب الفوري لطرح أسئلة بخصوص المستند:
    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)
    

تنظيف

لتجنب تكبد تكاليف مستقبلية، احذف نقاط نهاية استدلال SageMaker التي قمت بإنشائها في دفتر الملاحظات هذا. يمكنك القيام بذلك عن طريق تشغيل ما يلي في دفتر ملاحظات SageMaker Studio الخاص بك:

# 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)

إذا قمت بإنشاء مجموعة OpenSearch Serverless لهذا المثال ولم تعد بحاجة إليها، فيمكنك حذفها عبر وحدة تحكم OpenSearch Serverless.

وفي الختام

في هذا المنشور، ناقشنا استخدام RAG كنهج لتوفير سياق خاص بالمجال لـ LLMs. لقد أظهرنا كيفية استخدام SageMaker JumpStart لإنشاء روبوت دردشة سياقي قائم على RAG لمؤسسة خدمات مالية تستخدم Llama 2 وOpenSearch Serverless مع محرك متجه كمخزن بيانات متجه. تعمل هذه الطريقة على تحسين إنشاء النص باستخدام Llama 2 من خلال تحديد مصادر السياق ذي الصلة ديناميكيًا. يسعدنا أن نراكم تجلبون بياناتكم المخصصة وتبتكرون باستخدام هذه الإستراتيجية المستندة إلى RAG على SageMaker JumpStart!


عن المؤلفين

سونيل بادمانابان هو مهندس حلول بدء التشغيل في AWS. بصفته مؤسسًا سابقًا لشركة ناشئة ورئيسًا تنفيذيًا للتكنولوجيا ، فهو متحمس للتعلم الآلي ويركز على مساعدة الشركات الناشئة في الاستفادة من الذكاء الاصطناعي / التعلم الآلي من أجل نتائج أعمالها وتصميم حلول ML / AI ونشرها على نطاق واسع.

سليمان باتل هو مهندس حلول أول في Amazon Web Services (AWS) ، مع التركيز بشكل خاص على التعلم الآلي والتحديث. من خلال الاستفادة من خبرته في كل من الأعمال والتكنولوجيا ، يساعد سليمان العملاء على تصميم وبناء الحلول التي تعالج مشاكل الأعمال في العالم الحقيقي. عندما لا يكون منغمسًا في عمله ، يحب سليمان استكشاف الأماكن الخارجية والقيام برحلات على الطريق وطهي الأطباق اللذيذة في المطبخ.

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة