LLMs کے ساتھ Amazon Lex کو بہتر بنائیں اور URL کے ادخال کا استعمال کرتے ہوئے FAQ کے تجربے کو بہتر بنائیں | ایمیزون ویب سروسز

LLMs کے ساتھ Amazon Lex کو بہتر بنائیں اور URL کے ادخال کا استعمال کرتے ہوئے FAQ کے تجربے کو بہتر بنائیں | ایمیزون ویب سروسز

آج کی ڈیجیٹل دنیا میں، زیادہ تر صارفین کاروبار اور/یا سروس فراہم کرنے والوں تک پہنچنے کے لیے وقت نکالنے کے بجائے اپنے کسٹمر سروس کے سوالات کے جوابات خود تلاش کریں گے۔ یہ بلاگ پوسٹ سوال اور جواب چیٹ بوٹ بنانے کے لیے ایک جدید حل تلاش کرتی ہے۔ ایمیزون لیکس جو آپ کی ویب سائٹ سے موجودہ اکثر پوچھے گئے سوالات کا استعمال کرتا ہے۔ یہ AI سے چلنے والا ٹول حقیقی دنیا کی پوچھ گچھ کے لیے فوری، درست جوابات فراہم کر سکتا ہے، جس سے صارف کو عام مسائل کو آزادانہ طور پر جلدی اور آسانی سے حل کرنے کی اجازت ملتی ہے۔

سنگل یو آر ایل ادخال

بہت سے کاروباری اداروں کے پاس اپنے صارفین کے لیے اکثر پوچھے گئے سوالات کے جوابات کا ایک سیٹ ان کی ویب سائٹ پر دستیاب ہوتا ہے۔ اس صورت میں، ہم صارفین کو ایک چیٹ بوٹ پیش کرنا چاہتے ہیں جو ہمارے شائع شدہ اکثر پوچھے گئے سوالات سے ان کے سوالات کا جواب دے سکے۔ کے عنوان سے بلاگ پوسٹ میں LLMs کا استعمال کرتے ہوئے بات چیت کے سوالات کی خصوصیات کے ساتھ Amazon Lex کو بہتر بنائیں، ہم نے دکھایا کہ آپ اپنے موجودہ علمی ذرائع جیسے کہ PDF یا Word دستاویزات سے چلنے والا چیٹ بوٹ بنانے کے لیے Amazon Lex اور LlamaIndex کے امتزاج کا استعمال کر سکتے ہیں۔ FAQs کی ویب سائٹ پر مبنی ایک سادہ FAQ کو سپورٹ کرنے کے لیے، ہمیں ایک ادخال کا عمل بنانے کی ضرورت ہے جو ویب سائٹ کو کرال کر سکے اور ایسی ایمبیڈنگز تخلیق کر سکے جو LlamaIndex کے ذریعے صارفین کے سوالات کے جوابات دینے کے لیے استعمال کیے جا سکیں۔ اس صورت میں، ہم میں بنائے گئے بوٹ پر تعمیر کریں گے۔ پچھلی بلاگ پوسٹ، جو صارف کے الفاظ کے ساتھ ان ایمبیڈنگز سے استفسار کرتا ہے اور ویب سائٹ کے عمومی سوالنامہ سے جواب دیتا ہے۔

مندرجہ ذیل خاکہ دکھاتا ہے کہ کس طرح ادخال کا عمل اور Amazon Lex bot ہمارے حل کے لیے مل کر کام کرتے ہیں۔

LLMs کے ساتھ Amazon Lex کو بہتر بنائیں اور URL کے ادخال کا استعمال کرتے ہوئے FAQ کے تجربے کو بہتر بنائیں | ایمیزون ویب سروسز پلیٹو بلاکچین ڈیٹا انٹیلی جنس۔ عمودی تلاش۔ عی

