Hilfe zu FAQ

FAQ Assist schlägt menschlichen Kundenservicemitarbeitern in Unterhaltungen mit Endnutzern relevante Antworten auf FAQ vor. Mit diesem Feature kann ein menschlicher Kundenservicemitarbeiter häufige Endnutzerfragen beantworten, während sich der menschliche Kundenservicemitarbeiter und der Endnutzer unterhalten.

Agent Assist verfolgt die Unterhaltung und parst FAQ-Dokumente, die in Wissensdatenbanken gespeichert sind, um Antworten auf Endnutzerfragen vorzuschlagen. Der menschliche Kundenservicemitarbeiter kann diese Vorschläge während der Unterhaltung prüfen und gegebenenfalls dem Endnutzer als Antwort erteilen.

In diesem Dokument wird erläutert, wie Sie die API verwenden, um FAQ Assist zu implementieren und während der Laufzeit Vorschläge von diesem Feature zu erhalten. Sie haben die Möglichkeit, mit der Agent Assist Console die Ergebnisse von Article Suggestion während der Entwicklung zu testen. Sie müssen die API jedoch während der Laufzeit direkt aufrufen. Informationen zum Testen der Feature-Leistung über die Agent Assist Console finden Sie im Abschnitt "Anleitungen".

Hinweis

Führen Sie die folgenden Schritte aus, bevor Sie mit dieser Anleitung beginnen:

  1. Aktivieren Sie die Dialogflow API für Ihr GCP-Projekt.
  2. Aktivieren Sie die Data Labeling API für Ihr Projekt.

Unterhaltungsprofil konfigurieren

Um Vorschläge von Agent Assist zu erhalten, müssen Sie eine Wissensdatenbank mit Ihren hochgeladenen Dokumenten erstellen und ein Unterhaltungsprofil konfigurieren. Sie können diese Aktionen auch mit der Agent Assist Console ausführen, wenn Sie die API nicht direkt aufrufen möchten.

Knowledge Base erstellen

Bevor Sie Dokumente hochladen können, müssen Sie zuerst eine Wissensdatenbank erstellen, in der Sie die Dokumente speichern. Rufen Sie zum Erstellen einer Wissensdatenbank die Methode create des Typs KnowledgeBase auf.

REST UND BEFEHLSZEILE

Ersetzen Sie diese Werte, bevor Sie die Anfragedaten unten verwenden:

  • project-id: Die ID Ihres GCP-Projekts
  • knowledge-base-display-name: Name der gewünschten Wissensdatenbank

HTTP-Methode und URL:

POST https://dialogflow.googleapis.com/v2/projects/project-id/knowledgeBases

JSON-Text anfordern:

{
  "displayName": "knowledge-base-display-name"
}

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten in etwa folgende JSON-Antwort erhalten:

{
  "name": "projects/project-id/knowledgeBases/NDA4MTM4NzE2MjMwNDUxMjAwMA",
  "displayName": "knowledge-base-display-name"
}

Das Pfadsegment nach knowledgeBases enthält Ihre neue Wissensdatenbank-ID.

Python

def create_knowledge_base(project_id, display_name):
    """Creates a Knowledge base.

    Args:
        project_id: The GCP project linked with the agent.
        display_name: The display name of the Knowledge base."""
    from google.cloud import dialogflow_v2beta1 as dialogflow
    client = dialogflow.KnowledgeBasesClient()
    project_path = client.common_project_path(project_id)

    knowledge_base = dialogflow.KnowledgeBase(
        display_name=display_name)

    response = client.create_knowledge_base(
        parent=project_path,
        knowledge_base=knowledge_base
    )

    print('Knowledge Base created:\n')
    print('Display Name: {}\n'.format(response.display_name))
    print('Knowledge ID: {}\n'.format(response.name))

Wissensdokument erstellen

Sie können der Wissensdatenbank jetzt Dokumente hinzufügen. Rufen Sie die Methode create im Typ Document auf, um ein Dokument in der Wissensdatenbank zu erstellen. Legen Sie KnowledgeType auf FAQ fest. In diesem Beispiel wird das Dokument FAQ zu Cloud Storage verwendet, das in einen öffentlich freigegebenen Cloud Storage-Bucket hochgeladen wurde. Wenn Sie Article Suggestion in Ihrem eigenen System einrichten, müssen die Dokumente eines der folgenden Formate haben: Weitere Informationen zu den Best Practices für Dokumente finden Sie in der Dokumentation zu Wissensdokumenten.

Das FAQ-Dokument kann in einem von drei Formaten vorliegen:

  • Eine öffentliche URL.
  • Ein GCS-Pfad zu einer .csv-Datei.
  • Eine .csv-Datei, die Sie in die API-Anfrage einfügen.

Wenn Ihr Dokument das Format .csv hat, muss es zwei Spalten enthalten: FAQ-Fragen müssen in der ersten Spalte aufgeführt werden und die Antworten auf jede Frage müssen in der zweiten Spalte aufgeführt werden. Jede Frage und ihre zugehörige Antwort werden als FAQ-Paar bezeichnet. Die Datei .csv darf keine Kopfzeile enthalten. Wenn Ihr Dokument eine öffentliche URL ist, muss es sich um eine FAQ-Seite handeln, in der mehrere FAQ-Paare aufgeführt sind.

