catch-img

生成AIでデータクレンジング

さて今回は「生成AIでデータクレンジング」というテーマでお送りします。
例えばアンケートや、商品レビュー、お客様からのクレーム、メール、といったテキストデータを分析したい!と思ったことはないでしょうか? こういったテキストの長文で書かれたデータというのは分析できる形に整形(クレンジング)するのが意外に大変です。
数が少なければ人が読むなり、生成AIに要約させるなりできますが、1000件、1万件あったらどうでしょうか? せめて区分値や数値なら分析が楽になります。

※ここで扱うデータクレンジングとは、長文のテキストデータを数値や文字列といった集計しやすいデータ型に変換する作業を指します。

そこで今回はテキストから指定した要素を抜き出し、数値や区分値に変換する、という処理を生成AIで使ってやってみようという趣旨です。

目次[非表示]

  1. 1.構成の概要
  2. 2.手順
    1. 2.1.Azureで生成AIの作成
      1. 2.1.1.リソースグループ作成
      2. 2.1.2.AOAIリソース作成
      3. 2.1.3.AOAIのネットワーク設定
      4. 2.1.4.生成AIモデルデプロイ
      5. 2.1.5.プレイグラウンドで動作確認
      6. 2.1.6.Pythonコード取得
    2. 2.2.Pythonで生成AIモデルの呼出し
      1. 2.2.1.パッケージのインストール
      2. 2.2.2.Pythonコードの修正
      3. 2.2.3.Pythonから生成AIモデル呼出しのテスト
      4. 2.2.4.生成AIモデル呼出しの関数化
    3. 2.3.Excelファイルのデータクレンジング
      1. 2.3.1.情報抽出プロンプトの作成
      2. 2.3.2.Excelファイルの読み込み
      3. 2.3.3.生成AIで一件づつ処理
      4. 2.3.4.Excelに出力
  3. 3.コストについて
  4. 4.まとめ
  5. 5.CNSについて


構成の概要

こちらのツール・サービスを使ってできるだけ簡単な方法で実装していきます。

  • Excelファイル:アンケートデータが入っている
  • Azure OpenAI:使用する生成AIサービス
  • Python:Excelを読み込み、生成AIを呼び出す

構成はこんな感じの最小限です。


手順

Azureで生成AIの作成

Azureで作成するのはリソースグループ、Azure OpenAIサービス、生成AIモデルの3つです。ここでは以下の接頭辞とリージョンで作っていきますが、この部分はお好きに決めて下さい。

リソースの接頭辞

cns-cn-data-clean

リージョン

Japan East



リソースグループ作成

Azureポータルにログインし、「リソースグループ」を検索して開きます。


「+作成」をクリックします。


サブスクリプションを選択、リソースグループ名を入れて、リージョンにJapan Eastを選び、「確認および作成」をクリックします。


「作成」をクリックします。


はい、リソースグループが出来ました。


リソースグループはAzureのリソース(仮想マシンとか仮想ネットワークとかAOAIとか)を入れておくための箱だと思ってください。1つの箱に入れておけば、終わったらまとめて削除することが出来ます。



AOAIリソース作成

次にAzure OpenAI、略してAOAIを作成していきます。


Azureポータルで「OpenAI」を検索して開きます。


「+作成」をクリックします。


各項目を入力して「次へ」をクリックします。

サブスクリプション

サブスクリプションを選択

リソースグループ

上で作成したリソースグループを選択

リージョン

Japan East を選択

名前

接頭辞+aoai(任意)

価格レベル

Standard S0


次はネットワークですが、後で設定するので「無効」を選んで「次へ」をクリックします。

タグはお好きに付けて、「次へ」をクリックします。

内容を確認して、良ければ「作成」をクリックします。


作成が完了したら、「リソースに移動」をクリックします。


このように作成できました。

​​​​​​​



AOAIのネットワーク設定

AOAIは作成する際にネットワークを無効にしたため、どこからもアクセスできません。
本格的なAOAI環境を構築する場合はちゃんと仮想ネットワークを作りますが、今回は検証目的ですから最低限でいきます。


作成したAOAIのメニューから、リソース管理>ネットワーク を開きます。


許可するアクセス元で「選択したネットワークとプライベートエンドポイント」を選択し、クライアントIPアドレスにチェックを入れます。