حل کے ورک فلو میں، اکثر پوچھے گئے سوالات کے ساتھ ویب سائٹ کو بذریعہ داخل کیا جاتا ہے۔ او ڈبلیو ایس لامبڈا۔. یہ لیمبڈا فنکشن ویب سائٹ کو کرال کرتا ہے اور نتیجے میں آنے والے متن کو ایک میں محفوظ کرتا ہے۔ ایمیزون سادہ اسٹوریج سروس (ایمیزون S3) بالٹی۔ S3 بالٹی پھر ایک Lambda فنکشن کو متحرک کرتی ہے جو ایمبیڈنگز بنانے کے لیے LlamaIndex کا استعمال کرتی ہے جو Amazon S3 میں محفوظ ہیں۔ جب کسی اختتامی صارف کی طرف سے کوئی سوال آتا ہے، جیسے کہ "آپ کی واپسی کی پالیسی کیا ہے؟"، Amazon Lex بوٹ LlamaIndex کے ساتھ RAG پر مبنی اپروچ کا استعمال کرتے ہوئے ایمبیڈنگز سے استفسار کرنے کے لیے اپنے Lambda فنکشن کا استعمال کرتا ہے۔ اس نقطہ نظر اور پیشگی شرائط کے بارے میں مزید معلومات کے لیے، بلاگ پوسٹ سے رجوع کریں، LLMs کا استعمال کرتے ہوئے بات چیت کے سوالات کی خصوصیات کے ساتھ Amazon Lex کو بہتر بنائیں.

مذکورہ بالا بلاگ کی پیشگی شرائط مکمل ہونے کے بعد، پہلا قدم یہ ہے کہ اکثر پوچھے گئے سوالات کو دستاویز کے ذخیرے میں شامل کیا جائے جسے 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)

پچھلی مثال میں، ہم Zappos سے پہلے سے طے شدہ FAQ ویب سائٹ کا URL لیتے ہیں اور اسے استعمال کرتے ہوئے ہضم کرتے ہیں۔ EZWebLoader کلاس اس کلاس کے ساتھ، ہم نے URL پر تشریف لے گئے ہیں اور صفحہ میں موجود تمام سوالات کو انڈیکس میں لوڈ کر دیا ہے۔ اب ہم ایک سوال پوچھ سکتے ہیں جیسے "کیا Zappos کے پاس گفٹ کارڈز ہیں؟" اور ویب سائٹ پر ہمارے اکثر پوچھے گئے سوالات سے براہ راست جوابات حاصل کریں۔ درج ذیل اسکرین شاٹ میں ایمیزون لیکس بوٹ ٹیسٹ کنسول دکھاتا ہے جو اکثر پوچھے گئے سوالات سے اس سوال کا جواب دیتا ہے۔

LLMs کے ساتھ Amazon Lex کو بہتر بنائیں اور URL کے ادخال کا استعمال کرتے ہوئے FAQ کے تجربے کو بہتر بنائیں | ایمیزون ویب سروسز پلیٹو بلاکچین ڈیٹا انٹیلی جنس۔ عمودی تلاش۔ عی

ہم اسے حاصل کرنے میں کامیاب ہوئے کیونکہ ہم نے پہلے مرحلے میں یو آر ایل کو کرال کیا تھا اور ایمبیڈڈنگز بنائی تھیں جنہیں LlamaIndex ہمارے سوال کا جواب تلاش کرنے کے لیے استعمال کر سکتا تھا۔ ہمارے بوٹ کا لیمبڈا فنکشن دکھاتا ہے کہ جب بھی فال بیک کا ارادہ واپس آتا ہے تو یہ تلاش کیسے چلائی جاتی ہے:

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 مثال میں، اگر ہم یہ سوال پوچھتے ہیں کہ "کیا آپ کے پاس قیمت سے مماثل پالیسی ہے؟"، تو ہمیں کم سے کم تسلی بخش جواب ملتا ہے، جیسا کہ درج ذیل اسکرین شاٹ میں دکھایا گیا ہے۔

LLMs کے ساتھ Amazon Lex کو بہتر بنائیں اور URL کے ادخال کا استعمال کرتے ہوئے FAQ کے تجربے کو بہتر بنائیں | ایمیزون ویب سروسز پلیٹو بلاکچین ڈیٹا انٹیلی جنس۔ عمودی تلاش۔ عی