In der Dokumentation zu Wissensdokumenten finden Sie Best Practices.

REST UND BEFEHLSZEILE

Ersetzen Sie diese Werte, bevor Sie die Anfragedaten unten verwenden:

  • project-id: Die ID Ihres GCP-Projekts
  • knowledge-base-id: ID Ihrer Wissensdatenbank (bei der vorherigen Anfrage zurückgegeben)
  • document-display-name: gewünschter Name des Wissensdokuments

HTTP-Methode und URL:

POST https://dialogflow.googleapis.com/v2/projects/project-id/knowledgeBases/knowledge-base-id/documents

JSON-Text anfordern:

{
  "displayName": "document-display-name",
  "mimeType": "text/html",
  "knowledgeTypes": "FAQ",
  "contentUri": "https://cloud.google.com/storage/docs/faq"
}

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten in etwa folgende JSON-Antwort erhalten:

{
  "name": "projects/project-id/operations/ks-add_document-MzA5NTY2MTc5Mzg2Mzc5NDY4OA"
}

Die Antwort ist ein Vorgang mit langer Ausführungszeit, bei dem Sie prüfen können, ob er abgeschlossen wurde.

Python

def create_document(project_id, knowledge_base_id, display_name, mime_type,
                    knowledge_type, content_uri):
    """Creates a Document.

    Args:
        project_id: The GCP project linked with the agent.
        knowledge_base_id: Id of the Knowledge base.
        display_name: The display name of the Document.
        mime_type: The mime_type of the Document. e.g. text/csv, text/html,
            text/plain, text/pdf etc.
        knowledge_type: The Knowledge type of the Document. e.g. FAQ,
            EXTRACTIVE_QA.
        content_uri: Uri of the document, e.g. gs://path/mydoc.csv,
            http://mypage.com/faq.html."""
    from google.cloud import dialogflow_v2beta1 as dialogflow
    client = dialogflow.DocumentsClient()
    knowledge_base_path = dialogflow.KnowledgeBasesClient.knowledge_base_path(
        project_id, knowledge_base_id)

    document = dialogflow.Document(
        display_name=display_name, mime_type=mime_type,
        content_uri=content_uri)

    document.knowledge_types.append(
        getattr(dialogflow.Document.KnowledgeType, knowledge_type)
    )

    response = client.create_document(parent=knowledge_base_path, document=document)
    print('Waiting for results...')
    document = response.result(timeout=120)
    print('Created Document:')
    print(' - Display Name: {}'.format(document.display_name))
    print(' - Knowledge ID: {}'.format(document.name))
    print(' - MIME Type: {}'.format(document.mime_type))
    print(' - Knowledge Types:')
    for knowledge_type in document.knowledge_types:
        print('    - {}'.format(KNOWLEDGE_TYPES[knowledge_type]))
    print(' - Source: {}\n'.format(document.content_uri))

Unterhaltungsprofil erstellen

Ein Unterhaltungsprofil konfiguriert eine Reihe von Parametern zum Steuern der Vorschläge, die einem menschlichen Kundenservicemitarbeiter während einer Unterhaltung erteilt werden. In den folgenden Schritten wird ein ConversationProfile mit einem HumanAgentAssistantConfig-Objekt erstellt. Sie können diese Aktionen auch mit der Agent Assist Console ausführen, wenn Sie die API nicht direkt aufrufen möchten.

REST UND BEFEHLSZEILE

Zum Erstellen eines Unterhaltungsprofils rufen Sie die Methode create für die Ressource ConversationProfile auf.

noSmallTalk: Wenn true, werden nach Small-Talk-Nachrichten wie "Hallo", "wie geht es dir" usw. keine Vorschläge ausgelöst. Bei false werden Vorschläge nach Small-Talk-Nachrichten ausgelöst.

onlyEndUser: Bei true werden Vorschläge nur nach Endnutzernachrichten ausgelöst. Bei false werden Vorschläge nach Nachrichten von sowohl Endnutzern als auch menschlichen Kundenservicemitarbeitern ausgelöst.

Ersetzen Sie diese Werte, bevor Sie die Anfragedaten unten verwenden:

  • PROJECT_ID: Die ID Ihres GCP-Projekts
  • KNOWLEDGE_BASE_ID: Ihre Wissensdatenbank-ID

HTTP-Methode und URL:

POST https://dialogflow.googleapis.com/v2/projects/PROJECT_ID/conversationProfiles

JSON-Text anfordern:

{
  "displayName": "my-conversation-profile-display-name",
  "humanAgentAssistantConfig": {
    "humanAgentSuggestionConfig": {
      "featureConfigs": [
        {
          "suggestionFeature": {
            "type": "FAQ"
          },
          "queryConfig": {
            "knowledgeBaseQuerySource": {
              "knowledgeBases": ["projects/PROJECT_ID/knowledgeBases/KNOWLEDGE_BASE_ID"]
            }
          },
          "enableEventBasedSuggestion": false,
          "enableInlineSuggestion": true,
          "SuggestionTriggerSettings": {
             "noSmallTalk": true,
             "onlyEndUser": true,
           }
        }
      ]
    }
  }
}

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten in etwa folgende JSON-Antwort erhalten:

{
  "name": "projects/PROJECT_ID/conversationProfiles/CONVERSATION_PROFILE_ID",
  "displayName": "my-conversation-profile-display-name",
  "humanAgentAssistantConfig": {
    ...
  }
}

Das Pfadsegment nach conversationProfiles enthält Ihre neue Unterhaltungsprofil-ID.

Python

def create_conversation_profile_article_faq(
        project_id,
        display_name,
        article_suggestion_knowledge_base_id=None,
        faq_knowledge_base_id=None):
    """Creates a conversation profile with given values

    Args: project_id:  The GCP project linked with the conversation profile.
        display_name: The display name for the conversation profile to be
        created.
        article_suggestion_knowledge_base_id: knowledge base id for article
        suggestion.
        faq_knowledge_base_id: knowledge base id for faq."""

    client = dialogflow.ConversationProfilesClient()
    project_path = client.common_project_path(project_id)

    conversation_profile = {
        'display_name': display_name,
        'human_agent_assistant_config': {
            'human_agent_suggestion_config': {
                'feature_configs': []
            }
        },
        'language_code': 'en-US'
    }

    if article_suggestion_knowledge_base_id is not None:
        as_kb_path = dialogflow.KnowledgeBasesClient.knowledge_base_path(
            project_id, article_suggestion_knowledge_base_id)
        feature_config = {
            'suggestion_feature': {
                'type_': 'ARTICLE_SUGGESTION'
            },
            'suggestion_trigger_settings': {
                'no_small_talk': True,
                'only_end_user': True,
            },
            'query_config': {
                'knowledge_base_query_source': {
                    'knowledge_bases': [as_kb_path]
                },
                'max_results': 3
            },
        }
        conversation_profile['human_agent_assistant_config'][
            'human_agent_suggestion_config']['feature_configs'].append(
                feature_config)
    if faq_knowledge_base_id is not None:
        faq_kb_path = dialogflow.KnowledgeBasesClient.knowledge_base_path(
            project_id, faq_knowledge_base_id)
        feature_config = {
            'suggestion_feature': {
                'type_': 'FAQ'
            },
            'suggestion_trigger_settings': {
                'no_small_talk': True,
                'only_end_user': True,
            },
            'query_config': {
                'knowledge_base_query_source': {
                    'knowledge_bases': [faq_kb_path]
                },
                'max_results': 3
            },
        }
        conversation_profile['human_agent_assistant_config'][
            'human_agent_suggestion_config']['feature_configs'].append(
                feature_config)

    response = client.create_conversation_profile(
        parent=project_path, conversation_profile=conversation_profile)

    print('Conversation Profile created:')
    print('Display Name: {}'.format(response.display_name))
    # Put Name is the last to make it easier to retrieve.
    print('Name: {}'.format(response.name))
    return response

Unterhaltungen während der Laufzeit verarbeiten

Unterhaltung erstellen

Wenn ein Dialog zwischen einem Endnutzer und einem menschlichen oder virtuellen Kundenservicemitarbeiter beginnt, erstellen Sie eine Unterhaltung. Um Vorschläge zu erhalten, müssen Sie einen Endnutzer und einen menschlichen Kundenservicemitarbeiter erstellen und der Unterhaltung als Teilnehmer hinzufügen. Dieser Prozess wird in den folgenden Abschnitten beschrieben.

Zuerst müssen Sie eine Unterhaltung erstellen:

REST UND BEFEHLSZEILE

Rufen Sie zum Erstellen einer Unterhaltung die Methode create für die Ressource Conversation auf.

Ersetzen Sie diese Werte, bevor Sie die Anfragedaten unten verwenden:

  • PROJECT_ID: Die ID Ihres GCP-Projekts
  • CONVERSATION_PROFILE_ID: Die ID, die Sie beim Erstellen des Unterhaltungsprofils erhalten haben.

HTTP-Methode und URL:

POST https://dialogflow.googleapis.com/v2/projects/PROJECT_ID/conversations

JSON-Text anfordern:

{
  "conversationProfile": "projects/PROJECT_ID/conversationProfiles/CONVERSATION_PROFILE_ID",
}

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten in etwa folgende JSON-Antwort erhalten:

{
  "name": "projects/PROJECT_ID/conversations/CONVERSATION_ID",
  "lifecycleState": "IN_PROGRESS",
  "conversationProfile": "projects/PROJECT_ID/conversationProfiles/CONVERSATION_PROFILE_ID",
  "startTime": "2018-11-05T21:05:45.622Z"
}

Das Pfadsegment nach conversations enthält Ihre neue Unterhaltungs-ID.

Python

def create_conversation(project_id, conversation_profile_id):
    """Creates a conversation with given values

    Args:
        project_id:  The GCP project linked with the conversation.
        conversation_profile_id: The conversation profile id used to create
        conversation."""

    client = dialogflow.ConversationsClient()
    conversation_profile_client = dialogflow.ConversationProfilesClient()
    project_path = client.common_project_path(project_id)
    conversation_profile_path = (
        conversation_profile_client.conversation_profile_path(
            project_id, conversation_profile_id))
    conversation = {'conversation_profile': conversation_profile_path}
    response = client.create_conversation(parent=project_path,
                                          conversation=conversation)

    print('Life Cycle State: {}'.format(response.lifecycle_state))
    print('Conversation Profile Name: {}'.format(
        response.conversation_profile))
    print('Name: {}'.format(response.name))
    return response

