Tingkatkan Amazon Lex dengan LLM dan tingkatkan pengalaman FAQ menggunakan penyerapan URL | Layanan Web Amazon

Tingkatkan Amazon Lex dengan LLM dan tingkatkan pengalaman FAQ menggunakan penyerapan URL | Layanan Web Amazon

Di dunia digital saat ini, sebagian besar konsumen lebih memilih mencari jawaban atas pertanyaan layanan pelanggan mereka sendiri daripada meluangkan waktu untuk menghubungi bisnis dan/atau penyedia layanan. Posting blog ini mengeksplorasi solusi inovatif untuk membangun chatbot tanya jawab AmazonLex yang menggunakan FAQ yang ada dari situs web Anda. Alat yang didukung AI ini dapat memberikan respons yang cepat dan akurat terhadap pertanyaan di dunia nyata, memungkinkan pelanggan menyelesaikan masalah umum secara mandiri dengan cepat dan mudah.

Penyerapan URL tunggal

Banyak perusahaan yang menerbitkan kumpulan jawaban FAQ untuk pelanggannya di situs web mereka. Dalam hal ini, kami ingin menawarkan kepada pelanggan chatbot yang dapat menjawab pertanyaan mereka dari FAQ yang kami terbitkan. Dalam postingan blog berjudul Tingkatkan Amazon Lex dengan fitur FAQ percakapan menggunakan LLM, kami mendemonstrasikan bagaimana Anda dapat menggunakan kombinasi Amazon Lex dan LlamaIndex untuk membangun chatbot yang didukung oleh sumber pengetahuan Anda yang ada, seperti dokumen PDF atau Word. Untuk mendukung FAQ sederhana, berdasarkan situs FAQ, kita perlu membuat proses penyerapan yang dapat merayapi situs web dan membuat penyematan yang dapat digunakan oleh LlamaIndex untuk menjawab pertanyaan pelanggan. Dalam hal ini, kita akan membangun bot yang dibuat di posting blog sebelumnya, yang menanyakan penyematan tersebut dengan ucapan pengguna dan mengembalikan jawaban dari FAQ situs web.

Diagram berikut menunjukkan bagaimana proses penyerapan dan bot Amazon Lex bekerja sama untuk solusi kami.

Tingkatkan Amazon Lex dengan LLM dan tingkatkan pengalaman FAQ menggunakan penyerapan URL | Kecerdasan Data PlatoBlockchain Layanan Web Amazon. Pencarian Vertikal. Ai.

Dalam alur kerja solusi, situs web dengan FAQ diserap melalui AWS Lambda. Fungsi Lambda ini merayapi situs web dan menyimpan teks yang dihasilkan dalam sebuah Layanan Penyimpanan Sederhana Amazon (Amazon S3) ember. Bucket S3 kemudian memicu fungsi Lambda yang menggunakan LlamaIndex untuk membuat embeddings yang disimpan di Amazon S3. Ketika pertanyaan dari pengguna akhir tiba, seperti โ€œApa kebijakan pengembalian Anda?โ€, bot Amazon Lex menggunakan fungsi Lambda untuk menanyakan penyematan menggunakan pendekatan berbasis RAG dengan LlamaIndex. Untuk informasi lebih lanjut tentang pendekatan ini dan prasyaratnya, lihat postingan blog, Tingkatkan Amazon Lex dengan fitur FAQ percakapan menggunakan LLM.

Setelah prasyarat dari blog tersebut di atas selesai, langkah pertama adalah memasukkan FAQ ke dalam repositori dokumen yang dapat divektorisasi dan diindeks oleh LlamaIndex. Kode berikut menunjukkan cara melakukannya:

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)

Pada contoh sebelumnya, kami mengambil URL situs FAQ yang telah ditentukan sebelumnya dari Zappos dan menyerapnya menggunakan EZWebLoader kelas. Dengan kelas ini, kita telah menavigasi ke URL dan memuat semua pertanyaan yang ada di halaman ke dalam indeks. Sekarang kita dapat mengajukan pertanyaan seperti โ€œApakah Zappos memiliki kartu hadiah?โ€ dan dapatkan jawabannya langsung dari FAQ kami di website. Tangkapan layar berikut menunjukkan konsol pengujian bot Amazon Lex menjawab pertanyaan tersebut dari FAQ.

