ساخت ربات گفتگوی متنی برای خدمات مالی با استفاده از Amazon SageMaker JumpStart، Llama 2 و Amazon OpenSearch Serverless با موتور برداری | خدمات وب آمازون

ساخت ربات گفتگوی متنی برای خدمات مالی با استفاده از Amazon SageMaker JumpStart، Llama 2 و Amazon OpenSearch Serverless با موتور برداری | خدمات وب آمازون

صنعت خدمات مالی (FinServ) دارای الزامات هوش مصنوعی مولد منحصربه‌فرد مربوط به داده‌های خاص دامنه، امنیت داده‌ها، کنترل‌های نظارتی و استانداردهای انطباق صنعت است. علاوه بر این، مشتریان به دنبال انتخاب‌هایی برای انتخاب کارآمدترین و مقرون‌به‌صرفه‌ترین مدل یادگیری ماشین (ML) و توانایی انجام سفارشی‌سازی لازم (تنظیم دقیق) هستند تا متناسب با موارد استفاده تجاری خود باشند. Amazon SageMaker JumpStart به طور ایده آل برای موارد استفاده مولد هوش مصنوعی برای مشتریان FinServ مناسب است زیرا کنترل های امنیتی داده های لازم را فراهم می کند و الزامات استانداردهای انطباق را برآورده می کند.

در این پست، ما وظایف پاسخگویی به سوال را با استفاده از یک رویکرد مبتنی بر بازیابی (RAG) با مدل‌های زبان بزرگ (LLM) در SageMaker JumpStart با استفاده از یک مورد استفاده از دامنه مالی ساده نشان می‌دهیم. RAG چارچوبی برای بهبود کیفیت تولید متن با ترکیب یک LLM با یک سیستم بازیابی اطلاعات (IR) است. LLM متن تولید می کند و سیستم IR اطلاعات مربوطه را از پایگاه دانش بازیابی می کند. سپس اطلاعات بازیابی شده برای تقویت ورودی LLM استفاده می شود، که می تواند به بهبود دقت و ارتباط متن تولید شده مدل کمک کند. نشان داده شده است که RAG برای انواع وظایف تولید متن، مانند پاسخ به سؤال و خلاصه‌سازی، مؤثر است. این یک رویکرد امیدوارکننده برای بهبود کیفیت و دقت مدل‌های تولید متن است.

مزایای استفاده از SageMaker JumpStart

با SageMaker JumpStart، پزشکان ML می‌توانند از میان مجموعه گسترده‌ای از مدل‌های پیشرفته برای موارد استفاده مانند نوشتن محتوا، تولید تصویر، تولید کد، پاسخ‌گویی به سؤال، کپی‌نویسی، خلاصه‌سازی، طبقه‌بندی، بازیابی اطلاعات و موارد دیگر انتخاب کنند. پزشکان ML می توانند مدل های پایه را به صورت اختصاصی به کار گیرند آمازون SageMaker نمونه هایی از یک محیط جدا شده از شبکه و سفارشی کردن مدل ها با استفاده از SageMaker برای آموزش و استقرار مدل.

SageMaker JumpStart برای موارد استفاده مولد هوش مصنوعی برای مشتریان FinServ ایده آل است زیرا موارد زیر را ارائه می دهد:

  • قابلیت های سفارشی سازی – SageMaker JumpStart نمونه‌های نوت‌بوک و پست‌های دقیق را برای راهنمایی گام به گام در مورد تطبیق دامنه مدل‌های پایه ارائه می‌کند. شما می توانید این منابع را برای تنظیم دقیق، تطبیق دامنه، و آموزش مدل های پایه یا ساخت برنامه های کاربردی مبتنی بر RAG دنبال کنید.
  • امنیت داده ها - اطمینان از امنیت داده های بار استنتاج بسیار مهم است. با SageMaker JumpStart، می‌توانید مدل‌ها را در ایزوله شبکه با ارائه نقطه پایانی تک اجاره‌ای مستقر کنید. علاوه بر این، می‌توانید کنترل دسترسی به مدل‌های انتخابی را از طریق قابلیت هاب مدل خصوصی مدیریت کنید، که با الزامات امنیتی فردی هماهنگ باشد.
  • کنترل های نظارتی و انطباق - مطابقت با استانداردهایی مانند HIPAA BAA، SOC123، PCI، و HITRUST CSF یکی از ویژگی های اصلی SageMaker است که از همسویی با چشم انداز نظارتی دقیق بخش مالی اطمینان می دهد.
  • انتخاب های مدل – SageMaker JumpStart مجموعه‌ای از پیشرفته‌ترین مدل‌های ML را ارائه می‌کند که به طور مداوم در بین معیارهای HELM شناخته‌شده در صنعت رتبه‌بندی می‌شوند. اینها شامل مدل‌های Llama 2، Falcon 40B، AI21 J2 Ultra، AI21 Summarize، Hugging Face MiniLM و BGE می‌شود، اما محدود به آنها نیست.

