神戸のデータ活用塾!KDL Data Blog

KDLが誇るデータ活用のプロフェッショナル達が書き連ねるブログです。

Promptflow使って文書検索の仕組みを作ってみた! ~精度向上・デプロイ編~

データインテリジェンスチームの畑です。
こちらの記事は「Promptflow使って文書検索の仕組みを作ってみた!」の第三弾です。独自の文書から質問・回答する仕組みをAzure Machine Learningに追加されたPromptflowを使って実装します。

本記事は連載記事です。
-----------------------------------------------------------------------------
第一弾:Promptflowを使うための準備編
第二弾:独自データを使ったQ&Aのフロー作成編
第三弾:質問・回答の精度向上&エンドポイントへのデプロイ編
-----------------------------------------------------------------------------

第三弾の質問・回答の精度向上&エンドポイントへのデプロイを進めていきます。
第一弾、第二弾をまだ読まれていない方は以下のブログを確認してください。

kdl-di.hatenablog.com

kdl-di.hatenablog.com

今回は以下の2項目をご紹介します。

  1. 質問・回答の精度向上
  2. エンドポイントへのデプロイ

1. 質問回答の精度向上

Q&Aのフローを作成していると、思ったような回答をしてくれないときがあると思います。
その場合にも2パターンあり、1つ目は質問に対する回答になっていない場合です。これは検索方法を変更する、Azure AI Searchでのデータの持たせ方を変更するなど修正が大掛かりになります。
2つ目は、回答が読みにくい場合です。例えば回答が英語で返ってきてしまう、回答が長すぎるなどです。こちらはプロンプトを書きかえることで大部分が修正可能です。
今回は2つ目のプロンプトの調整をやってみたいと思います。

情報がない場合に回答を指定する

前回はブログ記事に書いてあることを質問してみました。少しいじわるをして、全くブログと関係の質問をしてみます。

質問:パイナップルについて教えて
回答:I'm sorry, but the provided context does not contain any information about pineapples.

ブログに情報がない場合の回答
英語で「パイナップルについては情報がないよー。」と回答が返ってきました。日本語で回答したいので、修正してみましょう!このとき役に立つのがvariants機能です。
Prompt variantsのバリエーションを表示するボタンを押して一番上のプロンプトを複製してみましょう。
variantsの複製
variant_0の下に、variant_1が増えるのでプロンプトを書きかえてみましょう。もともとのプロンプトが英語なのをまず日本語に直しました。加えて、情報がないときには「情報がありません。」と回答するように指定しました。variant_0をそのまま書き換えてもいいのですが、プロンプトをどう変更したらどう回答が変わるのかを把握したいので残しておきます。

System:
・与えられた文章をもとに質問回答するAIアシスタントです。
・回答の最後に次のフォーマットで参照したcitationを示してください。
フォーマット:(参照:source)
・質問に対する回答の情報がない場合は「情報がありません。」と回答してください。
User:{{contexts}} 
Human: {{question}} 

上記のプロンプトで実行してみます。

質問:パイナップルについて教えて
回答:情報がありません。

指定通りに「情報がありません。」と返してくれるようになりました。

プロンプト調整後の回答

回答の文字数制限を加える

今度は回答の長さを簡潔にしたいので、文字数の制限を加えてみます。

System:
・与えられた文章をもとに質問回答するAIアシスタントです。
・回答の最後に次のフォーマットで参照したcitationを示してください。
フォーマット:(参照:source)
・質問に対する回答の情報がない場合は「情報がありません。」と回答してください。
・回答は200文字以内で文章になるように回答してください。
User:{{contexts}} 
Human: {{question}} 

追加して再度実行してみます。

質問:YOLOについて教えて
回答:YOLO(You Only Look Once)は、物体検出のための深層学習モデルの一つです。画像内の物体の位置とそのクラスを同時に検出することができます。YOLOはその名の通り、画像を一度だけ見ることで物体の位置とクラスを特定します。これにより、リアルタイムでの物体検出が可能となります。YOLOはその高速性と精度から、自動運転やビデオ監視などの分野で広く利用されています。また、YOLOにはいくつかのバージョンがあり、YOLOv5やYOLOXなどが存在します。

簡潔に回答してくれていますが、少し長い気がします。文字数チェッカーで確認すると232文字でした。文字数というと日本語と英語では数え方が違うことがあるようです。今回の場合、英語は1単語が1文字としてカウントされており少し長めの回答になってしまったようです。英語も含めて200文字以内にするにはどうしたらいいでしょうか?この機会に挑戦してみてください。

文字数指定した場合の回答
このようにプロンプトを書き換えて思い描いている出力に最適化していくことを「プロンプトエンジニアリング」と言います。検索すると様々なテクニックが出てくると思いますので、目的に応じてプロンプトを設定してみてください。

2. エンドポイントへのデプロイ

最後に、フローをデプロイして、API経由で質問してみましょう。
デプロイボタンを押すとデプロイの設定画面が表示されます。テストなので低スペックの仮想マシンで、インスタンスを1に設定します。不要な機能も全てオフにしておきましょう。設定後「確認と作成」ボタンでエンドポイントへのデプロイが始まります。完了まで少し時間がかかりますので待ちましょう。

フローのデプロイ

デプロイが完了したらエンドポイントを確認してみましょう。無事完了していればデプロイ名が表示されているはずです。
まずは正しく動くかテストで確認します。

エンドポイントの確認

問題なく返ってきたら、エンドポイントのURL、APIキーをメモして、実際にAPI経由で質問をしてみましょう。

エンドポイントのURLとAPIキーの確認

API経由で実行した結果が以下の図です。

API経由で質問回答した結果
質問・回答のAPIを作成することができました。今回はブログを読み込ませましたが、社内の文書を使えばQ&Aや文書検索にも応用が可能です。「Promptflowを使って社内文書検索の仕組みを作ってみた」の連載はこれで終了です。

この記事で生成AIに興味を持たれた方はお気軽にお問合せください。

畑加奈子

データインテリジェンスチーム所属
元製造メーカー勤務。製品の不良検知を担当したことがきっかけとなり、データサイエンスに興味を持ちKDLへ。クラウドを利用したデータ活用に関してのトピックを中心に発信していきます。