URL alımını kullanarak Amazon Lex'i LLM'lerle geliştirin ve SSS deneyimini iyileştirin | Amazon Web Hizmetleri

URL alımını kullanarak Amazon Lex'i LLM'lerle geliştirin ve SSS deneyimini iyileştirin | Amazon Web Hizmetleri

Günümüzün dijital dünyasında çoğu tüketici, işletmelere ve/veya hizmet sağlayıcılara ulaşmak için zaman ayırmak yerine müşteri hizmetleri sorularına kendi başlarına yanıt bulmayı tercih eder. Bu blog gönderisi, bir soru cevap sohbet botu oluşturmak için yenilikçi bir çözümü araştırıyor. Amazon Lex'i web sitenizdeki mevcut SSS'leri kullanan. Yapay zeka destekli bu araç, gerçek dünyadaki sorgulara hızlı ve doğru yanıtlar vererek müşterinin ortak sorunları bağımsız olarak hızlı ve kolay bir şekilde çözmesine olanak tanır.

Tek URL alımı

Birçok işletmenin, web sitelerinde müşterileri için SSS'ler için yayınlanmış bir dizi yanıtı vardır. Bu durumda, müşterilere, yayınlanmış SSS bölümümüzden sorularını yanıtlayabilecekleri bir chatbot sunmak istiyoruz. başlıklı blog yazısında LLM'leri kullanarak diyaloglu SSS özellikleriyle Amazon Lex'i geliştirin, PDF veya Word belgeleri gibi mevcut bilgi kaynaklarınızla desteklenen bir sohbet robotu oluşturmak için Amazon Lex ve LlamaIndex'in bir kombinasyonunu nasıl kullanabileceğinizi gösterdik. Bir SSS web sitesine dayalı basit bir SSS'yi desteklemek için, web sitesini tarayabilen ve müşteri sorularını yanıtlamak için LlamaIndex tarafından kullanılabilecek yerleştirmeler oluşturabilen bir alım süreci oluşturmamız gerekir. Bu durumda, içinde oluşturulan bot üzerine inşa edeceğiz. önceki blog yazısı, bu yerleştirmeleri bir kullanıcının ifadesiyle sorgular ve yanıtı web sitesi SSS'lerinden döndürür.

Aşağıdaki diyagram, çözümümüz için alım sürecinin ve Amazon Lex robotunun birlikte nasıl çalıştığını göstermektedir.

Amazon Lex'i Yüksek Lisans'larla geliştirin ve URL alımını kullanarak SSS deneyimini iyileştirin | Amazon Web Hizmetleri PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Çözüm iş akışında, SSS içeren web sitesi şu şekilde alınır: AWS Lambda. Bu Lambda işlevi, web sitesini tarar ve ortaya çıkan metni bir Amazon Basit Depolama Hizmeti (Amazon S3) paketi. Ardından S3 klasörü, Amazon S3'te depolanan yerleştirmeler oluşturmak için LlamaIndex'i kullanan bir Lambda işlevini tetikler. Bir son kullanıcıdan "İade politikanız nedir?" gibi bir soru geldiğinde, Amazon Lex botu, LlamaIndex ile RAG tabanlı bir yaklaşım kullanarak yerleştirmeleri sorgulamak için Lambda işlevini kullanır. Bu yaklaşım ve ön koşullar hakkında daha fazla bilgi için şu blog gönderisine bakın: LLM'leri kullanarak diyaloglu SSS özellikleriyle Amazon Lex'i geliştirin.

Bahsi geçen blogun ön koşulları tamamlandıktan sonra, ilk adım SSS'leri LlamaIndex tarafından vektörleştirilebilen ve dizine eklenebilen bir belge deposuna almaktır. Aşağıdaki kod, bunun nasıl gerçekleştirileceğini gösterir:

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)

