Paranna Amazon Lexiä LLM:illä ja paranna UKK-kokemusta URL-osoitteen käsittelyn avulla | Amazon Web Services

Paranna Amazon Lexiä LLM:illä ja paranna UKK-kokemusta URL-osoitteen käsittelyn avulla | Amazon Web Services

Nykypäivän digitaalisessa maailmassa useimmat kuluttajat löytävät mieluummin vastaukset asiakaspalvelukysymyksiinsä itse sen sijaan, että he käyttäisivät aikaa ottamaan yhteyttä yrityksiin ja/tai palveluntarjoajiin. Tämä blogipostaus tutkii innovatiivista ratkaisua kysymys- ja vastauschatbotin rakentamiseen Amazon-Lex joka käyttää verkkosivustosi olemassa olevia usein kysyttyjä kysymyksiä. Tämä tekoälyllä toimiva työkalu voi tarjota nopeita ja tarkkoja vastauksia tosielämän tiedusteluihin, jolloin asiakas voi nopeasti ja helposti ratkaista yleisiä ongelmia itsenäisesti.

Yhden URL-osoitteen käsittely

Monilla yrityksillä on verkkosivuillaan julkaistut vastaukset usein kysyttyihin kysymyksiin asiakkailleen. Tässä tapauksessa haluamme tarjota asiakkaille chatbotin, joka voi vastata heidän kysymyksiinsä julkaistuista usein kysytyistä kysymyksistämme. Blogikirjoituksessa, jonka otsikko on Paranna Amazon Lexiä keskustelupalstojen UKK-ominaisuuksilla LLM:ien avulla, osoitimme, kuinka voit käyttää Amazon Lexin ja LlamaIndexin yhdistelmää chatbotin rakentamiseen olemassa olevista tietolähteistäsi, kuten PDF- tai Word-asiakirjoista. Tukeaksemme yksinkertaisia ​​usein kysyttyjä kysymyksiä, jotka perustuvat usein kysyttyjen kysymysten verkkosivustoon, meidän on luotava käsittelyprosessi, joka voi indeksoida verkkosivuston ja luoda upotuksia, joita LlamaIndex voi käyttää asiakkaiden kysymyksiin vastaamiseen. Tässä tapauksessa rakennamme bottiin, joka on luotu kohteessa edellinen blogin viesti, joka kysyy noista upotuksista käyttäjän lausumalla ja palauttaa vastauksen verkkosivuston usein kysytyistä kysymyksistä.

Seuraava kaavio näyttää, kuinka käsittelyprosessi ja Amazon Lex -botti toimivat yhdessä ratkaisussamme.

Paranna Amazon Lexiä LLM:illä ja paranna UKK-kokemusta URL-osoitteen käsittelyn avulla | Amazon Web Services PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Ratkaisun työnkulussa usein kysytyt kysymykset sisältävä verkkosivusto otetaan käyttöön AWS Lambda. Tämä Lambda-toiminto indeksoi verkkosivuston ja tallentaa tuloksena olevan tekstin Amazonin yksinkertainen tallennuspalvelu (Amazon S3) ämpäri. S3-ämpäri laukaisee sitten Lambda-toiminnon, joka käyttää LlamaIndexiä luodakseen upotuksia, jotka on tallennettu Amazon S3:een. Kun loppukäyttäjältä saapuu kysymys, kuten "Mikä on palautuskäytäntösi?", Amazon Lex -botti käyttää Lambda-toimintoaan kyselyn upotuksille käyttämällä RAG-pohjaista lähestymistapaa LlamaIndexin kanssa. Lisätietoja tästä lähestymistavasta ja edellytyksistä löytyy blogikirjoituksesta, Paranna Amazon Lexiä keskustelupalstojen UKK-ominaisuuksilla LLM:ien avulla.

Kun edellä mainitun blogin ennakkovaatimukset on suoritettu, ensimmäinen askel on syöttää usein kysytyt kysymykset asiakirjavarastoon, jonka LlamaIndex voi vektoroida ja indeksoida. Seuraava koodi näyttää, kuinka tämä tehdään:

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)