Tingkatkan Amazon Lex dengan LLM dan tingkatkan pengalaman FAQ menggunakan penyerapan URL | Kecerdasan Data PlatoBlockchain Layanan Web Amazon. Pencarian Vertikal. Ai.

Kami dapat mencapai hal ini karena kami telah merayapi URL pada langkah pertama dan membuat penyematan yang dapat digunakan LlamaIndex untuk mencari jawaban atas pertanyaan kami. Fungsi Lambda bot kami menunjukkan bagaimana pencarian ini dijalankan setiap kali maksud fallback dikembalikan:

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

Solusi ini berfungsi dengan baik bila satu halaman web memiliki semua jawabannya. Namun, sebagian besar situs FAQ tidak dibuat dalam satu halaman. Misalnya, dalam contoh Zappos, jika kita mengajukan pertanyaan โ€œApakah Anda memiliki kebijakan pencocokan harga?โ€, maka kita mendapatkan jawaban yang kurang memuaskan, seperti yang ditunjukkan pada gambar layar berikut.

Tingkatkan Amazon Lex dengan LLM dan tingkatkan pengalaman FAQ menggunakan penyerapan URL | Kecerdasan Data PlatoBlockchain Layanan Web Amazon. Pencarian Vertikal. Ai.

Pada interaksi sebelumnya, jawaban kebijakan pencocokan harga tidak membantu pengguna kami. Jawaban ini singkat karena FAQ yang dirujuk adalah tautan ke halaman tertentu tentang kebijakan pencocokan harga dan perayapan web kami hanya untuk satu halaman. Mendapatkan jawaban yang lebih baik berarti merayapi tautan ini juga. Bagian selanjutnya menunjukkan cara mendapatkan jawaban atas pertanyaan yang memerlukan dua atau lebih tingkat kedalaman halaman.

Perayapan tingkat-N

Saat kami merayapi halaman web untuk mendapatkan pengetahuan FAQ, informasi yang kami inginkan dapat dimuat di halaman tertaut. Misalnya, dalam contoh Zappos, kami mengajukan pertanyaan โ€œApakah Anda memiliki kebijakan pencocokan harga?โ€ dan jawabannya โ€œIya silahkan berkunjung untuk mempelajari lebih lanjut.โ€ Jika seseorang bertanya โ€œApa kebijakan pencocokan harga Anda?โ€ maka kami ingin memberikan jawaban yang lengkap dengan kebijakan tersebut. Untuk mencapai hal ini berarti kami harus menelusuri tautan untuk mendapatkan informasi aktual bagi pengguna akhir kami. Selama proses penyerapan, kita dapat menggunakan pemuat web untuk menemukan tautan jangkar ke halaman HTML lain dan kemudian melintasinya. Perubahan kode berikut pada perayap web memungkinkan kami menemukan tautan di laman yang kami jelajahi. Ini juga mencakup beberapa logika tambahan untuk menghindari perayapan melingkar dan mengizinkan filter berdasarkan awalan.

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)

Pada kode sebelumnya, kami memperkenalkan kemampuan untuk merayapi tingkat N secara mendalam, dan kami memberikan awalan yang memungkinkan kami membatasi perayapan hanya pada hal-hal yang dimulai dengan pola URL tertentu. Dalam contoh Zappos kami, semua halaman layanan pelanggan di-root zappos.com/c, jadi kami menyertakannya sebagai awalan untuk membatasi perayapan kami ke subkumpulan yang lebih kecil dan lebih relevan. Kode tersebut menunjukkan bagaimana kita dapat menyerap hingga kedalaman dua tingkat. Logika Lambda bot kami tetap sama karena tidak ada yang berubah kecuali perayap menyerap lebih banyak dokumen.

Kami sekarang telah mengindeks semua dokumen dan kami dapat mengajukan pertanyaan yang lebih rinci. Pada tangkapan layar berikut, bot kami memberikan jawaban yang benar atas pertanyaan โ€œApakah Anda memiliki kebijakan pencocokan harga?โ€

