Hallo, dies ist der achte Tag des ABEJA Adventskalenders.
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 /). 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. Im Folgenden werde ich vorstellen, wie ich Kendra gemacht habe, während ich es sofort berührte.
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. 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.
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}})
Dies ist die Geschichte des unteren Rahmens der Systemkonfiguration. Hier erscheint Kendra, der Protagonist des Tages.
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. Das Erstellen einer neuen IAM-Rolle für Kendra dauert ca. 30 Sekunden. Außerdem dauert es ungefähr 30 Minuten, um den Index zu erstellen. Machen wir also eine lange Kaffeepause lol Als nächstes folgt die Auswahl der Datenquelle. Wählen Sie diesmal S3. 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. Der Einstellungsüberprüfungsbildschirm wird angezeigt. Wenn Sie eine etwas längere Kaffeepause einlegen, ist der Bau abgeschlossen. Ich habe die Dokumentation bereits in S3, daher beginne ich mit der Synchronisierung mit Kendra. Wenn dies jedoch unverändert bleibt, ist IAM nicht ausreichend und es tritt ein Fehler auf. Fügen Sie daher Kendras eigene Autorität und die Autorität von S3 hinzu. Die Synchronisierung ist endlich erfolgreich.
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.
in_channel
gepostet.Sie können jetzt mit Kendra + Translate nach natürlichem Text wie diesem suchen. 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. 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.
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.