Edellisessä esimerkissä otamme Zapposilta ennalta määritetyn UKK-sivuston URL-osoitteen ja nielemme sen käyttämällä EZWebLoader luokkaa. Tällä kurssilla olemme siirtyneet URL-osoitteeseen ja ladaneet kaikki sivulla olevat kysymykset hakemistoon. Voimme nyt esittää kysymyksen, kuten "Onko Zapposilla lahjakortteja?" ja saat vastaukset suoraan verkkosivustomme usein kysytyistä kysymyksistä. Seuraavassa kuvakaappauksessa näkyy Amazon Lex -bottitestikonsoli, joka vastaa kysymykseen usein kysytyistä kysymyksistä.

Paranna Amazon Lexiä LLM:illä ja paranna UKK-kokemusta URL-osoitteen käsittelyn avulla | Amazon Web Services PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Pystyimme saavuttamaan tämän, koska olimme indeksoineet URL-osoitteen ensimmäisessä vaiheessa ja luoneet upotuksia, joiden avulla LlamaIndex saattoi etsiä vastausta kysymykseemme. Bottimme Lambda-funktio näyttää, kuinka tämä haku suoritetaan aina, kun palautustarkoitus palautetaan:

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

Tämä ratkaisu toimii hyvin, kun yhdellä verkkosivulla on kaikki vastaukset. Useimmat UKK-sivustot eivät kuitenkaan ole rakennettu yhdelle sivulle. Jos esimerkiksi Zappos-esimerkissämme kysytään "Onko sinulla hintasovituskäytäntö?", saamme vähemmän kuin tyydyttävän vastauksen, kuten seuraavassa kuvakaappauksessa näkyy.

Paranna Amazon Lexiä LLM:illä ja paranna UKK-kokemusta URL-osoitteen käsittelyn avulla | Amazon Web Services PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Edellisessä vuorovaikutuksessa hintasovituskäytännön vastaus ei ole hyödyllinen käyttäjällemme. Tämä vastaus on lyhyt, koska viitattu UKK on linkki tietylle hintavastaavuuskäytäntöä käsittelevälle sivulle ja verkkoindeksointimme koski vain yhtä sivua. Parempien vastausten saaminen tarkoittaa myös näiden linkkien indeksointia. Seuraavassa osiossa näytetään, kuinka saat vastauksia kysymyksiin, jotka vaativat kaksi tai useampaa sivun syvyyttä.

N-tason ryömiminen

Kun indeksoimme verkkosivua saadaksemme usein kysyttyä tietoa, haluamamme tiedot voidaan sisällyttää linkitetyille sivuille. Esimerkiksi Zappos-esimerkissämme kysytään "Onko sinulla hintasovituskäytäntö?" ja vastaus on "Kyllä käy oppia lisää." Jos joku kysyy "Mikä on sinun hintasovituspolitiikkasi?" sitten haluamme antaa täydellisen vastauksen käytännöllä. Tämän saavuttaminen tarkoittaa, että meidän on käytävä läpi linkkejä saadaksemme todellista tietoa loppukäyttäjällemme. Tiedonkeruuprosessin aikana voimme käyttää verkkolatausohjelmaamme löytääksemme ankkurilinkit muille HTML-sivuille ja käydä niiden läpi. Seuraavan indeksointirobotimme koodimuutoksen ansiosta voimme löytää linkkejä indeksoimiltamme sivuilta. Se sisältää myös lisälogiikkaa pyöreän indeksoinnin välttämiseksi ja suodatuksen sallimiseksi etuliitteellä.

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)

Edellisessä koodissa esittelemme mahdollisuuden indeksoida N tasoa syvälle, ja annamme etuliitteen, jonka avulla voimme rajoittaa indeksoinnin vain sellaisiin asioihin, jotka alkavat tietyllä URL-osoitteella. Zappos-esimerkissämme kaikki asiakaspalvelusivut ovat juurtuneet zappos.com/c, joten sisällytämme sen etuliitteenä rajoittaaksemme indeksoinnit pienempään ja osuvampaan osajoukkoon. Koodi näyttää, kuinka voimme niellä jopa kaksi tasoa syvälle. Bottimme Lambda-logiikka pysyy samana, koska mikään ei ole muuttunut, paitsi että indeksointirobotti syöttää enemmän asiakirjoja.

