はじめに
Excelに吐き出されていたチャット履歴のデータを、生成AIに食べさせてみたりするために一度CosmosDBにまるっとインポートしたときの個人的なメモ
中身のデータがこんな感じのExcelファイルだったので、python使ってJSONに変換して突っ込みました
ChatID | type | Createdon | MessageText |
---|---|---|---|
a0001 | user | 2024-04-04 13:56:13 | ○○システムのライセンスを付与していただきたいです |
a0001 | supporter | 2024-04-04 14:20:53 | こちらの事前の手順を完了させたのち、このチャットでご連絡ください。URL:XXXXXXXX |
a0001 | user | 2024-04-05 08:48:59 | 資料ありがとうございます。 |
a0001 | user | 2024-04-08 09:45:10 | 事前の作業完了しました。 |
a0001 | supporter | 2024-04-08 09:45:10 | 確認が取れましたので、これからライセンスを付与いたします。 |
a0001 | supporter | 2024-04-08 10:07:21 | ライセンスの付与が完了しました。Welcomeメールが配信されているかと思いますのでそちらからご利用ください |
a0002 | user | 2024-04-08 15:29:34 | 機種変更した際に二要素認証の設定を移すのを忘れました。一度リセットお願いします |
a0002 | supporter | 2024-04-08 15:32:26 | 解除しました。再度登録をお願いします |
a0002 | user | 2024-04-08 15:48:07 | 新しい機種で設定できました。ありがとうございました。 |
CosmosDB のリソース作る
お試しなので、AZは無効、容量はServerlessにして作っておきます
基本的にデフォルトで作成しますが、バックアップはContinuous (7 days)にしておきます
コンテナを作る
NewContainerから新しくコンテナを作成する(ついでにDBも作る
- Database Id:ChatHistoryDB
- ContainerId:ChatData
- PartitionKey:chatId
Excelファイル開いてインポートする関数を作成する
使うライブラリ
requirements.txt
pandas
openpyxl
azure-cosmos
データは一連の会話がChatID単位にまとまってるようだったので、この単位にデータを入れていくように今回はしました。
app.py
import pandas as pd
from azure.cosmos import CosmosClient, PartitionKey
import json
# Cosmos DBの接続情報
COSMOS_ENDPOINT = "<your endpoint>"
COSMOS_KEY = "<your Key>"
DATABASE_NAME = "ChatHistoryDB" #作成したDBのID
CONTAINER_NAME = "ChatData" #作成したコンテナのID
PARTITION_KEY= "/chatId" #作成したパーティションのキー
# Cosmos DBクライアントの初期化
client = CosmosClient(COSMOS_ENDPOINT, COSMOS_KEY)
database = client.create_database_if_not_exists(id=DATABASE_NAME)
container = database.create_container_if_not_exists(
id=CONTAINER_NAME,
partition_key=PartitionKey(path=PARTITION_KEY),
offer_throughput=400
)
# Excelファイルの読み込み
file_path = r"C:\work\user-chat-history.xlsx"
sheet_name = "Message data"
df = pd.read_excel(file_path, sheet_name=sheet_name)
# データをチャットID単位にグループ化
grouped = df.groupby('chatId')
# グループごとにデータをCosmos DBに格納
# デフォルトでID列ができてしまうので、chatIdと同じ値を入れておく
for chat_id, group in grouped:
chat_data = {
"id": chat_id,
"chatId": chat_id,
"messages": []
}
print(chat_id)
for index, row in group.iterrows():
message = {
"type": row['type'],
"UserID": row['UserID'],
"Createdon": row['Createdon'],
"MessageText": row['MessageText']
}
chat_data["messages"].append(message)
# データの挿入
#idが重複した場合は上書きする
container.upsert_item(body=chat_data)
print("データのインポートが完了しました。")
これでCosmosDBにインポートできた