【UiPath×OpenAI】開発者向けのプロンプトエンジニアリング② 中編 テキストの要約と推論

LLM（Large Language Models）は人々の生活を着実に変えており、開発者にとっては非常に強力なツールです。LLMが提供するAPIを利用することで、開発者は素早く便利なアプリケーションを開発することができます。
OpenAIは、LLMを開発者に提供するためのAPIを提供しており、これを使用することで、開発者は自分のアプリケーションやプロジェクトにLLMの能力を組み込むことができます。

UiPathでOpenAIを使用すると、本来ルールベースのRPAでできなかったこと、例えば、自然言語処理やチャットボットなども可能になり、UiPath開発者として、OpenAIを使用する際のプロンプト文の構成原則やテクニックを把握することで、自動化の範囲が更に広がると思います。

# 記事概要
本記事は以下の講座を纏めた内容です。

https://www.deeplearning.ai/short-courses/chatgpt-prompt-engineering-for-developers/

これが開発者向けのプロンプトエンジニアリングガイドです。Andrew Ng先生の「ChatGPT Prompt Engineering for Developers」講座を基に、**初心者向けのLLM開発者向けに、プロンプトの構築方法とOpenAIのAPIを使用して要約、推論、変換などの一般的な機能を実現する方法をわかりやすく紹介しています。**
記事の最後に、UiPath Studioを使用して、講座でのそれぞれのテーマを実現しました。UiPath×OpenAIの開発において、この情報を活用することで、より高度な自動化ワークフローの開発を期待できます。

