服务
关于
CloudProse博客
无服务器

使用Amazon Connect,Lex和Lambda的联络中心票务自动化

在Amazon Connect工作流程中使用无服务器系统可以简化和自动化业务流程。
詹姆斯·弗利·崔克(James Foley Trek)
詹姆斯·弗利 | 2019年10月2日

整合 LexBotsLambda函数 进入你的 亚马逊通 工作流程可以帮助解决您的呼叫中心自动化需求。在Trek10中,我们在呼叫中心工作流程中使用Lex和Lambda将呼江苏体彩的口头输入转换为文本,并使用这些值自动提交呼江苏体彩组织的支持通知单。该博客将说明Trek10如何将AWS无服务器系统集成到手动流程中,以解决业务需求。

问题

在Trek10,我们有一个呼叫中心来处理入站客户电话。如果最终用户需要帮助并拨打Trek10的支持号码,则呼叫中心代理会处理呼叫,并获取一些必要的信息,例如呼江苏体彩姓名,呼江苏体彩组织和简短消息。然后,呼叫中心代理将获取此信息,并将其放入电子邮件中,然后将紧急票证提交给Trek10的票务系统。这些票证在进入系统时未绑定到特定的客户端。相反,Trek10代理必须解密哪个客户遇到了问题,该问题是什么以及该问题是紧急的还是正常的优先级。由于Trek10在客户端环境中提供的监视级别,如今这样的呼叫现在不那么频繁了。通常,客户端的AWS环境中的任何问题都会在客户端通知监视器和触发Trek10代理之前发出。客户可以根据需要通过电子邮件提交票证,但可以拨打电话,因为如今看来老旧,无论如何都可以作为客户的一种选择。

尽管按照上述过程进行了适当的调整和完善,但上述系统存在一些问题:

  • 无论问题如何,呼叫中心提交的票务都是当务之急
  • 提交票证时,无法按客户组织和最终用户筛选票证

解决方案

像AWS的许多东西一样,Amazon也有一个解决方案:Amazon Connect。当AWS与Amazon Connect一起推出时,Trek10发现为呼叫中心创建工作流程非常强大,并且随着时间的推移,发现了如何将其他AWS服务集成到工作流程中。认识到这是改变游戏规则的人。我们能够创建一个自动化的工作流程,以解决我们所有的呼叫中心售票问题。

这是我们创建的用于自动致电支持者票证的Connect工作流程的摘要:

我们在此工作流程中结合在一起的AWS无服务器服务是Connect,Lambda,Lex和DynamoDB以及票务系统的API。所有服务一起工作以接听客户的电话,知道客户是谁,允许客户通过语音输入票证信息,将语音输入转换为文本,将呼江苏体彩信息和语音输入存储在数据库中,并在其中创建票证Trek10的票务服务。

在完全启用此工作流程之前,我们需要提出一种解决方案来解决票务系统的局限性。要将票证路由到正确的客户组织,票证系统需要一个客户电子邮件地址。但是,Amazon Connect并不容易存储此信息。为了解决这个问题,我们创建了一个DynamoDB表,其中包含使用该系统的客户端的名称,电子邮件地址和电话号码。现在,当客户打进电话时,将触发Lambda函数,该函数从DynamoDB表中获取用户信息,并且LexBot语音会在询问呼江苏体彩任何内容之前以其姓名和组织来欢迎呼江苏体彩。即使是与您交谈的机器人,也肯定是一个不错的选择。

经过最初的细心交流之后,LexBot要求提供票证优先级,并要求呼江苏体彩总结问题。调用者的响应将转换为文本,并且Lambda函数将获取这些LexBot响应,并在调用结束后将其输入到DynamoDB表中。相同的Lambda函数将获取呼江苏体彩的电子邮件地址,票证优先级和问题,并使用票务系统API提交票证。凭单以正确的优先级进入呼江苏体彩组织下的系统。 (注意:如果有一个未知的呼江苏体彩打进来,工作流会将呼江苏体彩定向到一个单独的LexBot,该LexBot询问呼江苏体彩的姓名,组织,票证优先级和问题。然后,此过程将创建具有由呼江苏体彩指定的优先级的通用票证以及来电者提供的剩余信息。)

下面列出了用于从已知呼江苏体彩接收信息的LexBot:

上面的LexBot具有用于优先级类型和问题的插槽。 LexBot询问呼江苏体彩的问题是优先级较低还是更为紧急。呼江苏体彩还用几句话解释了该问题。

调用者输入完成后,Lambda函数通过将所有信息存储在DynamoDB表中来满足请求,并通过API在Trek10的票务系统中创建票证。 Lambda函数的代码片段如下:


成功调用后,Connect工作流程将向呼江苏体彩确认已创建票证并结束呼叫。提交了工单,Trek10代理根据优先级提供帮助。