Endnutzer als Teilnehmer erstellen

Sie müssen der Unterhaltung sowohl Endnutzer als auch menschliche Kundenservicemitarbeiter hinzufügen, damit Vorschläge angezeigt werden. Fügen Sie der Unterhaltung zuerst einen Endnutzer als Teilnehmer hinzu:

REST UND BEFEHLSZEILE

Rufen Sie zum Erstellen eines Endnutzers als Teilnehmer die Methode create für die Ressource Participant auf.

Ersetzen Sie diese Werte, bevor Sie die Anfragedaten unten verwenden:

  • PROJECT_ID: Die ID Ihres GCP-Projekts
  • CONVERSATION_ID: Die Unterhaltungs-ID

HTTP-Methode und URL:

POST https://dialogflow.googleapis.com/v2/projects/PROJECT_ID/conversations/CONVERSATION_ID/participants

JSON-Text anfordern:

{
  "role": "END_USER",
}

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten in etwa folgende JSON-Antwort erhalten:

{
  "name": "projects/PROJECT_ID/conversations/CONVERSATION_ID/participants/PARTICIPANT_ID",
  "role": "END_USER"
}

Das Pfadsegment nach participants enthält die neue Teilnehmer-ID für den Endnutzer.

Python

def create_participant(project_id, conversation_id, role):
    """Creates a participant in a given conversation.

    Args:
        project_id: The GCP project linked with the conversation profile.
        conversation_id: Id of the conversation.
        participant: participant to be created."""

    client = dialogflow.ParticipantsClient()
    conversation_path = dialogflow.ConversationsClient.conversation_path(
        project_id, conversation_id)
    if role in ROLES:
        response = client.create_participant(parent=conversation_path,
                                             participant={'role': role})
        print('Participant Created.')
        print('Role: {}'.format(response.role))
        print('Name: {}'.format(response.name))

        return response

Menschlichen Kundenservicemitarbeiter als Teilnehmer erstellen

Fügen Sie der Unterhaltung einen menschlichen Kundenservicemitarbeiter als Teilnehmer hinzu:

REST UND BEFEHLSZEILE

Rufen Sie zum Erstellen eines menschlichen Kundenservicemitarbeiters als Teilnehmer die Methode create für die Ressource Participant auf.

Ersetzen Sie diese Werte, bevor Sie die Anfragedaten unten verwenden:

  • PROJECT_ID: Die ID Ihres GCP-Projekts
  • CONVERSATION_ID: Die Unterhaltungs-ID

HTTP-Methode und URL:

POST https://dialogflow.googleapis.com/v2/projects/PROJECT_ID/conversations/CONVERSATION_ID/participants

JSON-Text anfordern:

{
  "role": "HUMAN_AGENT",
}

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten in etwa folgende JSON-Antwort erhalten:

{
  "name": "projects/PROJECT_ID/conversations/CONVERSATION_ID/participants/PARTICIPANT_ID",
  "role": "HUMAN_AGENT"
}

Das Pfadsegment nach participants enthält die neue Teilnehmer-ID für den menschlichen Kundenservicemitarbeiter.

Python

def create_participant(project_id, conversation_id, role):
    """Creates a participant in a given conversation.

    Args:
        project_id: The GCP project linked with the conversation profile.
        conversation_id: Id of the conversation.
        participant: participant to be created."""

    client = dialogflow.ParticipantsClient()
    conversation_path = dialogflow.ConversationsClient.conversation_path(
        project_id, conversation_id)
    if role in ROLES:
        response = client.create_participant(parent=conversation_path,
                                             participant={'role': role})
        print('Participant Created.')
        print('Role: {}'.format(response.role))
        print('Name: {}'.format(response.name))

        return response

Nachricht vom menschlichen Kundenservicemitarbeiter hinzufügen und analysieren

Wenn ein Teilnehmer eine Nachricht in die Unterhaltung eingibt, müssen Sie diese Nachricht zur Verarbeitung an die API senden. Agent Assist erteilt Vorschläge basierend auf der Analyse von Nachrichten von menschlichen Kundenservicemitarbeitern und Endnutzern. Im folgenden Beispiel beginnt der menschliche Kundenservicemitarbeiter die Unterhaltung mit der Frage: "Wie kann ich Ihnen helfen?". In der Antwort werden noch keine Vorschläge zurückgegeben.

REST UND BEFEHLSZEILE

Wenn Sie die Nachricht eines menschlichen Kundenservicemitarbeiters für die Unterhaltung hinzufügen und analysieren möchten, rufen Sie die Methode analyzeContent für die Ressource Participant auf.

Ersetzen Sie diese Werte, bevor Sie die Anfragedaten unten verwenden:

  • PROJECT_ID: Die ID Ihres GCP-Projekts
  • CONVERSATION_ID: Die Unterhaltungs-ID
  • PARTICIPANT_ID: Die Teilnehmer-ID für den menschlichen Kundenservicemitarbeiter