در این پست، ساختن یک ربات چت متنی برای سازمان های خدمات مالی با استفاده از معماری RAG با مدل پایه Llama 2 و صورت در آغوش گرفته GPTJ-6B-FP16 مدل embeddings، هر دو در SageMaker JumpStart موجود است. ما نیز استفاده می کنیم موتور بردار برای بدون سرور جستجوی باز آمازون (در حال حاضر در پیش نمایش) به عنوان ذخیره داده های برداری برای ذخیره جاسازی ها.

محدودیت های مدل های زبان بزرگ

LLM ها بر روی حجم وسیعی از داده های بدون ساختار آموزش دیده اند و در تولید متن عمومی عالی هستند. از طریق این آموزش، LLM ها دانش واقعی را کسب و ذخیره می کنند. با این حال، LLM های خارج از قفسه محدودیت هایی دارند:

  • آموزش آفلاین آنها را از اطلاعات به روز بی خبر می کند.
  • آموزش آن‌ها بر روی داده‌های عمدتاً تعمیم‌یافته، کارایی آن‌ها را در وظایف حوزه خاص کاهش می‌دهد. به عنوان مثال، یک شرکت مالی ممکن است ربات پرسش و پاسخ خود را ترجیح دهد تا پاسخ ها را از آخرین اسناد داخلی خود تهیه کند و از صحت و انطباق با قوانین تجاری خود اطمینان حاصل کند.
  • اتکای آنها به اطلاعات جاسازی شده، قابلیت تفسیر را به خطر می اندازد.

برای استفاده از داده های خاص در LLM ها، سه روش رایج وجود دارد:

  • تعبیه داده ها در مدل، به آن اجازه می دهد تا از این زمینه در طول تولید خروجی استفاده کند. این می تواند صفر شات (بدون مثال)، چند شات (نمونه های محدود)، یا چند شات (نمونه های فراوان). چنین انگیزه های متنی مدل ها را به سمت نتایج ظریف تر هدایت می کند.
  • تنظیم دقیق مدل با استفاده از جفت اعلان‌ها و تکمیل‌ها.
  • RAG، که داده های خارجی (غیر پارامتریک) را بازیابی می کند و این داده ها را در دستورات ادغام می کند و زمینه را غنی می کند.

با این حال، روش اول با محدودیت های مدل در اندازه زمینه دست و پنجه نرم می کند، که ورود اسناد طولانی و احتمالاً افزایش هزینه ها را دشوار می کند. رویکرد تنظیم دقیق، در حالی که قدرتمند است، منابع فشرده است، به ویژه با داده های خارجی همیشه در حال تکامل، که منجر به تاخیر در استقرار و افزایش هزینه ها می شود. RAG همراه با LLM ها راه حلی برای محدودیت های ذکر شده قبلی ارائه می دهد.

بازیابی نسل افزوده

RAG داده های خارجی (غیر پارامتریک) را بازیابی می کند و این داده ها را در دستورات ML ادغام می کند و زمینه را غنی می کند. لوئیس و همکاران مدل های RAG را در سال 2020 معرفی کرد و آنها را به عنوان تلفیقی از یک مدل توالی به دنباله از پیش آموزش دیده (حافظه پارامتریک) و یک شاخص برداری متراکم از ویکی پدیا (حافظه ناپارامتریک) که از طریق یک بازیابی عصبی قابل دسترسی است، مفهوم سازی کرد.