پچھلے تعامل میں، قیمت سے مماثل پالیسی کا جواب ہمارے صارف کے لیے مددگار نہیں ہے۔ یہ جواب مختصر ہے کیونکہ اکثر پوچھے گئے سوالات قیمت کے مماثل پالیسی کے بارے میں ایک مخصوص صفحہ کا لنک ہے اور ہمارا ویب کرال صرف ایک صفحے کے لیے تھا۔ بہتر جوابات حاصل کرنے کا مطلب ان لنکس کو بھی رینگنا ہوگا۔ اگلا حصہ دکھاتا ہے کہ ان سوالات کے جوابات کیسے حاصل کیے جائیں جن کے لیے صفحہ کی گہرائی کے دو یا زیادہ درجے درکار ہوتے ہیں۔

این لیول رینگنا

جب ہم اکثر پوچھے گئے سوالات کے علم کے لیے ویب صفحہ کرال کرتے ہیں، تو جو معلومات ہم چاہتے ہیں وہ منسلک صفحات میں موجود ہو سکتی ہے۔ مثال کے طور پر، ہماری 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، لہذا ہم اسے ایک سابقہ ​​کے طور پر شامل کرتے ہیں تاکہ اپنے کرالوں کو چھوٹے اور زیادہ متعلقہ سب سیٹ تک محدود کر سکیں۔ کوڈ دکھاتا ہے کہ ہم کس طرح دو سطحوں تک گہرائی میں داخل ہو سکتے ہیں۔ ہمارے بوٹ کی لیمبڈا منطق ایک ہی ہے کیونکہ کرالر مزید دستاویزات داخل کرنے کے علاوہ کچھ نہیں بدلا ہے۔

اب ہمارے پاس تمام دستاویزات کا حساب کتاب ہے اور ہم مزید تفصیلی سوال پوچھ سکتے ہیں۔ مندرجہ ذیل اسکرین شاٹ میں، ہمارا بوٹ اس سوال کا صحیح جواب فراہم کرتا ہے "کیا آپ کے پاس قیمت سے مماثل پالیسی ہے؟"

LLMs کے ساتھ Amazon Lex کو بہتر بنائیں اور URL کے ادخال کا استعمال کرتے ہوئے FAQ کے تجربے کو بہتر بنائیں | ایمیزون ویب سروسز پلیٹو بلاکچین ڈیٹا انٹیلی جنس۔ عمودی تلاش۔ عی

اب ہمارے پاس قیمت کے ملاپ کے بارے میں ہمارے سوال کا مکمل جواب ہے۔ "ہاں ہماری پالیسی دیکھیں" کہے جانے کے بجائے یہ ہمیں دوسرے درجے کے کرال سے تفصیلات فراہم کرتا ہے۔

صاف کرو

مستقبل کے اخراجات سے بچنے کے لیے، ان تمام وسائل کو حذف کرنے کے لیے آگے بڑھیں جو اس مشق کے حصے کے طور پر تعینات کیے گئے تھے۔ ہم نے سیج میکر اینڈ پوائنٹ کو احسن طریقے سے بند کرنے کے لیے ایک اسکرپٹ فراہم کیا ہے۔ استعمال کی تفصیلات README میں ہیں۔ مزید برآں، دوسرے تمام وسائل کو ہٹانے کے لیے جو آپ چلا سکتے ہیں۔ cdk destroy اسی ڈائرکٹری میں جیسا کہ دیگر cdk آپ کے اسٹیک میں موجود تمام وسائل کو ختم کرنے کا حکم دیتا ہے۔

نتیجہ