Önceki örnekte, Zappos'tan önceden tanımlanmış bir SSS web sitesi URL'si alıyoruz ve EZWebLoader sınıf. Bu sınıf ile URL'ye gittik ve sayfadaki tüm soruları bir dizine yükledik. Artık “Zappos'ta hediye çeki var mı?” gibi bir soru sorabiliriz. ve yanıtları doğrudan web sitesindeki SSS'lerimizden alın. Aşağıdaki ekran görüntüsü, SSS'deki bu soruyu yanıtlayan Amazon Lex bot test konsolunu göstermektedir.

Amazon Lex'i Yüksek Lisans'larla geliştirin ve URL alımını kullanarak SSS deneyimini iyileştirin | Amazon Web Hizmetleri PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Bunu başarabildik çünkü ilk adımda URL'yi taradık ve LlamaIndex'in sorumuzun yanıtını aramak için kullanabileceği gömmeler oluşturduk. Botumuzun Lambda işlevi, geri dönüş amacı her döndürüldüğünde bu aramanın nasıl yürütüldüğünü gösterir:

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

Bu çözüm, tek bir web sayfasında tüm yanıtlar bulunduğunda işe yarar. Ancak, çoğu SSS sitesi tek bir sayfa üzerine inşa edilmemiştir. Örneğin Zappos örneğimizde “Fiyat eşleştirme politikanız var mı?”

Amazon Lex'i Yüksek Lisans'larla geliştirin ve URL alımını kullanarak SSS deneyimini iyileştirin | Amazon Web Hizmetleri PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Önceki etkileşimde, fiyat eşleştirme politikası yanıtı kullanıcımız için yararlı değildir. Bu cevap kısa çünkü başvurulan SSS, fiyat eşleştirme politikasıyla ilgili belirli bir sayfanın bağlantısı ve web taramamız yalnızca tek bir sayfa içindi. Daha iyi cevaplar elde etmek, bu bağlantıları da taramak anlamına gelecektir. Bir sonraki bölümde, iki veya daha fazla sayfa derinliği gerektiren soruların yanıtlarının nasıl alınacağı gösterilmektedir.

N düzeyinde tarama

SSS bilgisi için bir web sayfasını taradığımızda, istediğimiz bilgiler bağlantılı sayfalarda bulunabilir. Örneğin Zappos örneğimizde “Fiyat eşleştirme politikanız var mı?” ve cevap “Evet, lütfen ziyaret edin. daha fazla öğrenmek için." Birisi "Fiyat eşleştirme politikanız nedir?" o zaman politika ile tam bir cevap vermek istiyoruz. Bunu başarmak, son kullanıcımız için gerçek bilgileri elde etmek için bağlantıları geçmemiz gerektiği anlamına gelir. Besleme işlemi sırasında, diğer HTML sayfalarına giden bağlantı bağlantılarını bulmak ve ardından bunlar arasında geçiş yapmak için web yükleyicimizi kullanabiliriz. Web tarayıcımızda yapılan aşağıdaki kod değişikliği, taradığımız sayfalardaki bağlantıları bulmamızı sağlar. Ayrıca, döngüsel taramayı önlemek ve bir önekle filtrelemeye izin vermek için bazı ek mantık içerir.

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)

Önceki kodda, N seviye derinlemesine tarama yeteneğini tanıtıyoruz ve taramayı yalnızca belirli bir URL modeliyle başlayan şeylerle kısıtlamamıza izin veren bir önek veriyoruz. Zappos örneğimizde, müşteri hizmetleri sayfalarının tümü, zappos.com/c, bu nedenle, taramalarımızı daha küçük ve daha alakalı bir alt kümeyle sınırlamak için bunu bir önek olarak ekledik. Kod, iki seviye derinliğe kadar nasıl sindirebileceğimizi gösteriyor. Botumuzun Lambda mantığı aynı kalıyor çünkü tarayıcının daha fazla belge alması dışında hiçbir şey değişmedi.

Artık tüm belgeleri dizine ekledik ve daha ayrıntılı bir soru sorabiliriz. Aşağıdaki ekran görüntüsünde botumuz “Fiyat eşleştirme politikanız var mı?” sorusuna doğru cevabı vermektedir.

