Täiustage Amazon Lexi LLM-idega ja parandage KKK-kogemust URL-i sisestamise abil | Amazoni veebiteenused

Täiustage Amazon Lexi LLM-idega ja parandage KKK-kogemust URL-i sisestamise abil | Amazoni veebiteenused

Tänapäeva digimaailmas otsib enamik tarbijaid pigem ise oma klienditeeninduse küsimustele vastuseid, mitte ei võta aega ettevõtete ja/või teenusepakkujate poole pöördumiseks. See ajaveebi postitus uurib uuenduslikku lahendust küsimuste ja vastuste vestlusboti loomiseks Amazon Lex mis kasutab teie veebisaidi olemasolevaid KKK-sid. See tehisintellektil töötav tööriist suudab pakkuda kiireid ja täpseid vastuseid tegelikele päringutele, võimaldades kliendil kiiresti ja lihtsalt iseseisvalt lahendada levinud probleeme.

Ühe URL-i sisestamine

Paljude ettevõtete veebisaidil on avaldatud klientidele mõeldud KKK vastused. Sel juhul tahame pakkuda klientidele vestlusrobotit, mis saab vastata nende küsimustele meie avaldatud KKK-dest. Blogipostituses pealkirjaga Täiustage Amazon Lexi vestluspõhise KKK funktsioonidega, kasutades LLM-e, näitasime, kuidas saate kasutada Amazon Lexi ja LlamaIndexi kombinatsiooni, et luua vestlusrobot, mis töötab teie olemasolevatel teadmisteallikatel, näiteks PDF- või Wordi dokumentidel. KKK veebisaidil põhineva lihtsa KKK toetamiseks peame looma sisestusprotsessi, mis suudab veebisaidil roomata ja luua manuseid, mida LlamaIndex saab kasutada klientide küsimustele vastamiseks. Sel juhul lähtume rakenduses loodud robotist eelmine blogipostitus, mis küsib neid manuseid kasutaja lausungiga ja tagastab vastuse veebisaidi KKK-st.

Järgmine diagramm näitab, kuidas neelamisprotsess ja Amazon Lex bot meie lahenduse jaoks koos töötavad.

Täiustage Amazon Lexi LLM-idega ja parandage KKK-kogemust URL-i sisestamise abil | Amazon Web Services PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.

Lahenduse töövoos sisestatakse KKK-dega veebisait selle kaudu AWS Lambda. See Lambda-funktsioon roomab veebisaidil ja salvestab tulemuseks oleva teksti Amazoni lihtne salvestusteenus (Amazon S3) kopp. Seejärel käivitab S3 kopp Lambda funktsiooni, mis kasutab LlamaIndexi, et luua Amazon S3-sse salvestatud manuseid. Kui saabub lõppkasutaja küsimus, näiteks "Milline on teie tagastuspoliitika?", kasutab Amazon Lex bot oma Lambda funktsiooni, et teha päringuid manustele, kasutades LlamaIndexiga RAG-põhist lähenemisviisi. Lisateavet selle lähenemisviisi ja eeltingimuste kohta leiate ajaveebi postitusest, Täiustage Amazon Lexi vestluspõhise KKK funktsioonidega, kasutades LLM-e.

Kui eelnimetatud ajaveebi eeltingimused on täidetud, on esimene samm KKK-de sisestamine dokumendihoidlasse, mida saab vektoriseerida ja indekseerida LlamaIndexi abil. Järgmine kood näitab, kuidas seda teha:

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)

Eelmises näites võtame Zappose eelmääratletud KKK veebisaidi URL-i ja sisestame selle, kasutades EZWebLoader klass. Selle klassiga oleme navigeerinud URL-ile ja laadinud kõik lehel olevad küsimused registrisse. Nüüd saame esitada sellise küsimuse nagu "Kas Zapposel on kinkekaarte?" ja saate vastused otse meie veebisaidi KKK-st. Järgmisel ekraanipildil on näha, kuidas Amazon Lexi robotite testkonsool vastab sellele küsimusele KKK-st.

Täiustage Amazon Lexi LLM-idega ja parandage KKK-kogemust URL-i sisestamise abil | Amazon Web Services PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.

Suutsime selle saavutada, kuna olime esimeses etapis URL-i roomanud ja loonud manused, mida LlamaIndex sai kasutada meie küsimusele vastuse otsimiseks. Meie roboti Lambda funktsioon näitab, kuidas seda otsingut käitatakse alati, kui tagastatakse varukava:

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

See lahendus töötab hästi, kui ühel veebilehel on kõik vastused. Kuid enamik KKK saite ei ole üles ehitatud ühele lehele. Näiteks kui esitame Zappose näites küsimuse „Kas teil on hinna sobitamise poliitika?”, saame vähem kui rahuldava vastuse, nagu on näidatud järgmisel ekraanipildil.

Täiustage Amazon Lexi LLM-idega ja parandage KKK-kogemust URL-i sisestamise abil | Amazon Web Services PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.

Eelmises suhtluses ei ole hinnavastavuspoliitika vastus meie kasutajale kasulik. See vastus on lühike, kuna viidatud KKK on link konkreetsele lehele, mis käsitleb hinna sobitamise poliitikat ja meie veebiroomamine oli mõeldud ainult ühele lehele. Paremate vastuste saamine tähendab ka nende linkide roomamist. Järgmine jaotis näitab, kuidas saada vastuseid küsimustele, mis nõuavad kahe või enama lehe sügavuse taset.

