[PYTHON] Ich habe versucht, mit Kendra, das bei re: Invent 2019 angekündigt wurde, sofort einen Befehl zum Durchsuchen der Dokumentensuche auszuführen

Hallo, dies ist der achte Tag des ABEJA Adventskalenders.

Einführung

Neulich wurde auf der re: Invent 2019 ein interessanter Service angekündigt. Ja, Enterprise Search Service [Amazon Kendra Release](https://aws.amazon.com/jp/about-aws/whats-new/2019/12/announcing-amazon-kendra-reinventing-enterprise-search-with -maschinelles Lernen /). Screenshot from 2019-12-08 07-56-38.png Im Unternehmen gibt es verschiedene Kommunikationsmittel. Alle von ihnen sind jedoch in der Regel Flussinformationen und nicht organisiert, und es besteht das Problem, dass Informationsunterschiede wahrscheinlich auftreten. Dies ist genau Kendras maßgeschneiderte Aufgabe. Wenn es angekündigt wird, muss dies getan werden! Ich war überrascht. Also habe ich einen Slack-Befehl gemacht, der Dokumente nach natürlichen Sätzen wie diesen durchsuchen kann. Screenshot_2019-12-08 Slack yuta nakagawa ABEJA, Inc .png Im Folgenden werde ich vorstellen, wie ich Kendra gemacht habe, während ich es sofort berührte.

Systemkonfiguration

Kendra ist eine Vorschau-Version vom 8. Dezember 2019. Daher werden die Dienste, die als Datenquellen verwendet werden können, auf Folgendes eingegrenzt.

Deshalb habe ich eine Möglichkeit gefunden, die Suche nach natürlichem Text zu ermöglichen, indem ich einmal interne Dokumente in S3 gesammelt und Kendra verwendet habe. Es ist jedoch nicht immer einfach. Nun, wie ich mir vorgestellt habe, unterstützt Kendra kein Japanisch. Screenshot_2019-12-08 Amazon Kendra FAQs - Amazon Web Services.png Daher werde ich versuchen, es zu lösen, indem ich es mit dem Übersetzungsdienst von AWS Amazon Translate kombiniere. Wenn Sie Übersetzen verwenden, um das Dokument in S3 abzulegen und abzufragen, kann die IF intern in einer beliebigen Sprache mit nur englischer Verarbeitung vorliegen. (Ich möchte wirklich, dass Kendra Japaner so schnell wie möglich unterstützt.) In Bezug auf IF habe ich Slack gewählt, weil es einfach ist, Befehle zu implementieren, weil die normale Kommunikation locker ist.

Nun, es gibt keine Moderation, aber zusammenfassend sieht die Architektur so aus. Architecture.png

Dokumentenvorbereitung

Dies ist die Geschichte des oberen Rahmens der Systemkonfiguration. Grundsätzlich müssen Sie nur das angegebene Dokument herunterladen, übersetzen und in S3 hochladen. Übersetzen begrenzt jedoch die Größe der Sätze, die gleichzeitig übersetzt werden können. Daher versuche ich, Zeile für Zeile zu übersetzen. Aus diesem Grund kann es in etwas seltsames Englisch übersetzt werden, aber da es sich um eine Überprüfung handelt, werde ich fortfahren, ohne mir darüber Sorgen zu machen. Als ich den Befehl slack ausführte, wollte ich eine Verknüpfung zum Originaldokument, daher versuche ich, eine Verknüpfung mit den Metadaten von S3 Object herzustellen.

def translate_and_upload(url, title, content):
    client = boto3.client('translate')
    bucket = boto3.resource('s3').Bucket('ynaka-kendra')
    # Translate content to English.
    translated = ''
    for line in content.splitlines():
        if len(line) > 0:
            response = client.translate_text(
                Text=line,
                SourceLanguageCode='ja',
                TargetLanguageCode='en'
            )
            translated += (response['TranslatedText'] + os.linesep)
        else:
            translated += os.linesep
    # Upload to S3.
    file_obj = io.BytesIO(translated.encode('utf-8'))
    bucket.upload_fileobj(file_obj, title, ExtraArgs={'Metadata': {'url': url}})

Dokumentensuche

Dies ist die Geschichte des unteren Rahmens der Systemkonfiguration. Hier erscheint Kendra, der Protagonist des Tages.

Gebäude Kendra

Zuerst werden wir Kendra bauen, das die Grundlage dieser Suche ist. Grundsätzlich können Sie es erstellen, indem Sie Erste Schritte mit der Konsole folgen.

Generieren Sie zunächst einen Index. Screenshot_2019-12-07 Kendra.png Das Erstellen einer neuen IAM-Rolle für Kendra dauert ca. 30 Sekunden. Screenshot_2019-12-07 Kendra (1).png Außerdem dauert es ungefähr 30 Minuten, um den Index zu erstellen. Machen wir also eine lange Kaffeepause lol Screenshot_2019-12-07 Kendra(1).png Als nächstes folgt die Auswahl der Datenquelle. Wählen Sie diesmal S3. Screenshot_2019-12-07 Kendra(2).png Screenshot_2019-12-07 Kendra(3).png Geben Sie den Pfad von S3 an, der verknüpft werden soll. Sie können auch festlegen, wie oft Sie synchronisieren möchten, aber diesmal habe ich es geschafft, also habe ich "Bei Bedarf ausführen" ausgewählt. Screenshot_2019-12-07 Kendra(4).png Der Einstellungsüberprüfungsbildschirm wird angezeigt. Screenshot_2019-12-07 Kendra(5).png Wenn Sie eine etwas längere Kaffeepause einlegen, ist der Bau abgeschlossen. Screenshot_2019-12-07 Kendra(6).png Screenshot_2019-12-07 Kendra(7).png Ich habe die Dokumentation bereits in S3, daher beginne ich mit der Synchronisierung mit Kendra. Screenshot_2019-12-07 Kendra(8).png Wenn dies jedoch unverändert bleibt, ist IAM nicht ausreichend und es tritt ein Fehler auf. Screenshot_2019-12-07 Kendra(9).png Fügen Sie daher Kendras eigene Autorität und die Autorität von S3 hinzu. Screenshot_2019-12-07 IAM Management Console(4).png Die Synchronisierung ist endlich erfolgreich. Screenshot_2019-12-07 Kendra(11).png

Dokumentensuch-API

Die Zusammenarbeit mit Slack wird mit Slash Commands implementiert. Es handelt sich um eine gängige API-Gateway + Lambda-Konfiguration. Vergessen Sie nicht, der Rolle, in der Lambda ausgeführt wird, Kendra-Berechtigungen hinzuzufügen. Beachten Sie auch, dass Kendra nur mit dem neuesten boto3 verwendet werden kann.

import boto3
import base64
import json
import logging
import os
import urllib


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


def respond(err, res=None):
    return {
        'statusCode': '400' if err else '200',
        'response_type': 'in_channel',
        'body': err.message if err else json.dumps({
            'response_type': 'in_channel',
            'text': res 
        }), 
        'headers': {
            'Content-Type': 'application/json',
        },  
    }   


def handler(event, context):
    # Prepare clients.
    translate = boto3.client('translate')
    kendra = boto3.client('kendra')
    s3 = boto3.resource('s3')
    # Parse request.
    body = event['body']
    params = urllib.parse.parse_qs(base64.b64decode(body).decode('utf-8'))
    token = params['token'][0]
    if token != os.environ['VERIFY_TOKEN']:
        logger.error(f'Request token ({token}) does not match expected.')
        return respond(Exception('Invalid request token.'))
    if 'text' not in params:
        logger.error(f'The text should be included in command.')
        return respond(Exception('Need text.'))
    query = params['text'][0]
    # Translate query to English.
    response = translate.translate_text(
        Text=query,
        SourceLanguageCode='ja',
        TargetLanguageCode='en'
    )
    query = response['TranslatedText']
    # Find the most relevant document.
    response = kendra.query(IndexId=os.environ['INDEX_ID'], QueryText=query)
    # Create response message.
    message = ''
    for i, item in enumerate(response['ResultItems'][:3]):
        title = item['DocumentTitle']['Text']
        excerpt = item['DocumentExcerpt']['Text']
        s3_uri = item['DocumentId'].replace('s3://', '').split('/')
        url = s3.Object(s3_uri[0], '/'.join(s3_uri[1:])).metadata['url']
        message_i = f'{i + 1}. *{title}*{os.linesep}url: {url}{os.linesep}```{excerpt}```{os.linesep}{os.linesep}'
        message += message_i
    # Return result.
    return respond(None, message)

Das SDK von Kendra erfordert "IndexId". Legen Sie es also in der Umgebungsvariablen fest. Die folgenden drei Punkte werden entwickelt.

Ergebnis

Sie können jetzt mit Kendra + Translate nach natürlichem Text wie diesem suchen. Screenshot_2019-12-08 Slack yuta nakagawa ABEJA, Inc .png Als Antwort auf die Frage "Was ist die Skill Map von ABEJA?" Ist die erste Antwort die Skill Map, die organisiert wird, und die zweite Antwort ist der kürzlich veröffentlichte Technology Stack. Es scheint so zu funktionieren, wenn ich einen Artikel über / tech-stack-201911 veröffentliche. Wie erwartet ist ein Teil des Dokuments unscharf, aber bitte spüren Sie die Atmosphäre.

Übrigens können Sie natürlich auch auf Englisch suchen. Screenshot_2019-12-08 Slack yuta nakagawa ABEJA, Inc (2).png In Kendra können verschiedene Positionen im selben Dokument betroffen sein. Daher scheint es notwendig zu sein, zu überlegen, wie Sie damit umgehen sollen, je nachdem, was Sie mit Befehlen erreichen möchten.

Auch die Reaktion innerhalb des Unternehmens ist gut und ich bin sehr glücklich. Screenshot_2019-12-08 Slack proj_tech_branding ABEJA, Inc .png

Zusammenfassung

Ich habe sofort versucht, Amazon Kendra zu verwenden, das neulich bei re: Invent 2019 angekündigt wurde, und einen internen Befehl zum Durchsuchen von Dokumenten erstellt. Obwohl die Wartezeit lang war und die Lösung aufgrund eines mysteriösen Fehlers lange dauerte, fand ich, dass Kendra im Allgemeinen einfach zu verwenden ist und es ein sehr guter Service ist, in natürlichen Sätzen suchen zu können. Dieses Mal habe ich versucht, es aufgrund der Beziehung zwischen Zeit und Kosten nur mit einigen Dokumenten im Unternehmen zu schaffen, aber ich kann alle Arten von Informationen sammeln und aus der Ruhe suchen, lernen, indem ich die Ergebnisse anderer sehe, und den Suchverlauf Es scheint, dass Sie ein Weltbild zeichnen können, in dem die Informationsverteilung visualisiert und Informationen strukturiert werden und Ihre Träume sich verbreiten. Ich frage mich, ob sie Japaner so schnell wie möglich unterstützen werden. Beachten Sie übrigens, dass ein interner Serverfehler zurückgegeben werden kann, wenn Sie ein unerwartetes Dokument wie ein japanisches Dokument in Kendra einfügen. Ich hatte jedoch den Mut, es freizugeben, auch wenn es einen Fehler gab. Screenshot_2019-12-04 Kendra(21).png

Recommended Posts

Ich habe versucht, mit Kendra, das bei re: Invent 2019 angekündigt wurde, sofort einen Befehl zum Durchsuchen der Dokumentensuche auszuführen
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich habe mit PyQt einen einfachen Texteditor erstellt
Ich habe versucht, mit Python einen regulären Ausdruck für "Betrag" zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Datum" zu erstellen
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
Ich habe eine Web-API erstellt
[Python] Ich habe versucht, mit argparse ein einfaches Programm zu erstellen, das in der Befehlszeile funktioniert
Ich habe versucht, einen Übersetzungs-BOT zu erstellen, der mit Discord unter Verwendung von Googletrans funktioniert
Ich habe versucht, eine verdächtige Person mithilfe von Geolonia-Adressdaten schnell zu einem MAP zu machen
Ich habe versucht, einen "verdammt großen Literaturkonverter" zu machen.
Ich habe versucht, ein Konfigurationsdiagramm mit Diagrammen zu zeichnen
[LPIC 101] Ich habe versucht, die Befehlsoptionen zusammenzufassen, die leicht zu Fehlern führen können
Ich habe versucht, Videos mit der Youtube Data API (Anfänger) zu suchen.
Ich habe versucht, [eine bestimmte Aufgabe] mit einem Raspeltorte zu automatisieren
Ich habe versucht, mit OpenCV eine Bewegungserkennungsüberwachungskamera mit einer WEB-Kamera mit Raspberry Pi herzustellen
Ich habe versucht, Slack Emojinator zu verwenden
[5.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, mit Pandas eine Pferderenn-Datenbank zu erstellen
[2nd] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[Python] Ich habe versucht, eine stabile Sortierung zu implementieren
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht, mit Boto3 eine Liste der AMI-Namen zu erhalten
Ich habe versucht, mit Python eine 2-Kanal-Post-Benachrichtigungsanwendung zu erstellen
[4.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[1.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, Jojo mit LSTM ein seltsames Zitat zu machen
Ich habe versucht, mit Go einen exklusiven Kontrollmechanismus zu erstellen
Wie man einen lockeren Bot macht
Ich habe versucht, eine Gesichtsdiagnose-KI für professionelle Golferinnen zu erstellen ②
Ich habe das Schaben mit Selen gelernt, um ein Vorhersagemodell für Pferderennen zu erstellen.
Ich habe versucht, "Sakurai-san" LINE BOT mit API Gateway + Lambda zu erstellen
Ich habe versucht, mit Raspeye 4 (Python Edition) ein signalähnliches Signal zu erzeugen.
Ich habe versucht, eine Clusteranalyse von Kunden anhand von Kaufdaten durchzuführen
Hinweise Ich habe nachgeschlagen, um Befehlszeilentools in Python zu erstellen
Ich habe ein Beispiel für den Zugriff auf Salesforce mit Python und Bottle erstellt
Ich habe versucht, einen URL-Verkürzungsdienst mit AWS CDK serverlos zu machen
Ich möchte eine Webanwendung mit React und Python Flask erstellen
Ich habe versucht, einen Linebot zu erstellen (Implementierung)
Ich habe versucht, Azure Speech to Text zu verwenden.
Ich habe versucht, den Befehl umask zusammenzufassen
Ich habe versucht, einen Linebot zu erstellen (Vorbereitung)
Ich habe versucht, ○ ✕ mit TensorFlow zu spielen
Ich habe versucht, mit einer Schildkröte eine Linie zu ziehen
Ich habe versucht, Text mit TensorFlow zu klassifizieren
Ich habe versucht, die selektive Suche als R-CNN zu verwenden
Ich habe versucht, pipenv zu verwenden, machen Sie sich also eine Notiz
Ich habe versucht, einen periodischen Prozess mit CentOS7, Selenium, Python und Chrome durchzuführen
Ich habe eine einfache Mail-Sendeanwendung mit tkinter von Python erstellt
[Python] Deep Learning: Ich habe versucht, Deep Learning (DBN, SDA) ohne Verwendung einer Bibliothek zu implementieren.
Als ich versuchte, eine VPC mit AWS CDK zu erstellen, konnte ich es aber nicht schaffen