Amazon Lex'i Yüksek Lisans'larla geliştirin ve URL alımını kullanarak SSS deneyimini iyileştirin | Amazon Web Hizmetleri PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Artık fiyat eşleştirmeyle ilgili sorumuzun tam bir yanıtına sahibiz. Basitçe "Evet, politikamıza bakın" demek yerine, bize ikinci düzey taramanın ayrıntılarını verir.

Temizlemek

Gelecekte masraflara maruz kalmamak için, bu alıştırmanın bir parçası olarak dağıtılan tüm kaynakları silmeye devam edin. Sagemaker uç noktasını incelikle kapatmak için bir komut dosyası sağladık. Kullanım ayrıntıları README'dedir. Ek olarak, çalıştırabileceğiniz diğer tüm kaynakları kaldırmak için cdk destroy yığınınızdaki tüm kaynakların sağlamasını kaldırmak için diğer cdk komutlarıyla aynı dizinde.

Sonuç

Bir dizi SSS'yi bir sohbet botuna alma yeteneği, müşterilerinizin sorularının yanıtlarını basit, doğal dil sorgularıyla bulmasını sağlar. Geri dönüş yönetimi için Amazon Lex'teki yerleşik desteği LlamaIndex gibi bir RAG çözümüyle birleştirerek, müşterilerimize SSS'lere tatmin edici, derlenmiş ve onaylanmış yanıtlar almaları için hızlı bir yol sağlayabiliriz. Çözümümüze N düzeyinde tarama uygulayarak, muhtemelen birden çok SSS bağlantısına yayılabilecek yanıtlara izin verebilir ve müşterilerimizin sorgularına daha derin yanıtlar sağlayabiliriz. Bu adımları izleyerek güçlü LLM tabanlı Soru-Cevap özelliklerini ve verimli URL alımını Amazon Lex sohbet botunuza sorunsuz bir şekilde dahil edebilirsiniz. Bu, kullanıcılarla daha doğru, kapsamlı ve bağlamsal olarak bilinçli etkileşimlerle sonuçlanır.


yazarlar hakkında

Amazon Lex'i Yüksek Lisans'larla geliştirin ve URL alımını kullanarak SSS deneyimini iyileştirin | Amazon Web Hizmetleri PlatoBlockchain Veri Zekası. Dikey Arama. Ai.Max Henkel-Wallace AWS Lex'te Yazılım Geliştirme Mühendisi. Müşteri başarısını en üst düzeye çıkarmak için teknolojiden yararlanarak çalışmaktan keyif alıyor. İş dışında yemek pişirmeye, arkadaşlarıyla vakit geçirmeye ve sırt çantasıyla gezmeye tutkulu.

Amazon Lex'i Yüksek Lisans'larla geliştirin ve URL alımını kullanarak SSS deneyimini iyileştirin | Amazon Web Hizmetleri PlatoBlockchain Veri Zekası. Dikey Arama. Ai.Şarkı Feng AWS AI Labs'ta Doğal Dil İşleme ve Yapay Zeka konusunda uzmanlaşmış Kıdemli Uygulamalı Bilim Adamıdır. Araştırması, belgeye dayalı diyalog modelleme, görev odaklı diyaloglar için akıl yürütme ve çok modlu verileri kullanarak etkileşimli metin oluşturma dahil olmak üzere bu alanların çeşitli yönlerini araştırıyor.

Amazon Lex'i Yüksek Lisans'larla geliştirin ve URL alımını kullanarak SSS deneyimini iyileştirin | Amazon Web Hizmetleri PlatoBlockchain Veri Zekası. Dikey Arama. Ai.John Baker AWS'de, Doğal Dil İşleme, Büyük Dil Modelleri ve ML/AI ile ilgili diğer projeler üzerinde çalıştığı bir Baş SDE'dir. 9 yılı aşkın süredir Amazon'da çalışıyor ve AWS, Alexa ve Amazon.com'da çalıştı. John boş zamanlarında Kuzeybatı Pasifik'te kayak yapmaktan ve diğer açık hava aktivitelerinden hoşlanıyor.

Zaman Damgası:

Den fazla AWS Makine Öğrenimi