NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

Amazon Bedrock Prompt FlowsでDifyの質問分類器つくってみた

本記事は  AWSアワード記念!夏のアドベントカレンダー  9日目の記事です。
🎆🏆  8日目  ▶▶ 本記事 ▶▶  10日目  🏆🎆

こんにちは、桃をたくさんもらって食べきれるか心配していたら、妻が友達におすそ分けを提案してきたので、急いで桃を食べきろうとしている志水です。ブログ執筆しながらも桃を食べています。申し訳ないですが、桃は独り占めさせていただきたいです。

NRIネットコムのブログイベント「AWSアワード記念!夏のアドベントカレンダー」9日目で、昨日は今年から同じAmbassadorsとなった丹くんでした。CCoEについて非常に分かりやすい記事となっていて勉強になりました。私はなんとか2年目更新できた組なので、丹くんに負けないように頑張らないとなと感じました。なので、私は大好きな生成AIネタとして、最近新しく出たAmazon Bedrock Prompt Flowsを試してみました。

はじめに

2024年7月10日にAmazon BedrockにPrompt Flows機能がプレビューで公開されました。詳細は以下のリンクから確認できます。

aws.amazon.com

この機能は、生成AIアプリケーション開発のためのノーコードツールであり、Difyとほぼ同じコンセプトのAWS版です。Difyはオープンソースの生成AIプラットフォームとして知られています。

よく訓練されたJapanese Bedrocker達がNew Yorkでの発表前に発見したことが話題となりました。AWS Summit New York Keynoteでの発表の様子は以下のリンクからご覧いただけます。なお、Bedrock Prompt Flowsの発表は最後の一言だけで意外でした。直前で発表が決まったのではないかと推測しています。

www.youtube.com

本記事では、Bedrock Prompt Flowsを使ってDifyの質問分類器を作成する方法について解説します。

Bedrock Prompt FlowsとDifyの比較

Bedrock Prompt Flowsの特徴と利点についてお話ししましょう。まず、ノーコードで生成AIアプリケーションを作成できる点が大きな魅力です。直感的なUIと豊富なテンプレートが用意されており、AWSサービスとのシームレスな統合(Lambda, S3, Lexが統合)も可能です。さらに、セキュリティとスケーラビリティの高さも特筆すべき点です。AWSのセキュリティ基準に準拠しており、エンタープライズレベルのセキュリティを提供します。また、プロンプト管理機能(Amazon Bedrock Prompt Management)があり、AWSでの利用が容易で、マネージドサービスのためコンピューティングの管理も不要です。

次に、Difyの特徴と利点についてです。Difyはオープンソースの生成AIプラットフォームであり、コミュニティによるサポートと拡張性が魅力です。多言語対応と柔軟なデプロイオプションがあり、自由にカスタマイズ可能です。活発なコミュニティサポートがあり、広範囲なAIモデルを選択できる点も大きな利点です。多機能で、質問分類器やGoogle検索などが利用可能であり、コミュニティからのフィードバックを活用できる点も見逃せません。ちなみにDifyについての詳しい説明や実際のSlack Botの作成方法は堤くんの下記記事がオススメです。堤くんは今回のアドベントカレンダーでも記事を出すので、私個人としても楽しみです。

tech.nri-net.com

私がDifyで特に好きなところは、質問分類器です。質問分類器は、ユーザーからの質問を受け取り、それを適切なカテゴリに分類する機能です。これにより、ユーザーの意図を正確に理解し、迅速に回答を提供することができます。例えば、カスタマーサポートのシナリオでは、製品に関する質問、技術的なサポートの質問、アカウントに関する質問などを自動的に分類し、それぞれのカテゴリに応じた適切な回答を提供することができます。これがBedrock Prompt Flowsで出来ると良いのになぁと感じたので、作成してみたいと思います。

Bedrock Prompt Flowsで質問分類器を作成する方法

まず、Bedrock Prompt FlowsのNode一覧を確認しましょう。

  • Logic
    • Collector
    • Condition
    • Iterator
  • Orchestration
    • Agents
    • Prompts
  • Code
    • Lambda function
  • Data
    • Knowledge base
    • S3 retrieval
    • S3 storage
  • AI Services
    • Lex
  • Other
    • Flow output

それぞれのNodeの説明は下記をご覧ください。

docs.aws.amazon.com