HTTP-Methode und URL:

POST https://dialogflow.googleapis.com/v2/projects/PROJECT_ID/conversations/CONVERSATION_ID/participants/PARTICIPANT_ID:analyzeContent

JSON-Text anfordern:

{
  "textInput": {
    "text": "How may I help you?",
    "languageCode": "en-US"
  }
}

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten in etwa folgende JSON-Antwort erhalten:

      {
        "message": {
          "name": "projects/PROJECT_ID/conversations/CONVERSATION_ID/messages/MESSAGE_ID",
          "content": "How may I help you?",
          "languageCode": "en-US",
          "participant": "PARTICIPANT_ID",
          "participantRole": "HUMAN_AGENT",
          "createTime": "2020-02-13T00:01:30.683Z"
        },
        "humanAgentSuggestionResults": [
          {
            "suggestArticlesResponse": {
              "latestMessage": "projects/PROJECT_ID/conversations/CONVERSATION_ID/messages/MESSAGE_ID",
              "contextSize": 1
            }
          }
        ]
      }
    }
  ]
}

Python

def analyze_content_text(project_id, conversation_id, participant_id, text):
    """Analyze text message content from a participant.

    Args:
        project_id: The GCP project linked with the conversation profile.
        conversation_id: Id of the conversation.
        participant_id: Id of the participant.
        text: the text message that participant typed."""

    client = dialogflow.ParticipantsClient()
    participant_path = client.participant_path(project_id, conversation_id,
                                               participant_id)
    text_input = {'text': text, 'language_code': 'en-US'}
    response = client.analyze_content(participant=participant_path,
                                      text_input=text_input)
    print('AnalyzeContent Response:')
    print('Reply Text: {}'.format(response.reply_text))

    for suggestion_result in response.human_agent_suggestion_results:
        if suggestion_result.error is not None:
            print('Error: {}'.format(suggestion_result.error.message))
        if suggestion_result.suggest_articles_response:
            for answer in suggestion_result.suggest_articles_response.article_answers:
                print('Article Suggestion Answer: {}'.format(answer.title))
                print('Answer Record: {}'.format(answer.answer_record))
        if suggestion_result.suggest_faq_answers_response:
            for answer in suggestion_result.suggest_faq_answers_response.faq_answers:
                print('Faq Answer: {}'.format(answer.answer))
                print('Answer Record: {}'.format(answer.answer_record))
        if suggestion_result.suggest_smart_replies_response:
            for answer in suggestion_result.suggest_smart_replies_response.smart_reply_answers:
                print('Smart Reply: {}'.format(answer.reply))
                print('Answer Record: {}'.format(answer.answer_record))

    for suggestion_result in response.end_user_suggestion_results:
        if suggestion_result.error:
            print('Error: {}'.format(suggestion_result.error.message))
        if suggestion_result.suggest_articles_response:
            for answer in suggestion_result.suggest_articles_response.article_answers:
                print('Article Suggestion Answer: {}'.format(answer.title))
                print('Answer Record: {}'.format(answer.answer_record))
        if suggestion_result.suggest_faq_answers_response:
            for answer in suggestion_result.suggest_faq_answers_response.faq_answers:
                print('Faq Answer: {}'.format(answer.answer))
                print('Answer Record: {}'.format(answer.answer_record))
        if suggestion_result.suggest_smart_replies_response:
            for answer in suggestion_result.suggest_smart_replies_response.smart_reply_answers:
                print('Smart Reply: {}'.format(answer.reply))
                print('Answer Record: {}'.format(answer.answer_record))

    return response

Nachricht des Endnutzers hinzufügen und Vorschläge erhalten

Der Endnutzer fragt als Antwort auf den Kundenservicemitarbeiter "Wie melde ich mich an?". Die Antwort enthält eine Liste mit Antwortvorschlägen auf die Frage des Endnutzers sowie einen Konfidenzwert für jede Antwort. Alle Antworten stammen aus dem FAQ-Wissensdokument, das wir zuvor in dieser Anleitung hinzugefügt haben. Der Konfidenzwert bezieht sich auf die Zuverlässigkeit des Modells für jeden FAQ-Vorschlag, der auf die Anfrage des Agents ausgegeben wird. Ein höherer Konfidenzwert erhöht die Wahrscheinlichkeit, dass relevante Antworten zurückgegeben werden. Er kann jedoch zu weniger oder keinen Antworten führen, wenn keine der Optionen den hohen Schwellenwert erreicht. Wir empfehlen einen anfänglichen Konfidenzwert von 0,4. Sie können diesen Wert bei Bedarf später anpassen, um die Ergebnisse zu verbessern.

Die Antwort enthält auch die source der Antwort, das Wissensdokument, aus dem die Antwort stammt. Sie sollten die vorgeschlagenen Antworten dem menschlichen Kundenservicemitarbeiter zur Verfügung stellen, der diese Informationen möglicherweise an den Endnutzer weitergibt.

REST UND BEFEHLSZEILE

Rufen Sie die Methode analyzeContent für die Resource Participant auf, um eine Endnutzernachricht für die Unterhaltung hinzuzufügen und zu analysieren.