در اینجا نحوه عملکرد RAG آمده است:

  • منابع داده - RAG می‌تواند از منابع داده‌های مختلف، از جمله مخازن اسناد، پایگاه‌های داده یا APIها استخراج کند.
  • قالب بندی داده ها - هم درخواست کاربر و هم اسناد به قالبی مناسب برای مقایسه ارتباط تبدیل می شوند.
  • درونه گیریها - برای تسهیل این مقایسه، پرس و جو و مجموعه اسناد (یا کتابخانه دانش) با استفاده از مدل های زبانی به جاسازی های عددی تبدیل می شوند. این تعبیه‌ها به صورت عددی مفاهیم متنی را در بر می‌گیرند.
  • جستجوی مرتبط – جاسازی پرس و جو کاربر با جاسازی های مجموعه سند مقایسه می شود و متن مربوطه را از طریق جستجوی شباهت در فضای جاسازی شناسایی می کند.
  • غنی سازی زمینه - متن مربوطه شناسایی شده به درخواست اصلی کاربر الحاق می شود و در نتیجه زمینه آن را تقویت می کند.
  • پردازش LLM - با زمینه غنی شده، درخواست به LLM داده می شود، که به دلیل گنجاندن داده های خارجی مربوطه، خروجی های مرتبط و دقیق را تولید می کند.
  • به روز رسانی ناهمزمان - برای اطمینان از جاری بودن اسناد مرجع، می توان آنها را به صورت ناهمزمان همراه با نمایش های جاسازی شده به روز کرد. این تضمین می‌کند که پاسخ‌های مدل آینده مبتنی بر آخرین اطلاعات است و دقت را تضمین می‌کند.

در اصل، RAG یک روش پویا برای القای اطلاعات مرتبط و هم‌زمان در LLM ارائه می‌کند و از تولید خروجی‌های دقیق و به موقع اطمینان می‌دهد.

نمودار زیر جریان مفهومی استفاده از RAG با LLM ها را نشان می دهد.

Build a contextual chatbot for financial services using Amazon SageMaker JumpStart, Llama 2 and Amazon OpenSearch Serverless with Vector Engine | Amazon Web Services PlatoBlockchain Data Intelligence. Vertical Search. Ai.

بررسی اجمالی راه حل

مراحل زیر برای ایجاد یک ربات چت پاسخگویی متنی برای یک برنامه خدمات مالی لازم است:

  1. از مدل جاسازی SageMaker JumpStart GPT-J-6B برای ایجاد جاسازی برای هر سند PDF در سرویس ذخیره سازی ساده آمازون دایرکتوری آپلود (Amazon S3).
  2. با استفاده از مراحل زیر اسناد مربوطه را شناسایی کنید:
    • با استفاده از همان مدل، یک جاسازی برای درخواست کاربر ایجاد کنید.
    • از OpenSearch Serverless با ویژگی موتور برداری برای جستجوی K مرتبط ترین نمایه های سند در فضای جاسازی استفاده کنید.
    • اسناد مربوطه را با استفاده از نمایه های شناسایی شده بازیابی کنید.
  3. اسناد بازیابی شده را به عنوان زمینه با درخواست و سوال کاربر ترکیب کنید. این را برای تولید پاسخ به SageMaker LLM ارسال کنید.

ما از LangChain، یک چارچوب محبوب، برای هماهنگ کردن این فرآیند استفاده می کنیم. LangChain به طور خاص برای تقویت برنامه های کاربردی طراحی شده توسط LLM ها طراحی شده است و یک رابط جهانی برای LLM های مختلف ارائه می دهد. این یکپارچه سازی چندین LLM را ساده می کند و از تداوم حالت یکپارچه بین تماس ها اطمینان می دهد. علاوه بر این، کارایی توسعه‌دهندگان را با ویژگی‌هایی مانند قالب‌های سریع قابل تنظیم، عوامل جامع برنامه‌سازی، و فهرست‌های تخصصی برای جستجو و بازیابی افزایش می‌دهد. برای درک عمیق، به مستندات LangChain.

پیش نیازها

برای ساخت ربات چت آگاه ما به پیش نیازهای زیر نیاز دارید:

برای دستورالعمل‌های مربوط به نحوه راه‌اندازی موتور برداری بدون سرور OpenSearch، به مراجعه کنید معرفی موتور برداری برای Amazon OpenSearch Serverless، اکنون در پیش نمایش.

برای بررسی جامع راه حل زیر، آن را شبیه سازی کنید GitHub repo و رجوع به نوت بوک ژوپیتر.

مدل های ML را با استفاده از SageMaker JumpStart اجرا کنید

برای استقرار مدل های ML، مراحل زیر را انجام دهید:

  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
    

داده ها را تکه تکه کنید و یک شی جاسازی سند ایجاد کنید

در این بخش، داده ها را به اسناد کوچکتر تقسیم می کنید. قطعه قطعه کردن تکنیکی برای تقسیم متون بزرگ به تکه های کوچکتر است. این یک مرحله ضروری است زیرا ارتباط جست و جو را برای مدل RAG ما بهینه می کند، که به نوبه خود کیفیت ربات چت را بهبود می بخشد. اندازه قطعه به عواملی مانند نوع سند و مدل استفاده شده بستگی دارد. یک chunk chunk_size=1600 انتخاب شده است زیرا این اندازه تقریبی یک پاراگراف است. با بهبود مدل‌ها، اندازه پنجره زمینه آنها افزایش می‌یابد و امکان اندازه‌های بزرگ‌تر را فراهم می‌کند.

به دفترچه ژوپیتر در مخزن GitHub برای راه حل کامل.

  1. LangChain را گسترش دهید SageMakerEndpointEmbeddings کلاس برای ایجاد یک تابع embeddings سفارشی که از نقطه پایانی gpt-j-6b-fp16 SageMaker که قبلاً ایجاد کرده‌اید (به عنوان بخشی از استفاده از مدل embeddings) استفاده می‌کند:
    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 را ایجاد کنید و به صورت دسته ای ایجاد جاسازی های سند را ایجاد کنید:
    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 را به عنوان رویکردی برای ارائه زمینه خاص دامنه به LLMها مورد بحث قرار دادیم. ما نشان دادیم که چگونه از SageMaker JumpStart برای ساختن یک ربات گفتگوی متنی مبتنی بر RAG برای یک سازمان خدمات مالی با استفاده از Llama 2 و OpenSearch Serverless با موتور برداری به عنوان ذخیره داده های برداری استفاده کنیم. این روش تولید متن را با استفاده از Llama 2 با منبع‌یابی پویا زمینه مرتبط اصلاح می‌کند. ما خوشحالیم که می‌بینیم داده‌های سفارشی خود را آورده و با این استراتژی مبتنی بر RAG در SageMaker JumpStart نوآوری می‌کنید!


درباره نویسندگان

Build a contextual chatbot for financial services using Amazon SageMaker JumpStart, Llama 2 and Amazon OpenSearch Serverless with Vector Engine | Amazon Web Services PlatoBlockchain Data Intelligence. Vertical Search. Ai.سونیل پادمانابهان یک معمار راه حل های استارتاپی در AWS است. او به‌عنوان یک بنیان‌گذار سابق استارت‌آپ و مدیر ارشد فناوری، علاقه‌مند به یادگیری ماشینی است و بر کمک به استارت‌آپ‌ها در استفاده از AI/ML برای نتایج کسب‌وکارشان و طراحی و استقرار راه‌حل‌های ML/AI در مقیاس تمرکز می‌کند.

Build a contextual chatbot for financial services using Amazon SageMaker JumpStart, Llama 2 and Amazon OpenSearch Serverless with Vector Engine | Amazon Web Services PlatoBlockchain Data Intelligence. Vertical Search. Ai.سلیمان پاتل یک معمار ارشد راه حل در خدمات وب آمازون (AWS) با تمرکز ویژه بر یادگیری ماشین و مدرنیزاسیون است. سلمان با استفاده از تخصص خود در کسب و کار و فناوری، به مشتریان کمک می کند تا راه حل هایی را طراحی و بسازند که با مشکلات تجاری دنیای واقعی مقابله کند. زمانی که سلیمان در کار خود غوطه ور نیست، عاشق کاوش در فضای باز، سفرهای جاده ای و پختن غذاهای خوشمزه در آشپزخانه است.

تمبر زمان:

بیشتر از آموزش ماشین AWS