変更したら最後に上段の「Save」をクリックして設定を保存します。


これで今AzureポータルにアクセスしているIPアドレスからは、AOAIに接続できるようになります。



生成AIモデルデプロイ

ここで作成したAzure OpenAI(AOAI)は、生成AIモデルを入れるための箱だと思ってください。まだモデルはないので、箱は空っぽです。この中に用意されているモデルを選んでデプロイしていきます。

デプロイとはアプリケーションの機能やサービスをサーバー上に配置・展開し、利用可能な状態にすることです。

使うモデルは現時点(2024/12)で一番お安い「gpt-4o-mini」です。
AOAIのモデルの価格表についてはこちらを参照してください。

Azure OpenAI Service - 価格 | Microsoft Azure



AOAIのメニューから「概要」を開き、「Go to Azure AI Foundry portal」をクリックします。


すると別のタブで Azure AI Foundry(旧: Azure AI Studio) が開きます。
左メニューの「チャット」をクリックして、チャットプレイグラウンドを開きます。


プレイグラウンド=遊び場です。簡単に生成AIモデルを試すことが出来る場所です。
まだモデルはありませんので、早速作ってみましょう。
「+新しいデプロイの作成」をクリックして「基本モデルから」を選択します。


デプロイするモデルが選べますので、「gpt-4o-mini」を選択して「確認」をクリックします。


デプロイ名は、モデルと同じ「gpt-4o-mini」のまま、デプロイの種類は「グローバル標準」となっていることを確認して「デプロイ」をクリックします。

※ここは特に注意が必要な操作です。デプロイ種類が「グローバル標準」なら従量課金ですが、「Provisioned-Managed」を選ぶと時間課金となり、高額な費用が発生します。
※容量のTPMは10K、つまり1分あたり10,000トークンまで処理できます。


デプロイが完了すると、このようにチャットプレイグラウンドにデプロイしたモデルが表示されます。



プレイグラウンドで動作確認

では少し動かしてみましょう。

プロンプトに「どんな色が好きですか?」と入れてENTERを押します。


はい、このように答えてくれます。一般的な回答ですね。


プレイグラウンドの左側をスクロールして「パラメータ」を展開すると、いろいろなパラメータを調整して動きを確認することが出来ます。


パラメータの説明は長くなるのでまた今度。今回はすべてデフォルトで進めます。



Pythonコード取得

プレイグラウンドの「コードの表示」をクリックします。


するとこのように、生成AIモデルを呼び出すためのサンプルコードが表示されます。
今回はキー認証でアクセスするので、「キー認証」タブに切り替えます。


こちらがキー認証でアクセスする場合のPythonコードです。
コピーボタンをクリックしてローカル端末のPythonファイルにコピーしておいて下さい。



この画面を下までスクロールすると、エンドポイントとAPIキーが表示されています。
エンドポイントはPythonコードに記載されているので、APIキーだけコピーして下さい。



Pythonで生成AIモデルの呼出し

次にPython側の準備です。
VSCodeを使っていますが、Pythonを実行できる環境であれば何でも良いです。

プレイグラウンドでコピーしたPythonコードを貼り付けましょう。

ここから少し修正をしていきます。


パッケージのインストール

Pythonコードの先頭部分でimportしているライブラリをインストールします。


osとbase64は標準ライブラリなのでインストール不要ですが、openaiは外部ライブラリですのでインストールが必要です。また、この後のExcelファイルの読み込みで使うpandasも一緒にインストールしておきましょう。

コマンドラインで以下を実行します。

pip install pandas openai


Pythonコードの修正

インポートの次に、3つの環境変数を読みこんでいます。

Endpoint

AOAIにアクセスするURL

Deployment

生成AIモデルのデプロイ名(手順「生成AIモデルデプロイ 」で指定したプロイ名)

Subscription_key

プレイグラウンドのサンプルコード画面でコピーしたAPIキー

通常、これらの情報は別の場所(環境変数ファイルなど)に設定して、プログラムには直接書かないというのがセオリーです。ですが今回は最小構成で動作を確認して、検証後にこの環境は削除しますので、REPLACE_WITH_YOUR_KEY_VALUE_HERE の部分をAPIキーに書き替えて動かします。

次はエンドポイントとAPIキーを使ってクライアントの初期化、これはそのままで良いです。
18-19行目は画像認識を使う場合のコードですのでコメントアウトしておきます。


