Google Cloud Enterprise SearchとRetrieveReadCompose方式RAGを利用して社内公式情報を全部質問できるようにしてみた

2023.09.01

はじめに

新規事業部 山本です。

ChatGPT(OpenAI API)をはじめとしたAIの言語モデル(Large Language Model:以下、LLM)を使用して、チャットボットを構築するケースが増えています。通常、LLMが学習したときのデータに含まれている内容以外に関する質問には回答ができません。そのため、例えば社内システムに関するチャットボットを作成しようとしても、素のLLMでは質問に対してわからないという回答や異なる知識に基づいた回答が(当然ながら)得られてしまいます。

この問題を解決する方法として、Retrieval Augmented Generation(以下、RAG)という手法がよく使用されます。RAGでは、ユーザからの質問に回答するために必要そうな内容が書かれた文章を検索し、その文章をLLMへの入力(プロンプト)に付け加えて渡すことで、ユーザが欲しい情報に関して回答させることができます。

以前の記事では、RAGを試しに作ってみた内容や、文章を検索するためのベクトル検索の問題点や改良方法について記載しました。また、一つの解決策として、エンタープライズ検索を試してみました。

OpenAIのAPIを使って営業資料をベクトル検索するボットをつくってみた | DevelopersIO

ベクトル検索で欲しい情報が得られないときの問題点と改良方法を考えてみた | DevelopersIO

【Google Cloud】Enterprise Searchで社内ドキュメントを検索してみた | DevelopersIO

今回は、エンタープライズ検索を使用してRAGを構成する + RAGの方式を改良することで、生成される回答を改善できた内容について記載します。具体的には、社内のNotionの情報を検索して回答するために、GCPのGen App Builder(Enterprise Search)を文章検索として使用し、検索結果のドキュメント一つずつから質問に関連する情報を抽出し、最終的に回答を生成する、というフローを作成しました。

本記事で紹介しているGoogle Cloud(GCP)のGen App Builder(Enterprise Search)は、Google Cloud’s AI Trusted Tester Programとして使用・評価した内容です サービスがGAされました!

※ (2023/10/16追記) discoveryengineでsearchする際のパラメータ(max_extractive_segment_count)として、前回の記事では1を指定していました。ただ、1を指定すると1つのドキュメントの一箇所からしか情報を取り出せず、必要な情報を見落とす可能性があります。1よりも大きい値を指定し、取得できたすべてのセグメントを連結させ、read処理を実行すると、情報を見落とす可能性が少なくなるため、こちらの方がオススメです。

結果

先に結果を示します。今回の方法によって得られた回答は以下のようでした(こうした回答で正解を定義するのは難しいですが、得られた回答がほぼ想定どおりものでした)。各項目において、以下の順で表示しています。

  • 1つ目:ユーザからの質問
  • 2つ目:生成された回答
  • 3つ目:参考とした情報のパス(補足情報として表示。この記事ではパスのみ表示していますが、実際にはNotionページへのリンクを設定しクリックで跳べるようにしています)

FAQページに存在する質問

質問と全く同じテキストが書かれたページが存在するケースです。該当するページやその他のページの情報を使用した回答が得られました。

回答例1

Slackでアンケートを取る方法があると聞いてます。方法を教えてください。
―――――――――――――――――――――――――――――――――――――――――
Slackでアンケートを取る方法は、アプリ「Polly」を使用することで可能です。まず、アンケートを取りたいチャネルにPollyを招待する必要があります。Pollyが既に参加しているかどうかはメンバーリストから確認できます。参加させる場合は「/invite @Polly」と入力し招待します。その後、Pollyに質問文と選択肢を伝えるだけでアンケートを作成することができます[0][2]。
―――――――――――――――――――――――――――――――――――――――――
references:
- [0]: 社内公式情報/【FAQ】社内システムよくある問い合せ/Slack/Slackでアンケートを取る方法があると聞いてます。方法を教えてください。.pdf
- [2]: 社内公式情報/社内システム、貸与機器の使い方/Slack 活用・テクニカル編/便利ツール(Slackアプリ).pdf

回答例2

Creative Cloudの使用を開始したい
―――――――――――――――――――――――――――――――――――――――――
Creative Cloudの使用を開始するには、まず登録済のアカウント(メールアドレス)へのアクセス権をSaas管理コンソールから付与します。その後、ソフトウェアをインストールし、メールアドレスを登録してワークフロー申請を行ってください。ワークフロー申請は以下のURLから行うことができます:https://***.****/*******/****** [0]。
―――――――――――――――――――――――――――――――――――――――――
references:
- [0]: 社内公式情報/【FAQ】社内システムよくある問い合せ/Adobe/Creative Cloudの使用を開始したい.pdf

※ 「https://***.****/*******/******」:実際は正しく利用できるURLが出力されましたが、内部情報であるためマスクしました

回答例3

Notionで社外の人がページ編集・閲覧をすることはできるのでしょうか?
―――――――――――――――――――――――――――――――――――――――――
Notionでは、社外の人がページの編集・閲覧をすることは可能ですが、その範囲は限られます。具体的には、@classmethod.jpドメインのアカウントがない場合、従業員と同じグループ権限を付与することはできません。また、ゲスト参加の場合は一部範囲に限られます。ただし、社外の方で@classmethod.jpドメインを持っている場合は、従業員と同様のアクセス権となります[0]。
―――――――――――――――――――――――――――――――――――――――――
references:
- [0]: 社内公式情報/【FAQ】社内システムよくある問い合せ/Notion/社外の人がページ編集・閲覧をすることはできるのでしょうか?.pdf

回答例4

Notionでクラスメソッド以外の人が、ページの内容を変更したり見たりをすることはできるのでしょうか?
―――――――――――――――――――――――――――――――――――――――――
クラスメソッド以外の人がNotionでページの内容を変更したり見たりすることは、一部制限があります。具体的には、@classmethod.jpドメインのアカウントがない場合、従業員と同じグループ権限を付与することはできません。ゲスト参加の場合は一部範囲に限られます。また、社外のビジネスパートナー(BP)さんの場合、@classmethod.jpドメインを持っている方は従業員と同様のアクセス権となります[0]。
 
また、Notionの各ページ及びワークスペースの管理権限は情報システム担当者のみが一元的に管理しています。権限の変更やトップページ・部門横断ページの作成などについては情報システムに依頼を行っていただく必要があります[1]。
 
なお、外部ドメイン(クラスメソッド社外)をゲストとして招待することは禁止されています[3]。
―――――――――――――――――――――――――――――――――――――――――
references:
- [0]: 社内公式情報/【FAQ】社内システムよくある問い合せ/Notion/社外の人がページ編集・閲覧をすることはできるのでしょうか?.pdf
- [1]: 社内公式情報/情報活用管理部門用/[内部]危機管理室、情シス作成中文書/WIP_Notionに関する依頼、申請.pdf
- [3]: 社内公式情報/社内ガイドライン/Notion利用ガイドライン/Notionのユーザーとアクセス権の管理について.pdf

回答例3の少し言い換えた質問に対しても、ほぼ同様の回答が得られました。

「社内公式情報」に書かれている情報に関する質問

かなり曖昧な聞き方の質問でも、関連するページの情報をもとにした妥当な回答が得られました。

回答例5

有給の残日数を教えてください
―――――――――――――――――――――――――――――――――――――――――
有給休暇の残数は、タイムカードの「日数集計」→「有休」で確認できます[0]。
―――――――――――――――――――――――――――――――――――――――――
references:
- [0]: 社内公式情報/人事・労務/勤怠関連/【KoT】有給休暇.pdf

「社内公式情報」に存在しない情報に関する質問

該当する情報がない質問に対しては、情報がなく回答できないという旨の回答が得られました。

回答例6

ChatGPTのFunctionCallingの実装方法を教えてください
―――――――――――――――――――――――――――――――――――――――――
申し訳ありませんが、提供されたドキュメントの中にはChatGPTのFunctionCallingの実装方法に関する情報は含まれていません。詳細な情報が必要な場合は、関連する技術文書や開発者向けのガイドを参照することをお勧めします。
―――――――――――――――――――――――――――――――――――――――――
references:

回答例7

Microsoftが新しく出したLoopは利用可能ですか?
―――――――――――――――――――――――――――――――――――――――――
現在のところ、提供されているドキュメントの中にはMicrosoft Loopに関する情報は含まれていません。したがって、その利用可能性については確認できません。詳細な情報を得るためには、情報システム部門に問い合わせることをお勧めします。
―――――――――――――――――――――――――――――――――――――――――
references:

情報の場所を聞く質問

書かれている内容そのものではなく、情報の”場所”を聞く質問に対して、ページ名・パスなど場所を答える回答が得られました。

回答例8

就業規則ってどこで読めますか?
―――――――――――――――――――――――――――――――――――――――――
就業規則は、社内公式情報の「就業規則・規程・協定・従業員代表・年間カレンダー」に掲載されています[4]。また、副業・兼業に関する規定は「会社に申請・届出が必要なもの/副業・兼業について」に詳細が記載されています[0][5]。具体的な内容については、労務チームに問い合わせることも可能です[3]。
―――――――――――――――――――――――――――――――――――――――――
references:
- [0]: 社内公式情報/人事・労務/会社に申請・届出が必要なもの/副業・兼業について.pdf
- [3]: 社内公式情報/組織情報/バックオフィスに関する問い合わせ先一覧/勤怠に関すること/就業規則に関すること.pdf
- [4]: 社内公式情報/規則・規程・社内ルール/就業規則・規程・協定・従業員代表・年間カレンダー.pdf
- [5]: 社内公式情報/人事・労務/会社に申請・届出が必要なもの/副業・兼業について/1 就業規則について.pdf

システムの概要・処理の流れ

今回作成したシステムの構成は、おおよそ以下のようなものです。(下の3つの名前は、情報検索やRAGで使われている言葉を参考に名付けたものです。一般的なものではないと思います)

Retrieve

ユーザからの質問に回答するのに必要な情報が含まれているドキュメントを取り出すステップです。(正確には、ドキュメント全体ではなく、ファイル内の一部分のテキスト+ファイルへのパスが取り出されます。わかりやすくするために、以下では「ドキュメント」として記載します)

(クエリとなるテキストを入力として、ドキュメントのリストを出力する機能自体は、通常のRAGの「Retrieve」と同じです)

Read

取り出したドキュメントから質問に関連する情報を取り出すステップです。通常のRAGではこのステップがありません。今回の方式では、Retrieveで取り出した個々のドキュメントに対して、それぞれ情報を抽出する処理を実行するようにしました。(なので、取り出されたドキュメントの個数分だけ、この処理が繰り返し実行されます)

Compose

取り出した情報をもとに、質問に対する回答を生成するステップです。通常のRAGでは、取り出したドキュメントを、そのまますべて含めて回答を生成するためのプロンプトに入れ込んで生成します。今回の方式では、Readで取り出した情報のみをプロンプトに入れ込む点が異なります。

狙い

個々にドキュメントをReadしてからComposeすることで、情報抽出の機能と回答生成の機能を分けることができるため、以下の点がメリットになることを期待してこの方式にしました。

  • 必要な情報が取り出されやすい
  • 回答の生成(Compose)で不要な情報が入る可能性が減り、生成の精度が上がる
  • 情報抽出を先に行うことで、不要な箇所を削除でき、回答生成に含めるべきテキスト量を抑えることができる
    • 情報抽出は低性能だが安価なLLMで行い、回答生成は高価だが高性能なLLMを使用することで、高価なLLMの使用量を抑える、といったことができる
    • 回答生成のプロンプトで、LLMに入力できる最大トークンを超える可能性を減らせる
  • デバッグ・分析しやすい

デメリットとしては、以下の点があります。

  • Readの分、LLMを実行するコストがかかる
  • Readの分、処理時間(Latency・応答時間)が長くなってしまう

詳細・実装

処理途中の例はこのページ末尾のAppendixに記載しましたので、動作内容を見たい方はそちらをご覧ください。

Retrieve部分

今回はGoogle Cloud(GCP)のGen App Builder(Enterprise Search)を使用しました。(詳しい使い方や手順は、前回の記事をご覧ください)

今回の実装では検索結果の上位10件を使用しました。

Read部分

今回の実装では、プロンプト・プログラムは以下のものを使用しました。LLM(model)としてOpenAIのgpt-3.5-turboを使用し、temperatureは0を指定しました。

USER_PROMPT_FORMAT_EXTRACT_INFO = """
ユーザからの質問と、その回答として利用できるかわかっていないドキュメントがあります。
ドキュメントがユーザの質問に対する回答に使用できそうな情報を取り出してください。
ドキュメントはデータベースに保存されており、そのファイルパスが与えられるので考慮にいれてください。
回答に使用できそうな情報は箇条書きで出力してください。

# 制約
- 使用できそうな情報のみ回答してください
- 出力はJSON形式で、Stringのリストで回答してください
- 使用できそうな情報がない場合は空のリスト"[]"を出力してください。

# 出力の例
["明日の天気は晴れです", "明後日の天気は曇りです"]

# ユーザからの質問
{user_question}

# ドキュメントのファイルパス
{document_filepath}

# ドキュメントの内容
{document_text}
""".strip()
import json
import openai
from pydantic import BaseModel
from typing import List

class RetrievedText(BaseModel):
    path: str  # Notion内のパス(階層)
    text: str  # PDFに含まれるテキスト

def read_text(
    query: str,
    retrieved_text: RetrievedText,
    model: str,
    temperature: float,
) -> List[str]:
    # format
    user_prompt = USER_PROMPT_FORMAT_EXTRACT_INFO.format(
        user_question=query,
        document_filepath=retrieved_text.path,
        document_text=retrieved_text.text,
    )

    # call API
    ai_response = openai.ChatCompletion.create(
        model=model,
        messages=[
            {
                "role": "system",
                "content": "JSONフォーマットで出力してください。形式はList[str]のみで出力してください。",
            },
            {
                "role": "user",
                "content": user_prompt,
            },
        ],
        temperature=temperature,
    )
    ai_response_str = ai_response.choices[0]["message"]["content"].strip()

    try:
        extracted_infos: List[str] = json.loads(ai_response_str)
    except:
        logger.warning(f"cannot parse '{ai_response_str}'")
        return [ai_response_str]

    if not isinstance(extracted_infos, list):
        logger.warning(f"cannot parse '{ai_response_str}'")
        return [ai_response_str]

    if not all([isinstance(extracted_info, str) for extracted_info in extracted_infos]):
        logger.warning(f"cannot parse '{ai_response_str}'")
        return [ai_response_str]
    return extracted_infos

以下が少し工夫した点です。

  • ドキュメントのファイルパスをプロンプトに与える

    ファイルパスを与えることで、質問に関連するページの情報が取り出されやすくなり、関連しないページの情報が取り出されにくくなりました。

  • 意図しない形式で返されても、そのテキストを返す

    ケース形式をStringのListにするようにしたが、JSONとしてパースできないもあるので、おかしい場合はそのまま返すようにしました。

(他の部分は、よくあるプロンプトの書き方で書きました。さらに改良しても良いかもしれません)

Compose部分

今回の実装では、プロンプト・プログラムは以下のものを使用しました。LLM(model)としてOpenAIのgpt-4を使用し、temperatureは0を指定しました。

USER_PROMPT_FORMAT_GENERAGE_ANSWER = """
ユーザからの質問と、その回答で利用できる情報があります。
ドキュメントの情報をもとに、ユーザの質問に対する回答を生成してください。
ドキュメントはデータベースに保存されており、そのファイルパスが与えられるので考慮にいれてください。
矛盾している内容がある場合は、その旨を回答してください。
使用したドキュメントは、その番号を引用の形式で示してください 例:[0],[2]

# 制約
- 質問に関係のありそうな情報にのみ基づいて回答してください。

# ドキュメントのファイルパスと内容
{available_info}

# ユーザからの質問
{user_question}

# 回答
""".strip()
import openai
from pydantic import BaseModel
from typing import List

