Visualizzazione delle chiamate all'assistenza clienti con OpenSearch Service e OpenSearch Dashboards - Amazon OpenSearch Service

Visualizzazione delle chiamate all'assistenza clienti con OpenSearch Service e OpenSearch Dashboards

Questo capitolo è un'analisi completa della seguente situazione: un'azienda riceve un numero di chiamate al servizio di assistenza clienti e desidera analizzarle. Qual è l'argomento di ogni chiamata? Quante sono state positive? Quante sono state negative? In che modo i responsabili possono cercare o analizzare le trascrizioni di queste chiamate?

Un flusso di lavoro manuale potrebbe coinvolgere dipendenti che ascoltano le registrazioni, annotano l'oggetto di ciascuna chiamata e decidono se l'interazione con il cliente è stata positiva.

Tale processo sarebbe estremamente impegnativo. Considerando un tempo medio di 10 minuti per chiamata, ogni dipendente potrebbe ascoltare solo 48 chiamate al giorno. Ad eccezione di eventuali distorsioni umane, i dati generati sarebbero altamente accurati, ma la quantità di dati sarebbe minima: solo l'oggetto della chiamata e un Boolean se il cliente è soddisfatto oppure no. Qualcosa di più complesso, come una trascrizione completa, potrebbe richiedere una grande quantità di tempo.

Grazie a Amazon S3, Amazon Transcribe, Amazon Comprehend e Amazon OpenSearch Service, è possibile automatizzare un processo analogo con pochissimo codice e ottenere molti più dati. Ad esempio, è possibile ottenere una trascrizione completa della chiamata, le parole chiave dalla trascrizione e un "sentiment" della chiamata (positivo, negativo, neutro o misto). Quindi è possibile utilizzare OpenSearch e OpenSearch Dashboards per cercare e visualizzare i dati.

Mentre è possibile usare questa spiegazione passo per passo così com'è, l'intento è dare vita a nuove idee su come arricchire i documenti JSON prima di indicizzarli in OpenSearch Service.

Costi stimati

In generale, l'esecuzione della procedura indicata in questo scenario avrebbe un costo inferiore a $2. La procedura guidata utilizza le risorse seguenti:

  • Bucket S3 con meno di 100 MB trasferiti e memorizzati

    Per ulteriori informazioni, consultare Amazon S3 Pricing.

  • Dominio OpenSearch Service con un'istanza t2.medium e 10 GiB di spazio di archiviazione EBS per diverse ore

    Per ulteriori informazioni, consultare Prezzi di Amazon OpenSearch Service.

  • Chiamate multiple ad Amazon Transcribe

    Per ulteriori informazioni, consultare Prezzi di Amazon Transcribe.

  • Diverse chiamate di elaborazione del linguaggio naturale ad Amazon Comprehend

    Per ulteriori informazioni, consultare Prezzi di Amazon Comprehend.

Fase 1: Configurazione dei prerequisiti

Prima di procedere, devi disporre delle risorse indicate di seguito.

Prerequisito Descrizione
Bucket Amazon S3 Per ulteriori informazioni, consulta Creazione di un bucket nella Guida per l'utente di Amazon Simple Storage Service.
Dominio OpenSearch Service Destinazione per i dati. Per ulteriori informazioni, consultare Creazione di domini OpenSearch Service.

Se non si dispone già di queste risorse, è possibile crearle utilizzando i comandi AWS CLI seguenti:

aws s3 mb s3://my-transcribe-test --region us-west-2
aws opensearch create-domain --domain-name my-transcribe-test --engine-version OpenSearch_1.0 --cluster-config InstanceType=t2.medium.search,InstanceCount=1 --ebs-options EBSEnabled=true,VolumeType=standard,VolumeSize=10 --access-policies '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789012:root"},"Action":"es:*","Resource":"arn:aws:es:us-west-2:123456789012:domain/my-transcribe-test/*"}]}' --region us-west-2
Nota

Questi comandi utilizzano la regione us-west-2, ma è possibile usare qualsiasi regione supportata da Amazon Comprehend. Per ulteriori informazioni, consultare Riferimenti generali AWS.