次のこの部分が、Jsonフォーマットでプロンプトを指定している部分です。
ここには、先ほどのプレイグラウンドでのやり取りが記録されています。

System

これは生成AIに与える基本設定です

User

この部分が生成AIに投げかける入力文、プロンプトです

Assistant

プロンプトに対する生成AIの回答です

まずAssistantの部分は不要なので削除します。Userの部分はあとで書き換えます。

プログラムの最後が生成AIモデルを呼び出す部分です。
いろいろなパラメータが指定してありますが、これはプレイグラウンドで使用していたパラメータを引き継いでいます。


Pythonから生成AIモデル呼出しのテスト

ではプログラムを実行してみましょう。

そのまま実行すると、このようにJSONフォーマットの回答が表示されます。
ちゃんと回答が入っていますね。先ほどとは違う答えです。


もう少し下にスクロールすると、使ったトークン数も確認できます。
(トークン数:生成AIの処理量。英語なら1単語≒1トークン。日本語だと1文字≒1~2トークン。AOAIのモデル利用料金は100万トークン当たりいくらの設定)


コードの真ん中あたり、37行目のテキストが生成AIに投げているプロンプトです。
違う文章に変えて実行してみましょう。


プロンプトに合った回答が返ってきます。


生成AIモデル呼出しの関数化

このPythonコードのうち、プロンプト作成と生成AI呼出の部分を、繰り返し呼び出せるように関数化します。変更箇所は以下の3か所です。

  • 先頭にdef文を書いて、以降をインデント
  • プロンプトのテキストを引数に置き換え
  • 最後のprint()を、回答からテキストだけ取り出してreturnに変える


では別の文章で関数を呼び出してテストします。


はい、応答の文章だけが表示されました。



Excelファイルのデータクレンジング

ここまではPythonでAOAIの生成AIモデルの呼出しでした。
長くなりましたが、やりたいことはExcelデータのクレンジングです。
まずはサンプルデータを作りましょう。こんなプロンプトでChatGPT-4oにお願いしました。


プロンプト:

あなたは新商品の営業担当者です。
新商品に対する評価コメントの分析をしたいと思っています。
分析のテスト用に評価コメントのサンプルデータを作成します。

以下の#制約条件 に沿って、#新商品 に対するサンプルデータを #出力形式 の表形式で作成して下さい。

#制約条件
*以下の#新商品 に対する評価コメントを考えて下さい。
*以下の#出力形式 に沿った表形式で出力して下さい。
*年齢、性別、職業はありそうなペルソナを想定して下さい。
*評価コメントは自由に、そのペルソナがいいそうなことを想像して下さい。
*ネガティブな意見、ポジティブな意見、ここはいいけど、ここが悪い、といった多様な意見を入れて下さい。
*評価コメントでは、値段や味、価格、デザインなど想像を広げていろいろな点に触れて下さい。
*評価コメントは最低500文字以上で、件数は10件作成して下さい。

#新商品
強炭酸柚子コーラ
*刺激強めの強炭酸。
*暑い日にすっきりできて塩分補給にもなる。
*強い柚子の風味とさっぱり感。

#出力形式
|年齢|性別|職業|評価コメント|


500文字以上と指定しても、100文字程度のコメントしか出してくれなかったので、「もっと長くして」と指示して出来たのがこちらのサンプルデータです。

input.xlsx:

評価コメントの文字数を数えてみましたが、「長くして」と指定しても300文字程度ですね。件数はちゃんと10件あります。

ちなみにAPI呼出しをループ処理して1件づつ作らせると、似たようなコメントが出てきました。このためAPI呼出しではなく、ChatGPTにペタ張りで10件を一度に作成しました。テストデータとしては十分でしょう。


情報抽出プロンプトの作成

サンプルデータのコメントから、何を取り出したいかを決めて、ベースとなるプロンプトを作成します。

プロンプトは生成AIへの命令文です。何をしてほしいか、何を出力したいかを具体的に記述します。今回はコメントテキストから内容を読み取って、分析しやすい数値で出力してもらうために、このようなプロンプトを用意しました。

このベースプロンプトに、評価コメントを繋げて生成AIに投げるわけです。
汎用性を考えるなら、このベースプロンプトは別のテキストファイルに保存して、プログラムで読み込むようにしますが、今回は最小構成なのでコードの中に直接書いています。


