見出し画像

GPT-4 + miibo + AWS Kendraで社内ドキュメントと連動したRAG環境を構築する方法

GPT-4を始めとした生成AIを使ったBotは、今はそこら中で大活躍。
上手に社内の知識を与えることができれば、社内でAIアシスタントとして活躍するのは間違いありません。

・社内ヘルプデスクの24h無人自動化
・社内ドキュメントへの素早いアクセス
・社内の資料作成支援
・営業支援 etc…

凄まじいポテンシャルがあるのを、2023年多くの方が実感したはずです。

社内にAIがいるのが当たり前になる日も近い

課題

なかなか浸透しないワケ


しかし、そう上手くはいかないことを、多くの生成AIチャレンジャーが昨年目の当たりにしました。「AIに上手くナレッジを与える(与え続ける)」ことが大変なんです。

AIにナレッジを連携させて活用するには、いくつかの工夫が必要です。

・AIフレンドリーな形でデータを蓄えておく
・データを手軽に運用できる仕組みを整える

重要なのがこの2点。AIが扱いやすいようなデータとして置いておく必要があるのですが、そこに手間を懸けすぎると、人間が手軽に運用できなくなってしまって長続きしない。そんな問題があるんです。

自然な業務フローで生まれた情報にAIがアクセス

今まで通り業務を行いつつ、AIがそこで生まれた情報にアクセスし、上手く利活用できる環境構築が重要です。要するに、人間が無理にAIに気を使わなくて良いような環境を作るということです。

それを叶えるのが本記事の目的です。

RAG(Retrieval-Augmented Generation)

RAGは、AIが情報を取得し、それを用いてより正確な回答やコンテンツを生成するための技術です。RAGのプロセスでは、AIはまず特定の問いに対する情報をデータベースやインターネットから取得(Retrieval)します。次に、この取得した情報を基に、より具体的で精度の高い回答やコンテンツを生成(Generation)します。まさに今回のユースケースに必要な技術です。

今回作りたいのは、
社内ナレッジから情報を取得 (Retrieval)し、取得した情報を元に何らかのアシストを行うAIであり、それをなし得る環境です。

RAGの環境に必要な構成要素と、今回利用する技術・サービスは下記の通りです。

  1. LLM : GPT-4-turbo

  2. プロンプト制御: miibo

  3. 外部データベース: AWS Kendra

全体構成

全体構成図

AWS Kendra

Kendra は、様々なデータをインデックス化し、横断的に検索できるエンタープライズ検索サービスです。Kendra上に様々なサービスのデータと接続するコネクタが用意されており、Amazon S3, Box, Zendesk, Microsoft SharePoint, Salesforce, ServiceNow, Google ドライブ, Confluence など連携できます。

ポイントは、
・様々なサービスのデータを一括で検索できる
・勝手にクロールしてベクトル化しておいてくれる
の2点です。

例えば、Google Driveと連携をさせておけば、
定期的にファイルをベクトル化し、AIから検索がし易い状態にしておけます。AI用にわざわざデータを加工して用意する必要がなく運用できます。

miibo

Kendraに接続するAIはmiiboで用意します。
miiboでGPT-4ベースのAIを用意しKendraと接続、プロンプトによる制御を行います。
miiboを利用することで、スムーズにプロンプトの設定やデータベースの接続ができる他、Webチャット画面やSlackなど様々なインターフェースにAIを導入できます。

make (おまけ)

makeなどのIPaaSを利用すると、AIとの会話からファイルの書き込みを行うインテグレーションを組むことができます。本記事では具体的に紹介を行いませんが、実際のインテグレーションを組む際は便利です。

Google Driveと接続したAIとの会話の様子

本記事では、上記のような会話ができるAIを作成する手順を解説していきます。

構築手順

必要な手順はこの3つです。

  1. miiboでAIエージェントを作成

  2. Kendraの構築

  3. Kendra - miiboの接続

1. miiboでAIエージェントを作成

まずは、会話を行うことができるAIを作りましょう。

こちらのページからサインアップして、AIエージェントの作成を行いましょう。miiboによるAIの詳細な作り方については、ぜひ下記のトライアルガイドやmiiboの利用事例をご参照ください。