N-taseme roomamine

Kui roomame veebisaidil KKK-teabe saamiseks, võib soovitud teave sisalduda lingitud lehtedel. Näiteks esitame Zappose näites küsimuse „Kas teil on hinna sobitamise eeskirjad?” ja vastus on "Jah, lisateabe saamiseks külastage ." Kui keegi küsib: "Milline on teie hinna sobitamise poliitika?" siis tahame poliitikaga anda täieliku vastuse. Selle saavutamine tähendab, et peame oma lõppkasutaja jaoks tegeliku teabe saamiseks linke läbima. Sisseelamisprotsessi ajal saame kasutada oma veebilaadurit, et leida ankurlingid teistele HTML-lehtedele ja seejärel neid läbida. Järgmine koodimuudatus meie veebiroomajas võimaldab meil leida linke lehtedelt, mida roomame. See sisaldab ka täiendavat loogikat, et vältida ringikujulist roomamist ja lubada filtrit eesliite järgi.

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)

Eelnevas koodis tutvustame võimalust roomata N taseme sügavusel ja anname eesliite, mis võimaldab piirata roomamist ainult asjadega, mis algavad teatud URL-i mustriga. Meie Zappose näites on kõik klienditeeninduse lehed juurdunud zappos.com/c, seega lisame selle eesliitena, et piirata meie roomamist väiksema ja asjakohasema alamhulgaga. Kood näitab, kuidas saame alla neelata kuni kahe taseme sügavuselt. Meie roboti Lambda loogika jääb samaks, sest midagi pole muutunud, välja arvatud see, et roomaja neelab rohkem dokumente.

Nüüd on meil kõik dokumendid indekseeritud ja saame esitada üksikasjalikuma küsimuse. Järgmisel ekraanipildil annab meie bot õige vastuse küsimusele "Kas teil on hinna sobitamise poliitika?"

Täiustage Amazon Lexi LLM-idega ja parandage KKK-kogemust URL-i sisestamise abil | Amazon Web Services PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.

Meil on nüüd täielik vastus meie küsimusele hindade sobitamise kohta. Selle asemel, et lihtsalt öelda "Jah, vaadake meie poliitikat", annab see meile teise taseme roomamise üksikasjad.

Koristage

Tulevaste kulude vältimiseks kustutage kõik selle harjutuse käigus kasutusele võetud ressursid. Oleme esitanud skripti Sagemakeri lõpp-punkti graatsiliseks sulgemiseks. Kasutamise üksikasjad leiate README-st. Lisaks eemaldage kõik muud käitatavad ressursid cdk destroy samas kataloogis kui teised cdk-käsud, et eemaldada kõik teie virnas olevad ressursid.

Järeldus

Võimalus sisestada vestlusrobotisse KKK-de komplekt, mis võimaldab teie klientidel leida oma küsimustele vastused lihtsate ja loomuliku keelega päringute abil. Kombineerides Amazon Lexi sisseehitatud toe varuhalduse jaoks RAG-lahendusega, nagu LlamaIndex, saame pakkuda oma klientidele kiiret teed, et saada KKK-dele rahuldavad, kureeritud ja heakskiidetud vastused. Rakendades oma lahenduses N-taseme roomamist, saame pakkuda vastuseid, mis võivad hõlmata mitut KKK linki ja pakkuda sügavamaid vastuseid meie klientide päringutele. Järgides neid samme, saate sujuvalt lisada võimsad LLM-põhised Q- ja A-võimalused ning tõhusa URL-ide sisestamise oma Amazon Lex-vestlusbotisse. Selle tulemuseks on täpsem, terviklikum ja kontekstitundlikum suhtlus kasutajatega.


Autoritest

Täiustage Amazon Lexi LLM-idega ja parandage KKK-kogemust URL-i sisestamise abil | Amazon Web Services PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.Max Henkel-Wallace on AWS Lexi tarkvaraarenduse insener. Talle meeldib töötada tehnoloogia abil, et maksimeerida klientide edu. Väljaspool tööd on ta kirglik kokkamise, sõpradega aja veetmise ja seljakotireisimise vastu.

Täiustage Amazon Lexi LLM-idega ja parandage KKK-kogemust URL-i sisestamise abil | Amazon Web Services PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.Laul Feng on AWS AI Labsi vanemrakendusteadlane, kes on spetsialiseerunud loomuliku keele töötlemisele ja tehisintellektile. Tema uurimistöö uurib nende valdkondade erinevaid aspekte, sealhulgas dokumendipõhise dialoogi modelleerimist, ülesandele orienteeritud dialoogide põhjendamist ja interaktiivset teksti genereerimist, kasutades multimodaalseid andmeid.

Täiustage Amazon Lexi LLM-idega ja parandage KKK-kogemust URL-i sisestamise abil | Amazon Web Services PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.John Baker on AWS-i juhtiv SDE, kus ta töötab loomuliku keele töötlemise, suurte keelemudelite ja muude ML/AI-ga seotud projektidega. Ta on olnud Amazonis üle 9 aasta ning töötanud AWS-is, Alexas ja Amazon.com-is. Vabal ajal naudib John suusatamist ja muid vabaõhutegevusi kogu Vaikse ookeani loodeosas.

Ajatempel:

Veel alates AWS-i masinõpe