Ersetzen Sie diese Werte, bevor Sie die Anfragedaten unten verwenden:

  • PROJECT_ID: Die ID Ihres GCP-Projekts
  • CONVERSATION_ID: Die Unterhaltungs-ID
  • PARTICIPANT_ID: Die Teilnehmer-ID für den Endnutzer

HTTP-Methode und URL:

POST https://dialogflow.googleapis.com/v2/projects/PROJECT_ID/conversations/CONVERSATION_ID/participants/PARTICIPANT_ID:analyzeContent

JSON-Text anfordern:

{
  "textInput": {
    "text": "How do I sign up?",
    "languageCode": "en-US"
  }
}

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten in etwa folgende JSON-Antwort erhalten:

{
  "message": {
    "name": "projects/PROJECT_ID/conversations/fiiJBeHnQIa6Zx_DUKNlEg/messages/Rjv8ErKYS_yIqVR9SW4CpA",
    "content": "How may I help you?",
    "languageCode": "en-US",
    "participant": "PaZQyeiTQgCOyliHkZjs0Q",
    "participantRole": "HUMAN_AGENT",
    "createTime": "1970-01-01T00:00:00Z"
  },
  "humanAgentSuggestionResults": [
    {
      "suggestFaqAnswersResponse": {
        "faqAnswers": [
          {
            "answer": "Sign up for Cloud Storage by turning on the Cloud Storage service in the Google Cloud Platform Console.",
            "confidence": 0.07266401,
            "question": "How do I sign up?",
            "source": "projects/PROJECT_ID/knowledgeBases/NjQ2MzI1MDQwNTQ2MjYzODU5Mg/documents/NTMxOTA4MTAxMzQxMjg4ODU3Ng",
            "metadata": {
              "document_display_name": "my-document-display-name"
            },
            "answerRecord": "projects/PROJECT_ID/answerRecords/MTU0MzE0NDQwOTAwNzEyODU3NjA"
          },
          {
            "answer": "Consider storing your data in a multi-regional or dual-regional bucket location if high availability is a top requirement. This ensures that your data is stored in at least two geographically separated regions, providing continued availability even in the rare event of a region-wide outage, including ones caused by natural disasters. All data, regardless of storage class, is stored geo-redundantly in these types of locations, which allows you to use storage lifecycle management without giving up high availability.",
            "confidence": 0.06937904,
            "question": "How can I maximize the availability of my data?",
            "source": "projects/PROJECT_ID/knowledgeBases/NjQ2MzI1MDQwNTQ2MjYzODU5Mg/documents/NTMxOTA4MTAxMzQxMjg4ODU3Ng",
            "metadata": {
              "document_display_name": "my-document-display-name"
            },
            "answerRecord": "projects/PROJECT_ID/answerRecords/MzkwMjIyOTA0NDAwMjgxNjAwMA"
          },
          {
            "answer": "From the Cloud Storage documentation click \"Send feedback\" near the top right of the page. This will open a feedback form. Your comments will be reviewed by the Cloud Storage team.",
            "confidence": 0.069021806,
            "question": "How do I give product feedback?",
            "source": "projects/PROJECT_ID/knowledgeBases/NjQ2MzI1MDQwNTQ2MjYzODU5Mg/documents/NTMxOTA4MTAxMzQxMjg4ODU3Ng",
            "metadata": {
              "document_display_name": "my-document-display-name"
            },
            "answerRecord": "projects/PROJECT_ID/answerRecords/MTMxMjU2MDEwODA4NTc1OTE4MDg"
          },
          {
            "answer": "Read the Pricing page for detailed information on pricing, including how Cloud Storage calculates bandwidth and storage usage.",
            "confidence": 0.06681696,
            "question": "Where can I find pricing information?",
            "source": "projects/PROJECT_ID/knowledgeBases/NjQ2MzI1MDQwNTQ2MjYzODU5Mg/documents/NTMxOTA4MTAxMzQxMjg4ODU3Ng",
            "metadata": {
              "document_display_name": "my-document-display-name"
            },
            "answerRecord": "projects/PROJECT_ID/answerRecords/ODUxMzkxNTA2MjQzMDIwMzkwNA"
          },
          {
            "answer": "Use Object Versioning. The Object Versioning feature keeps an archived version of an object whenever you overwrite or delete the live version. If you accidentally delete an object, you can copy an archived version of it back to the live version. It's recommended that you use Object Versioning in conjunction with Object Lifecycle Management. Doing so ensures that you don't have multiple, unnecessary copies of an object, which are each subject to storage costs. Caution: Object Versioning does not protect your data if you delete the entire bucket. As an alternative, use object holds. When you place an object hold on an object, it cannot be deleted or overwritten.",
            "confidence": 0.06453417,
            "question": "How do I protect myself from accidental data deletion?",
            "source": "projects/PROJECT_ID/knowledgeBases/NjQ2MzI1MDQwNTQ2MjYzODU5Mg/documents/NTMxOTA4MTAxMzQxMjg4ODU3Ng",
            "metadata": {
              "document_display_name": "my-document-display-name"
            },
            "answerRecord": "projects/PROJECT_ID/answerRecords/MTc3MzcyODcwOTkyODQ5Nzk3MTI"
          },
          {
            "answer": "You can share an individual object with a user or group by adding an entry to that object's access control list (ACL) that grants the user or group READ permission. For step-by-step instructions, see Changing ACLs.",
            "confidence": 0.06336816,
            "question": "I want to let someone download an individual object. How do I do that?",
            "source": "projects/PROJECT_ID/knowledgeBases/NjQ2MzI1MDQwNTQ2MjYzODU5Mg/documents/NTMxOTA4MTAxMzQxMjg4ODU3Ng",
            "metadata": {
              "document_display_name": "my-document-display-name"
            },
            "answerRecord": "projects/PROJECT_ID/answerRecords/MTAxOTkyNTI4MjQ4NTY5ODU2MA"
          },
          {
            "answer": "You can simply use the gsutil tool to download the data, even without a Google account. You do not need to activate Cloud Storage or turn on billing for this purpose. You also do not need to create credentials or authenticate to Cloud Storage. The gsutil tool is best installed as part of the Google Cloud SDK package, but may also be downloaded and installed as a stand-alone product.",
            "confidence": 0.061990723,
            "question": "I am just trying to download or access some data that is freely available to the public. How can I do that?",
            "source": "projects/PROJECT_ID/knowledgeBases/NjQ2MzI1MDQwNTQ2MjYzODU5Mg/documents/NTMxOTA4MTAxMzQxMjg4ODU3Ng",
            "metadata": {
              "document_display_name": "my-document-display-name"
            },
            "answerRecord": "projects/PROJECT_ID/answerRecords/MTAyNDMyOTczMTkzNDA0NzQzNjg"
          },
          {
            "answer": "Certain types of content are not allowed on this service; please refer to the Terms of Services and Platform Policies for details. If you believe a piece of content is in violation of our policies, report it here (select See more products, then Google Cloud Storage & Cloud Bigtable).",
            "confidence": 0.060459033,
            "question": "I believe some content hosted on your service is inappropriate, how do I report it?",
            "source": "projects/PROJECT_ID/knowledgeBases/NjQ2MzI1MDQwNTQ2MjYzODU5Mg/documents/NTMxOTA4MTAxMzQxMjg4ODU3Ng",
            "metadata": {
              "document_display_name": "my-document-display-name"
            },
            "answerRecord": "projects/PROJECT_ID/answerRecords/NTYzMTYxMTMwMDkxMzA4NjQ2NA"
          },
          {
            "answer": "For most common Cloud Storage operations, you only need to specify the relevant bucket's name, not the project associated with the bucket. In general, you only need to specify a project identifier when creating a bucket or listing buckets in a project. For more information, see When to specify a project. To find which project contains a specific bucket: If you are searching over a moderate number of projects and buckets, use the Google Cloud Platform Console, select each project, and view the buckets it contains. Otherwise, go to the storage.bucket.get page in the API Explorer and enter the bucket's name in the bucket field. When you click Authorize and Execute, the associated project number appears as part of the response. To get the project name, use the project number in the following terminal command: gcloud projects list | grep [PROJECT_NUMBER]",
            "confidence": 0.05914715,
            "question": "I created a bucket, but don't remember which project I created it in. How can I find it?",
            "source": "projects/PROJECT_ID/knowledgeBases/NjQ2MzI1MDQwNTQ2MjYzODU5Mg/documents/NTMxOTA4MTAxMzQxMjg4ODU3Ng",
            "metadata": {
              "document_display_name": "my-document-display-name"
            },
            "answerRecord": "projects/PROJECT_ID/answerRecords/MTQ4NTQ5ODMzMzc3Njc4NjIyNzI"
          },
          {
            "answer": "Cloud Storage is designed for 99.999999999% (11 9's) annual durability, which is appropriate for even primary storage and business-critical applications. This high durability level is achieved through erasure coding that stores data pieces redundantly across multiple devices located in multiple availability zones. Objects written to Cloud Storage must be redundantly stored in at least two different availability zones before the write is acknowledged as successful. Checksums are stored and regularly revalidated to proactively verify that the data integrity of all data at rest as well as to detect corruption of data in transit. If required, corrections are automatically made using redundant data. Customers can optionally enable object versioning to add protection against accidental deletion.",
            "confidence": 0.05035359,
            "question": "How durable is my data in Cloud Storage?",
            "source": "projects/PROJECT_ID/knowledgeBases/NjQ2MzI1MDQwNTQ2MjYzODU5Mg/documents/NTMxOTA4MTAxMzQxMjg4ODU3Ng",
            "metadata": {
              "document_display_name": "my-document-display-name"
            },
            "answerRecord": "projects/PROJECT_ID/answerRecords/MzMyNTc2ODI5MTY5OTM5MjUxMg"
          }
        ],
        "latestMessage": "projects/PROJECT_ID/conversations/fiiJBeHnQIa6Zx_DUKNlEg/messages/Rjv8ErKYS_yIqVR9SW4CpA",
        "contextSize": 1
      }
    }
  ]
}

