Βελτιώστε το Amazon Lex με LLM και βελτιώστε την εμπειρία συχνών ερωτήσεων χρησιμοποιώντας την απορρόφηση URL | Υπηρεσίες Ιστού της Amazon

Βελτιώστε το Amazon Lex με LLM και βελτιώστε την εμπειρία συχνών ερωτήσεων χρησιμοποιώντας την απορρόφηση URL | Υπηρεσίες Ιστού της Amazon

Στον σημερινό ψηφιακό κόσμο, οι περισσότεροι καταναλωτές προτιμούν να βρίσκουν μόνοι τους απαντήσεις στις ερωτήσεις εξυπηρέτησης πελατών αντί να αφιερώνουν χρόνο για να απευθυνθούν σε επιχειρήσεις ή/και παρόχους υπηρεσιών. Αυτή η ανάρτηση ιστολογίου διερευνά μια καινοτόμο λύση για τη δημιουργία ενός chatbot ερωτήσεων και απαντήσεων Amazon-Lex που χρησιμοποιεί υπάρχουσες συχνές ερωτήσεις από τον ιστότοπό σας. Αυτό το εργαλείο που λειτουργεί με τεχνητή νοημοσύνη μπορεί να παρέχει γρήγορες, ακριβείς απαντήσεις σε ερωτήματα του πραγματικού κόσμου, επιτρέποντας στον πελάτη να επιλύει γρήγορα και εύκολα κοινά προβλήματα ανεξάρτητα.

Απορρόφηση μεμονωμένου URL

Πολλές επιχειρήσεις διαθέτουν στον ιστότοπό τους δημοσιευμένο σύνολο απαντήσεων για συχνές ερωτήσεις για τους πελάτες τους. Σε αυτήν την περίπτωση, θέλουμε να προσφέρουμε στους πελάτες ένα chatbot που μπορεί να απαντήσει στις ερωτήσεις τους από τις δημοσιευμένες Συνήθεις Ερωτήσεις μας. Στην ανάρτηση του ιστολογίου με τίτλο Βελτιώστε το Amazon Lex με λειτουργίες συνομιλίας FAQ χρησιμοποιώντας LLM, δείξαμε πώς μπορείτε να χρησιμοποιήσετε έναν συνδυασμό Amazon Lex και LlamaIndex για να δημιουργήσετε ένα chatbot που να υποστηρίζεται από τις υπάρχουσες πηγές γνώσης σας, όπως έγγραφα PDF ή Word. Για να υποστηρίξουμε ένα απλό FAQ, που βασίζεται σε έναν ιστότοπο με συχνές ερωτήσεις, πρέπει να δημιουργήσουμε μια διαδικασία απορρόφησης που μπορεί να ανιχνεύσει τον ιστότοπο και να δημιουργήσει ενσωματώσεις που μπορούν να χρησιμοποιηθούν από το LlamaIndex για να απαντήσει σε ερωτήσεις πελατών. Σε αυτήν την περίπτωση, θα βασιστούμε στο bot που δημιουργήθηκε στο προηγούμενη ανάρτηση ιστολογίου, το οποίο θέτει ερωτήματα σε αυτές τις ενσωματώσεις με την έκφραση ενός χρήστη και επιστρέφει την απάντηση από τις Συχνές ερωτήσεις του ιστότοπου.

Το παρακάτω διάγραμμα δείχνει πώς η διαδικασία κατάποσης και το bot Amazon Lex συνεργάζονται για τη λύση μας.

Βελτιώστε το Amazon Lex με LLM και βελτιώστε την εμπειρία συχνών ερωτήσεων χρησιμοποιώντας την απορρόφηση URL | Υπηρεσίες Ιστού Amazon PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Στη ροή εργασιών λύσης, ο ιστότοπος με τις Συνήθεις Ερωτήσεις απορροφάται μέσω AWS Lambda. Αυτή η συνάρτηση Lambda ανιχνεύει τον ιστότοπο και αποθηκεύει το κείμενο που προκύπτει σε ένα Απλή υπηρεσία αποθήκευσης Amazon (Amazon S3) κάδος. Στη συνέχεια, ο κάδος S3 ενεργοποιεί μια συνάρτηση Lambda που χρησιμοποιεί το LlamaIndex για να δημιουργήσει ενσωματώσεις που αποθηκεύονται στο Amazon S3. Όταν έρχεται μια ερώτηση από έναν τελικό χρήστη, όπως "Ποια είναι η πολιτική επιστροφών σας;", το bot Amazon Lex χρησιμοποιεί τη συνάρτηση Lambda για να ρωτήσει τις ενσωματώσεις χρησιμοποιώντας μια προσέγγιση βασισμένη σε RAG με το LlamaIndex. Για περισσότερες πληροφορίες σχετικά με αυτήν την προσέγγιση και τις προϋποθέσεις, ανατρέξτε στην ανάρτηση ιστολογίου, Βελτιώστε το Amazon Lex με λειτουργίες συνομιλίας FAQ χρησιμοποιώντας 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 δωροκάρτες;" και λάβετε τις απαντήσεις απευθείας από τις Συχνές Ερωτήσεις μας στον ιστότοπο. Το παρακάτω στιγμιότυπο οθόνης δείχνει τη δοκιμαστική κονσόλα bot Amazon Lex να απαντά σε αυτήν την ερώτηση από τις Συχνές ερωτήσεις.

