22.3K Views
December 08, 23
スライド概要
JPPC RB06 の投影資料です。
日本マイクロソフトでPower Platform の技術営業をしています。
Power Platform × AzureOpenAI で実現する 社内文書GPTアプリ 向井久美子 @KumikoMukai_jp RB06
本イベントのスポンサー様 Gold Sponsor Silver Sponsor Facilities & Staff Sponsor ダイキン工業㈱
スピーカー自己紹介 向井 久美子(くみむー) #JPPC2023 #RB06 でツイートしてね! 慶應理工卒 2020年 日本マイクロソフト入社。 ビジネスアプリケーション技術本部配属 (Dynamics 365 & Power Platform 技術営業) 2023年7月からPower Platform 専属に SNS Twitter : @KumikoMukai_jp Qiita : @kumukai Twitter Thanks Akira-san!
今回ご紹介する “社内文書GPTアプリ” とは 社内にある文書をソースとして回答をするGPTアプリです! 嬉しいポイント 社外に公開されていない 情報に関する回答が得ら れる! 用途に特化したアプリを 作成できる!
今回ご紹介する “社内文書GPTアプリ” とは 社内にある文書をソースとして回答をするGPTアプリです! まずはデモでアプリをご紹介します! 嬉しいポイント 社外に公開されていない 情報に関する回答が得ら れる! 用途に特化したアプリを 作成できる!
アプリの全体像 質問 Azure Power Automate Azure OpenAI ユーザ 回答 Azure Open AI チャットを呼び出し 質問文から「検索キーワード」を生成させる GPT 「検索キーワード」で QAインデックスを検索し 関連QAを取得する(最大3つ) QA インデックス Power Apps なし 質問と同じ意図のQAはあるか? あり 「検索キーワード」で 文書インデックスを検索し 関連文書を取得する(最大3つ) 関連文書のテキストデータから回答文を生成させる ヒットしたQA内容に基づいた回答をユーザーに提示 関連文書に内容に基づいた回答をユーザーに提示 文書 インデックス
アプリの全体像 質問 大きく4つのステップがあります! Azure Power Automate Azure OpenAI ユーザ 回答 ① Azure Open AI チャットを呼び出し 質問文から「検索キーワード」を生成させる ② GPT 「検索キーワード」で QAインデックスを検索し 関連QAを取得する(最大3つ) QA インデックス Power Apps なし 質問と同じ意図のQAはあるか? あり 「検索キーワード」で 文書インデックスを検索し 関連文書を取得する(最大3つ) ③ 文書 インデックス 関連文書のテキストデータから回答文を生成させる ヒットしたQA内容に基づいた回答をユーザーに提示 関連文書に内容に基づいた回答をユーザーに提示 ④
それぞれのステップの解説 質問 Azure Power Automate Azure OpenAI ユーザ 回答 ① Azure Open AI チャットを呼び出し 質問文から「検索キーワード」を生成させる ② GPT 「検索キーワード」で QAインデックスを検索し 関連QAを取得する(最大3つ) QA インデックス ①検索キーワードの生成 Power Apps なし 質問と同じ意図のQAはあるか? JPPCのブレイクアウトセッショ ンについて教えて あり ③ 以下の例に倣ってテキストからキーワードを最 「検索キーワード」で 文書インデックスを検索し 文書 大3つ抽出して、スペース区切りとしてください。 関連文書を取得する(最大3つ) インデックス 例:今日の東京の天気はなんですか。 関連文書のテキストデータから回答文を生成させる 結果: 今日 天気 東京 JPPC ブレイクアウトセッショ ヒットしたQA内容に基づいた回答をユーザーに提示 ン 教えて 関連文書に内容に基づいた回答をユーザーに提示 ④
それぞれのステップの解説 質問 Azure Power Automate Azure OpenAI ユーザ 回答 ① Azure Open AI チャットを呼び出し 質問文から「検索キーワード」を生成させる ② GPT 「検索キーワード」で QAインデックスを検索し 関連QAを取得する(最大3つ) QA インデックス Power Apps ②QAインデックスの検索 まず、よくあるQA一覧に回答がないか探しに行く ギークフジワラ いつ 話 ヒットしたQA内容に基づいた回答をユーザーに提示 こんなQAあったよ! Q: ギークフジワラはいつ話しますか? A: 12/8(金) 12:25~13:25のランチタイム セッションで話します。 よくあるQA一覧をcsvで用意 ③
それぞれのステップの解説 ③-1 よくあるQAに回答があるか判定 質問 こんなQAあったよ! Azure Q: ギークフジワラはいつ話しますか? ① Power Automate OpenAI A: 12/8(金)Azure 12:25~13:25のランチタイム セッションで話します。 ギークフジワラはいつ話しますか? ユーザ 回答 Azure Open AI チャットを呼び出し 質問文から「検索キーワード」を生成させる ② GPT JPPCのブレイクアウトセッションに 「検索キーワード」で QAインデックスを検索し ついて教えて 関連QAを取得する(最大3つ) Power Apps 質問と同じ意図のQAはあるか? あり QA一覧にはなかった。。 文書を探しに行くか なし 「検索キーワード」で 文書インデックスを検索し 関連文書を取得する(最大3つ) QA インデックス ③ 文書 インデックス 関連文書のテキストデータから回答文を生成させる ヒットしたQA内容に基づいた回答をユーザーに提示 ③-2 よくあるQAに回答がない場合は文書を検索 「ブレイクアウトセッション」という ワードが含まれる文書は・・・ 関連文書に内容に基づいた回答をユーザーに提示 ④
それぞれのステップの解説 ④ 回答の提示 質問 Azure Power Automate ギークフジワラはいつ話しますか? ユーザ 回答 Azure Open AI チャットを呼び出し 質問文から「検索キーワード」を生成させる ② GPT この文書使えそう! 「検索キーワード」で QAインデックスを検索し こんなQAあったよ! 関連QAを取得する(最大3つ) Q: ギークフジワラはいつ話しますか? Power Apps A: 12/8(金) 12:25~13:25のランチタイム セッションで話します。 なし 質問と同じ意図のQAはあるか? あり 12/8(金) 12:25~13:25のランチタイム セッションで話します。 ① Azure OpenAI JPPCのブレイクアウトセッションに ついて教えて QA インデックス ③ 作文します~ 「検索キーワード」で 文書インデックスを検索し 関連文書を取得する(最大3つ) 文書 インデックス ブレイクアウトセッション以下の4つのトラックに分か れて開催します。 ・アプリ&サイト開発・・・ 関連文書のテキストデータから回答文を生成させる ヒットしたQA内容に基づいた回答をユーザーに提示 関連文書に内容に基づいた回答をユーザーに提示 ④
それぞれのステップについて 詳しく解説していきます!
①検索キーワードの生成 質問 Azure Power Automate Azure OpenAI ユーザ 回答 ① Azure Open AI チャットを呼び出し 質問文から「検索キーワード」を生成させる GPT 「検索キーワード」で QAインデックスを検索し 関連QAを取得する(最大3つ) QA インデックス Power Apps なし 質問と同じ意図のQAはあるか? あり 「検索キーワード」で 文書インデックスを検索し 関連文書を取得する(最大3つ) 関連文書のテキストデータから回答文を生成させる ヒットしたQA内容に基づいた回答をユーザーに提示 関連文書に内容に基づいた回答をユーザーに提示 文書 インデックス
Power Automate ではこう作る! トリガー。Power Apps で入力された質問文を受け取る。 質問文からキーワードを抽出させる指示文(プロンプト) をあらかじめ作成。 プロンプトを使用し、AOAIに質問文からキーワードを抽出 させる。 AOAIのレスポンスからキーワードを抽出させる。 出力 { ・・・(中略) "choices": [ { "index": 0, "finish_reason": "stop", "message": { "role": "assistant", “content”: “ギークフジワラ 話" }, ・・・(中略) } 出力はjson形式。 ここから必要なテキスト だけを抽出するよ!
事前準備:Azure OpenAI の用意 環境変数にendpoint と API Key を設定!
フロー解説 AOAIに投げる指示 concat(‘ 以下の例に倣ってテキストからキーワードを最大3 つ抽出して、スペース区切りとしてください。 ###例: ###テキスト:今日の東京の天気はなんですか。 ###キーワード: 今日 天気 東京 ###テキスト:',triggerBody()['text'],’ ###キーワード: ')
フロー解説 本文 { "messages": [ { "role": "system", "content": "あなたは文書を検索するAIアシ スタントです。" }, { "role": "user", "content": 出力 } ], "temperature": 0.7, "top_p": 0.95, "frequency_penalty": 0, "presence_penalty": 0, "max_tokens": 800, "stop": null }
フロー解説 { ・・・(中略) "choices": [ { "index": 0, "finish_reason": "stop", "message": { "role": "assistant", “content”: “ギークフジワラ 話" }, ・・・(中略) } キーワードだけ抽出 body('HTTP_キーワードの抽出 ')['choices'][0]?['message']? ['content']
②QAインデックスの検索 質問 Azure Power Automate Azure OpenAI ユーザ 回答 Azure Open AI チャットを呼び出し 質問文から「検索キーワード」を生成させる ② GPT 「検索キーワード」で QAインデックスを検索し 関連QAを取得する(最大3つ) QA インデックス Power Apps なし 質問と同じ意図のQAはあるか? あり 「検索キーワード」で 文書インデックスを検索し 関連文書を取得する(最大3つ) 関連文書のテキストデータから回答文を生成させる ヒットしたQA内容に基づいた回答をユーザーに提示 関連文書に内容に基づいた回答をユーザーに提示 文書 インデックス
Power Automate ではこう作る! Azure Search にキーワードを渡すためにキーワードをエン コードする エンコードされたキーワードを使用してQAを検索。該当す るQAを得る。 検索結果のQuestionを抽出 検索結果のAnswerを抽出 出力 {(中略) "value": [ { "@search.score": 10.956205, "Question": "ギークフジワラはいつ話しますか?", "Answer": ""12/8(金) 12:25~13:25のランチタイム セッションで話します。", "Section": "JPPCスケジュール", (中略) } 出力はjson形式。 ここから必要なテキスト だけを抽出するよ!
事前準備:AI Search の用意 よくあるQAリスト用と文書用、 2つのコンテナーを用意 環境変数にendpoint と API Key を設定!
インデックスってなに? Azure で検索! インデックスがない場合 インデックスがある場合 単語 ドキュメント # (トークン) microsoft 1, 3, 4 introducing 1, 3 sql 1 server 1, 2 Microsoft is introducing Azure windows 2 update 2 Programming on Microsoft Azure azure 3, 4 programming 4 # 1 Microsoft is introducing SQL Sever # 1 Microsoft is introducing SQL Sever # 2 Windows Server Update # 2 Windows Server Update # 3 Microsoft is introducing Azure # 3 # 4 Programming on Microsoft Azure # 4 全てのドキュメントを走査する、 コストが非常に高い非効率な処理 インデックスがポインタとなり、ドキュメントを引き当て
インデックスってなに? Azure で検索! インデックスがない場合 インデックスがある場合 単語 ドキュメント # (トークン) AI Search の作成方法を ざっくりご紹介します! microsoft 1, 3, 4 introducing 1, 3 sql 1 server 1, 2 Microsoft is introducing Azure windows 2 update 2 Programming on Microsoft Azure azure 3, 4 programming 4 # 1 Microsoft is introducing SQL Sever # 1 Microsoft is introducing SQL Sever # 2 Windows Server Update # 2 Windows Server Update # 3 Microsoft is introducing Azure # 3 # 4 Programming on Microsoft Azure # 4 全てのドキュメントを走査する、 コストが非常に高い非効率な処理 インデックスがポインタとなり、ドキュメントを引き当て
アップロードしたよくあるQA csvで用意
アップロードした文書 wordで用意
インデックスはこんな感じに作ります 取得・検索対象とするところにチェック
フロー解説
HTTP 出力
"value": [
{
"@search.score": 2.1694171,
"Question": "ギークフジワラはいつ話しますか?",
"Answer": "12/8(金) 12:25~13:25のランチタイムセッション
で話します。",
"Section": "JPPCスケジュール",
"AzureSearch_DocumentKey": "aHR0cHM6Ly90ZXN0MjMxMjA0
LmJsb2IuY29yZS53aW5kb3dzLm5ldC90ZXN0MjMxMjA0ZnFhL0pQUENfdG
VzdDIuY3N2OzE1"
},
Questionの抽出
first(body('HTTP_Search_Query
_QA')?['value'])?['Question']
Answerの抽出
first(body('HTTP_Search_Query
_QA')?['value'])?[‘Answer']
③よくあるQAに回答があるか判定し、あれば回答を提示 Azure Power Automate 質問 Azure OpenAI ユーザ 回答 Azure Open AI チャットを呼び出し 質問文から「検索キーワード」を生成させる GPT 「検索キーワード」で QAインデックスを検索し 関連QAを取得する(最大3つ) Power Apps ③ QA インデックス なし 質問と同じ意図のQAはあるか? あり 「検索キーワード」で 文書インデックスを検索し 関連文書を取得する(最大3つ) 関連文書のテキストデータから回答文を生成させる ヒットしたQA内容に基づいた回答をユーザーに提示 関連文書に内容に基づいた回答をユーザーに提示 文書 インデックス
Power Automate ではこう作る! QAの信頼度をスコアとして抽出 スコアの高さによって条件分岐 スコアが高い場合は参考にしたQAを抽出 Power Apps に回答・参考QAを返す
フロー解説
HTTP 出力
"value": [
{
"@search.score": 2.1694171,
"Question": "ギークフジワラはいつ話しますか?",
"Answer": "12/8(金) 12:25~13:25のランチタイムセッション
で話します。",
"Section": "JPPCスケジュール",
"AzureSearch_DocumentKey": "aHR0cHM6Ly90ZXN0MjMxMjA0
LmJsb2IuY29yZS53aW5kb3dzLm5ldC90ZXN0MjMxMjA0ZnFhL0pQUENfdG
VzdDIuY3N2OzE1"
},
スコアの抽出
first(body('HTTP_Search_Query_QA')?
['value'])?[‘@search.score']
④ 回答の提示 質問 Azure Power Automate Azure OpenAI ユーザ 回答 Azure Open AI チャットを呼び出し 質問文から「検索キーワード」を生成させる GPT 「検索キーワード」で QAインデックスを検索し 関連QAを取得する(最大3つ) QA インデックス Power Apps なし 質問と同じ意図のQAはあるか? あり 「検索キーワード」で 文書インデックスを検索し 関連文書を取得する(最大3つ) 関連文書のテキストデータから回答文を生成させる ヒットしたQA内容に基づいた回答をユーザーに提示 関連文書に内容に基づいた回答をユーザーに提示 ④ 文書 インデックス
Power Automate ではこう作る! キーワードで文書インデックスを検索し関連文書を取得 取得した文書の内容をテキストとして取得 文書のテキストデータからAOAIに質問の回答を作成させる AOAIのレスポンスから回答を抽出 AOAIのレスポンスから参考文書名を抽出 Power Apps に回答・参考文書名を返す
フロー解説
HTTP 出力
{
"@search.score": 2.8482497,
“content”: “…ブレイクアウトセッション\nメインイベントで
は4つのセッショントラックに分かれて開催します\n· アプリ&サイト
開発:Power Apps、Power Pages についてお話します\n· ボット・
RPA・自動化:Power Automate、Power Virtual Agents についてお
話します\n· データ&分析&その他:Microsoft Fabric、マニアック
なセッション、難易度高めな内容など、深堀セッションについてお話し
ます…”,
"metadata_storage_name": "JPPC概要_デモ用.docx"
}
ドキュメント内容の抽出
first(body('HTTP_Search_Query_docs')?['
value'])?['content']
フロー解説 HTTP 入力 { "messages": [ { "role": "user", “content”: “## 条件¥n丁寧に説明してください。¥n inputを参考にしてください。 ¥n500 token 以内で回答を要 約してください。¥n¥n## 質問: ##input¥n ¥n## 回答:“ } ], "temperature": 0.7, "top_p": 0.95, "frequency_penalty": 0, "presence_penalty": 0, "max_tokens": 4096, "stop": null }
フロー解説 HTTP 出力 "choices": [ { "index": 0, "finish_reason": "stop", "message": { "role": "assistant", "content": "Japan Power Platform Conferenceは、Power Apps、Power Automate、Power Virtual Agents、Power BI、Power PagesなどのPower Platformサービスに関心のある人を対象としたイベン トです。このイベントでは、Copilotや生成型AIに関連したセッションや ワークショップが開催されます。さらに、アプリやサイト開発、ボット・ RPA・自動化、データ・分析、その他のトピックについてのセッションもあ ります。イベントの最後には、ハッカソンが行われ、参加者は実際に Power Platformのソリューションを作成することができます。参加方法や 注意事項についても説明されています。" }, 回答の抽出 body('HTTP_Answer_with_AOAI_ChatGPT_model' )?['choices'][0]?['message']?['content'] 参考文書の抽出 body('HTTP_Search_Query_docs')?['value'][0 ]?['metadata_storage_name']
Thank you …♡ 最後まで見てくれてありがとう! #JPPC2023 #RB06 でツイート &フォローよろしくね! SNS Twitter : @KumikoMukai_jp Qiita : @kumukai Twitter