PythonとAzure OpenAIを使って、Excelのレコードを読みやすくする方法（例：ServiceNowのチケットを読みやすくする場合）

## 目次

1. はじめに
2. なぜこのスクリプトが必要なのか？
3. 主な機能
4. 使用するテクノロジー
5. インストールとセットアップ
6. 使い方
7. 実行例と結果
8. まとめ

---

## 1. はじめに

ServiceNowの運用者にとって、毎日のチケット管理はとても大変です。1つずつのレコードは長くて無駄なフィールドもあり見づらいです。また、一覧であるリスト表示も列が多くて1画面に収まらないです。そこで、PythonとAzure OpenAIを使って読みやすくする方法を考えました。ServiceNowに限らず、1行目にヘッダーがあり、2行目移行にデータがあるExcelの表であればどんなものでも解析できるように汎用性を持たせています。ぜひご参考頂きたいです。

## 2. なぜこのスクリプトが必要なのか？

この先、ヘルプデスク向けのAIはたくさんリリースされて、利用者向けの自動回答などは充実してくると思います。AIでは対応ができなかったチケットの管理は今後も残るので、たくさんのチケットに対し「つまり、いま何が起きているの？」を素早く把握するための支援になればいいと思い、作成しました。

## 3. 主な機能

１．Pythonの実行時に引数としてExcelのファイルパスを指定して実行します。
２．Azure Open AIに問い合わせする命令は、予め「system_content.txt」に書いておきます。
３．実行すると、Excelの内容を読み込み、1行ずつをAzure Open AIに問い合わせします。
４．結果はExcelと同じディレクトリに、Excelのファイル名と同じテキストファイルが生成されます。


- **データ解析**: Excelに記録されたチケット情報を一括解析
- **柔軟なカスタマイズ**: `system_content.txt`で解析内容を調整可能
- **時系列の対応状況**: どれだけ放置されているか、次に何をすべきかが一目でわかる
- **ログ出力**: 処理結果をリアルタイムで確認

## 4. 使用するテクノロジー

- Python 3.x
- Azure OpenAI
- Excel

## 5. インストールとセットアップ

必要なライブラリとAPIキーをセットアップしましょう。

```bash
pip install openai
pip install pandas
```


[Record_analyze.py]
```bash
import os
import pandas as pd
import openai
from datetime import datetime
import sys

# Azure OpenAIの設定
openai.api_type = "azure"
openai.api_base = "https://YOUR_OWN_SUBDOMAIN.openai.azure.com/"  # <-- YOUR_OWN_SUBDOMAINを適切なものに置き換えてください
openai.api_version = "2023-07-01-preview"
openai.api_key = "YOUR API KEY"  # <-- YOUR API KEYを適切なAPIキーに置き換えてください

# Excelファイルの読み取り
def read_excel_file(file_path):
    df = pd.read_excel(file_path)
    return df

# Azure OpenAIに問い合わせる
def query_azure_openai(row_data):
    current_date_str = datetime.now().strftime("%Y-%m-%d")
    
    with open("system_content.txt", "r", encoding="utf-8") as f:
        system_content = f.read().strip()
    
    system_content_with_date = f"今日の日付は：{current_date_str}です\n{system_content}"

    messages = [
        {"role": "system", "content": system_content_with_date},
        {"role": "user", "content": row_data}
    ]
    
    response = openai.ChatCompletion.create(
        engine="myAzureOoenAI_35_16k",  # <-- エンジン名を適切なものに置き換えてください
        messages=messages,
        temperature=0.7,
        max_tokens=8000,
        top_p=0.95,
        frequency_penalty=0,
        presence_penalty=0,
        stop=None
    )

    return response.choices[0].message['content'].strip()

# メイン処理
if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python Record_analyze.py <Excel File Path>")
        sys.exit(1)
    
    excel_file_path = sys.argv[1]
    df = read_excel_file(excel_file_path)
    
    output_file_name = os.path.basename(excel_file_path).split('.')[0] + '.txt'
    output_directory = os.path.dirname(excel_file_path)
    output_file_path = os.path.join(output_directory, output_file_name)
    
    if os.path.exists(output_file_path):
        os.remove(output_file_path)
    
    for index, row in df.iterrows():
        row_data_list = []
        
        for column in df.columns:
            column_name = column
            data = row[column]
            if pd.isna(data):
                continue
            row_data_list.append(f"{column_name}: {data}")
        
        row_data_str = ', '.join(row_data_list)
        
        if row_data_str:
            response_text = query_azure_openai(row_data_str)
            
            with open(output_file_path, "a", encoding="utf-8") as f:
                f.write(f"----------------------------------------------------------------\n\n")
                f.write(f"{response_text}\n\n\n")

```
 



