前回の記事では、SAPテーブルの項目の情報をS/4HANAなどのSAPシステムから一括で取得し、Excel上に一覧表示するExcelマクロ(VBA)を紹介した。
今回は、Excel上に一覧表示されているSAPテーブル項目の「解説文」を、生成AIに書いてもらうためのExcelマクロを紹介する。
SAPテーブルの項目一覧表(Excelブックファイル)は、前回の記事で作成したものを使用する。ただし、テーブル項目が一覧表示されているExcelワークシートであれば、本記事で紹介するExcelマクロは基本的に利用可能である。
SAPテーブル項目の解説を生成AIに依頼する
SAPテーブル項目の解説を依頼するプロンプト
以下は、Excelワークシート上に表示されている項目の、解説を生成AI(ChatGPT)に依頼するためのプロンプトである。
解説の依頼は、ワークシート上の表を一括で送るのではなく、項目ごとにひとつずつ行う。その理由は、表の件数が多い場合、生成AIがトークン不足により処理を途中で打ち切ったり、満足のいく解説を返せなくなったりすることがあるからである。
#依頼 あなたはSAP ERPおよびSAP S/4HANAの専門家です。 SAP S/4HANAのテーブル{#テーブル}の項目{#項目}の意味と使い方を解説し、回答として返してください。 {#ルール}は必ず守ってください。 #テーブル MARA #項目 MATNR #ルール -回答は、項目の解説文のみを出力すること。 -解説文は日本語で、100字以内で書くこと。 -回答は項目の解説文のみを出力すること。 -解説文の主語に、テーブル名や項目目など技術名称は含めないこと。 -解説文は体言止めを意識し、簡潔な文章とすること。 -ハルシネーションは出さないこと。
上記のプロンプトをChatGPTで実行すると、次のような回答を得られる。なお、使用したAIモデルは ChatGPT 4o である。
初心者向けに、生成AI用のプロンプトの書き方を解説した記事は以下。
ExcelからChatGPTを利用するには
OpenAI API
OpenAI APIとは、ChatGPTをプログラムなどチャット以外から利用するためのWeb APIのことである。ChatGPTの運営母体であるOpenAI社が公開している。
機能面で見れば(大雑把に言えば)、
OpenAI API ≒ ChatGPT
ということだ。
OpenAI APIはプログラムから使うことを前提にしている。もちろん、Excelマクロ(VBA)から使うことも可能。
今回は、Excelのワークシートに表示されているSAPテーブルの項目の解説をChatGPTに依頼し、解説文を取得する。それを自動化する方法として、ExcelマクロからOpenAI APIを呼び出す。
ExcelマクロでChatGPT(OpenAI API)を呼び出す方法を解説した記事は以下。マクロを含むExcelファイルはダウンロード可能なので、活用および参考にしていただきたい。
SAPテーブル項目の解説を生成AIに書かせるマクロ
OpenAI APIを利用するための準備
本記事で紹介するExcelでは、OpenAI APIを利用するための設定情報は、ワークシート「Parameter」に設定するようにしている。「Parameter」には以下の設定項目を用意してあるので、あらかじめ設定しておく。
API Key
OpenAI APIを利用するには、「API Key」が必要だ。APIキーを所有していない場合は、OpenAIの公式サイトから入手する。
API Model
利用するGPTモデルの文字列を入力する。利用可能なモデルについては、OpenAIの公式サイト「Models」で公開されている情報を参照してほしい。
本マクロでは、デフォルトモデルは「GPT 4o mini」(gpt-4o-mini)としている。 GPT 4o mini は GPT 4o の軽量モデルであり、GPT 4oよりも料金が安価で応答速度に優れる。今回は項目単位(Excelの行単位)に処理を行い、且つ、文字数を下の「回答の文字数」で制限をかけるため、GPT 4o miniでも十分な結果を得られるはずだ。
GPT 4o と GPT 4o mini との比較を、表としてまとめておく。
項目 | GPT-4o | GPT-4o mini |
---|---|---|
特徴 | 高性能モデル | 軽量化されたモデル |
主な用途 | 複雑なタスクや高度な言語処理に適している | リアルタイム処理やコスト重視のタスクに適している |
応答速度 | 高速(GPT-4 Turbo比2倍速) | GPT-4oの約2倍速 |
コスト | 標準 | 低コスト(約1/30の料金) |
多言語対応 | 可能 | 可能(ただしGPT-4oより若干劣る) |
マルチモーダル入力 | 対応 | 非対応 |
料金(参考) | 未公開(比較的高額) | 入力100万トークンあたり0.15ドル 出力100万トークンあたり0.60ドル |
出力の品質 | 高品質 | 若干劣る |
回答の文字数
OpenAIのパラメータではないが、OpenAIが作成する解説文の文字数の上限を設定する。既定値は100字である。
マクロでは、取得した文字数はGPTクラスの 変数 NUM_CHAR_ANS にセットし、外部から参照できるようにしておく。
実装したExcelマクロ(VBA)
上述のプロンプトを、Excelから呼び出すマクロ(VBA)は以下である。
ModuleGPT
メイン処理を行うプロシージャ「GetDescriptionWithGPT」を収めたモジュール。
「GetDescriptionWithGPT」は、Excelワークシート「Field List」に表示されているテーブルの項目単位にループ処理を行う。
ループ内では、項目名を変数としてプロンプトにセットし、OpenAI APIに問い合わせを行う。問い合わせの結果、解説文を取得できた場合はExceワークlシート上に表示する、という処理を行単位に繰り返す。
なお、GetDescriptionWithGPTは、「Field List」上に配置されたボタン「OpenAI APIによる項目解説」から呼び出される。
Option Explicit Option Compare Text 'GPTと通信するクラス Private GPT As ClassGPT '------------------------------------------------------------- ' SAPシステムのテーブル名と項目名をOpenAIに送信し、解説文をワークシートに表示するプロシージャ '------------------------------------------------------------- Public Sub GetDescriptionWithGPT() On Error GoTo Err_GetDescriptionWithGPT Dim wsFL As Worksheet 'ワークシート Dim Row As Integer 'Excelの行番号 Dim strField As String Dim strPromptBase As String '質問文 Dim strPrompt As String '質問文 Dim strAnswer As String 'GPTの回答 Dim strMessage As String 'メッセージ Dim COL_Description As Integer Dim COL_Message As Integer '項目名の列番号 Const COL_FIELD As Integer = 2 'OpenAIに送る「役割」 Const strSpecialty As String = "SAP ERPおよびSAP S/4HANAの専門家" 'GPTと通信するクラスの生成 Set GPT = New ClassGPT If GPT.OpenAIAPIkey = "" Then 'OpenAI API キーが空白の時、中断 Set GPT = Nothing Worksheets("Parameter").Activate Worksheets("Parameter").Range("APIKEY").Select MsgBox "APIキーを設定してください。", vbExclamation Exit Sub End If 'ワークシート"Field List"を変数に格納 Set wsFL = Worksheets("Field List") '解説を表示する列番号 COL_Description = wsFL.Range("Description").Column 'エラー発生時のメッセージを表示する列番号 COL_Message = wsFL.Cells(ROW_START, 1).SpecialCells(xlLastCell).Column + 1 'プロンプトの生成 strPromptBase = PreparePrompt(Trim(wsFL.Range("TABLE_NAME"))) '最終行まで繰り返し処理(ループ処理) For Row = ROW_START To wsFL.Cells(ROW_START, 1).SpecialCells(xlLastCell).Row '項目名の取得 strField = Trim(wsFL.Cells(Row, COL_FIELD)) '項目名が空白でない、且つ、".INCLU"以外を処理する If strField <> "" And InStr(strField, ".INCLU") = 0 Then 'プロンプトに項目名をセット strPrompt = Replace(strPromptBase, "{#項目}", strField) 'GPTのAPIにプロンプトを送信 If GPT.GptAPI(strSpecialty, strPrompt, strAnswer, strMessage) = 0 Then '正常終了、且つエラーメッセージ無しの時 If strMessage = "" Then 'GPTからの解説文を出力 wsFL.Cells(Row, COL_Description).Value = strAnswer Else 'メッセージ有りの時、メッセージを出力 wsFL.Cells(Row, COL_Message).Value = strMessage End If ElseIf strMessage <> "" Then 'エラーメッセージ有りの時、エラーメッセージを出力 wsFL.Cells(Row, COL_Message).Value = strMessage End If End If Next 'クラスの開放 Set GPT = Nothing MsgBox "全ての質問を処理しました。", vbInformation Exit Sub 'エラー発生時 Err_GetDescriptionWithGPT: MsgBox Err.Description, vbCritical Set GPT = Nothing End Sub '------------------------------------------------------------- ' OpenAIに送信するプロンプトの準備 ' Table : テーブル名(技術名称) ' PreparePrompt(戻り値): プロンプトとなる文字列 '------------------------------------------------------------- Private Function PreparePrompt(ByVal Table As String) As String PreparePrompt = "#依頼" & vbLf 'PreparePrompt = PreparePrompt & "あなたはSAP ERPおよびSAP S/4HANAの専門家です。" & vbLf PreparePrompt = PreparePrompt & "SAP S/4HANAのテーブル" & Table & "の項目{#項目}の意味と使い方を解説し、回答として返してください。" & vbLf PreparePrompt = PreparePrompt & "{#ルール}は必ず守ってください。" & vbLf PreparePrompt = PreparePrompt & "#ルール" & vbLf PreparePrompt = PreparePrompt & "-解説文は日本語で、" & CStr(GPT.NUM_CHAR_ANS) & "字以内で書くこと。" & vbLf PreparePrompt = PreparePrompt & "-専門用語は使わず、ERP初心者でも解りやすい解説をすること。" & vbLf PreparePrompt = PreparePrompt & "-解説文は体言止めを意識し、簡潔な文章とすること。" & vbLf PreparePrompt = PreparePrompt & "-回答は、項目の解説文のみを出力すること。" & vbLf PreparePrompt = PreparePrompt & "-回答の主語にテーブル名、項目名など技術名称は含めないこと。" & vbLf PreparePrompt = PreparePrompt & "-ハルシネーションは出さないこと。" End Function
ClassGPT
OpenAI API を処理するクラスモジュール。本マクロでは、ModuleGPTのプロシージャ「GetDescriptionWithGPT」から、関数「GptAPI」が呼び出される。
Option Explicit Option Compare Text 'OpenAI APIサイトのURL Private Const strURL As String = "https://api.openai.com/v1/chat/completions" 'HTTPリクエストを行うためのオブジェクト Private objHttp As Object 'OpenAI API用のパラメータ Public OpenAIAPIkey As String 'OpenAI APIキー Private AIMODEL As String 'AI Model Public NUM_CHAR_ANS As Integer '回答の文字数 'このクラスの初期化 Private Sub Class_Initialize() On Error GoTo Err_Class_Initialize Dim wsParameter As Worksheet Dim tmp As String 'HTTPリクエストを行うためのオブジェクトを生成 Set objHttp = CreateObject("MSXML2.XMLHTTP") '--- ワークシート"Parameter"の値を読み取り、ChatGPTを設定 --- Set wsParameter = Worksheets("Parameter") 'OpenAI API key(省略不可) OpenAIAPIkey = Trim(wsParameter.Range("APIKEY").Value) 'AI Model AIMODEL = Trim(wsParameter.Range("AIMODEL").Value) If AIMODEL = "" Then AIMODEL = "gpt-4-turbo" '省略時のデフォルト End If '回答の文字数 tmp = Trim(wsParameter.Range("NUM_CHAR_ANS").Value) If tmp = "" Then NUM_CHAR_ANS = 100 ElseIf IsNumeric(tmp) Then NUM_CHAR_ANS = CInt(tmp) Else NUM_CHAR_ANS = 100 End If Exit Sub 'エラー発生時 Err_Class_Initialize: MsgBox Err.Description, vbCritical End Sub 'このクラスの廃棄 Private Sub Class_Terminate() Set objHttp = Nothing End Sub '------------------------------------------------------------- ' 指定した質問文字列をChatGPTにリクエストし回答文字列を取得する ' strSystem : GPTの役割(省略可) ' Question : GPTに送信する質問文。 ' Answer(戻り値): GPTからの回答文。エラー発生時はNull。 ' ErrMsg(戻り値): エラー発生時、エラーメッセージがセットされる。 ' GptAPI(戻り値): 0 正常終了、0以外 エラー発生時のエラー番号 '------------------------------------------------------------- Public Function GptAPI(ByVal strSystem As String, _ ByVal Question As String, _ ByRef Answer As String, _ ByRef ErrMsg As String) As Long '戻り値の初期化 Answer = "" ErrMsg = "" On Error GoTo Err_GptAPI Dim strText As String Dim strRequest As String, strRspns As String, strTemp As String, strW As String Dim p1 As Long, p2 As Long strText = Question '文字列内のエスケープ strText = PadQuotes(strText) With objHttp 'ヘッダー設定 .Open "POST", strURL, False .setRequestHeader "Content-Type", "application/json" .setRequestHeader "Authorization", "Bearer " & OpenAIAPIkey 'リクエスト strRequest = "{" strRequest = strRequest & " ""model"":""" & AIMODEL & """," strRequest = strRequest & " ""messages"": [" strRequest = strRequest & "{""role"":""system"", ""content"": """ & strSystem & """}, " strRequest = strRequest & "{""role"":""user"", ""content"": """ & strText & """}] ," 'strRequest = strRequest & " ""max_tokens"": " & MaxTokens & ", " strRequest = strRequest & " ""temperature"": 0 " strRequest = strRequest & "}" 'GPTのAPIに送信 .send strRequest 'GPTからの応答を取得 strRspns = .responseText End With 'Json文字列から回答部分のテキストを取得 p1 = InStr(strRspns, "content"":") + 11 p2 = InStr(p1, strRspns, """,") - p1 strTemp = Mid(strRspns, p1, p2) '改行のエスケープ strTemp = Replace(Replace(strTemp, "\n\n", vbLf), "\n", vbLf) 'バックスラッシュのエスケープ strTemp = Replace(Replace(strTemp, "\""", """"), "\\", "\") '空白文字の除去 strTemp = Trim(strTemp) '正常終了時、戻り値をセット Answer = strTemp GptAPI = 0 Exit Function 'エラー発生時 Err_GptAPI: GptAPI = Err.Number ErrMsg = Err.Description End Function '------------------------------------------------------------- ' 文字列のエスケープ ' s : 変換対象の文字列 ' PadQuotes(戻り値): エスケープ処理された文字列 '------------------------------------------------------------- Private Function PadQuotes(ByVal s As String) As String If InStr(s, "\") > 0 Then s = Replace(s, "\", "\\") End If If InStr(s, vbCrLf) > 0 Then s = Replace(s, vbCrLf, "\n") End If If InStr(s, vbCr) > 0 Then s = Replace(s, vbCr, "\r") End If If InStr(s, vbLf) > 0 Then s = Replace(s, vbLf, "\f") End If If InStr(s, vbTab) > 0 Then s = Replace(s, vbTab, "\t") End If If InStr(s, """") > 0 Then PadQuotes = Replace(s, """", "\""") Else PadQuotes = s End If End Function
マクロの補足
OpenAI に送信されるJson文字列
本マクロでは、関数GetAPIからOpenAI に送信されるJson文字列は次のようになる。
{ "model": "gpt-4o-mini", "messages": [ { "role": "system", "content": "SAP ERPおよびSAP S/4HANAの専門家" }, { "role": "user", "content": "#依頼\fSAP S/4HANAのテーブルMARAの項目MANDTの意味と使い方を解説し、回答として返してください。\f{#ルール}は必ず守ってください。\f#ルール\f-解説文は日本語で、100字以内で書くこと。\f-専門用語は使わず、ERP初心者でも解りやすい解説をすること。\f-解説文は体言止めを意識し、簡潔な文章とすること。\f-回答は,項目の解説文のみを出力すること。\f-回答の主語にテーブル名、項目名など技術名称は含めないこと。\f-ハルシネーションは出さないこと。" } ], "temperature": 0 }
- role “system“
-
GPTの「役割」を設定する。この例では、SAPシステムのテーブル項目の解説文を依頼するので、上述のプロンプトにあった「あなたはSAP ERPおよびSAP S/4HANAの専門家です」より、
「SAP ERPおよびSAP S/4HANAの専門家」
を値としてセットしている。
- role “user“
-
依頼となるプロンプト本文をセットする。
- temperature
-
生成されるテキストのランダム性や多様性を調整するためのパラメータ。値は0から2の範囲で設定可能であり、デフォルトは1である。0を設定するとランダム性が無くなるため、毎回同じ回答を返すようになる。したがって、回答の揺らぎを防ぎたい場合は0をセットする。
OpenAI APIによって出力された解説文の例
OpenAI API によって出力された解説文の例が以下である。
解説文が短い・長い・物足りないなど感じた場合は、Excelワークシート「Parameter」にある「回答の文字数」の値を調整し、再度「OpenAI APIによる項目解説」ボタンを押してマクロを実行すればよい。
この記事で紹介したマクロのダウンロード
この記事で紹介したExcelマクロのファイルは、当ブログの「便利ツールと資料」からダウンロード可能だ。
まとめ:生成AIをSAPシステムの解説者として活用しよう
本記事では、生成AI(OpenAI API)を活用してSAP S/4HANAのテーブルや項目の解説を効率的に作成する手法を紹介した。特に、Excelマクロを用いてAPIをコールし、ワークシート上の項目一覧を一括処理する仕組みは生産性向上に非常に効果的である。この方法により、手作業で膨大な時間を要する作業を短時間で自動化できるだけでなく、生成される解説の品質も高い。
SAPシステムの構造や項目の意味は複雑であり、正確に理解し伝えるには時間と労力が必要だ。しかし、生成AIを「解説者」として活用することで、その負担を大幅に軽減し、作業の効率化を実現することが可能である。特にITエンジニアやSAPコンサルタントにとって、この仕組みは実務での大きな助けとなるだろう。
本記事で紹介したアイデアやマクロを、実務に是非活用していただきたい。このアプローチは間違いなく、SAPシステム導入における生産性を上昇させるだろう。
コメント