class RetrievedText(BaseModel):
    path: str  # Notion内のパス(階層)
    text: str  # PDFに含まれるテキスト

class SearchResult(BaseModel):
    retrieved_texts: List[RetrievedText]

def format_extracted_infos(filepath: str, extracted_infos: List[str], i: int):
    document_info_str = "\n".join(
        [
            f"- [{i}] {filepath}",
            "\n".join([f"  - {info}" for info in extracted_infos]),
        ]
    )

    return document_info_str

def generate_answer_with_info(
    query: str,
    search_result: SearchResult,
    extracted_infos_list: List[List[str]],
    model: str,
    temperature: float,
):
    # format
    available_info = "\n".join(
        [
            format_extracted_infos(retrieved_text.path, extracted_infos, i)
            for i, (retrieved_text, extracted_infos) in enumerate(zip(search_result.retrieved_texts, extracted_infos_list))
            if len(extracted_infos) > 0
        ]
    )
    user_prompt = USER_PROMPT_FORMAT_GENERAGE_ANSWER.format(
        available_info=available_info,
        user_question=query,
    )

    # send response
    ai_response = openai.ChatCompletion.create(
        model=model,
        messages=[
            {
                "role": "user",
                "content": user_prompt,
            },
        ],
        temperature=temperature,
    )
    ai_response_str: str = ai_response.choices[0]["message"]["content"]

    # format
    answer = ai_response_str.strip()

    return answer

以下が少し工夫した点です。

  • ドキュメントのファイルパスをプロンプトに与える

    ファイルパスを与えることで、質問に関連するページの情報が回答に使われやすくなり、関連しないページの情報が使われにくくなりました。ファイルパスも考慮してくれているようです。

  • 引用の形式で答えるように指示する

    • 通常のRAGでは回答できない質問(情報の場所を聞く質問)に回答できる
    • (違うサイトのリンクになっているなどの理由で)中身の情報がなくても、情報のありかをユーザに伝える回答ができる
    • パス分のトークンを節約でき、トークン数の最大値制約を超えにくくなる
  • 情報が取り出されなかったドキュメントは含めない
    • プロンプトで2つ連続でドキュメントのパスが並ぶことになってしまい、LLMが誤解した回答を出力する可能性があったので、このように対処しました。

(他の部分は、よくあるプロンプトの書き方で書きました。さらに改良しても良いかもしれません)

後処理部分

最後に、answer(generate_answer_with_info関数が返した回答)に含まれている引用の箇所を検索して、該当するドキュメントのパスを表示しました。

ret = re.findall(r"\[([0-9]+)\]", answer)  # ex) [0]
nums_ref = sorted(list(set(map(int, ret))))  # 数字に変換し、setで重複を排除し、リストでソートする

コスト

各部分のコストは以下の通りです。上記の質問の場合を例にして計算した結果です。

Retrieve部分

Google CloudのEnterprise Searchの料金が非公開情報であるため、本記事では省略します(20230831現在)。

今回はextractive_segmentsを利用するため、Enterprise Editionをオンにして利用したので、以下のように計算されます。

1 query * $4 / 1000 query = 0.004 $ = 0.58円

※ extractive_segmentsについては、前回の記事をご覧ください

Read部分

OpenAIのAPIで利用したトークン数と、料金は以下のとおりです。

  • 各ドキュメントに対する利用トークン数(gpt-3.5-turbo)
    {
        "prompt_tokens": 1036,
        "completion_tokens": 1
    }
    {
        "prompt_tokens": 1249,
        "completion_tokens": 37
    }
    {
        "prompt_tokens": 1310,
        "completion_tokens": 38
    }
    {
        "prompt_tokens": 1583,
        "completion_tokens": 47
    }
    {
        "prompt_tokens": 1382,
        "completion_tokens": 111
    }
    {
        "prompt_tokens": 1156,
        "completion_tokens": 167
    }
    {
        "prompt_tokens": 1004,
        "completion_tokens": 235
    }
    {
        "prompt_tokens": 1133,
        "completion_tokens": 364
    }
    {
        "prompt_tokens": 1042,
        "completion_tokens": 418
    }
    {
        "prompt_tokens": 1118,
        "completion_tokens": 429
    }
  • 合計(トークン数と料金)
    "prompt_tokens": 14700 * $0.0015 / 1K tokens = $0.022
    "completion_tokens": 2073 * $0.002 / 1K tokens = $0.004
    合計:$0.026 = ¥3.77 ($1 = ¥145で計算)

Compose部分

利用トークン数(gpt-4)と料金

"prompt_tokens": 2687 * $0.03 / 1K tokens = $0.081
"completion_tokens": 226 * $0.06 / 1K tokens = $0.013
合計:$0.094 = ¥13.63 ($1 = ¥145で計算)

合計

¥17.98

※ 一回の質問に対して回答を生成するのにかかる料金(クエリに対する従量課金部分)です。

クエリの回数に関係なく発生するEnterprise Searchの固定料金は、月額$8 = ¥1,160です。

(※ 課金対象となるデータ容量が知る方法がなさそうだったため、今回の場合利用したデータの合計量1.6GBで計算しました。正確な料金は異なる場合があります。また、現在は10GBまで無料です。)

補足1

上記の質問は少しトークンが多いケースでした。他の場合だともう少し使用量が少ない(トークン数が少ない)ケースが多く、おおよそ¥10~¥15で、高くて¥20程度でした。

補足2

実際の運用時には、今回のプログラムをAPIとしてデプロイする環境が必要です。が、今回の機能のみならステートやセッション管理も不要であるため、AWSのLambdaのような、サーバレスな構成で実行でき、費用も安く抑えられそうです。

処理時間(Latency)

全体:32.6[s]

  • Retrieve部分:1.22[s]
  • Read部分:12.68[s]
  • Compose部分:18.65[s]

ほとんどの時間(31.5 / 32.6[s])がReadとCompose部分、つまり、OpenAIのChatCompletion APIの呼び出しでかかっていました。

結果・分析

出力例は冒頭部分をご覧ください。

全体

  • ◯:全体的に良い回答が得られた
  • ◯:ドキュメントの内容を参考にした、正確な回答が返ってきた(回答例1・3・4・5・8)
  • ◯:該当するドキュメントがない場合は、「情報がない」旨の回答が返ってきた(回答例6・7)
  • ✕:ユーザには直接関係なく、誤解しうる内容が含まれる回答が生成された(回答例2)
    • 管理者の操作(「まず登録済のアカウント(メールアドレス)へのアクセス権をSaas管理コンソールから付与します」)を、ユーザがやる必要があるように読み取れる
    • そもそもドキュメントの時点で、管理者の操作であるかユーザの操作であるかが区別して書かれてなく、人が読んでもわかりにくい内容でした
  • △:処理時間が30秒程度であり、少し長い(QAを行うユーザ体験としてはギリギリなレベルに思われる)。

Retrieve部分

  • ◯:回答に必要なドキュメントが検索でき、それらが上位に含まれるケースが多かった
  • ✕:まれにユーザの質問の回答に必要なドキュメントが出力されないことがあった
    • 該当するドキュメントは検索結果に含まれているが、別の箇所のテキストがヒットするケースでした
  • ◯:ユーザ体験としては問題ない程度の(短い)時間で検索を実行できた

Read部分

  • ◯:必要な情報を漏らさず抽出できた
  • ✕:不要な情報が多く含まれてしまった
    • Appendixの「Readの実行結果」をご覧ください
  • ✕:意図しない形式(JSON形式ではない、StringのListではない)で返されるケースがあった
    • Appendixの「Readの実行結果」の下から2つ目をご覧ください

Compose部分

  • ◯:Readの出力に不要な情報が多く含まれていても、情報が取捨選択された
  • ◯:ドキュメントに誤字脱字やわかりにくい表現があっても、わかりやすく書き直された

