آمازون Lex را با LLM تقویت کنید و تجربه پرسش‌های متداول را با استفاده از دریافت URL | خدمات وب آمازون

آمازون Lex را با LLM تقویت کنید و تجربه پرسش‌های متداول را با استفاده از دریافت URL | خدمات وب آمازون

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

دریافت URL واحد

بسیاری از شرکت‌ها مجموعه‌ای از پاسخ‌های منتشر شده برای پرسش‌های متداول برای مشتریان خود را در وب‌سایت خود در دسترس دارند. در این مورد، ما می‌خواهیم یک ربات چت به مشتریان ارائه دهیم که می‌تواند به سؤالات آنها از سؤالات متداول منتشر شده ما پاسخ دهد. در پست وبلاگ با عنوان آمازون Lex را با ویژگی‌های سؤالات متداول مکالمه با استفاده از LLM تقویت کنید، ما نشان دادیم که چگونه می توانید از ترکیب آمازون Lex و LlamaIndex برای ایجاد یک ربات چت با منابع دانش موجود شما مانند اسناد PDF یا Word استفاده کنید. برای پشتیبانی از یک پرسش متداول ساده، بر اساس یک وب‌سایت پرسش‌های متداول، باید فرآیندی را ایجاد کنیم که بتواند وب‌سایت را بخزد و جاسازی‌هایی ایجاد کند که توسط LlamaIndex برای پاسخ به سؤالات مشتری استفاده شود. در این مورد، ما بر روی ربات ایجاد شده در پست وبلاگ قبلی، که آن جاسازی‌ها را با گفتار کاربر پرس و جو می‌کند و پاسخ را از پرسش‌های متداول وب‌سایت برمی‌گرداند.

نمودار زیر نشان می دهد که چگونه فرآیند مصرف و ربات آمازون لکس برای راه حل ما با هم کار می کنند.

آمازون Lex را با LLM تقویت کنید و تجربه پرسش‌های متداول را با استفاده از دریافت URL | خدمات وب آمازون هوش داده پلاتو بلاک چین. جستجوی عمودی Ai.

در گردش کار راه حل، وب سایت با سؤالات متداول از طریق وارد می شود AWS لامبدا. این تابع Lambda وب سایت را می خزد و متن حاصل را در یک ذخیره می کند سرویس ذخیره سازی ساده آمازون سطل (Amazon S3). سپس سطل S3 یک تابع Lambda را راه‌اندازی می‌کند که از LlamaIndex برای ایجاد جاسازی‌هایی استفاده می‌کند که در Amazon S3 ذخیره می‌شوند. هنگامی که یک سوال از کاربر نهایی می رسد، مانند "سیاست بازگشت شما چیست؟"، ربات آمازون Lex از تابع Lambda خود برای جستجو در جاسازی ها با استفاده از رویکرد مبتنی بر RAG با LlamaIndex استفاده می کند. برای اطلاعات بیشتر در مورد این رویکرد و پیش نیازها، به پست وبلاگ مراجعه کنید، آمازون Lex را با ویژگی‌های سؤالات متداول مکالمه با استفاده از LLM تقویت کنید.

پس از تکمیل پیش نیازهای وبلاگ فوق، اولین گام این است که سؤالات متداول را در یک مخزن اسناد وارد کنید که می تواند توسط LlamaIndex بردار و نمایه شود. کد زیر نحوه انجام این کار را نشان می دهد:

import logging
import sys
import requests
import html2text
from llama_index.readers.schema.base import Document
from llama_index import GPTVectorStoreIndex
from typing import List logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout)) class EZWebLoader: def __init__(self, default_header: str = None): self._html_to_text_parser = html2text() if default_header is None: self._default_header = {"User-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36"} else: self._default_header = default_header def load_data(self, urls: List[str], headers: str = None) -> List[Document]: if headers is None: headers = self._default_header documents = [] for url in urls: response = requests.get(url, headers=headers).text response = self._html2text.html2text(response) documents.append(Document(response)) return documents url = "http://www.zappos.com/general-questions"
loader = EZWebLoader()
documents = loader.load_data([url])
index = GPTVectorStoreIndex.from_documents(documents)