Excelファイルの読み込み

先ほどインストールしておいたpandasを使って、Excelファイルを読み込みます。
PandasのDataFrameはExcelのような表形式データを扱うためのデータタイプです。

ファイルパスを指定して、read_excel()でExcelファイルを読み込み、先頭の5行を表示します。(確認のための表示なので、Print()はあとでコメントアウトします。)

実行すると、ちゃんと読みこめているようです。
右端の数字はExcelファイルで確認のために追加した文字数の列ですね。


生成AIで一件づつ処理

for文を使ってDataFrameから1行取り出し、ベースプロンプトにコメントテキストを連結して生成AIに送っています。生成AIの回答は、空のリストに追加していき、ループを抜けたら、結果をDataFrameに追加します。


では実行してDataFrameの結果列を確認してみましょう。
「Processing row:」は処理中のログです。ちゃんと10件処理されたようです。
結果列には味、価格、デザイン、総合、改善点、と指定した要素が抽出出来ているようです。

ただし、改行入りの文字列で格納されているので、ひと手間入れて分割しておきましょう。

結果列を改行ごとに分割(Split)して、正規表現で各列の列名を取得します。「価格:」といったプレフィックスも不要なので削除します。そして、これを元のDataFrameに追加します。


実行するとこのように要素が取り出されています。分析しやすくなりました。


Excelに出力

最後にDataFrameをExcelに出力して結果を確認してみましょう。


出力されたExcelファイルがこちらです。

output.xlsx:

列の幅などは少し見やすくフォーマット調整していますが、データとしては出力されたそのままです。G列の結果が生成AIの回答、H~L列が分割して取り出した値です。

このように、評価コメントのテキストから、ベースプロンプトで指定した要素が数値や文字列として取り出せました。長文テキストだと読むしかなかった内容から、数値や区分値に変換することで、格段に集計・分析がしやすくなりました。

※ただし、生成AIが判断した数値や文字列が正しいものか、という検証は別途必要です。


コストについて

この仕組みでデータクレンジングするのに費用ってどのくらいかかるんだろう?

はい、そこ気になりますよね。今回のサンプルデータは小さいので大したコストはかかりませんが、目安として実業務で使った場合のコストを参考として載せておきます。

参考値

項目

元データ

データ件数
約1000件

1件当たり文字数
1000~2000文字
日本語
プロンプト

ベースプロンプト文字数
540文字

抽出要素数
7項目

文字数

送信文字数
約220万文字
Python→AOAI
受信文字数
約14万文字
AOAI→Python
処理時間

処理時間
3時間弱

1件当たり処理時間

約9秒

費用


生成AIモデル

gpt-4o-mini

コスト

47円

1件当たりコスト

0.04円

生成AIモデルは現時点(2024/12)で一番お安いgpt-4o-miniを使い、2000文字程度のテキストから7つの要素を抽出するプロンプトで、約1000件を処理した場合、費用は47円でした。処理時間が3時間もかかっているのは、1分あたり10Kトークンという容量制限があり、連続でリクエストを投げても応答が待たされるためです。

生成AIモデルの利用料金はトークン単位で課金され、入力と出力で別料金(出力の方が高い)となっています。日本語は1文字≒1トークン前後と言われていますが、これも文章内の文字によって変わります。比較的長め(2000文字)の日本語テキストを1000件処理して50円なら、充分データクレンジングに使えると思いますが、いかがでしょうか?

もちろん、デプロイするモデルを変えたり、容量を上げて処理速度を上げたりする場合は費用が高くなりますので、費用は最低限の構成で使用した場合の参考値と考えて下さい。また、モデルの選択や設定を間違えると高額の料金が発生することもありますので、専門家に任せたいということでしたら、弊社までご相談下さい。


まとめ

今回はAzure OpenAIサービスを構築してPythonから呼び出し、Excelのテキストデータをクレンジングするところまでを行いました。今回使ったプロンプトでは、評価コメントから味、価格、デザインの点数を付けて、改善点を抽出しました。ベースプロンプトを変えれば、他の要素を抽出することもできます。

また、別の使い方として、Excelに入っている長いテキストを行ごとに要約させるとか、Excelに書かれた各行のテーマに沿って説明文を書かせる、などプロンプト次第でいろいろな応用が可能です。