Python

def analyze_content_text(project_id, conversation_id, participant_id, text):
    """Analyze text message content from a participant.

    Args:
        project_id: The GCP project linked with the conversation profile.
        conversation_id: Id of the conversation.
        participant_id: Id of the participant.
        text: the text message that participant typed."""

    client = dialogflow.ParticipantsClient()
    participant_path = client.participant_path(project_id, conversation_id,
                                               participant_id)
    text_input = {'text': text, 'language_code': 'en-US'}
    response = client.analyze_content(participant=participant_path,
                                      text_input=text_input)
    print('AnalyzeContent Response:')
    print('Reply Text: {}'.format(response.reply_text))

    for suggestion_result in response.human_agent_suggestion_results:
        if suggestion_result.error is not None:
            print('Error: {}'.format(suggestion_result.error.message))
        if suggestion_result.suggest_articles_response:
            for answer in suggestion_result.suggest_articles_response.article_answers:
                print('Article Suggestion Answer: {}'.format(answer.title))
                print('Answer Record: {}'.format(answer.answer_record))
        if suggestion_result.suggest_faq_answers_response:
            for answer in suggestion_result.suggest_faq_answers_response.faq_answers:
                print('Faq Answer: {}'.format(answer.answer))
                print('Answer Record: {}'.format(answer.answer_record))
        if suggestion_result.suggest_smart_replies_response:
            for answer in suggestion_result.suggest_smart_replies_response.smart_reply_answers:
                print('Smart Reply: {}'.format(answer.reply))
                print('Answer Record: {}'.format(answer.answer_record))

    for suggestion_result in response.end_user_suggestion_results:
        if suggestion_result.error:
            print('Error: {}'.format(suggestion_result.error.message))
        if suggestion_result.suggest_articles_response:
            for answer in suggestion_result.suggest_articles_response.article_answers:
                print('Article Suggestion Answer: {}'.format(answer.title))
                print('Answer Record: {}'.format(answer.answer_record))
        if suggestion_result.suggest_faq_answers_response:
            for answer in suggestion_result.suggest_faq_answers_response.faq_answers:
                print('Faq Answer: {}'.format(answer.answer))
                print('Answer Record: {}'.format(answer.answer_record))
        if suggestion_result.suggest_smart_replies_response:
            for answer in suggestion_result.suggest_smart_replies_response.smart_reply_answers:
                print('Smart Reply: {}'.format(answer.reply))
                print('Answer Record: {}'.format(answer.answer_record))

    return response