در مثال قبل، ما یک URL وب سایت پرسش و پاسخ از پیش تعریف شده را از Zappos می گیریم و آن را با استفاده از EZWebLoader کلاس با استفاده از این کلاس، ما به URL پیمایش کرده ایم و تمام سوالاتی که در صفحه هستند را در یک فهرست بارگذاری کرده ایم. اکنون می توانیم سؤالی مانند "آیا Zappos کارت هدیه دارد؟" و پاسخ ها را مستقیماً از سؤالات متداول ما در وب سایت دریافت کنید. اسکرین شات زیر کنسول تست ربات آمازون لکس را نشان می دهد که به این سوال از سوالات متداول پاسخ می دهد.

آمازون Lex را با LLM تقویت کنید و تجربه پرسش‌های متداول را با استفاده از دریافت URL | خدمات وب آمازون هوش داده پلاتو بلاک چین. جستجوی عمودی Ai.

ما توانستیم به این هدف برسیم زیرا در مرحله اول URL را خزیده بودیم و جاسازی هایی ایجاد کرده بودیم که LlamaIndex می توانست از آنها برای جستجوی پاسخ سؤال ما استفاده کند. تابع Lambda ربات ما نشان می دهد که هر زمان که هدف بازگشتی برگردانده می شود، این جستجو چگونه اجرا می شود:

import time
import json
import os
import logging
import boto3
from llama_index import StorageContext, load_index_from_storage logger = logging.getLogger()
logger.setLevel(logging.DEBUG) def download_docstore(): # Create an S3 client s3 = boto3.client('s3') # List all objects in the S3 bucket and download each one
try: bucket_name = 'faq-bot-storage-001' s3_response = s3.list_objects_v2(Bucket=bucket_name) if 'Contents' in s3_response: for item in s3_response['Contents']: file_name = item['Key'] logger.debug("Downloading to /tmp/" + file_name) s3.download_file(bucket_name, file_name, '/tmp/' + file_name) logger.debug('All files downloaded from S3 and written to local filesystem.') except Exception as e: logger.error(e)
raise e #download the doc store locally
download_docstore() storage_context = StorageContext.from_defaults(persist_dir="/tmp/")
# load index
index = load_index_from_storage(storage_context)
query_engine = index.as_query_engine() def lambda_handler(event, context): """
Route the incoming request based on intent.
The JSON body of the request is provided in the event slot. """ # By default, treat the user request as coming from the America/New_York time zone. os.environ['TZ'] = 'America/New_York' time.tzset() logger.debug("===== START LEX FULFILLMENT ====") logger.debug(event) slots = {} if "currentIntent" in event and "slots" in event["currentIntent"]: slots = event["currentIntent"]["slots"] intent = event["sessionState"]["intent"] dialogaction = {"type": "Delegate"} message = [] if str.lower(intent["name"]) == "fallbackintent": #execute query from the input given by the user response = str.strip(query_engine.query(event["inputTranscript"]).response) dialogaction["type"] = "Close" message.append({'content': f'{response}', 'contentType': 'PlainText'}) final_response = { "sessionState": { "dialogAction": dialogaction, "intent": intent }, "messages": message } logger.debug(json.dumps(final_response, indent=1)) logger.debug("===== END LEX FULFILLMENT ====") return final_response

این راه حل زمانی به خوبی کار می کند که یک صفحه وب تمام پاسخ ها را داشته باشد. با این حال، اکثر سایت های پرسش و پاسخ در یک صفحه ساخته نشده اند. به عنوان مثال، در مثال Zappos ما، اگر سوالی را بپرسیم «آیا سیاست تطبیق قیمت دارید؟»، همان‌طور که در تصویر زیر نشان داده شده است، پاسخی کمتر از رضایت‌بخش دریافت می‌کنیم.

