見出し画像

Googleドライブにアップロードするだけで使えるQAアプリを作成してみた


こんにちは、福田です。

今回は、Googleドライブにアップロードするだけで使えるQAアプリを作成してみました。

はじめに

この記事では、OpenAIとGradioを使用して質問応答システムを開発する方法について説明します。このシステムは、Google Driveからデータを読み込み、それを基に質問に回答します。



全体コード

import os
import openai
from dotenv import load_dotenv
import gradio as gr
from llama_index import download_loader, VectorStoreIndex, QuestionAnswerPrompt

# 環境変数の設定をロード
load_dotenv()
folder_id = os.getenv("FOLDER_ID")
opeanai_api_key = os.getenv("OPENAI_API_KEY")

# Google Driveからのデータ読み込みのための設定
GoogleDriveReader = download_loader("GoogleDriveReader")
loader = GoogleDriveReader()

# QAテンプレートの設定
QA_PROMPT_TMPL = (
    "以下の情報を参照してください。 \n"
    "---------------------\n"
    "{context_str}"
    "\n---------------------\n"
    "この情報を使って、次の質問に回答してください。: {query_str}\n"
)

# データをロード
documents = loader.load_data(folder_id=folder_id)

index = VectorStoreIndex.from_documents(documents)
QA_PROMPT = QuestionAnswerPrompt(QA_PROMPT_TMPL)
query_engine = index.as_query_engine(text_qa_template=QA_PROMPT)

def answer_question(question, button_click):
    global query_engine
    if button_click:
        documents = loader.load_data(folder_id=folder_id)
        index = VectorStoreIndex.from_documents(documents)
        query_engine = index.as_query_engine(text_qa_template=QA_PROMPT)
        return "フォルダのデータがアップデートされました。チェックを外して質問してみてください."

    response = query_engine.query(question)
    return response

interface = gr.Interface(
    fn=answer_question, 
    inputs=[
        "text", 
        gr.inputs.Checkbox(label="✅をしてSubmitすることで、フォルダのデータを更新します。(新しくファイルを追加した際は、1度だけチェックボックスにチェックを入れてください)")
    ],
    outputs="text"
)

interface.launch(share=True)


前準備(google driveへの認証まわり)

ここの部分が一番複雑ですが、以下の説明に従えば問題ありません。

今回無理やりGoogle Colabで作成しようとしましたが、諦めました。

ローカル環境で行います。

https://llamahub.ai/l/google_drive

We need credentials.json and client_secrets.json files to use this reader.You need to get your credentials.json file by following the steps mentioned here
Create duplicate file of credentials.json with name client_secrets.json which will be used by pydrive for downloading files.

Finally, make sure you enable "Google Drive API" in the console of your Google App.

システムの概要

このシステムはPythonで開発されており、主に以下のライブラリを使用しています:os, openai, dotenv, gradio, llama_index。

システムのアーキテクチャは以下の通りです:

  1. 環境変数の設定

  2. Google Driveからのデータ読み込み

  3. QAテンプレートの設定

  4. データのロードとインデックス作成

  5. 質問応答関数の作成

  6. Gradioインターフェースの設定と起動

コードの詳細

環境変数の設定

まず、必要な環境変数を設定します。これには、Google DriveのフォルダIDとOpenAI APIキーが含まれます。

load_dotenv()
folder_id = os.getenv("FOLDER_ID")
opeanai_api_key = os.getenv("OPENAI_API_KEY")

Google Driveからのデータ読み込み設定

次に、Google Driveからデータを読み込むための設定を行います。

GoogleDriveReader = download_loader("GoogleDriveReader")
loader = GoogleDriveReader()

QAテンプレートの設定

QAテンプレートを設定します。これは、質問応答プロンプトで使用されます。

QA_PROMPT_TMPL = (
    "以下の情報を参照してください。 \n"
    "---------------------\n"
    "{context_str}"
    "\n---------------------\n"
    "この情報を使って、次の質問に回答してください。: {query_str}\n"
)

データのロードとインデックス作成

Google Driveからデータをロードし、それを基にインデックスを作成します。

documents = loader.load_data(folder_id=folder_id)
index = VectorStoreIndex.from_documents(documents)
QA_PROMPT = QuestionAnswerPrompt(QA_PROMPT_TMPL)
query_engine = index.as_query_engine(text_qa_template=QA_PROMPT)

質問応答関数の作成

質問応答関数を作成します。この関数は、ユーザーからの質問に対して回答を生成します。

def answer_question(question, button_click):
    global query_engine
    if button_click:
        documents = loader.load_data(folder_id=folder_id)
        index = VectorStoreIndex.from_documents(documents)
        query_engine = index.as_query_engine(text_qa_template=QA_PROMPT)
        return "フォルダのデータがアップデートされました。チェックを外して質問してみてください."

    response = query_engine.query(question)
    return response

Gradioインターフェースの設定と起動

最後に、Gradioインターフェースを設定し、起動します。

interface = gr.Interface(
    fn=answer_question, 
    inputs=[
        "text", 
        gr.inputs.Checkbox(label="✅をしてSubmitすることで、フォルダのデータを更新します。(新しくファイルを追加した際は、1度だけチェックボックスにチェックを入れてください)")
    ],
    outputs="text"
)

interface.launch(share=True)

システムの使用方法

システムは非常に使いやすくなっています。まず、システムを起動します。次に、質問欄に質問を入力します。必要に応じて、データを更新するためのチェックボックスを使用します。

結論

この記事では、OpenAIとGradioを使用して質問応答システムを開発する方法について説明しました。このシステムは、Google Driveからデータを読み込み、それを基に質問に回答します。今後の改善点としては、データの更新プロセスを自動化することや、より高度な質問応答モデルの採用などが考えられます。








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