Fase 2: Copia del codice di esempio

  1. Copiare e incollare il seguente codice di esempio Pythin 3 in un nuovo file denominato call-center.py:

    import boto3 import datetime import json import requests from requests_aws4auth import AWS4Auth import time import urllib.request # Variables to update audio_file_name = '' # For example, 000001.mp3 bucket_name = '' # For example, my-transcribe-test domain = '' # For example, https://search-my-transcribe-test-12345.us-west-2.es.amazonaws.com index = 'support-calls' type = '_doc' region = 'us-west-2' # Upload audio file to S3. s3_client = boto3.client('s3') audio_file = open(audio_file_name, 'rb') print('Uploading ' + audio_file_name + '...') response = s3_client.put_object( Body=audio_file, Bucket=bucket_name, Key=audio_file_name ) # # Build the URL to the audio file on S3. # # Only for the us-east-1 region. # mp3_uri = 'https://' + bucket_name + '.s3.amazonaws.com/' + audio_file_name # Get the necessary details and build the URL to the audio file on S3. # For all other regions. response = s3_client.get_bucket_location( Bucket=bucket_name ) bucket_region = response['LocationConstraint'] mp3_uri = 'https://' + bucket_name + '.s3-' + bucket_region + '.amazonaws.com/' + audio_file_name # Start transcription job. transcribe_client = boto3.client('transcribe') print('Starting transcription job...') response = transcribe_client.start_transcription_job( TranscriptionJobName=audio_file_name, LanguageCode='en-US', MediaFormat='mp3', Media={ 'MediaFileUri': mp3_uri }, Settings={ 'ShowSpeakerLabels': True, 'MaxSpeakerLabels': 2 # assumes two people on a phone call } ) # Wait for the transcription job to finish. print('Waiting for job to complete...') while True: response = transcribe_client.get_transcription_job(TranscriptionJobName=audio_file_name) if response['TranscriptionJob']['TranscriptionJobStatus'] in ['COMPLETED', 'FAILED']: break else: print('Still waiting...') time.sleep(10) transcript_uri = response['TranscriptionJob']['Transcript']['TranscriptFileUri'] # Open the JSON file, read it, and get the transcript. response = urllib.request.urlopen(transcript_uri) raw_json = response.read() loaded_json = json.loads(raw_json) transcript = loaded_json['results']['transcripts'][0]['transcript'] # Send transcript to Comprehend for key phrases and sentiment. comprehend_client = boto3.client('comprehend') # If necessary, trim the transcript. # If the transcript is more than 5 KB, the Comprehend calls fail. if len(transcript) > 5000: trimmed_transcript = transcript[:5000] else: trimmed_transcript = transcript print('Detecting key phrases...') response = comprehend_client.detect_key_phrases( Text=trimmed_transcript, LanguageCode='en' ) keywords = [] for keyword in response['KeyPhrases']: keywords.append(keyword['Text']) print('Detecting sentiment...') response = comprehend_client.detect_sentiment( Text=trimmed_transcript, LanguageCode='en' ) sentiment = response['Sentiment'] # Build the Amazon OpenSearch Service URL. id = audio_file_name.strip('.mp3') url = domain + '/' + index + '/' + type + '/' + id # Create the JSON document. json_document = {'transcript': transcript, 'keywords': keywords, 'sentiment': sentiment, 'timestamp': datetime.datetime.now().isoformat()} # Provide all details necessary to sign the indexing request. credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, 'opensearchservice', session_token=credentials.token) # Index the document. print('Indexing document...') response = requests.put(url, auth=awsauth, json=json_document, headers=headers) print(response) print(response.json())
  2. Aggiornare le prime sei variabili.

  3. Installare i pacchetti necessari utilizzando i comandi seguenti:

    pip install boto3 pip install requests pip install requests_aws4auth
  4. Posizionare MP3 nella stessa directory di call-center.py ed eseguire lo script. Di seguito è riportato un output di esempio:

    $ python call-center.py Uploading 000001.mp3... Starting transcription job... Waiting for job to complete... Still waiting... Still waiting... Still waiting... Still waiting... Still waiting... Still waiting... Still waiting... Detecting key phrases... Detecting sentiment... Indexing document... <Response [201]> {u'_type': u'call', u'_seq_no': 0, u'_shards': {u'successful': 1, u'failed': 0, u'total': 2}, u'_index': u'support-calls4', u'_version': 1, u'_primary_term': 1, u'result': u'created', u'_id': u'000001'}

call-center.py esegue una serie di operazioni:

  1. Lo script carica un file audio (in questo caso, un MP3, ma Amazon Transcribe supporta diversi formati) nel bucket S3.

  2. Invia l'URL del file audio ad Amazon Transcribe e attende il completamento del processo di trascrizione.

    Il tempo necessario per completare il processo di trascrizione dipende dalla durata del file audio. Supponiamo siano minuti, non secondi.

    Suggerimento

    Per migliorare la qualità della trascrizione, è possibile configurare un vocabolario personalizzato per Amazon Transcribe.

  3. Una volta completato il processo di trascrizione, lo script estrae la trascrizione, la riduce a 5.000 caratteri e la invia ad Amazon Comprehend per l'analisi del sentiment e delle parole chiave.

  4. Infine, lo script aggiunge la trascrizione completa, le parole chiave, il sentiment e l'attuale timestamp a un documento JSON e lo indicizza in OpenSearch Service.

Suggerimento

LibriVox dispone di audiolibri di pubblico dominio da utilizzare per il test.

(Facoltativo) Fase 3: Indicizzazione dei dati di esempio