آمازون Lex را با LLM تقویت کنید و تجربه پرسش‌های متداول را با استفاده از دریافت URL | خدمات وب آمازون هوش داده پلاتو بلاک چین. جستجوی عمودی Ai.

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

خزیدن در سطح N

هنگامی که یک صفحه وب را برای دانش پرسش‌های متداول می‌خزیم، اطلاعاتی که می‌خواهیم را می‌توان در صفحات پیوندی قرار داد. به عنوان مثال، در مثال Zappos خود، ما این سوال را مطرح می کنیم که "آیا سیاست تطبیق قیمت دارید؟" و پاسخ این است: "بله لطفا بازدید کنید برای یادگیری بیشتر.” اگر کسی بپرسد "سیاست تطبیق قیمت شما چیست؟" سپس می خواهیم با خط مشی یک پاسخ کامل بدهیم. دستیابی به این بدان معنی است که ما نیاز به عبور از پیوندها برای دریافت اطلاعات واقعی برای کاربر نهایی خود داریم. در طول فرآیند جذب، می‌توانیم از بارگذار وب خود برای یافتن پیوندهای لنگر به سایر صفحات HTML و سپس عبور از آنها استفاده کنیم. تغییر کد زیر به خزنده وب ما به ما امکان می دهد پیوندها را در صفحاتی که می خزیم پیدا کنیم. همچنین شامل برخی منطق اضافی برای جلوگیری از خزیدن دایره ای و اجازه دادن به فیلتر توسط یک پیشوند است.

import logging
import requests
import html2text
from llama_index.readers.schema.base import Document
from typing import List
import re def find_http_urls_in_parentheses(s: str, prefix: str = None): pattern = r'((https?://[^)]+))' urls = re.findall(pattern, s) matched = [] if prefix is not None: for url in urls: if str(url).startswith(prefix): matched.append(url) else: matched = urls return list(set(matched)) # remove duplicates by converting to set, then convert back to list class EZWebLoader: def __init__(self, default_header: str = None): self._html_to_text_parser = html2text if default_header is None: self._default_header = {"User-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36"} else: self._default_header = default_header def load_data(self, urls: List[str], num_levels: int = 0, level_prefix: str = None, headers: str = None) -> List[Document]: logging.info(f"Number of urls: {len(urls)}.") if headers is None: headers = self._default_header documents = [] visited = {} for url in urls: q = [url] depth = num_levels for page in q: if page not in visited: #prevent cycles by checking to see if we already crawled a link logging.info(f"Crawling {page}") visited[page] = True #add entry to visited to prevent re-crawling pages response = requests.get(page, headers=headers).text response = self._html_to_text_parser.html2text(response) #reduce html to text documents.append(Document(response)) if depth > 0: #crawl linked pages ingest_urls = find_http_urls_in_parentheses(response, level_prefix) logging.info(f"Found {len(ingest_urls)} pages to crawl.") q.extend(ingest_urls) depth -= 1 #reduce the depth counter so we go only num_levels deep in our crawl else: logging.info(f"Skipping {page} as it has already been crawled") logging.info(f"Number of documents: {len(documents)}.") return documents url = "http://www.zappos.com/general-questions"
loader = EZWebLoader()
#crawl the site with 1 level depth and prefix of "/c/" for customer service root
documents = loader.load_data([url], num_levels=1, level_prefix="https://www.zappos.com/c/")
index = GPTVectorStoreIndex.from_documents(documents)

در کد قبلی، ما توانایی خزیدن N سطح عمیق را معرفی می‌کنیم و پیشوندی می‌دهیم که به ما اجازه می‌دهد خزیدن را فقط به مواردی محدود کنیم که با یک الگوی URL خاص شروع می‌شوند. در مثال Zappos ما، صفحات خدمات مشتری همگی از ریشه هستند zappos.com/c، بنابراین ما آن را به عنوان پیشوند برای محدود کردن خزیدن خود به یک زیر مجموعه کوچکتر و مرتبط تر اضافه می کنیم. این کد نشان می‌دهد که چگونه می‌توانیم تا دو سطح عمیق را وارد کنیم. منطق لامبدا ربات ما ثابت می ماند زیرا هیچ چیز تغییر نکرده است جز اینکه خزنده اسناد بیشتری را دریافت می کند.