Meillä on nyt kaikki asiakirjat indeksoitu, ja voimme esittää tarkemman kysymyksen. Seuraavassa kuvakaappauksessa bottimme antaa oikean vastauksen kysymykseen "Onko sinulla hintasovituskäytäntö?"

Paranna Amazon Lexiä LLM:illä ja paranna UKK-kokemusta URL-osoitteen käsittelyn avulla | Amazon Web Services PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Meillä on nyt täydellinen vastaus hintojen sovittamista koskevaan kysymykseemme. Sen sijaan, että meille vain sanottaisiin "Kyllä, katso käytäntömme", se antaa meille tietoja toisen tason indeksoinnista.

Puhdistaa

Vältä tulevia kuluja poistamalla kaikki resurssit, jotka otettiin käyttöön osana tätä harjoitusta. Olemme toimittaneet komentosarjan Sagemaker-päätepisteen sulkemiseksi sulavasti. Käyttötiedot ovat README:ssa. Lisäksi voit poistaa kaikki muut resurssit, joita voit käyttää cdk destroy samassa hakemistossa kuin muut cdk-komennot poistaaksesi kaikki pinosi resurssit.

Yhteenveto

Mahdollisuus käsitellä usein kysyttyjä kysymyksiä chatbotissa antaa asiakkaasi löytää vastaukset kysymyksiinsä yksinkertaisilla, luonnollisen kielen kyselyillä. Yhdistämällä Amazon Lexin sisäänrakennetun tuen varakäsittelyyn RAG-ratkaisun, kuten LlamaIndexin, kanssa voimme tarjota asiakkaillemme nopean tien saada tyydyttäviä, kuratoituja ja hyväksyttyjä vastauksia usein kysyttyihin kysymyksiin. Käyttämällä N-tason indeksointia ratkaisuamme voimme tarjota vastauksia, jotka saattavat kattaa useita UKK-linkkejä ja tarjota syvempiä vastauksia asiakkaidemme kyselyihin. Seuraamalla näitä vaiheita voit sisällyttää saumattomasti tehokkaat LLM-pohjaiset Q- ja A-ominaisuudet ja tehokkaan URL-osoitteen haun Amazon Lex -chatbottiisi. Tämä johtaa tarkempaan, kattavampaan ja kontekstitietoisempaan vuorovaikutukseen käyttäjien kanssa.


Tietoja kirjoittajista

Paranna Amazon Lexiä LLM:illä ja paranna UKK-kokemusta URL-osoitteen käsittelyn avulla | Amazon Web Services PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.Max Henkel-Wallace on ohjelmistokehitysinsinööri AWS Lexissä. Hän nauttii työskentelystä hyödyntäen teknologiaa asiakkaiden menestyksen maksimoimiseksi. Työn ulkopuolella hän on intohimoinen ruoanlaittoon, ystävien kanssa viettämiseen ja retkeilyyn.

Paranna Amazon Lexiä LLM:illä ja paranna UKK-kokemusta URL-osoitteen käsittelyn avulla | Amazon Web Services PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.Song Feng on AWS AI Labsin vanhempi soveltuva tutkija, joka on erikoistunut luonnollisen kielen käsittelyyn ja tekoälyyn. Hänen tutkimuksensa tutkii näiden alojen eri näkökulmia, mukaan lukien dokumenttipohjainen dialogimallinnus, tehtävälähtöisten dialogien perustelut ja interaktiivinen tekstin luominen multimodaalista dataa käyttämällä.

Paranna Amazon Lexiä LLM:illä ja paranna UKK-kokemusta URL-osoitteen käsittelyn avulla | Amazon Web Services PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.John Baker on pääasiallinen SDE AWS:ssä, jossa hän työskentelee luonnollisen kielen käsittelyn, suurten kielimallien ja muiden ML/AI-hankkeiden parissa. Hän on työskennellyt Amazonilla yli 9 vuotta ja työskennellyt AWS:n, Alexan ja Amazon.comin kautta. Vapaa-ajallaan John nauttii hiihtämisestä ja muusta ulkoilusta koko Tyynenmeren luoteisosassa.

Aikaleima:

Lisää aiheesta AWS-koneoppiminen