(gpt4の察してくれる度合いがすごい)

考察など

Retrieveで出力するドキュメント件数

今回、Retriveではドキュメントを10件出力するように設定しましたが、できればより少ない数にしたいところです。これは利用料金を抑える他、多人数で使用した際にAPIの使用レートを下げ制限に引っかからないようにすることにも繋がります。また、プロンプトのトークン数が減るため、OpenAI APIでの処理時間が短くなり、ユーザへの応答時間が短縮されることが期待できます。

今回使用した質問の場合、回答例で使用されたreferencesの番号を見てみると、ほとんどが[0]~[3]を使用し、場合によって[4],[5]を使用しています(この番号はRetrive(Google CloudのEnterprise Search)が出力した順番であり、クエリの関連度順に並んでいます)。同様の質問であることを仮定すると、使用するドキュメントの件数は6件に減らしても問題ないことになります。この値は、必要なドキュメントを見落とさないか(適切な回答が得られるか、精度)とのトレードオフになり、ユースケースごとに調整することになりそうです。

Read部分の改良

Appendixの「Readの実行結果」のように、今回のプロンプト + gpt-3.5-turboでReadを実行すると、不要な情報がかなり含まれてしまいました。gpt-4で実行すると、以下のように不要な情報がかなり省かれるようになりました。

また、意図しない形式(JSON形式ではない、StringのListではない)で返されるケースもかなり減りました。

[
    "Slackには色々な拡張機能があり、アンケートを取る方法はいろいろとあると思いますが、このページはPollyを用いた方法を紹介します。",
    "利用するにはアプリ「Polly」をチャネルに招待する必要があります。既にPollyが参加しているかどうかはメンバーリストから確認できます。",
    "参加させる場合は以下を入力し招待します。/invite @Polly",
    "招待に成功すると、以下のように表示されます。",
    "アンケートを作成するには、Pollyに質問文と選択肢を伝えるだけです。"
  ],
  [
    "Slackでアンケートを取る⽅法があると聞いてます。⽅法を教えてください。"
  ],
  [
    "Slackで投票アンケートが作成できるPollyの使い方についての紹介です。インストールのやり方や投票の作成方法、複数選択、定期投票などのオプション、削除、クローズ、結果表示のためのコマンドなどを紹介しています。",
    "Slack には色々な拡張機能があり、アンケートを取る方法はいろいろとあると思いますが Polly を用いた方法を紹介します。",
    "利用するにはアプリ「Polly」を チャネルに招待 する必要があります。既にPollyが参加しているかどうかはメンバーリストから確認できます。"
  ],
  [
    "\"[]\""
  ],
  [],
  [],
  [
    "\"[]\""
  ],
  [],
  [],
  []
]

ただ、生成される回答はほとんど変わりませんでした。gpt-4でReadを実行する場合、Read部分の入力トークンだけで¥63.9かかる計算になり、料金がかなり高くなってしまいます。Compose部分のトークン数が減るので、その部分の料金は安くなるものの、元が¥13程度なので、結局は高くことになります。今回試した範囲では、生成される回答にほぼ影響がなかったので、不要な情報が出力されることがあっても、Read部のモデルはgpt-3.5-turboにして料金を抑えるのが良さそう(今回のままで良さそう)です。業務やユースケースによって、よりよい回答(高い精度)を得たい場合は、gpt-4に設定して試してみると良いでしょう。

別の言い方をすると、Compose部分に高精度なモデル(gpt-4)を用いることで、Read部分は低精度なモデル(gpt-3.5-turbo)でも良い、また、不要な情報を入れてしまうことを気にするよりも、必要な情報を落としてしまわないようにする、という考え方ができそうです。

(プロンプトの方も試行錯誤しましたが、gpt-3.5-turboを使っていると、不要な情報が入ってしまうのは避けられませんでした。もっと工夫すればgpt-3.5-turboでも必要な情報のみをReadできるかもしれません)

プロンプトの改良(文言レベル)

プロンプトは使用するデータによって適した書き方が変わるので、何回か試行錯誤すると良さそうです。ただ、後述のとおり、そもそもデータの質が悪くて良い回答が得られない(精度が出ない)ケースもあるので、あまり文言レベルのプロンプトの改良に時間をかけない(こだわり過ぎない)方が良さそうだなという印象を持ちました。

プロンプトの改良(情報の追加)

より良い回答を生成させたい場合、以下の点を検討するのも良さそうです。

  • ドメイン情報

    特に今回のような社内情報やドメイン固有のドキュメントを利用する場合、一般的でない用語や特有の情報が含まれます。例えば、「クラスメソッド」という言葉が社内公式情報に出てくる場合、LLMがそれを会社名として認識できるかは不明です。なので、こうした情報は予めRead部・Compose部で使用するプロンプトに与えておくと、よりよい回答が得られそうです。追加するプロンプトの例としては以下のようなものが考えられます。

    • 「クラスメソッド株式会社というIT会社において、社内の公式情報をドキュメントから検索しようとしています」
    • 「社内では、Slackというコミュニケーションツールを活用し、何か困ったことがあれば#01-help-meというチャンネルで質問すると、誰かが回答してくれます」

    (もしくはfine-tuningを利用しても良さそうです)

  • ドキュメントの構成(親ページ)

    ドキュメントの構成として、あるページは親ページの情報を前提として書かれているケースがほとんどです。Retrieveで取り出したドキュメントだけでなく、2つ3つ上の階層まで親ページを含めた方が必要な情報を逃しにくくなる可能性があります。

  • ユーザ情報

    質問をしたユーザがどういった人物なのか、いつ検索を行っているのかといった情報も含めると、より具体的なガイダンスが可能になりそうです。

精度向上のための情報整理

「社内公式情報」のようなドキュメントは、業務を担当している人が書くことが多く、自分が理解している内容を書くため、前提や用語の説明が省かれてしまうことがあります。これは、初めて読む人(今回の場合はLLM)にとって必要な情報が欠けてしまう原因となります。

gpt4のようなモデルは、ドキュメントの内容が多少おかしくても、意図を察して回答を生成します。実際、今回の実装でも変な改行や誤字脱字があっても、問題なく回答を生成できました。誤った回答が生成された原因はドキュメントがわかりにくい(人間が読んでも理解できなかったり、誤解が生じる表現になっている)ことがほとんどでした。ドキュメントの質が悪いと、プロンプトやRAGを工夫しても精度が上がらないため、ドキュメントを整理することが精度向上に向けて課題となりそうです。

これを解決するためには、ドキュメントを書く書き手のスキルを向上させることや、書いた文書をレビューする体制を整備することが考えられますが、業務量や教育コストの問題から、これが難しい場合もあります。

そのような場合の一つの解決策として、生成AIを活用する方法があります。ドキュメントの内容をAIに与え、知識がない人から見てどの点がわかりにくいかを抽出し、元の書き手に再度書き直してもらうことが考えられます。さらに、知識がない人でも理解しやすいように、手順を明確にしたり、前提と説明を分けたり、作業者が誰なのかを明確にしたり要約するなど、ドキュメントを書き直す作業をLLMにまかせてみる方法を検討したいところです。

まとめ

RAGをRetrieve・Read・Composeの3段階に分ける方式を試しました。Retrieve部分にはGoogle CloudのEnterprise Searchを、Read部分にはOpenAIのgpt-3.5-turboを使ったChatCompletionAPIを、Compose部分にはgpt-4を使ったChatCompletionを、それぞれ利用しました。これによって、生成される回答の質を上げることができました。

参考にさせていただいたページ・サイト

https://research.google/research-areas/information-retrieval-and-the-web/

https://github.com/Azure-Samples/azure-search-openai-demo