トライアルガイド

利用事例

miiboで作成されたAIの様子

2. Kendraの構築

次にKendraで必要なデータソースを接続したデータベースを構築します。
下記ドキュメントを参考に、自社のKendra環境を構築してください。

公式のドキュメントはこちらです。

私が試したGoogle Driveとの接続をする場合は、こちらの記事が非常に参考になりました。

3. Kendra - miiboの接続

Kendraとmiiboを接続するには、KendraへAPI経由でのアクセスができる必要があります。
AWS Lambda + API Gatewayを利用して、APIを構築しましょう。

a. LambdaでAPIとなる関数を作成
下記のソースコードを利用します。index_idなど、適宜変更をしてください。

import boto3
import json

def lambda_handler(event, context):
    kendra = boto3.client('kendra')

    # APIリクエストからクエリテキストを取得
    query_text = event['queryStringParameters']['query']
    index_id = '<作成したインデックスのID>'

    response = kendra.retrieve(
        QueryText=query_text,
        IndexId=index_id,
        AttributeFilter={
            "EqualsTo": {
                "Key": "_language_code",
                "Value": {"StringValue": "ja"},
            },
        },
    )

    results = response['ResultItems'][:20] if response['ResultItems'] else []

    extracted_results = []
    for item in results:
        
        print(item)
        content = item.get('Content')
        document_uri = item.get('DocumentURI')
        title = item.get('DocumentTitle')

        extracted_results.append({
            'DocumentTitle': title,
            'Content': content,
            'DocumentURI': document_uri,
        })

    # API Gatewayが期待する形式のレスポンスに変更
    return {
        "statusCode": 200,
        "headers": {
            "Content-Type": "application/json"
        },
        "body": json.dumps(extracted_results, ensure_ascii=False)
    }

上記の関数では、「query」パラメータに渡した検索ワードをKendraに対して検索します。Kendraにリクエストを送信できるようにするため、LambdaのIAMロールには、AmazonKendraFullAccessポリシーをアタッチします。

b. API Gatewayの作成

Lambda呼び出しのトリガーにAPI Gatewayを追加してください。
API Gatewayでは、APIキーによる認証を設定し、特定のリクエスト元のみアクセスができるように設定をしてください。

APIキーの設定

設定方法の詳細は下記の記事が参考になります。

※ 一旦、APIキーでの認証について紹介をしました。
さらにアクセス元を限定したい場合は、個別にお問い合わせください。

c. API GatewayのエンドポイントをmiiboのWebhookに設定

a~bで作成したAPIにmiiboのAIを繋いでいきます。
miiboの「外部サービス連携」=> 「Webhook」を開きます。

下記を入力してWebhookを作成します。
・Webhookの名前
・メソッド (GET)
・URL (APIのエンドポイント)
・認証用ヘッダー情報 (APIキーの情報)
・トリガーの種類 / 条件 (お好みで)
・プロンプトに挿入を✅

URLの末尾には、下記のようなクエリーパラメータを付与しましょう。

https://~miibo-kendra-test-api?query=@{query}

@{query}に、会話の中で生成されるクエリーが自動挿入されます。
上記Webhookが発火すると、KendraのAPIで検索を行い、検索を行った結果がプロンプトに挿入されます。

ここまで設定をしたら、会話のテストを行って実際に連携ができているかを確認しましょう。

Google Driveと接続したAIとの会話の様子

「レポート」-> 「会話のログ」に記載されている会話の履歴では、Kendra APIと接続ができたかのログも確認できます。

会話のログ


まとめ

設定難易度の高い複雑な構成ですが、一度この仕組みができると、通常の業務で生まれたドキュメントをAIに簡単に読み込ませることができます。
劇的に業務効率を上げることができるAIを構築できるので、ぜひお試しください!

尚、AIに食べさせる情報のスコープは慎重にご検討ください。AIと会話ができるメンバーは誰でも食べさせた情報にアクセスができます。
Kendraでは読み込ませる情報のフィルタリング設定も可能なので、どこまでをAIに読み込ませるか、慎重にご判断ください。


この記事が気に入ったらサポートをしてみませんか?