このNodeの中で質問分類器を作成するために利用するNodeは、Prompt NodeとCondition Nodeになります。質問分類器とは、ユーザーからの質問を分類し、それを適切なカテゴリに仕分ける機能です。この分類には、Prompt Nodeを使用します。Prompt Nodeは、指定したプロンプトを使用してモデルに入力を送信し、生成された応答を取得します。プロンプトは、既存のプロンプト管理から選択するか、ノード内でインライン定義することができます。入力としては、プロンプトに変数を埋め込むための値が必要で、出力はモデルからの応答です。

次に、分類されたカテゴリに応じて適切な処理へ仕分けるために、Condition Nodeを使用します。Condition Nodeは、入力データに基づいて異なるノードにデータを送信します。複数の条件を定義し、各条件に基づいてデータの送信先を指定します。条件は、比較演算子や論理演算子を使用して定義され、条件が満たされた場合、その条件に対応するノードにデータが送られます。

具体的なシナリオでの使用例を見てみましょう。

例えば、要約システムでの日英判定を行う場合、要約結果は日本語で受け取りたいとします。この場合、要約のプロンプトは日本語と英語の2つのテンプレートを利用します。そして、要約プロンプトへのルーティングを分類器で行います。このシナリオでは、質問を受け取り、それを適切なテンプレートに分類するための質問分類器を作成します。もちろん、分類せずに1個のプロンプトでも対応可能ですが、精度を上げたい場合にはテンプレートを分けることが有効です。

実際に作成すると以下のようになります。

左上から順番に下にフローが流れ、紫色のPrompt Nodeで質問の言語が英語なのか日本語なのかの分類を行い、その下の青紫色のCondition Nodeで分類した結果から英語用の要約Prompt Nodeなのか日本語用の要約Prompt Nodeなのかのルーティングを行っています。

また、問い合わせシステムでの質問分類についても考えてみましょう。ここでは、質問がどちらのカテゴリに属するかを判定し、カテゴリによって必要なデータが入っているナレッジベースを利用します。構成は下記のようになります。

あまり先程の使用例とは変わらないですが、同じようにPromptで分類をして、Conditionでルーティングをしています。ルーティングした先が問い合わせ内容に応じた特定のナレッジベースを利用するような構成としてみました。

実際に作ってみた

では、Prompt Flowsを使って質問分類器を作成し、実際のユースケースに適用して作ってみましょう。

まず、ユースケースについてです。NRIネットコムの質問か、それ以外の質問かを判定するシステムとしました。ネットコムの質問であれば、ナレッジベースから情報を取得して回答します。それ以外の質問については、そのままLLMが回答する仕組みです。実際にできたものが下記です。

せっかくなので、NRIネットコムに関する質問にはきちんと答え、それ以外の質問には関西弁で答えるようにして、質問の分類が分かりやすくなるようにしました。

これを見ると、NRIネットコムの内容についてはナレッジベースから正確な情報が取得できていることが分かります。学習しているのは下記ページで、その下の画像の通り社員数も正確に答えています。そして、NRIネットコム以外の質問には、今や推理探偵系アニメでしか見ないようなコテコテの関西弁で答えているので、質問分類がしっかりできていることが確認できます。

www.nri-net.com

今回の構成は下記のようになります。

今までの使用例とほとんど同じですね。ルーティング先がナレッジベースとPromptになっています。それぞれ、どのようなことをやっているか細かく見ていきましょう。

まず、会話で入力された内容を分類するPromptへ入力しています。分類しているプロンプトは下記になります。

You are tasked with creating a question classifier for a chatbot. Your goal is to determine whether a given conversation is about a specific company or if it's a general question.
The company in question is: <company_name> NRIネットコム株式会社 </company_name>
Here is the conversation to be classified: <conversation> {{CONVERSATION}} </conversation>
Please analyze the conversation and determine if it is specifically about the company mentioned above or if it's a general question.
To make your classification:
Look for any mention of the company name or products/services closely associated with the company.
Consider the context of the conversation and whether it seems to be inquiring about or discussing the specific company.
If the conversation doesn't mention the company or its associated products/services, and doesn't seem to be about the company's industry or business area, it's likely a general question.
Output your final classification as either "Company" or "General". Do not include any explanation or tags, only the final classification.