Unterhaltung abschließen

Verwenden Sie am Ende der Unterhaltung die API, um die Unterhaltung abzuschließen.

REST UND BEFEHLSZEILE

Rufen Sie zum Abschließen der Unterhaltung die Methode complete für die Ressource conversations auf.

Ersetzen Sie diese Werte, bevor Sie die Anfragedaten unten verwenden:

  • PROJECT_ID: Die ID Ihres GCP-Projekts
  • CONVERSATION_ID: Die ID, die Sie beim Erstellen der Unterhaltung erhalten haben

HTTP-Methode und URL:

POST https://dialogflow.googleapis.com/v2/projects/PROJECT_ID/conversations/CONVERSATION_ID:complete

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten in etwa folgende JSON-Antwort erhalten:

{
  "name": "projects/PROJECT_ID/conversations/CONVERSATION_ID",
  "lifecycleState": "COMPLETED",
  "conversationProfile": "projects/PROJECT_ID/conversationProfiles/CONVERSATION_PROFILE_ID",
  "startTime": "2018-11-05T21:05:45.622Z",
  "endTime": "2018-11-06T03:50:26.930Z"
}

Python

def complete_conversation(project_id, conversation_id):
    """Completes the specified conversation. Finished conversations are purged from the database after 30 days.

    Args:
        project_id: The GCP project linked with the conversation.
        conversation_id: Id of the conversation."""

    client = dialogflow.ConversationsClient()
    conversation_path = client.conversation_path(project_id, conversation_id)
    conversation = client.complete_conversation(name=conversation_path)
    print('Completed Conversation.')
    print('Life Cycle State: {}'.format(conversation.lifecycle_state))
    print('Conversation Profile Name: {}'.format(
        conversation.conversation_profile))
    print('Name: {}'.format(conversation.name))
    return conversation

API-Anfrageoptionen

In den obigen Abschnitten wird gezeigt, wie Sie ein einfaches ConversationProfile erstellen, um Vorschläge zu erhalten. In den folgenden Abschnitten werden einige optionale Funktionen beschrieben, die Sie während einer Unterhaltung implementieren können.

Pub/Sub-Benachrichtigungen für Vorschläge

In den obigen Abschnitten wurde das ConversationProfile nur mit einem menschlichen Kundenservicemitarbeiter erstellt. Während der Unterhaltung mussten Sie die API aufrufen, um Vorschläge zu erhalten, nachdem die einzelnen Nachrichten zur Unterhaltung hinzugefügt wurden. Wenn Sie lieber Benachrichtigungsereignisse zu Vorschlägen erhalten möchten, können Sie das Feld notificationConfig beim Erstellen des Unterhaltungsprofils festlegen. Diese Option verwendet Cloud Pub/Sub, um Benachrichtigungen mit Vorschlägen an Ihre Anwendung zu senden, wenn die Unterhaltung fortgesetzt wird und neue Vorschläge verfügbar sind.