Tingkatkan Amazon Lex dengan LLM dan tingkatkan pengalaman FAQ menggunakan penyerapan URL | Kecerdasan Data PlatoBlockchain Layanan Web Amazon. Pencarian Vertikal. Ai.

Kami sekarang memiliki jawaban lengkap atas pertanyaan kami tentang pencocokan harga. Daripada hanya diberi tahu โ€œYa, lihat kebijakan kamiโ€, ini memberi kami detail dari perayapan tingkat kedua.

Membersihkan

Untuk menghindari timbulnya biaya di masa depan, lanjutkan dengan menghapus semua sumber daya yang digunakan sebagai bagian dari latihan ini. Kami telah menyediakan skrip untuk mematikan titik akhir Sagemaker dengan baik. Detail penggunaan ada di README. Selain itu, untuk menghapus semua sumber daya lain yang dapat Anda jalankan cdk destroy di direktori yang sama dengan perintah cdk lainnya untuk mencabut akses semua sumber daya di tumpukan Anda.

Kesimpulan

Kemampuan untuk memasukkan serangkaian FAQ ke dalam chatbot memungkinkan pelanggan Anda menemukan jawaban atas pertanyaan mereka dengan pertanyaan bahasa alami yang lugas. Dengan menggabungkan dukungan bawaan di Amazon Lex untuk penanganan fallback dengan solusi RAG seperti LlamaIndex, kami dapat memberikan jalur cepat bagi pelanggan kami untuk mendapatkan jawaban FAQ yang memuaskan, terkurasi, dan disetujui. Dengan menerapkan perayapan tingkat N ke dalam solusi kami, kami dapat memberikan jawaban yang mungkin mencakup beberapa tautan FAQ dan memberikan jawaban yang lebih mendalam terhadap pertanyaan pelanggan kami. Dengan mengikuti langkah-langkah ini, Anda dapat dengan mudah menggabungkan kemampuan Tanya Jawab berbasis LLM yang kuat dan penyerapan URL yang efisien ke dalam chatbot Amazon Lex Anda. Hal ini menghasilkan interaksi dengan pengguna yang lebih akurat, komprehensif, dan sadar konteks.


Tentang penulis

Tingkatkan Amazon Lex dengan LLM dan tingkatkan pengalaman FAQ menggunakan penyerapan URL | Kecerdasan Data PlatoBlockchain Layanan Web Amazon. Pencarian Vertikal. Ai.Max Henkel-Wallace adalah Insinyur Pengembangan Perangkat Lunak di AWS Lex. Dia senang bekerja memanfaatkan teknologi untuk memaksimalkan kesuksesan pelanggan. Di luar pekerjaan, dia sangat suka memasak, menghabiskan waktu bersama teman, dan backpacking.

Tingkatkan Amazon Lex dengan LLM dan tingkatkan pengalaman FAQ menggunakan penyerapan URL | Kecerdasan Data PlatoBlockchain Layanan Web Amazon. Pencarian Vertikal. Ai.Lagu Feng adalah Ilmuwan Terapan Senior di AWS AI Labs, dengan spesialisasi Pemrosesan Bahasa Alami dan Kecerdasan Buatan. Penelitiannya mengeksplorasi berbagai aspek bidang ini termasuk pemodelan dialog berbasis dokumen, penalaran untuk dialog berorientasi tugas, dan pembuatan teks interaktif menggunakan data multimodal.

Tingkatkan Amazon Lex dengan LLM dan tingkatkan pengalaman FAQ menggunakan penyerapan URL | Kecerdasan Data PlatoBlockchain Layanan Web Amazon. Pencarian Vertikal. Ai.John Baker adalah SDE Utama di AWS tempat dia mengerjakan Pemrosesan Bahasa Alami, Model Bahasa Besar, dan proyek terkait ML/AI lainnya. Dia telah bekerja di Amazon selama lebih dari 9 tahun dan telah bekerja di AWS, Alexa, dan Amazon.com. Di waktu luangnya, John menikmati bermain ski dan aktivitas luar ruangan lainnya di seluruh Pacific Northwest.

Stempel Waktu:

Lebih dari Pembelajaran Mesin AWS