プロンプトの内容としては、分類器としてタスクをこなして欲しいというのと、入力された内容(今回でいうと {{CONVERSATION}} です)をNRIネットコムに関するものかどうかを文脈から判断して、最終的な出力を CompanyGeneral で出力して欲しいというようなことをお願いしています。分類のみなのでモデルはClaude 3 Haikuを使って高速に行っています。

ちなみに、このプロンプトはClaudeのPrompt Generatorで作成し、それをBedrock Prompt Managementでテストしながら調整しました。Bedrock Prompt ManagementはPrompt Flowsほどの見た目や機能的なインパクトは無いですが、すごく良いツールなので是非触って頂きたいです。

上記の分類をしたものをCondition Nodeでシンプルに文字列比較をしています。Companyかどうかを判断して向き先を判断しています。

最後にNRIネットコムであった場合はナレッジベースをもとに回答するようにしています。こちらは、Prompt FlowsやPrompt Managementと同日に発表されたナレッジベースの新たなコネクタであるWeb Crawlerを利用して、先ほど紹介したネットコムのWebページをクローリングしてデータベースに入れたものです。ほんとはネットコムの別のページにしたかったんですが、SPAで返していてうまくデータのクローリングが出来ませんでした。

もう一つのNRIネットコム以外の質問の場合は、シンプルにPrompt Nodeで返信するようにしました。利用したプロンプトは下記です。

あんたは今から、めっちゃポジティブでコテコテの関西弁を使うんや。相手の話を聞いて、超前向きで元気いっぱいな返事をせなアカンで。

ここに相手の話があるさかい、よう読んでな:
<conversation_content>
{{CONVERSATION_CONTENT}}
</conversation_content>

さて、こんな風に返事するんや:
1. めっちゃ元気で明るい感じで話すこと
2. 相手の言うてることに対して、ポジティブな反応をすること
3. 「〜やで」「〜やねん」「〜さかい」みたいな関西弁特有の言い回しを使うこと
4. 「めっちゃ」「すんごい」「あかん」みたいな関西弁らしい言葉もたくさん使うこと
5. 相手を励ましたり、応援したりする感じで話すこと

返事は関西弁だけで書いて、それ以外のことは書かんでええで。準備はええか? せーので返事を書き始めてな!

<answer>

こちらもClaude Prompt Generatorを利用して作成したのですが、作成の依頼方法のせいか、プロンプトの中身まで関西弁になっちゃいました。そりゃあコテコテな関西弁を返すようになりますよね。ちなみにAIモデルはClaude 3.5 Sonnetを利用してるので、とっても賢い関西弁AIとなっております。

今回Bedrock Prompt Flowsで実際に作ってみた感想ですが、画面でポチポチするだけで作れるのは爽快でした。また、これをコードで作るのはなかなか大変なので、まずは作ってみるという点では非常に良いツールだと思いました。ただ、エラーが出たときの確認の難しさや、別で作ったPrompt Flowsと同じようなものを作りたい、というところも現状難しいので、その点は受け止めて利用する必要がありそうです。まだプレビューの機能であるため今後のアップデートに期待したいと思います。連携するAWSサービスもDynamoDBやSageMakerなどがあると更に良い気もしました。

まとめ

今回はDifyの質問分類器をBedrock Prompt Flowsで再現してみました。実際にいくつか分類器を作ってみましたが、プロンプトさえしっかり作れたら問題なく機能するというところは確認できました。作成したPrompt FlowsはAPIで呼び出しができるため、今後はこれを実際にChatbotとして利用できるようにアプリケーションに組み込んでみたいと思います。Prompt Flowsとしてはまだプレビューということで発展途上というところはありますが、開発体験としては非常に良かったので、どんどんアップデートして、GAされた暁には今回頑張って作った質問分類器も組み込んだ状態で発表して、この記事を無意味なものにして欲しいです。

執筆者志水友輔

2023,2024 Japan AWS Ambassador / 2021,2023,2024 Japan AWS Top Engineer / 2021-2024 APN ALL AWS Certifications Engineers / 2024 AWS Community Builder(Serverless)
大阪でAWSを中心としたクラウドの導入、設計、構築を専門に行っています。Generative AIとIaCとつけ麺が大好物

X:https://twitter.com/shimi023

Amazon著者ページ:Amazon.co.jp: 志水友輔: books, biography, latest update