Appendix:処理の途中結果

  • 質問(入力)
    Slackでアンケートを取る方法があると聞いてます。方法を教えてください。
  • 検索結果(Retrieve)
    [
        RetrievedText(
            document_path="社内公式情報/【FAQ】社内システムよくある問い合せ/Slack/Slackでアンケートを取る方法があると聞いてます。方法を教えてください。.pdf",
            text="Slackでアンケートを取る⽅法があると聞いてます。⽅法を教えてください。\n\n1\n\nSlackでアンケートを取る⽅法が\nあると聞いてます。⽅法を教えて\nください。\n\nタグ\n\nSlack アンケート\n\n最終更新⽇時\n\n【回答】\n\n以下 ⼿順書ご参照ください。\n\nはじめに\n\nSlack には⾊々な拡張機能があり、アンケートを取る⽅法はいろいろとあると思い\nますが、このページは Polly を⽤いた⽅法を紹介します。\n\n準備\n\n利⽤するにはアプリ「Polly」を チャネルに招待 する必要があります。既にPollyが\n参加しているかどうかはメンバーリストから確認できます。\n参加させる場合は以下を⼊⼒し招待します。\n/invite @Polly\n\n招待に成功すると、以下のように表⽰されます。\n\n使い⽅\nアンケートを作成\nPollyに質問⽂と選択肢を伝えるだけです。\n\n@2023年2⽉25⽇ 20:36",
        ),
        RetrievedText(
            document_path="社内公式情報/【FAQ】社内システムよくある問い合せ/Slack.pdf",
            text="Slack\n\n1\n\nSlack\n\n名前\n\nタグ\n\n最終更新⽇時\n\nKoTの打刻連携について詳しく知\nりたい。【Chrome拡張】【KoT】\n\nKOT Slack 連携\n\nPublicスペースではなくPrivateチ\nャンネルに変更したいのですがどの\nようにすればよいでしょうか?\n\nPrivate Public\nSlack 変更\n\nSlackConnectで接続できるオー\nガナゼイション数の上限を教えてく\nださい。\n\nConnect Slack\nチャンネル数\n\nSlackから⾝に覚えのないメール\nが届きました\n\nSlack メール\n\nSlackでアンケートを取る⽅法が\nあると聞いてます。⽅法を教えてく\nださい。\n\nSlack アンケート\n\nSlackにログインできません。連\n絡⼿段をどうすればいいですか?\n\nSlack ログイン\n\nSlackのbot(ボット)設定につい\nて知りたい\n\nSlack bot ボット\n設定\n\nSlackのバージョンが古いようで\nす。アップデートは⾃動で更新され\nるのでしょうか?\n\nSlack アップデート\n\nSlackへの外部アプリ連携につい\nて(インテグレーション設定につい\nて)\n\nSlack インストール\n外部アプリ\n\nカスタム絵⽂字の登録はしてよい\nのでしょうか?\n\nSlack 絵⽂字\n\nゲストユーザーの⽅にMFAの設\n定を案内したいです\n\nMFA Slack\n\nスマートフォンアプリで異常が発\n⽣しました\n\nSlack スマホ\n\n@2023年6⽉1⽇ 17:55\n\n@2023年2⽉25⽇ 20:36\n\n@2023年5⽉2⽇ 17:10\n\n@2023年2⽉25⽇ 20:36\n\n@2023年2⽉25⽇ 20:36\n\n@2023年2⽉25⽇ 20:36\n\n@2023年3⽉8⽇ 17:19\n\n@2023年2⽉25⽇ 20:36\n\n@2023年7⽉20⽇ 14:16\n\n@2023年4⽉17⽇ 19:28\n\n@2023年2⽉25⽇ 20:36\n\n@2023年2⽉25⽇ 20:36",
        ),
        RetrievedText(
            document_path="社内公式情報/社内システム、貸与機器の使い方/Slack 活用・テクニカル編/便利ツール(Slackアプリ).pdf",
            text="便利ツール(Slackアプリ)\n\n1\n\n便利ツール(Slackアプリ)\n\nSlack 活⽤・テクニカル編\n⽬次\n\n✋ はじめに\n\nℹこのページではSlackの活⽤をしたい⽅、アプリや便利ツールを記載しています。\n通常の利⽤⽅法は Slack利⽤ガイドライン をご覧ください。\n\n便利なアプリ、ツールについて #05-internal-feedback チャンネルで教えてください!\n\n多くの⼈の同意を得られたものは追記していきます。\n\nSlackの便利ツール\nPolly\n\nSlackで投票アンケートが作成できるPollyの使い⽅\nSlack上で投票アンケートが作成できるPollyの使い⽅についての紹介です。イ\nンストールのやり⽅や投票の作成⽅法、複数選択、定期投票などのオプショ\nン、削除、クローズ、結果表⽰のためのコマンドなどを紹介しています。\nhttp//lab.sonicmoov/slack/\n\nSlack には⾊々な拡張機能があり、アンケートを取る⽅法はいろいろとあると思います\nが Polly を⽤いた⽅法を紹介します。\n準備\n利⽤するにはアプリ「Polly」を チャネルに招待 する必要があります。既にPollyが参加して\nいるかどうかはメンバーリストから確認できます。\n\nSlackの便利ツール\nPolly\nAsana\n\nGoogle Calender とSlackを連携\nGoogle Calendar for Team Events\nmust-read\nToday List\nTrello",
        ),
        RetrievedText(
            document_path="社内公式情報/社内システム、貸与機器の使い方/Slack 活用・テクニカル編.pdf",
            text="Slack 活⽤・テクニカル編\n\n1\n\nSlack 活⽤・テクニカル編\n\n⽬次\n\n✋ はじめに\nℹこのページではSlackの活⽤をしたい⽅、アプリやWebhookなどテクニ\nカルな内容、リンクなどを記載しています。\n通常の利⽤⽅法は Slack利⽤ガイドライン をご覧ください。\n\n便利なアプリ、ツールについて #05-internal-feedback チャンネルで教え\nてください!\n\n多くの⼈の同意を得られたものは追記していきます。\n\nSlack Enterprise Gridについて\n\nクラスメソッドではSlackは1つのワークスペースではなく、Slack Enterprise Gridと\nして複数のワークスペースをまとめて⼀元管理しています。\n詳細は以下の資料をご覧ください。\nワークスペースの構成については Slackの構成とワークスペース間連携 もあわせ\nてご覧ください。\nSlack Enterprise Gridの関係資料\n\nSlack Enterprise Gridについて/アンインストールについて\nアプリはできるだけ公式から⼊⼿しましょう\nインストールする前に!そのアプリ、セキュリティは⼤丈夫?\nSlackアプリの挙動を確認したい場合、Sandboxワークスペースを活⽤してください\nアプリの作成⽅法などお役⽴ちリンク\n外部との連携 Slack コネクトとゲスト/ノウハウ・Tips",
        ),
        RetrievedText(
            document_path="社内公式情報/情報活用管理部門用/全社のお知らせ/Slack ワークスペース分離運用とガイドラインリニューアル.pdf",
            text="Slack ワークスペース分離運⽤とガイドラインリニューアル\n\n4\n/ゲストが参加するマルチワークスペ\nースチャンネルに変更します\nマルチスペースチャンネルへの変更は順次、情シスのほうで調整しながら実施\nします\nそれまでは従来通り、Classmethod Group(Classmethod)ワークスペースで業\n務を⾏ってください\n\n法⼈内限定チャンネルの運⽤\n\n法⼈内限定のチャンネルは⾃由に作成してもらって構いません\n法⼈、BPを参加させるチャンネル、業務・プロジェクトのチャンネルは従来通\nり、Classmethod Group(Classmethod)ワークスペースをご利⽤ください\n法⼈内限定にしたいチャンネルがある場合、#01-help-meチャンネルで情報シス\nテムにご相談ください\nチャンネルを作成しなおす必要はなく、Classmethod Group(Classmethod)ワ\nークスペースから移動可能です\n法⼈限定ワークスペースからチャンネルをClassmethod Group(Classmethod)\nワークスペースへの移動も可能です(こちらは条件次第となります)\n\nSlack運⽤ガイドラインのリニューアル、配\n置変更\n\nワークスペース運⽤の変更に伴い、Slackの社内向け説明ページをリニューアルしま\nした。\n旧Slackページにバックリンクをしていた⽅は修正をお願いします。\n\n利⽤者向け(ルール、概要、情シスへの依頼⽅法など)\nSlack利⽤ガイドライン\n\n活⽤・テクニカル向け\nSlack 活⽤・テクニカル編\n\n旧ページ:利⽤終了",
        ),
        RetrievedText(
            document_path="社内公式情報/社内ガイドライン/Slack利用ガイドライン.pdf",
            text="Slack利⽤ガイドライン\n\n1\n\nSlack利⽤ガイドライン\n/30\n⽬次\n\nはじめに\nℹここにはSlackを社内利⽤するうえで必要な「守るべきルール\n(Must)」と「こうした⽅が良い(Shoud)」、「申請⽅法」をまとめ\nています。\n\n「こうすると便利」「テクニカル情報」「Tips」は Slack 活⽤・テク\nニカル編 をご覧ください。\n\nもしあなたがSlackを使ったことがあり「こうするといいよ!」というア\nドバイスがあれば\n#05-internal-feedback チャンネルで教えてください!\n\n多くの⼈の同意を得られたものはこちらのページや、活⽤・テクニカル編\nに追記していきます。\n\nSlack上のコミュニケーションについて\n\nクラスメソッドグループ内でチャットを利⽤する際に、各⾃⼼がけていただきたい\nことです。\n定期的にアナウンスも⾏っていますので、皆さんご認識と実践をお願いします。\n\nSlack上のコミュニケーションについて/ガイドライン/ノウハウ",
        ),
        RetrievedText(
            document_path="社内公式情報/社内システム、貸与機器の使い方/Slack 活用・テクニカル編/運用してみてのノウハウ、Tips.pdf",
            text="運⽤してみてのノウハウ、Tips\n\n1\n\n運⽤してみてのノウハウ、Tips\n\nSlack 活⽤・テクニカル編\n⽬次\n\n✋ はじめに\n\nℹこのページではSlackの運⽤ノウハウ、Tipsなどをまとめています。使いやすいものを\n参考にしてみてください。\n通常の利⽤⽅法は Slack利⽤ガイドライン をご覧ください。\n\n便利な使い⽅、ノウハウについて #05-internal-feedback チャンネルで教えてください!\n\n多くの⼈の同意を得られたものは追記していきます。\n\nはじめに\n\nこのページではSlackの運⽤ノウハウ、Tipsなどをまとめています。\n使いやすいものを参考にしてみてください。\n\nタスク管理について\n\nはじめに\nタスク管理について\nブックマーク(後で)\nBacklog・・・作業依頼\nNotion・・・チーム全体への周知事項\nSlackアプリを⽤いたもの\n便利な機能、オススメ設定(Tips)\nキーボードショートカット\nエンターで改⾏するには\nチャンネルに複数メンバーをまとめて招待したい\n部⾨横断やマイクロチームのチャンネルはどうするのがいい?\nよく使う絵⽂字\n分報(times)を使ってみよう\n出退勤ステータス\nKoT出勤∕退勤時にSlackにもメッセージを書く\nプロジェクト⽤の設定",
        ),
        RetrievedText(
            document_path="社内公式情報/【FAQ】社内システムよくある問い合せ/Slack/個人所有スマホ・個人端末スマートホンにSlackをインストール・ログインしたい.pdf",
            text="個⼈所有スマホ・個⼈端末スマートホンにSlackをインストール・ログインしたい\n\n1\n\n個⼈所有スマホ・個⼈端末スマート\nホンにSlackをインストール・ログイ\nンしたい\n\nタグ\n\nSlack インストール スマホ\n\n最終更新⽇時\n\n【回答】\n\n以下の⼿順より個⼈所有のスマホへSlackアプリをインストールできます。\n\n*会社情報資産がスマホに共有されますので、紛失しないよう管理願います。\n*認証段階でつまずいた場合、前のアカウントログが影響している場合があります。以\n下を参照し再度お試しください。\nhttp//www.notion/25f7ee97e2f444c3a7310871660eef90?\nv=e33d964eb64245be90db58852b823874&p=4ab7330f7c7748baa35c3c61aa5dc520&pm=s\n\n【⼿順】*以下はAndoroid版となります。iPhoneの⽅は\nAppStoreよりダウンロードしてください。\n\n①GooglePlayStoreよりSlackアプリをダウンロードします。\nアプリを開いて「開始」をクリックします。\n\n@2023年7⽉7⽇ 16:32",
        ),
        RetrievedText(
            document_path="社内公式情報/社内システム、貸与機器の使い方/Slack 活用・テクニカル編/外部と連携 Slack コネクトとゲスト.pdf",
            text="外部と連携 Slack コネクトとゲスト\n\n3\n\n設定・招待\n\nお客様やパートナー会社など他社でSlackを利⽤している場合、共有チャンネル\n(Slack コネクト)の作成ができます\n【公式】Slack コネクトのはじめ⽅\nSlackコネクトは利⽤部⾨で⾃由に設定してください(情シスでの管理、設定は\n⾏っていません)\nSlack コネクトはClassmethodから招待する、外部のオーガナイゼーションから\n招待される、の2パターンがあります\n\nClassmethodから招待する:チャンネルの設定でSlack コネクトに招待した\nいユーザーを追加します\n外部のオーガナイゼーションからの招待:招待されたユーザーに外部組織\nのチャンネルが⾒えるようになります/招待されるとSlack Enterprise Gridの組織管理者の承\n認待ちとなります\n管理者専⾨チャンネルで部⾨⻑承認 →\xa0Slack Enterprise Gridの組織管理者の承\n認ゲストの招待\n※Classmetdthod、外部オーガナイゼーションの両⽅で承認がされないと、\nSlackコネクトにはなりません\nもし招待してもなかなかSlackコネクトにならない場合、相⼿側の承認が終わ\nっているか、確認してください\nSlackコネクトを設定したチャンネルの外部ユーザーは外部オーガナイゼーショ\nンの管理です\nClassmetdthodの管理者ではチャンネルへの招待、チャンネルからの退出をさせ\nることはできません\n(その逆も同様です)\n関係を解消した外部オーガナイゼーションとのSlackコネクトは速やかに削除し\nてください\n削除はチャンネルマネージャーの⽅と情シスの組織管理者アカウントが可\n能です\nSlack コネクトを削除できない場合、情報システムにお問い合わせください\n情報システムへの依頼・申請\n\n制約",
        ),
        RetrievedText(
            document_path="社内公式情報/社内ガイドライン/Slack利用ガイドライン/Slackの構成とワークスペース間連携.pdf",
            text="Slackの構成とワークスペース間連携\n\n5\n\nチャンネルの種類 投稿内容\n\n例\n\n共⽤ワークスペース\nPublic\n\nCMグループ全体に適⽤・公開・共有される情報\n\ntimes-, misc-, office\n\n共⽤ワークスペース\nPrivate\n\nCMグループ内で機密・機微な情報を含む業務チャンネル\n(Slack/ゲスト含む)\n\nhotline-,tf-,prj\n\nマルチワークスペー\nス Public\n\n利⽤⾮推奨(⽇本国内限定情報など)\n\n-\n\nマルチワークスペー\nス Private\n/外部ゲストを含む業務チャンネル ⼊場\n者⼀時サポートチャンネル\n\nhotline-,tf-,prj- tmp-join-YYYYMM\n\n単⼀ワークスペース\nPublic\n\n各法⼈にのみ公開範囲される情報\n\nannouncement, team\n\n単⼀ワークスペース\nPrivate\n\n各法⼈内, メンバー限定の機密情報を取り扱う\n\n諸々\n\nSlack Enterprise Gridでのワークスペース作成\n\nSlack Enterprise Gridではクラスメソッドが契約しているOrG(組織)の中に、複数のワークスペースを作成す\nることが可能です。\n特定顧客、外部組織とのやり取りを想定ですが、まずSlack コネクトの利⽤を検討してください。\n→ 外部と連携 Slack コネクトとゲスト/CISOにご相談ください\nワークスペースの新規作成にワークフローなどの申請は不要です。\n以下の点についてご理解をいただける⽅のみ、作成を許可します(情報システムでは管理責任を負いません)\n部⾨⻑に事前にご相談ください。承認時に部⾨⻑に情シスから確認を⾏います\nワークスペース管理者として情報漏洩などが無きよう外部ユーザーの権限等に善管義務を負うこと\n外部ユーザー(クラスメソッド社員以外)は原則としてゲストでワークスペースに招待すること\nワークスペース上の運営管理は⾃分たちで実施すること\n野良ワークスペースを作成しないこと\nSlackのメニューにある「ワークスペースの新規作成」「ワークスペースを追加」からの作成は⾏わないで\nください\n\nワークスペースの新規作成(申請)\n1. http//classmethod.enterprise.slack/ にアクセスしますワークスペース⼀覧が表⽰されるので、画⾯の\n⼀番下にスクロールします",
        ),
    ]
  • プロンプト(Read)

    下のプロンプトはドキュメント1つ分です。このようなプロンプトがドキュメントごとに実行されます(なので、「ドキュメントの内容」が異なる同様のプロンプトが10回実行されます)

    ユーザからの質問と、その回答として利用できるかわかっていないドキュメントがあります。
    ドキュメントからユーザの質問に対する回答となる情報を取り出してください。
    ドキュメントはデータベースに保存されており、そのファイルパスが与えられます。
    
    # 制約
    - 質問に対する回答となる情報のみ出力してください
    - 少しでも関係ない情報は出力しないでください
    - 回答となる情報は箇条書きで出力してください。
    - 出力はJSON形式で、Stringのリストで出力してください
    - 質問に対する回答となる情報がない場合は空のリスト"[]"を出力してください。
    - ファイルパスが質問に関係ない場合は、空のリスト"[]"を出力してください。
    - ファイルパスが質問に関係あっても、内容が質問に関係ない場合は、空のリスト"[]"を出力してください。
    
    # ユーザからの質問
    Slackでアンケートを取る方法があると聞いてます。方法を教えてください。
    
    # ドキュメントのファイルパス
    社内公式情報/【FAQ】社内システムよくある問い合せ/Slack/Slackでアンケートを取る方法があると聞いてます。方法を教えてください。.pdf
    
    # ドキュメントの内容
    Slackでアンケートを取る⽅法があると聞いてます。⽅法を教えてください。
    
    1
    
    Slackでアンケートを取る⽅法が
    あると聞いてます。⽅法を教えて
    ください。
    
    タグ
    
    Slack アンケート
    
    最終更新⽇時
    
    【回答】
    
    以下 ⼿順書ご参照ください。
    
    はじめに
    
    Slack には⾊々な拡張機能があり、アンケートを取る⽅法はいろいろとあると思い
    ますが、このページは Polly を⽤いた⽅法を紹介します。
    
    準備
    
    利⽤するにはアプリ「Polly」を チャネルに招待 する必要があります。既にPollyが
    参加しているかどうかはメンバーリストから確認できます。
    参加させる場合は以下を⼊⼒し招待します。
    
    /invite @Polly
    
    招待に成功すると、以下のように表⽰されます。
    
    使い⽅
    アンケートを作成
    Pollyに質問⽂と選択肢を伝えるだけです。
    
    @2023年2⽉25⽇ 20:36
  • Readの実行結果

    (gpt-3.5-turboで実行した結果です)

    [
      [
        "以下手順書ご参照ください。",
        "はじめに",
        "Slack には色々な拡張機能があり、アンケートを取る方法はいろいろとあると思いますが、このページは Polly を用いた方法を紹介します。",
        "準備",
        "利用するにはアプリ「Polly」を チャネルに招待 する必要があります。既にPollyが参加しているかどうかはメンバーリストから確認できます。",
        "参加させる場合は以下を入力し招待します。",
        "/invite @Polly",
        "招待に成功すると、以下のように表示されます。",
        "使い方",
        "アンケートを作成",
        "Pollyに質問文と選択肢を伝えるだけです。"
      ],
      [
        "Slackでアンケートを取る⽅法があると聞いてます。⽅法を教えてください。"
      ],
      [
        "Slackで投票アンケートが作成できるPollyの使い方についての紹介です。",
        "https://lab.sonicmoov.com/tool/slack-polly/",
        "Slackには様々な拡張機能があり、アンケートを取る方法はいろいろとあると思いますがPollyを用いた方法を紹介します。",
        "利用するにはアプリ「Polly」をチャネルに招待する必要があります。既にPollyが参加しているかどうかはメンバーリストから確認できます。"
      ],
      [
        "Slackの活用をしたい方、アプリやWebhookなどテクニカルな内容、リンクなどを記載しています。",
        "通常の利用方法はSlack利用ガイドラインをご覧ください。",
        "便利なアプリ、ツールについて #05-internal-feedback チャンネルで教えてください!",
        "多くの人の同意を得られたものは追記していきます。",
        "Slack Enterprise Gridについて",
        "クラスメソッドではSlackは1つのワークスペースではなく、Slack Enterprise Gridとして複数のワークスペースをまとめて一元管理しています。",
        "詳細は以下の資料をご覧ください。",
        "ワークスペースの構成についてはSlackの構成とワークスペース間連携もあわせてご覧ください。",
        "Slack Enterprise Gridの関係資料",
        "Slackのアプリインストール/アンインストールについて",
        "アプリはできるだけ公式から入手しましょう",
        "インストールする前に!そのアプリ、セキュリティは大丈夫?",
        "Slackアプリの挙動を確認したい場合、Sandboxワークスペースを活用してください",
        "アプリの作成方法などお役立ちリンク",
        "外部との連携 Slack コネクトとゲスト",
        "便利ツール/ノウハウ・Tips"
      ],
      [
        "Slackでアンケートを取る方法については、ドキュメントには関連する情報がありません。"
      ],
      [
        "Slack利⽤ガイドライン",
        "はじめに",
        "ℹここにはSlackを社内利⽤するうえで必要な「守るべきルール(Must)」と「こうした⽅が良い(Shoud)」、「申請⽅法」をまとめています。",
        "「こうすると便利」「テクニカル情報」「Tips」は Slack 活⽤・テクニカル編 をご覧ください。",
        "もしあなたがSlackを使ったことがあり「こうするといいよ!」というアドバイスがあれば",
        "#05-internal-feedback チャンネルで教えてください!",
        "多くの⼈の同意を得られたものはこちらのページや、活⽤・テクニカル編に追記していきます。",
        "Slack上のコミュニケーションについて",
        "クラスメソッドグループ内でチャットを利⽤する際に、各⾃⼼がけていただきたい",
        "ことです。",
        "定期的にアナウンスも⾏っていますので、皆さんご認識と実践をお願いします。",
        "Slack上のコミュニケーションについて",
        "ルール/ガイドライン",
        "Slackアプリ/外部連携/テクニカル/便利ツール/ノウハウ"
      ],
      [
        "Slackの運⽤ノウハウ、Tipsなどをまとめています。使いやすいものを参考にしてみてください。",
        "通常の利⽤⽅法は Slack利⽤ガイドライン をご覧ください。",
        "便利な使い⽅、ノウハウについて #05-internal-feedback チャンネルで教えてください!",
        "タスク管理について",
        "ブックマーク(後で)",
        "Backlog・・・作業依頼",
        "Notion・・・チーム全体への周知事項",
        "Slackアプリを⽤いたもの",
        "便利な機能、オススメ設定(Tips)",
        "キーボードショートカット",
        "エンターで改⾏するには",
        "チャンネルに複数メンバーをまとめて招待したい",
        "部⾨横断やマイクロチームのチャンネルはどうするのがいい?",
        "よく使う絵⽂字",
        "分報(times)を使ってみよう",
        "出退勤ステータス",
        "KoT出勤∕退勤時にSlackにもメッセージを書く",
        "プロジェクト⽤の設定"
      ],
      [],
      [
        "{\n  \"質問\": \"Slackでアンケートを取る方法があると聞いてます。方法を教えてください。\",\n  \"ファイルパス\": \"社内公式情報/社内システム、貸与機器の使い方/Slack 活用・テクニカル編/外部と連携 Slack コネクトとゲスト.pdf\"\n}"
      ],
      [
        "Slackでアンケートを取る方法は、Slackの構成とワークスペース間連携に関する情報ではありません。"
      ]
    ]
  • プロンプト(Compose)
    ユーザからの質問と、その回答で利用できる情報があります。
    ドキュメントの情報をもとに、ユーザの質問に対する回答を生成してください。
    ドキュメントはデータベースに保存されており、そのファイルパスが与えられるので考慮にいれてください。
    矛盾している内容がある場合は、その旨を回答してください。
    使用したドキュメントは、その番号を引用の形式で示してください 例:[0],[2]
    
    # 制約
    - 質問に関係のありそうな情報にのみ基づいて回答してください。
    
    # ドキュメントのファイルパスと内容
    - [0] 社内公式情報/【FAQ】社内システムよくある問い合せ/Slack/Slackでアンケートを取る方法があると聞いてます。方法を教えてください。.pdf
      - 以下手順書ご参照ください。
      - はじめに
      - Slack には色々な拡張機能があり、アンケートを取る方法はいろいろとあると思いますが、このページは Polly を用いた方法を紹介します。
      - 準備
      - 利用するにはアプリ「Polly」を チャネルに招待 する必要があります。既にPollyが参加しているかどうかはメンバーリストから確認できます。
      - 参加させる場合は以下を入力し招待します。
      - /invite @Polly
      - 招待に成功すると、以下のように表示されます。
      - 使い方
      - アンケートを作成
      - Pollyに質問文と選択肢を伝えるだけです。
    - [1] 社内公式情報/【FAQ】社内システムよくある問い合せ/Slack.pdf
      - Slackでアンケートを取る⽅法があると聞いてます。⽅法を教えてください。
    - [2] 社内公式情報/社内システム、貸与機器の使い方/Slack 活用・テクニカル編/便利ツール(Slackアプリ).pdf
      - Slackで投票アンケートが作成できるPollyの使い方についての紹介です。
      - https://lab.sonicmoov.com/tool/slack-polly/
      - Slackには様々な拡張機能があり、アンケートを取る方法はいろいろとあると思いますがPollyを用いた方法を紹介します。
      - 利用するにはアプリ「Polly」をチャネルに招待する必要があります。既にPollyが参加しているかどうかはメンバーリストから確認できます。
    - [3] 社内公式情報/社内システム、貸与機器の使い方/Slack 活用・テクニカル編.pdf
      - Slackの活用をしたい方、アプリやWebhookなどテクニカルな内容、リンクなどを記載しています。
      - 通常の利用方法はSlack利用ガイドラインをご覧ください。
      - 便利なアプリ、ツールについて #05-internal-feedback チャンネルで教えてください!
      - 多くの人の同意を得られたものは追記していきます。
      - Slack Enterprise Gridについて
      - クラスメソッドではSlackは1つのワークスペースではなく、Slack Enterprise Gridとして複数のワークスペースをまとめて一元管理しています。
      - 詳細は以下の資料をご覧ください。
      - ワークスペースの構成についてはSlackの構成とワークスペース間連携もあわせてご覧ください。
      - Slack Enterprise Gridの関係資料
      - Slackのアプリインストール/アンインストールについて
      - アプリはできるだけ公式から入手しましょう
      - インストールする前に!そのアプリ、セキュリティは大丈夫?
      - Slackアプリの挙動を確認したい場合、Sandboxワークスペースを活用してください
      - アプリの作成方法などお役立ちリンク
      - 外部との連携 Slack コネクトとゲスト
      - 便利ツール/ノウハウ・Tips
    - [4] 社内公式情報/情報活用管理部門用/全社のお知らせ/Slack ワークスペース分離運用とガイドラインリニューアル.pdf
      - Slackでアンケートを取る方法については、ドキュメントには関連する情報がありません。
    - [5] 社内公式情報/社内ガイドライン/Slack利用ガイドライン.pdf
      - Slack利⽤ガイドライン
      - はじめに
      - ℹここにはSlackを社内利⽤するうえで必要な「守るべきルール(Must)」と「こうした⽅が良い(Shoud)」、「申請⽅法」をまとめています。
      - 「こうすると便利」「テクニカル情報」「Tips」は Slack 活⽤・テクニカル編 をご覧ください。
      - もしあなたがSlackを使ったことがあり「こうするといいよ!」というアドバイスがあれば
      - #05-internal-feedback チャンネルで教えてください!
      - 多くの⼈の同意を得られたものはこちらのページや、活⽤・テクニカル編に追記していきます。
      - Slack上のコミュニケーションについて
      - クラスメソッドグループ内でチャットを利⽤する際に、各⾃⼼がけていただきたい
      - ことです。
      - 定期的にアナウンスも⾏っていますので、皆さんご認識と実践をお願いします。
      - Slack上のコミュニケーションについて
      - ルール/ガイドライン
      - Slackアプリ/外部連携/テクニカル/便利ツール/ノウハウ
    - [6] 社内公式情報/社内システム、貸与機器の使い方/Slack 活用・テクニカル編/運用してみてのノウハウ、Tips.pdf
      - Slackの運⽤ノウハウ、Tipsなどをまとめています。使いやすいものを参考にしてみてください。
      - 通常の利⽤⽅法は Slack利⽤ガイドライン をご覧ください。
      - 便利な使い⽅、ノウハウについて #05-internal-feedback チャンネルで教えてください!
      - タスク管理について
      - ブックマーク(後で)
      - Backlog・・・作業依頼
      - Notion・・・チーム全体への周知事項
      - Slackアプリを⽤いたもの
      - 便利な機能、オススメ設定(Tips)
      - キーボードショートカット
      - エンターで改⾏するには
      - チャンネルに複数メンバーをまとめて招待したい
      - 部⾨横断やマイクロチームのチャンネルはどうするのがいい?
      - よく使う絵⽂字
      - 分報(times)を使ってみよう
      - 出退勤ステータス
      - KoT出勤∕退勤時にSlackにもメッセージを書く
      - プロジェクト⽤の設定
    - [8] 社内公式情報/社内システム、貸与機器の使い方/Slack 活用・テクニカル編/外部と連携 Slack コネクトとゲスト.pdf
      - {
      "質問": "Slackでアンケートを取る方法があると聞いてます。方法を教えてください。",
      "ファイルパス": "社内公式情報/社内システム、貸与機器の使い方/Slack 活用・テクニカル編/外部と連携 Slack コネクトとゲスト.pdf"
    }
    - [9] 社内公式情報/社内ガイドライン/Slack利用ガイドライン/Slackの構成とワークスペース間連携.pdf
      - Slackでアンケートを取る方法は、Slackの構成とワークスペース間連携に関する情報ではありません。
    
    # ユーザからの質問
    Slackでアンケートを取る方法があると聞いてます。方法を教えてください。
    
    # 回答
  • Composeの実行結果
    Slackでアンケートを取る方法は、アプリ「Polly」を使用することで可能です。以下に手順を説明します。
    
    1. まず、アンケートを取りたいチャネルにPollyを招待する必要があります。既にPollyが参加しているかどうかはメンバーリストから確認できます。
    2. Pollyを参加させる場合は、チャネルで「/invite @Polly」と入力し、招待します。
    3. 招待に成功すると、画面に表示が出ます。
    4. アンケートを作成するには、Pollyに質問文と選択肢を伝えるだけです。
    
    以上の手順でアンケートを作成することができます[0][2]。
  • 後処理部分
    - [0]: 社内公式情報/【FAQ】社内システムよくある問い合せ/Slack/Slackでアンケートを取る方法があると聞いてます。方法を教えてください。.pdf
    - [2]: 社内公式情報/社内システム、貸与機器の使い方/Slack 活用・テクニカル編/便利ツール(Slackアプリ).pdf