[system_content.txt]

```bash
あなたは、ServiceNowの運用のプロです。
レコードの内容を読み、以下の通りに日本語でレポートしてください。

### 基本情報###
　-番号
　-作成日
　-更新日
　-作成者
　-対応者
　-ステータス
　-チケットの説明
　-チケットの内容

### 対応状況 / 結果 ###
　-時系列の対応状況
　-現在の日付から何日放置されているか
　-次に対応するべきこと

### 難易度、リスク ###
　-対応のリスクや難易度の説明
　
　
```


## 6. 使い方

基本的には、コマンドラインからこのように実行します。

```bash
python Record_analyze.py "yourfile.xlsx"
```


## 7. 実行例と結果
3件の変更管理のレコードを解析した結果です。
ServiceNowのPDIにあったサンプルのレコードを使用しています。

```bash
### 基本情報###
　-番号：CHG0040007
　-作成日：2016-08-10 09:37:13
　-更新日：2016-08-10 09:37:13
　-作成者：System Administrator
　-対応者：未割り当て
　-ステータス：New
　-チケットの説明：ApplicationServerPeopleSoftの再起動を行ってください
　-チケットの内容：緊急のタイプで、ApplicationServerPeopleSoftの再起動が必要です。承認済みで、ITSM Engineeringグループに割り当てられています。

### 対応状況 / 結果 ###
　-時系列の対応状況：未割り当て
　-現在の日付から何日放置されているか：放置されてから約7年
　-次に対応するべきこと：チケットを担当者に割り当てる

### 難易度、リスク ###
　-対応のリスクや難易度の説明：リスクはModerate（中程度）、難易度はLow（低）です。再起動のタスクは比較的簡単であり、影響も低いと考えられます。


----------------------------------------------------------------

基本情報：
- 番号：CHG0040006
- 作成日：2016-08-10
- 更新日：2016-08-10
- 作成者：System Administrator
- 対応者：なし
- ステータス：スケジュール済み
- チケットの説明：データセンターキャビネットにネットワークスイッチを追加する
- チケットの内容：この標準変更テンプレートでは、データセンターキャビネットに新しいネットワークスイッチを追加する手順が記載されています。

対応状況 / 結果：
- 時系列の対応状況：チケットは作成され、承認されていますが、まだ対応者が割り当てられていません。
- 現在の日付から何日放置されているか：チケットは作成日から放置されていません。
- 次に対応するべきこと：チケットに対応する担当者を割り当てる必要があります。

難易度、リスク：
- 対応のリスクや難易度の説明：この変更には中程度のリスクがあります。


----------------------------------------------------------------

### 基本情報 ###
- 番号：CHG0040005
- 作成日：2016-08-10
- 更新日：2016-08-10
- 作成者：System Administrator
- 対応者：なし
- ステータス：Scheduled
- チケットの説明：データセンターキャビネットにネットワークスイッチを追加する
- チケットの内容：この標準変更テンプレートでは、データセンターキャビネットに新しいネットワークスイッチを追加する手順が記載されています。

### 対応状況 / 結果 ###
- 時系列の対応状況：チケットが作成され、承認が得られた後、対応者がまだ割り当てられていません。
- 現在の日付から何日放置されているか：チケットは作成日から放置されていないため、0日放置されています。
- 次に対応するべきこと：対応者を割り当てて実際の作業を開始する必要があります。

### 難易度、リスク ###
- 対応のリスクや難易度の説明：この変更はリスクが中程度であり、難易度は中程度です。ネットワークスイッチの追加手順が明確に記載されており、標準的な作業となっています。ただし、物理的な作業となるため、注意が必要です。

```

## 8. まとめ

サンプルはServiceNowのレコードですが、1行目がヘッダーになっていて2行目移行にデータがあれば何でも解析ができるようになっています。

以上が、PythonとAzure OpenAIを使ったExcelの自動解析に関する記事です。お役に立てばと思います。