最後に今回作成したPythonコードを載せておきます。エンドポイントやAPIキーなどの部分はご自分で構築した環境の値に書き換えてお使いください。(Azure AI Foundryのプレイグラウンドで確認できます)

import os  
import base64
from openai import AzureOpenAI  

endpoint = os.getenv("ENDPOINT_URL", "<ここにエンドポイントURL>")  
deployment = os.getenv("DEPLOYMENT_NAME", "<ここにデプロイ名>")  
subscription_key = os.getenv("AZURE_OPENAI_API_KEY", "<ここにAPIキー>")  

# キーベースの認証を使用して Azure OpenAI クライアントを初期化する    
client = AzureOpenAI(  
    azure_endpoint=endpoint,  
    api_key=subscription_key,  
    api_version="<ここにAPIバージョン>",  
)
    
    
#IMAGE_PATH = "YOUR_IMAGE_PATH"
# encoded_image = base64.b64encode(open(IMAGE_PATH, 'rb').read()).decode('ascii')

#繰り返し呼び出せるように関数化
def get_aoai_gpt(text):

    #チャット プロンプトを準備する 
    chat_prompt = [
        {
            "role": "system",
            "content": [
                {
                    "type": "text",
                    "text": "情報を見つけるのに役立つ AI アシスタントです。"
                }
            ]
        },
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": text  # 引数をプロンプトに渡す
                }
            ]
        },
    ] 
        
    # 音声認識が有効になっている場合は音声結果を含める  
    messages = chat_prompt  
        
    # 入力候補を生成する  
    completion = client.chat.completions.create(  
        model=deployment,  
        messages=messages,  
        max_tokens=800,  
        temperature=0.7,  
        top_p=0.95,  
        frequency_penalty=0,  
        presence_penalty=0,  
        stop=None,  
        stream=False
    )

    # print(completion.to_json())  
    # 応答からテキストだけ取り出して返す
    return completion.choices[0].message.content 

# 関数テスト
#print(get_aoai_gpt("月がきれいですね"))

base_prompt ="""
以下の#評価コメント を良く読み、#制約条件 に従って、#出力形式 に指定した情報を抽出して下さい。

#出力形式
味:
価格:
デザイン:
総合:
改善点:

#制約条件
*味、価格、デザインの3項目に対して、最低1点、最高10点の10点満点で評価して下さい。
*総合には、味、価格、デザインの合計点を入れて下さい。
*改善点には、評価コメントで指摘された改善点を端的に20文字以内で記載して下さい。

#評価コメント

"""

# PANDASをインポート
import pandas as pd

# Excelファイルのパス
excel_file_path = r'.\data\input.xlsx'

# pandasでExcelファイルを読み込む
df = pd.read_excel(excel_file_path)

# ファイルの確認(あとでコメントアウトする)
# print(df.head(5))

# 空リスト準備
responses = [] 

# DataFrameの各行を処理してChatGPTのレスポンスを取得
for index, row in df.iterrows():
    # 処理中のログ表示
    print(f"Processing row: {index}") 
    # ベースプロンプトに評価コメントを連結
    prompt = base_prompt + row['評価コメント']
    # 生成AIモデルにリクエストを送信
    response = get_aoai_gpt(prompt)
    # 結果をリストに追加  
    responses.append(response) 

# レスポンスをDataFrameに追加
df['結果'] = responses

# 結果の確認(あとでコメントアウトする)
# print(df['結果'].head(5))

# 結果列を分割
split_data = df['結果'].str.split('\n', expand=True)

# 列名を文字列から抽出
column_names = split_data.iloc[0].str.extract(r'^(\S+):')[0].tolist()
split_data.columns = column_names

# 不要なプレフィックスを削除
for col in split_data.columns:
    split_data[col] = split_data[col].str.replace(r'^\S+:', '', regex=True)

# 分割した列を元のDataFrameに追加
df = pd.concat([df, split_data], axis=1)

# 分割の確認(あとでコメントアウトする)
# print(df.iloc[:5, 7:])

# Excelファイルに出力
df.to_excel(r'./data/output.xlsx', index=False) 


CNSについて

CNSではAIをビジネスに活用するコンサルティング、AIを活用したデータ分析・データ利活用などを支援しています。

AIの活用にご興味のある方は、是非お気軽にお問合せ下さい。





ページトップへ戻る