本記事では、OpenAIを使用してテキストの要約と推論を解説し、最後に、UiPath×OpenAIの応用も説明します。
本記事で作成したJupiter NotebookとUiPath Workflowは以下の通りです。ご参照ください。
- [【OpenAI】開発者向けのプロンプトエンジニアリング② 中編.ipynb](https://drive.google.com/file/d/1G9z7P-Y2OjC3jZspO4CpJ339I6yMm6vk/view?usp=drive_link)
- [【UiPath Workflow】開発者向けのプロンプトエンジニアリング② 中編](https://drive.google.com/drive/folders/1QdRwXInjiPT9QZYj1E_eaANmSLUzcN5v?usp=drive_link)

上記Jupiter Notebookの開き方は以下のビデオをご参照ください。

https://www.youtube.com/watch?v=inN8seMm7UI

# 環境設定
この記事では、OpenAIが提供するChatGPT APIを使用しています。したがって、最初にChatGPTのAPIキーを取得する必要があります（または公式ウェブサイトでオンラインテストを実施することもできます）。次に、openaiのライブラリをインストールする必要があります。
openai：
```bash
pip install openai
```
ライブラリのインポートと自分のAPIキーを設定します。
```bash
import openai
import os
openai.api_key='自身のOpenAI キー'
```
これから、OpenAIが提供するChatCompletion APIの使用方法を詳しく確認します。ここでは、それを関数にラップしてみます。内部の仕組みを理解する必要はありません。単に、この関数を呼び出すと、プロンプトに対応するCompletionが提供されることを知っていれば十分です。
```python
# 「Prompt」を受け取り、それに対応する結果を返す関数
# gpt-3.5-turbo
def get_completion(prompt, model="gpt-3.5-turbo"):
    '''
    prompt: 入力となるPrompt
    model: 使用するGPTモデルを指定、デフォルトgpt-3.5-turbo(ChatGPT)
    '''
    messages = [{"role": "user", "content": prompt}]
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=0, # 生成されたテキストの多様性や予測のランダム性を調整するためのパラメータ
    )
    # OpenAIからの応答からテキストを抽出
    return response.choices[0].message["content"]
```
# テキストの要約

現在、世界中にはあまりにも多くのテキスト情報があり、ほとんどの人が知りたいことをすべて読む十分な時間を持っていません。しかし、喜ばしいことに、現在LLMはテキスト要約のタスクで強力な水準を示しており、多くのチームがこの機能を自分たちのソフトウェアアプリケーションに組み込んでいます。

この記事では、APIインターフェースをプログラムで呼び出して「テキスト要約」機能を実現する方法について説明します。

## 単一テキストの要約

以下は商品レビューの例です。電子商取引プラットフォームにとって、ウェブサイトには通常、大量の商品レビューがあり、これらのレビューはすべての顧客の意見を反映しています。これらの大量で長いレビューを要約するツールがあれば、より多くのレビューを迅速に閲覧し、顧客の嗜好を理解し、プラットフォームと販売業者により優れたサービスを提供するためのガイダンスを得ることができます。

```python 
# インプットのレビュー
prod_review_jp = """
このパンダのぬいぐるみは、私が娘の誕生日プレゼントにあげたもので、
彼女はとても気に入ってどこにでも持って行きます。
ぬいぐるみはとても柔らかく、超かわいいですし、顔の表情もとても優しいです。
ただ、価格と比較すると、ちょっと小さい気がします。
同じ価格で他の場所でより大きなものが買えると感じます。
予想よりも1日早く商品が届いたので、娘に渡す前に自分で少し遊びました。
"""
```

### 出力テキストの長さを制限する

```python 
# テキストの長さを最大15単語に制限しようとしています
prompt = f"""
あなたの仕事は電子商取引ウェブサイトから製品のレビューを簡潔な要約にすることです。
バッククォート（`）で囲まれたコメントテキストを最大15ワードで要約してください。
```{prod_review_jp}```
"""
response = get_completion(prompt)
print(response)
```

出力：`"パンダのぬいぐるみは可愛くて柔らかく、娘も気に入っていますが、価格に対しては少し小さいかもしれません。"`

### 特定の視点に焦点を当てる

時折、異なるビジネスに対して、私たちはテキストに対する焦点を異ならせることがあります。たとえば、商品のレビューテキストに対して、物流は配送の効率に関心を持ち、販売業者は価格と商品の品質により注力し、プラットフォームは総合的なサービス体験に注力します。

私たちは、プロンプトのヒントを追加することで、特定の視点に焦点を当てることができます。

- 配送に焦点を当てる
```python 
prompt = f"""
このタスクは、電子商取引のウェブサイトから製品のレビューを簡潔にまとめることです。
コメントテキストをバッククォート（`）で囲まれた部分に集中し、
最大15語で商品の配送に焦点を当てて要約してください。

```{prod_review_jp}```
"""

response = get_completion(prompt)
print(response)
```
出力：`「予想よりも1日早く商品が届いた」ということが要約の焦点です。`

- 品質と値段に焦点を当てる
```python 
prompt = f"""
このタスクは、電子商取引のウェブサイトから製品のレビューを簡潔にまとめることです。
コメントテキストをバッククォート（`）で囲まれた部分に集中し、
最大15語で商品の値段と品質に焦点を当てて要約してください。

```{prod_review_zh}```
"""

response = get_completion(prompt)
print(response)
```

出力：`「柔らかくてかわいいが、価格に比べてちょっと小さい。早く届いた。」`

表示された結果は、「柔らかくてかわいいが、価格に比べてちょっと小さい。」というキーワードで始まり、製品の価格と品質に対する重要性が表れています。

### 重要な情報を抽出する

上記では、特定の視点に焦点を当てたプロンプトを追加することで、テキストの要約が特定の側面に重点を置くようになりましたが、結果として、価格と品質の観点からの要約には「早く届いた」という情報も含まれています。 これらの情報は時々役立つことがありますが、特定の視点の情報のみを抽出し、他のすべての情報をフィルタリングしたい場合は、LLMに  **「テキスト抽出（Extract）」** を実行させることができます。 「テキスト要約（Summarize）」ではなく。

```python 
prompt = f"""
あなたの仕事は、電子商取引ウェブサイトの製品レビューから関連情報を抽出することです。
バッククォート（`）で囲まれた部分から、製品の配送に関連する情報を最大30語抽出してください。
```{prod_review_jp}```
"""

response = get_completion(prompt)
print(response)
```

出力：`予想よりも1日早く商品が届いた`

## 複数テキストの要約

実際の業務では、通常、多くのレビューテキストがあります。以下に、 "テキストサマリー" ツールを使用し、forループを介して呼び出し、順番に出力する例を示します。もちろん、実際のプロダクション環境では、何百万、何千万ものレビューテキストがある場合、forループを使用することは現実的ではなく、レビューの統合、分散などの方法を検討して計算効率を向上させる必要があるかもしれません。

:::note info
複数レビューを処理する際に、Pythonなどのプログラミングを用いて処理することが可能ですが、UiPath Studioツールを利用して、容易にできます。更にUiPath Studioの強みを活かして、他の業務システムへ入力したり、担当者にメール送信したりができます。
:::

```python 
review_1 = prod_review_jp

# review for a standing lamp
review_2 = """
私の寝室に素敵なランプが必要で、このランプは追加の収納スペースがあり、 \
価格も高すぎないものでした。 \
迅速に届きました - 2日で到着しました。 \
ランプのひもは輸送中に壊れましたが、会社は喜んで新しいものを送ってくれました。 \
それも数日で届きました。組み立ては簡単でした。 \
その後、パーツが一つ不足していたので、サポートに連絡し、 \
非常に迅速に不足している部分を取り寄せてもらいました！ \
お客様と製品に気を配る素晴らしい会社のように思えます。
"""

# review for an electric toothbrush
review_3 = """
私の歯科衛生士は電動歯ブラシをおすすめしてくれたので、それを手に入れました。 \
バッテリーの持ちがかなり印象的です。初めての充電後、 \
バッテリーを調整するために最初の週に充電器を挿しっぱなしにしてから、 \
充電器を抜いて同じ充電で最後の3週間、毎日2回歯磨きに使用しています。 \
しかし、歯ブラシの頭は小さすぎます。 \
この一つよりも大きな赤ちゃん用歯ブラシを見たことがあります。 \
この歯ブラシの頭がもう少し大きく、異なる長さの毛先があれば、 \
歯と歯の間に入り込むのに役立つだろうと思います。 \
この歯ブラシは、約50ドルで手に入れることができれば、お買い得だと思います。 \
製造元の交換用ヘッドはかなり高価ですが、より手ごろな価格の汎用品を入手できます。 \
この歯ブラシは、毎日歯医者に行ったかのような気分にさせてくれます。 \
歯がきれいに輝いて感じられます！ \
"""

# review for a blender
review_4 = """
11月の月に、彼らはまだ季節限定セールで17ピースのシステムを約49ドルで提供していました。 \
約半額ですが、何らかの理由（価格の乱高下と呼んでください）で、 \
12月の第2週ごろには同じシステムが約70ドルから89ドルの間で価格が上昇しました。 \
そして、11ピースのシステムも、29ドルの前のセール価格から約10ドル値上がりしました。 \
見た目は大丈夫ですが、刃が固定されるベースの部分は、数年前の以前のバージョンほど良く見えません。 \
しかし、私は非常に慎重に扱う予定です（例えば、豆、氷、ご飯などの非常に硬いものをまずミキサーで粉砕し、 \
それから欲しいサービングサイズでミキサーで細かくし、より細かい粉を作るためにホイップブレードに切り替え、 \
スムージーを作る際には、まずクロスカットブレードを使用し、より細かく/パルプ状でない場合はフラットブレードを使用します）。 \
スムージーを作る際の特別なヒント：フルーツと野菜を細かく切って冷凍しておく（ほうれん草を使用する場合、 \
ほうれん草を軽く煮てから使用する準備ができるまで冷凍し、 \
ソルベを作る場合は小さな～中サイズのフードプロセッサーを使用する）ことをお勧めします。 \
これにより、スムージーを作る際に氷をあまり多く追加する必要がなくなります。 \
約1年後、モーターが変な音を立てるようになりました。カスタマーサービスに電話しましたが、 \
保証期間がすでに切れていたので、別のものを購入しなければなりませんでした。 \
ご参考までに：この種の製品の総合的な品質は低下しており、 \
販売を維持するためにブランド認知と消費者の忠誠心に頼っている傾向があります。納品は約2日かかりました。 \
"""

reviews = [review_1, review_2, review_3, review_4]
```

```python 
for i in range(len(reviews)):
    prompt = f""" この課題は、eコマースサイトの製品レビューの短い要約を生成することです。
    三つのバックティックで区切られた以下のレビューを、最大20語で要約してください。

    レビュー: ```{reviews[i]}```
    """
    response = get_completion(prompt)
    print(i,response,"\n")
```

出力結果：
```json
0 要約: "娘のプレゼントに買ったパンダぬいぐるみは可愛いけど、価格に比べてちょっと小さい。早く届いたので自分で遊んだ。" 

1 要約: "迅速な配送と素晴らしいカスタマーサポート。簡単な組み立て。満足のいく製品。" 

2 要約: 電動歯ブラシはバッテリーが長持ちでお買い得。頭が小さくて使いづらいが、歯がきれいになる。 

3 要約: 11月にはセールで安かったが、価格が上昇し、品質も低下している。モーターもすぐに壊れた。 
```

# 推論

この部分では、製品のレビューやニュース記事から**感情とテーマ**を推論します。

これらのタスクは、モデルがテキストを入力として受け取り、ある種の分析を実行するプロセスと見なすことができます。これには、ラベルの抽出、エンティティの抽出、テキストの感情の理解などが含まれるかもしれません。
テキストからポジティブまたはネガティブな感情を抽出したい場合、従来の機械学習ワークフローではラベルデータセットの収集、モデルのトレーニング、クラウドでのモデルのデプロイ方法の決定が必要です。これにはかなりの作業が必要です。また、感情分析、エンティティの抽出など、各タスクについては個別のモデルのトレーニングとデプロイが必要です。

大規模な言語モデルの非常に優れた特徴の1つは、多くのタスクに対して単にプロンプトを書くだけで結果を生成できることであり、多くの作業を必要としません。
これは**アプリケーション開発のスピードを大幅に向上させます**。さらに、多くの異なるタスクを実行するために1つのモデルと1つのAPIだけを使用でき、多くの異なるモデルをトレーニングおよびデプロイする方法を理解する必要はありません。

以下が商品のレビューの例です：
```python 
lamp_review_jp = """
私は美しい寝室用ランプが必要で、そのランプには追加の収納機能があり、
価格も高すぎないものが欲しいです。それをすぐに受け取りました。
輸送中にランプのコードが切れてしまいましたが、
会社は新しいものを送ってくれることに快く応じました。数日後、それを受け取りました。
このランプは非常に簡単に組み立てられます。
私はパーツが一つ足りないことに気付き、それで彼らのカスタマーサービスに連絡しました。
彼らはすぐに足りないパーツを送ってくれました！
私の意見では、Luminaは顧客と製品に非常に気を配る優れた会社です！
"""
```

## 感情(ポジティブとネガティブ)

さて、このレビューの感情を分類するためのプロンプトを作成しましょう。このコメントの感情をシステムに教えてもらいたい場合、通常の区切り文字やコメントテキストなどを含めて、「以下の製品のコメントの感情は何ですか」というプロンプトを作成するだけです。

それでは、実行してみましょう。結果はこの製品のコメントの感情がポジティブであることを示しており、これは非常に正しいようです。このデスクランプは完璧ではないかもしれませんが、この顧客は非常に満足しているようです。これは顧客と製品に関心を持つ素晴らしい企業と考えられ、ポジティブな感情が正しい答えのようです。

```python 
prompt = f"""
バッククォート（`）で製品レビューの感情は何ですか？

レビュー: ```{lamp_review_jp}```
"""
response = get_completion(prompt)
print(response)
```

出力：`このレビューの感情はポジティブです。製品に関する要求が満たされ、会社の対応も良かったと述べられています。`

もしもっと簡潔な回答を提供し、後処理を容易にしたい場合、上記のプロンプトを使用し、もう一つの指示を追加して、**「ポジティブ」または「ネガティブ」** という単語で回答を提供できます。これにより、単語「ポジティブ」だけが表示され、テキストがこの出力を受け入れやすく、処理しやすくなります。

```python 
prompt = f"""
バッククォート（`）で製品レビューの感情は何ですか？

こちらの一つの単語で答えください。：「ポジティブ」或いは「ネガティブ」。

レビュー: ```{lamp_review_jp}```
"""
response = get_completion(prompt)
print(response)
```

出力：`ポジティブ`

## 感情のタイプを識別する

別のプロンプトを見てみましょう。引き続きデスクランプのレビューを使用します。今回は、このレビューの著者が表現した感情のリストを最大5つまで識別させたいと思います。

```python 
prompt = f"""
レビューの作成者の感情を識別してください。五つ項目を含んでください。回答をコンマ区切りの単語リストにフォーマットしてください。

レビュー: ```{lamp_review_jp}```
"""
response = get_completion(prompt)
print(response)
```
出力：`満足, 快適, 積極的, 簡単, 優れた`

LLMは、テキストから特定の情報を抽出するのに非常に優れています。上記の例では、レビューが感情を表現しており、これは特定の製品に対する顧客の見方を理解するのに役立つかもしれません。

## クレームを識別する

多くの企業にとって、特定の顧客が非常に怒っているかどうかを知ることは非常に重要です。したがって、おそらくこのような分類の問題があるかもしれません：次のコメントの著者は怒りを表現していますか？なぜなら、誰かが本当に怒っている場合、それは追加の注意を払う価値があり、カスタマーサポートまたはカスタマーサクセスチームが顧客と連絡を取り、状況を理解し、顧客の問題を解決するために連絡を取るかもしれないからです。

```python 
prompt = f"""
以下のレビューの作者は怒りを表現していますか？
レビューは三つのバッククォートで区切られています。「はい」または「いいえ」の答えを提供してください。

レビュー: ```{lamp_review_jp}```
"""
response = get_completion(prompt)
print(response)

```
出力：`いいえ`

この例の中で、お客様は怒っていません。
通常の監督学習を使用する場合、これらの分類器をすべて構築するのは数分では不可能であることに注意してください。皆さんでもこのプロンプトをいくつか変更してみてください。おそらく、お客様が喜んでいるかどうかを尋ねるか、何か抜けている部分があるか尋ね、この照明に関するプロンプトを異なる推論にすることができるかどうかを確認してみてください。

## 顧客レビューから製品と企業名を抽出

次に、顧客レビューからより豊かな情報を抽出しましょう。情報抽出は自然言語処理（NLP）の一部であり、テキストから特定の情報を取り出すことに関連しています。したがって、このプロンプトでは、次の情報を識別するように要求されています：購入アイテムと製造アイテムの企業名。

同様に、オンラインショッピングの電子商取引ウェブサイトの多くのレビューを要約しようとしている場合、これらのレビューにとって、どのアイテムが何で、そのアイテムを誰が製造したのか、ポジティブな感情とネガティブな感情を理解し、特定のアイテムまたは特定の製造業者のポジティブまたはネガティブなトレンドを追跡することは役立つことがあります。

以下の例では、レスポンスをJSONオブジェクトとしてフォーマットするように要求されており、アイテムとブランドがキーとして含まれています。

```python 
prompt = f"""
レビューの文章から以下の項目を特定する：
- レビュアーが購入した商品
- その商品を製造した会社

コメントテキストは3つのバッククォート(`)で区切られています。
「item」と「brand」をキーとするJSONオブジェクトとして、回答をフォーマットしてください。

情報が存在しない場合は、値として「unknown」を使用してください。
回答はできるだけ短くしてください。

レビュー: ```{lamp_review_jp}```
"""
response = get_completion(prompt)
print(response)
```

```json
{
  "item": "美しい寝室用ランプ",
  "brand": "Lumina"
}
```

上記のように、これは寝室のランプであり、ブランドはLuminarです。これを簡単にPythonの辞書にロードし、その出力を他の処理に使用できます。

## 複数のタスクを一度に完了する

上記のすべての情報を抽出するために3つまたは4つのプロンプトを使用しましたが、実際には1つのプロンプトを書いてすべての情報を同時に抽出できます。

```python 
prompt = f"""
レビュー文から以下の項目を抽出する：
- 感情（肯定的か否定的か）
- レビュアーは怒りを表しましたか？ (はいまたはいいえ）
- レビュアーが購入したアイテム
- その商品を作った会社

レビューは3つのバッククォート(`)で区切られています。
「Sentiment」、「Anger」、「Item」、「Brand」をキーとするJSONオブジェクトとして、回答をフォーマットしてください。
情報が存在しない場合は、値として「unknown」を使用してください。
応答はできるだけ短くしてください。
Anger 値をブール値としてフォーマットしてください。

レビュー: ```{lamp_review_jp}```
"""
response = get_completion(prompt)
print(response)
```

出力結果：

```json 
{
  "Sentiment": "positive",
  "Anger": "No",
  "Item": "Lamp",
  "Brand": "Lumina"
}
```

この例では、怒りの値をブール値にフォーマットし、それからJSONを出力するように伝えました。皆さんは異なる変更を試したり、まったく異なるレビューを試したりして、これらのコンテンツを正確に抽出できるかどうかを確認できます。

## トピックの推論

大規模な言語モデルの素晴らしい応用の一つは、トピックの推論です。与えられた長いテキストが、何についてのものなのか？どのようなトピックが含まれているのか？

```python 
story_jp = """
政府が最近実施した調査では、公共部門の従業員に対して、所属部門の満足度を評価するように求めました。調査結果によれば、NASAは最も人気のある部門で、満足度は95％でした。

NASAの従業員であるジョン・スミスは、この発見についてコメントしました。彼は言いました：
「NASAが第一位にランクされたことには驚きません。これは素晴らしい人々と信じられない機会と一緒に働く素晴らしい場所です。この革新的な組織の一員であることを誇りに思っています。」

NASAの管理チームもこの結果を歓迎しており、Tom Johnson責任者は次のように述べています：
「私たちはNASAの従業員が私たちの仕事に満足していることを聞いて嬉しいです。私たちは才能ある、忠実で献身的なチームを持っており、彼らは私たちの目標を達成するために不断の努力をしています。彼らの熱心な仕事が報われるのは素晴らしいことです。」

調査によれば、社会保障管理局の満足度は最も低く、従業員の45％しか仕事に満足していないと回答しました。政府は調査で従業員が提起した問題を解決し、すべての部門の仕事の満足度を向上させる努力をしています。
"""
```

### 5つのトピックの推論

以下は政府職員が彼らの職場に対する感情についての架空の新聞記事です。これから5つの議論中の主題を特定し、それぞれのトピックを1〜2語で説明し、出力をコンマで区切られたリスト形式に整形します。

```python 
prompt = f"""
以下の与えられた文章で論じられている5つのトピックを特定しなさい。
各トピックを1-2語で要約しなさい。
各トピックをコンマで区切って出力しなさい。

文章: ```{story_jp}```
"""
response = get_completion(prompt)
print(response)
```

出力結果：

```json 
1. 公共部門の従業員の満足度調査結果
2. NASAの従業員の満足度
3. NASAの組織の評価
4. NASAの管理チームの反応
5. 社会保障管理局の満足度の低さ
```

### 特定のトピックに関するニュースリマインダーの作成

特定のトピックに関心を持つニュースウェブサイトや類似のものを持っていると仮定します。これらのトピックは、NASA、地方政府、エンジニアリング、従業員満足度、連邦政府などです。特定のニュース記事において、どのトピックがカバーされているかを理解したい場合を考えます。次のプロンプトを使用して、以下のトピックリストの各アイテムが与えられたテキスト内のトピックであるかどうかを確認できます。回答リストを0または1の形式で提供してください。

```python 
prompt = f"""
トピックのリストの各項目が、指定されたテキストのトピックであるかどうかを判断します。
各トピックに 0 または 1 を使用して、答えをリストとして与えます。
トピックリスト: NASA, 地方政府, エンジニアリング, 従業員満足度, 連邦政府

答えの形は以下のようにしてください：
NASA:1

文章: ```{story_jp}```
"""
response = get_completion(prompt)
print(response)
```

出力結果：

```python 
NASA: 1
地方政府: 0
エンジニアリング: 0
従業員満足度: 1
連邦政府: 1
```

この文章はNASAについてです。地方政府やエンジニアリングについてではなく、従業員の満足度と連邦政府についてです。これは機械学習ではZero-Shot学習アルゴリズムと呼ばれることがあります。なぜなら、私たちはそれにラベルのついたトレーニングデータを提供していないからです。プロンプトだけで、それは新聞記事でカバーされているトピックを特定できます。

新聞のアラートを生成したい場合、このニュース処理プロセスを使用することもできます。例えば、私がNASAの仕事を非常に好きであると仮定し、NASAのニュースが出るたびに通知を出力したい場合、このようなシステムを構築できます。

```python 
topic_dict = {i.split(':')[0]: int(i.split(':')[1]) for i in response.split(sep='\n')}
if topic_dict['NASA'] == 1:
    print("リマインド: NASAに関するニュース")
```

出力結果：`リマインド: NASAに関するニュース`

## まとめ

以上は推論に関するすべての内容です。以前は熟練の機械学習エンジニアが数日、数週間かかっていましたが、LLMのAPIを利用してわずか数分で、テキスト推論用の複数のシステムを構築することができます。熟練の機械学習エンジニアでも初心者でも、プロンプトを使用して非常に迅速にかなり複雑な自然言語処理タスクを構築し、始めることができます。

# 応用:UiPath Studio×OpenAIでアマゾン商品レビューから特定情報の推論

次は、UiPath StudioとOpenAIを利用して、以下のサイトからレビューを取得して、これらレビューから「顧客感情」、「顧客が怒っているか」、「効果があるか」、「対応サービスがいいか」などを推論して、最終的にExcelにまとめます。

https://www.amazon.co.jp/%E4%BA%95%E8%97%A4%E6%BC%A2%E6%96%B9%E8%A3%BD%E8%96%AC-DHA1000-%E3%83%87%E3%82%A3%E3%83%BC%E3%82%A8%E3%82%A4%E3%83%81%E3%82%A8%E3%83%BC-%E7%B4%8420%E6%97%A5%E5%88%86-120%E7%B2%92/product-reviews/B00ITGM4G0/ref=cm_cr_dp_d_show_all_btm?ie=UTF8&reviewerType=all_reviews

構成図は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/0b95cad3-131b-fe2c-86fb-c2a8b2cb47e1.png)


プロンプト文と出力の例は以下の通りです。

```python 
レビュー文から以下の項目を抽出する：
- レビュアー感情（「肯定的」又は「否定的」）？
- レビュアーは怒りを表しましたか？ (「はい」又は「いいえ」）
- レビュアーが商品の効果を感じたのか？ (「はい」又は「いいえ」）
- レビュアーが対応サービスに満足しているか？ (「はい」又は「いいえ」）

レビューは3つのバッククォート(`)で区切られています。
「Sentiment」、「Anger」、「Efficacy」、「Service」をキーとするJSONオブジェクトとして、回答してください。
情報が存在しない場合は、値として「unknown」を使用してください。
出力フォーマットがJSONオブジェクトです。

レビュー: ```DHAは本当に必要だと思う。この薬を飲みだしてからケアレスミスが無くなり、効果を実感しています。```
```

出力結果：

```python 
{
  "Sentiment": "肯定的",
  "Anger": "いいえ",
  "Efficacy": "はい",
  "Service": "unknown"
}
```

ワークフローでは、主な処理は以下の通りです。
1. UiPathを利用して、アマゾンサイトから商品レビューデータを抽出して、データテーブルに保存します。【UiPath Studio利用】
1. データテーブルを繰り返して、商品レビューデータをプロンプト文に織り込んで、OpenAIのAPIをコールして、OpenAIより「Sentiment」、「Anger」、「Efficacy」、「Service」をキーとするJSONオブジェクトをもらいます。【OpenAI利用】
1. OpenAIからのJSONオブジェクトを解析して、元のレビューと一緒に一行のデータとしてExcelに保存します。【UiPath Studio利用】

詳細は以下のUiPath Studioのワークフローをご参照ください。
- [【UiPath Workflow】開発者向けのプロンプトエンジニアリング② 中編](https://drive.google.com/drive/folders/1QdRwXInjiPT9QZYj1E_eaANmSLUzcN5v?usp=drive_link)


作成したExcelは以下のイメージです、このデータを可視化して、見栄えの良いレポートを作成することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/e3a3149f-adee-2257-6f4b-a39b1dfe47ef.png)


また、上記顧客のお名前では、色んな国籍が存在していることが分かります、更に国籍も質問のJsonに追加をして、顧客の国籍も分析できるようになるので、ぜひ試してみてください。

# 最後に

上記の応用例のように、Pythonなどのプログラミング言語を知らなくても、UiPath Studioを利用して、簡単にChatGPTを実際の業務に活用できます。
また、UiPathは最後の一マイルの自動化を実現するための強力なツールです。このツールを使用することで、複数のシステムをシームレスにつなげ、業務プロセスの効率化が可能となります。さらに、OpenAIの自然言語処理技術を組み込むことで、RPAがさらに進化します。