Βελτιώστε το Amazon Lex με LLM και βελτιώστε την εμπειρία συχνών ερωτήσεων χρησιμοποιώντας την απορρόφηση URL | Υπηρεσίες Ιστού Amazon PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Μπορέσαμε να το πετύχουμε αυτό επειδή είχαμε ανιχνεύσει τη διεύθυνση URL στο πρώτο βήμα και δημιουργήσαμε ενσωματώσεις που θα μπορούσε να χρησιμοποιήσει το LlamaIndex για να αναζητήσει την απάντηση στην ερώτησή μας. Η συνάρτηση Lambda του bot μας δείχνει πώς εκτελείται αυτή η αναζήτηση κάθε φορά που επιστρέφεται η εναλλακτική πρόθεση:

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, αν θέσουμε την ερώτηση "Έχετε πολιτική αντιστοίχισης τιμών;", τότε λαμβάνουμε μια λιγότερο από ικανοποιητική απάντηση, όπως φαίνεται στο παρακάτω στιγμιότυπο οθόνης.

Βελτιώστε το Amazon Lex με LLM και βελτιώστε την εμπειρία συχνών ερωτήσεων χρησιμοποιώντας την απορρόφηση URL | Υπηρεσίες Ιστού Amazon PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Στην προηγούμενη αλληλεπίδραση, η απάντηση της πολιτικής αντιστοίχισης τιμών δεν είναι χρήσιμη για τον χρήστη μας. Αυτή η απάντηση είναι σύντομη επειδή οι Συχνές ερωτήσεις που αναφέρονται είναι ένας σύνδεσμος προς μια συγκεκριμένη σελίδα σχετικά με την πολιτική αντιστοίχισης τιμών και η ανίχνευση ιστού μας ήταν μόνο για τη μεμονωμένη σελίδα. Η επίτευξη καλύτερων απαντήσεων θα σημαίνει ανίχνευση και αυτών των συνδέσμων. Η επόμενη ενότητα δείχνει πώς μπορείτε να λάβετε απαντήσεις σε ερωτήσεις που απαιτούν δύο ή περισσότερα επίπεδα βάθους σελίδας.

Ανίχνευση σε επίπεδο Ν

Όταν ανιχνεύουμε μια ιστοσελίδα για γνώσεις συχνών ερωτήσεων, οι πληροφορίες που θέλουμε μπορούν να περιέχονται σε συνδεδεμένες σελίδες. Για παράδειγμα, στο παράδειγμά μας στο 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, επομένως το συμπεριλαμβάνουμε ως πρόθεμα για να περιορίσουμε τις ανιχνεύσεις μας σε ένα μικρότερο και πιο σχετικό υποσύνολο. Ο κώδικας δείχνει πώς μπορούμε να καταναλώσουμε έως και δύο επίπεδα σε βάθος. Η λογική Λάμδα του ρομπότ μας παραμένει η ίδια γιατί τίποτα δεν έχει αλλάξει εκτός από το ότι ο ανιχνευτής απορροφά περισσότερα έγγραφα.

Τώρα έχουμε όλα τα έγγραφα ευρετηριασμένα και μπορούμε να κάνουμε μια πιο λεπτομερή ερώτηση. Στο παρακάτω στιγμιότυπο οθόνης, το bot μας παρέχει τη σωστή απάντηση στην ερώτηση "Έχετε πολιτική αντιστοίχισης τιμών;"

Βελτιώστε το Amazon Lex με LLM και βελτιώστε την εμπειρία συχνών ερωτήσεων χρησιμοποιώντας την απορρόφηση URL | Υπηρεσίες Ιστού Amazon PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Τώρα έχουμε μια πλήρη απάντηση στην ερώτησή μας σχετικά με την αντιστοίχιση τιμών. Αντί να μας λένε απλώς «Ναι, δείτε την πολιτική μας», μας δίνει τις λεπτομέρειες από την ανίχνευση δεύτερου επιπέδου.