ما اکنون همه اسناد را نمایه کرده ایم و می توانیم سؤال دقیق تری بپرسیم. در اسکرین شات زیر، ربات ما پاسخ صحیحی به سوال «آیا سیاست تطبیق قیمت دارید؟» را ارائه می دهد.

آمازون Lex را با LLM تقویت کنید و تجربه پرسش‌های متداول را با استفاده از دریافت URL | خدمات وب آمازون هوش داده پلاتو بلاک چین. جستجوی عمودی Ai.

ما اکنون پاسخ کاملی به سوال خود در مورد تطبیق قیمت داریم. به جای اینکه به سادگی به او گفته شود "بله، خط مشی ما را ببینید"، جزئیات را از خزیدن سطح دوم به ما می دهد.

پاک کردن

برای جلوگیری از متحمل شدن هزینه های آتی، با حذف تمام منابعی که به عنوان بخشی از این تمرین استفاده شده اند، اقدام کنید. ما یک اسکریپت برای خاموش کردن نقطه پایانی Sagemaker به راحتی ارائه کرده ایم. جزئیات استفاده در README موجود است. علاوه بر این، برای حذف تمام منابع دیگری که می توانید اجرا کنید cdk destroy در همان دایرکتوری با دستورات دیگر cdk برای حذف تمام منابع موجود در پشته شما.

نتیجه

توانایی وارد کردن مجموعه ای از سؤالات متداول در یک ربات چت به مشتریان شما این امکان را می دهد که پاسخ سؤالات خود را با پرس و جوهای ساده و زبان طبیعی پیدا کنند. با ترکیب پشتیبانی داخلی در آمازون Lex برای مدیریت مجدد با یک راه حل RAG مانند LlamaIndex، می‌توانیم مسیر سریعی را برای مشتریان خود فراهم کنیم تا پاسخ‌های رضایت‌بخش، سرپرستی و تأیید شده به سؤالات متداول را دریافت کنند. با اعمال خزیدن سطح N در راه حل خود، می توانیم پاسخ هایی را که احتمالاً می توانند چندین پیوند سؤالات متداول را در بر گیرند و پاسخ های عمیق تری به سؤالات مشتری ارائه دهند، اجازه دهیم. با دنبال کردن این مراحل، می توانید به طور یکپارچه قابلیت های قدرتمند Q و A مبتنی بر LLM و دریافت URL کارآمد را در چت ربات آمازون Lex خود بگنجانید. این منجر به تعامل دقیق تر، جامع تر و آگاهانه تر با کاربران می شود.


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

آمازون Lex را با LLM تقویت کنید و تجربه پرسش‌های متداول را با استفاده از دریافت URL | خدمات وب آمازون هوش داده پلاتو بلاک چین. جستجوی عمودی Ai.ماکس هنکل والاس مهندس توسعه نرم افزار در AWS Lex است. او از کار با استفاده از فناوری برای به حداکثر رساندن موفقیت مشتری لذت می برد. او در خارج از محل کار به آشپزی، گذراندن وقت با دوستان و کوله‌پشتی علاقه دارد.

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

آمازون Lex را با LLM تقویت کنید و تجربه پرسش‌های متداول را با استفاده از دریافت URL | خدمات وب آمازون هوش داده پلاتو بلاک چین. جستجوی عمودی Ai.جان بیکر یک SDE اصلی در AWS است که در آن روی پردازش زبان طبیعی، مدل‌های زبان بزرگ و سایر پروژه‌های مرتبط با ML/AI کار می‌کند. او بیش از 9 سال با آمازون بوده و در AWS، Alexa و Amazon.com کار کرده است. جان در اوقات فراغت خود از اسکی و سایر فعالیت های فضای باز در سراسر شمال غرب اقیانوس آرام لذت می برد.

تمبر زمان:

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