Se non si dispone di un gruppo di registrazioni di chiamate (chi le ha, effettivamente?) è possibile indicizzare i documenti campione in sample-calls.zip, con un risultato simile a quello prodotto da call-center.py.

  1. Crea un file denominato bulk-helper.py:

    import boto3 from elasticsearch import Elasticsearch, RequestsHttpConnection import json from requests_aws4auth import AWS4Auth host = '' # For example, my-test-domain.us-west-2.es.amazonaws.com region = '' # For example, us-west-2 service = 'opensearchservice' bulk_file = open('sample-calls.bulk', 'r').read() credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) es = Elasticsearch( hosts = [{'host': host, 'port': 443}], http_auth = awsauth, use_ssl = True, verify_certs = True, connection_class = RequestsHttpConnection ) response = es.bulk(bulk_file) print(json.dumps(response, indent=2, sort_keys=True))
  2. Aggiornare le prime due variabili per host e region.

  3. Installare il pacchetto necessario utilizzando il seguente comando:

    pip install elasticsearch
  4. Scaricare e decomprimere sample-calls.zip.

  5. Posizionare sample-calls.bulk nella stessa directory di bulk-helper.py ed eseguire lo script helper. Di seguito è riportato un output di esempio:

    $ python bulk-helper.py { "errors": false, "items": [ { "index": { "_id": "1", "_index": "support-calls", "_primary_term": 1, "_seq_no": 42, "_shards": { "failed": 0, "successful": 1, "total": 2 }, "_type": "_doc", "_version": 9, "result": "updated", "status": 200 } }, ... ], "took": 27 }

Fase 4: Analisi e visualizzazione dei dati

Ora che si dispone dei dati in OpenSearch Service, è possibile visualizzarli usando OpenSearch Dashboards.

  1. Accedere a https://search-domain.region.es.amazonaws.com/_dashboards.

  2. Prima di utilizzare OpenSearch Dashboards, è però necessario un modello di indice. Dashboards usa modelli di indice per limitare l'analisi a uno o più indici. Per abbinare l'indice support-calls creato da call-center.py, passare a Gestione degli stack, Modelli di indice e definire un modello di indice di support*, quindi scegliere Approfondimenti.

  3. In Time Filter field name (Nome campo Filtro tempo), scegliere timestamp.

  4. Ora è possibile iniziare a creare le visualizzazioni. Scegliere Visualize (Visualizza), quindi aggiungere una nuova visualizzazione.

  5. Scegliere il grafico a torta e il modello dell'indice support*.

  6. La visualizzazione predefinita è di base, quindi scegliere Split Slices (Dividi sezioni) per creare una visualizzazione più interessante.

    Per Aggregation (Aggregazione) scegliere Terms (Termini). In Field (Campo), scegliere sentiment.keyword. Quindi selezionare Apply changes (Applica modifiche) e poi Save (Salva).

    
                        Configurazione di esempio per un grafico a torta di Dashboards.
  7. Tornare alla pagina Visualize (Visualizza) e aggiungere un'altra visualizzazione. Questa volta, scegliere il grafico a barre orizzontali.

  8. Scegliere Split Series (Dividi serie).

    Per Aggregation (Aggregazione) scegliere Terms (Termini). In Field (Campo), scegliere keywords.keyword e modificare Size (Dimensioni) in 20. Quindi selezionare Apply Changes (Applica modifiche) e poi Save (Salva).

    
                        Configurazione di esempio per un grafico a barre orizzontali di Dashboards.
  9. Tornare alla pagina Visualize (Visualizza) e aggiungere una visualizzazione finale, un grafico a barre verticali.

  10. Scegliere Split Series (Dividi serie). In Aggregation (Aggregazione), scegliere Date Histogram (Istogramma date). In Field (Campo), scegliere timestamp e modificare Interval (Intervallo) in Daily (Giornaliero).

  11. Scegliere Metrics & Axes (Parametri e assi) e cambiare Mode (Modalità) in normal (normale).

  12. Selezionare Apply Changes (Applica modifiche) e poi Save (Salva).

    
                        Configurazione di esempio per un grafico a barre verticali di Dashboards.
  13. Ora che si dispone di tre visualizzazioni, è possibile aggiungerle a una visualizzazione di Dashboards. Scegliere Dashboard (Pannello di controllo), creare un pannello di controllo e aggiungere le visualizzazioni.

    
                        Visualizzazione di Dashboards di esempio.

Fase 5: Pulizia delle risorse e fasi successive

Per evitare addebiti non necessari, eliminare il bucket S3 e il dominio OpenSearch Service. Per ulteriori informazioni, consulta Eliminazione di un bucket nella Guida per l'utente di Amazon Simple Storage Service e Eliminazione di un dominio OpenSearch Service in questa guida.

Le trascrizioni richiedono molto meno spazio su disco rispetto ai file MP3. È possibile ridurre il periodo di conservazione degli MP3 ad esempio, da tre mesi di registrazioni di chiamate a un mese, conservare anni di trascrizioni e comunque risparmiare sui costi di archiviazione.

È inoltre possibile automatizzare il processo di trascrizione utilizzando AWS Step Functions e Lambda, aggiungere altri metadati prima dell'indicizzazione o progettare visualizzazioni più complesse per casi d'uso specifici.