εκκαθάριση

Για να αποφύγετε μελλοντικά έξοδα, προχωρήστε στη διαγραφή όλων των πόρων που χρησιμοποιήθηκαν ως μέρος αυτής της άσκησης. Παρέχουμε ένα σενάριο για να τερματίσουμε με χάρη το τελικό σημείο του Sagemaker. Οι λεπτομέρειες χρήσης βρίσκονται στο README. Επιπλέον, για να αφαιρέσετε όλους τους άλλους πόρους που μπορείτε να εκτελέσετε cdk destroy στον ίδιο κατάλογο με τις άλλες εντολές cdk για να καταργήσετε όλους τους πόρους στη στοίβα σας.

Συμπέρασμα

Η δυνατότητα ενσωμάτωσης ενός συνόλου Συχνών Ερωτήσεων σε ένα chatbot επιτρέπει στους πελάτες σας να βρίσκουν τις απαντήσεις στις ερωτήσεις τους με απλά, ερωτήματα φυσικής γλώσσας. Συνδυάζοντας την ενσωματωμένη υποστήριξη στο Amazon Lex για εναλλακτικό χειρισμό με μια λύση RAG, όπως το LlamaIndex, μπορούμε να παρέχουμε μια γρήγορη διαδρομή στους πελάτες μας για να λάβουν ικανοποιητικές, επιμελημένες και εγκεκριμένες απαντήσεις στις συχνές ερωτήσεις. Εφαρμόζοντας ανίχνευση επιπέδου Ν στη λύση μας, μπορούμε να επιτρέψουμε απαντήσεις που θα μπορούσαν ενδεχομένως να καλύπτουν πολλούς συνδέσμους συχνών ερωτήσεων και να παρέχουν βαθύτερες απαντήσεις στα ερωτήματα των πελατών μας. Ακολουθώντας αυτά τα βήματα, μπορείτε να ενσωματώσετε απρόσκοπτα ισχυρές δυνατότητες Q και A που βασίζονται σε LLM και αποτελεσματική απορρόφηση URL στο chatbot Amazon Lex. Αυτό έχει ως αποτέλεσμα πιο ακριβείς, ολοκληρωμένες και συναφείς αλληλεπιδράσεις με τους χρήστες.


Σχετικά με τους συγγραφείς

Βελτιώστε το Amazon Lex με LLM και βελτιώστε την εμπειρία συχνών ερωτήσεων χρησιμοποιώντας την απορρόφηση URL | Υπηρεσίες Ιστού Amazon PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.Μαξ Χένκελ-Γουάλας είναι Μηχανικός Ανάπτυξης Λογισμικού στην AWS Lex. Του αρέσει να εργάζεται αξιοποιώντας την τεχνολογία για να μεγιστοποιήσει την επιτυχία των πελατών. Εκτός δουλειάς είναι παθιασμένος με τη μαγειρική, να περνά χρόνο με φίλους και να κάνει σακίδια.

Βελτιώστε το Amazon Lex με LLM και βελτιώστε την εμπειρία συχνών ερωτήσεων χρησιμοποιώντας την απορρόφηση URL | Υπηρεσίες Ιστού Amazon PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.Τραγούδι Feng είναι Senior Applied Scientist στο AWS AI Labs, με ειδίκευση στην Επεξεργασία Φυσικής Γλώσσας και στην Τεχνητή Νοημοσύνη. Η έρευνά της διερευνά διάφορες πτυχές αυτών των πεδίων, συμπεριλαμβανομένης της μοντελοποίησης διαλόγου βασισμένου σε έγγραφα, του συλλογισμού για διαλόγους προσανατολισμένους στην εργασία και της παραγωγής διαδραστικού κειμένου με χρήση πολυτροπικών δεδομένων.

Βελτιώστε το Amazon Lex με LLM και βελτιώστε την εμπειρία συχνών ερωτήσεων χρησιμοποιώντας την απορρόφηση URL | Υπηρεσίες Ιστού Amazon PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.John Baker είναι Κύριος SDE στο AWS όπου εργάζεται σε Επεξεργασία Φυσικής Γλώσσας, Μεγάλα Μοντέλα Γλωσσών και άλλα έργα που σχετίζονται με ML/AI. Είναι στην Amazon για 9+ χρόνια και έχει εργαστεί σε AWS, Alexa και Amazon.com. Στον ελεύθερο χρόνο του, ο John απολαμβάνει το σκι και άλλες υπαίθριες δραστηριότητες σε όλο τον Βορειοδυτικό Ειρηνικό.

Σφραγίδα ώρας:

Περισσότερα από Μηχανική εκμάθηση AWS