借助以上AWS服务的强大功能,我们已经缓解了所有原始问题。您可以开始了解AWS的功能以及不同的AWS系统如何协同工作来解决业务流程需求。如果您想创建自己的Amazon Connect呼叫中心,如果您想将自动化或其他服务集成到您已经创建的Amazon Connect工作流程中,或者获得有关任何AWS系统的专家建议,请通过Trek10与我们联系,我们将为您提供帮助很高兴探索我们提供帮助的可能性。


import logging
import boto3
import json
from boto3.dynamodb.conditions import Key
from zdesk import Zendesk


logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

# Get the service resource.
dynamodb = boto3.resource('dynamodb')

# Instantiate a table resource object
db_table = dynamodb.Table('dynamotableA')
br_table = dynamodb.Table('dynamotableB')

""" --- Main handler --- """

def lambda_handler(event, context):
    logger.debug(json.dumps(event))
    logger.debug('event.bot.name={}'.format(event['bot']['name']))
    logger.debug('dispatch userId={}, intentName={}'.format(event['userId'], event['currentIntent']['name']))
    logger.debug('entire.event={}'.format(event))


    # Validate intent name
    intent_name = event['currentIntent']['name']
    if intent_name != 'lexbotintent':
        raise Exception('Intent with name ' + intent_name + ' not supported!')

    # Validate invocation source
    source = event['invocationSource']
    if source == 'DialogCodeHook':
        raise Exception('This Lambda function only support fulfillment')

    # Get bot slot values
    issue = event['currentIntent']['slots']["issue"]
    prioritytype = event['currentIntent']['slots']["prioritytype"]

    ## Get customer number from DynamoDB table
    response = br_table.query(
        TableName='dynamotableB',
        IndexName='constant-timestamp-index',
        Select='ALL_ATTRIBUTES',
        Limit=1,
        ConsistentRead=False,
        ScanIndexForward=False,
        KeyConditionExpression=Key("constant").eq("a")
    )
    phoneNumber = response['Items'][0]['phoneNumber']
    
    update_response = db_table.update_item(
        Key={
            "phoneNumber": phoneNumber,
        },
        UpdateExpression='SET issue = :issue, prioritytype = :prioritytype',
        ExpressionAttributeValues={
            ":prioritytype": prioritytype,
            ":issue": issue
        }
    )
    
    get_customer_info = db_table.get_item(
        TableName='dynamotableA',
        Key={
            "phoneNumber": phoneNumber,
        },
    )['Item']
    
    #create ticket in zendeks with dynamodb 和 lexbot values
    SSM_CLIENT = boto3.client('ssm')
    zd_secret = SSM_CLIENT.get_parameter(
        Name='ssm_secret_key_name',
        WithDecryption=True
    )['Parameter']['Value']
    zendesk = Zendesk('companyzendeskurl', 'zendesk_user_email', zd_secret, True)
    new_ticket = {
    'ticket': {
        'requester': {
            #'name': get_customer_info['firstName'],
            'email': get_customer_info['email'],
        },
        'subject': 'Ticket Subject Here',
        'description': get_customer_info['issue'],
        'tags': ['key1', 'value1'],
        'priority': get_customer_info['prioritytype']
        }
    }
    zd = zendesk.ticket_create(data=new_ticket)
    logger.debug(zd)
    
 # Define the return response to the Lex bot in the required Lex response format. The
    # The Lex response format is documented here: http://docs.aws.amazon.com/lex/latest/dg/lambda-input-response-format.html#using-lambda-response-format
    intent_fulfillment_response = { 'sessionAttributes': event["sessionAttributes"],
       'dialogAction': {
            'type': 'Close',
            'fulfillmentState': 'Fulfilled',
            'message':
            {'contentType': 'SSML',
            # Message to return to the Lex bot 
             'content': 'Thank you. A ticket was sucessfully created. A Trek10 agent will be online 和 respond shortly. Have a great day.'}
        }
    }

    return intent_fulfillment_response

成功调用后,Connect工作流程将向呼江苏体彩确认已创建票证并结束呼叫。提交了工单,Trek10代理根据优先级提供帮助。

借助以上AWS服务的强大功能,我们已经缓解了所有原始问题。您可以开始了解AWS的功能以及不同的AWS系统如何协同工作来解决业务流程需求。如果您想创建自己的Amazon Connect呼叫中心,如果您想将自动化或其他服务集成到您已经创建的Amazon Connect工作流程中,或者获得有关任何AWS系统的专家建议,请通过Trek10与我们联系,我们将为您提供帮助很高兴探索我们提供帮助的可能性。

作者
詹姆斯·弗利·崔克(James Foley Trek)
詹姆斯·弗利