FAQs کے ایک سیٹ کو چیٹ بوٹ میں داخل کرنے کی صلاحیت آپ کے صارفین کو ان کے سوالات کے جوابات سیدھی، فطری زبان کے سوالات کے ساتھ تلاش کرنے کے قابل بناتی ہے۔ فال بیک ہینڈلنگ کے لیے Amazon Lex میں بلٹ ان سپورٹ کو RAG حل جیسے LlamaIndex کے ساتھ ملا کر، ہم اپنے صارفین کو اکثر پوچھے گئے سوالات کے تسلی بخش، کیوریٹڈ اور منظور شدہ جوابات حاصل کرنے کے لیے ایک تیز راستہ فراہم کر سکتے ہیں۔ ہمارے حل میں این لیول کرالنگ کو لاگو کرکے، ہم ایسے جوابات کی اجازت دے سکتے ہیں جو ممکنہ طور پر ایک سے زیادہ اکثر پوچھے گئے سوالات کے لنکس پر محیط ہوسکتے ہیں اور ہمارے کسٹمر کے سوالات کے گہرے جوابات فراہم کرسکتے ہیں۔ ان اقدامات پر عمل کر کے، آپ بغیر کسی رکاوٹ کے طاقتور LLM پر مبنی Q اور A صلاحیتوں اور مؤثر URL کو اپنے Amazon Lex چیٹ بوٹ میں شامل کر سکتے ہیں۔ اس کے نتیجے میں صارفین کے ساتھ زیادہ درست، جامع اور سیاق و سباق سے آگاہ تعاملات ہوتے ہیں۔


مصنفین کے بارے میں

LLMs کے ساتھ Amazon Lex کو بہتر بنائیں اور URL کے ادخال کا استعمال کرتے ہوئے FAQ کے تجربے کو بہتر بنائیں | ایمیزون ویب سروسز پلیٹو بلاکچین ڈیٹا انٹیلی جنس۔ عمودی تلاش۔ عیمیکس ہینکل والیس AWS Lex میں سافٹ ویئر ڈویلپمنٹ انجینئر ہے۔ وہ صارفین کی کامیابی کو زیادہ سے زیادہ کرنے کے لیے کام کرنے والی ٹیکنالوجی سے لطف اندوز ہوتا ہے۔ کام سے باہر اسے کھانا پکانے، دوستوں کے ساتھ وقت گزارنے اور بیگ پیک کرنے کا شوق ہے۔

LLMs کے ساتھ Amazon Lex کو بہتر بنائیں اور URL کے ادخال کا استعمال کرتے ہوئے FAQ کے تجربے کو بہتر بنائیں | ایمیزون ویب سروسز پلیٹو بلاکچین ڈیٹا انٹیلی جنس۔ عمودی تلاش۔ عیگانا فینگ AWS AI لیبز میں ایک سینئر اپلائیڈ سائنٹسٹ ہے، جو قدرتی زبان کی پروسیسنگ اور مصنوعی ذہانت میں مہارت رکھتا ہے۔ اس کی تحقیق ان شعبوں کے مختلف پہلوؤں کی کھوج کرتی ہے جس میں دستاویز کی بنیاد پر ڈائیلاگ ماڈلنگ، کام پر مبنی مکالموں کے لیے استدلال، اور ملٹی موڈل ڈیٹا کا استعمال کرتے ہوئے انٹرایکٹو ٹیکسٹ جنریشن شامل ہیں۔

LLMs کے ساتھ Amazon Lex کو بہتر بنائیں اور URL کے ادخال کا استعمال کرتے ہوئے FAQ کے تجربے کو بہتر بنائیں | ایمیزون ویب سروسز پلیٹو بلاکچین ڈیٹا انٹیلی جنس۔ عمودی تلاش۔ عیجان بیکر AWS میں پرنسپل SDE ہے جہاں وہ نیچرل لینگویج پروسیسنگ، لارج لینگویج ماڈلز اور دیگر ML/AI متعلقہ پروجیکٹس پر کام کرتا ہے۔ وہ ایمیزون کے ساتھ 9+ سالوں سے ہے اور اس نے AWS، Alexa اور Amazon.com پر کام کیا ہے۔ اپنے فارغ وقت میں، جان بحر الکاہل کے شمال مغرب میں اسکیئنگ اور دیگر بیرونی سرگرمیوں سے لطف اندوز ہوتا ہے۔

ٹائم اسٹیمپ:

سے زیادہ AWS مشین لرننگ