Udemy講座で学習した内容をもとに、データベースの正規化をChatGPT(3.5)で試してみた



12月1日に今年(2023年)の [流行語大賞](https://www.jiyu.co.jp/singo/) が発表され「アレ」が年間大賞に決まりました。

「生成AI」はトップ10ということなので、最終の対象候補10個以内には入っていたようです。どうも順位の詳細は（この [サイト](https://www.jiyu.co.jp/singo/) では？）公開されていませんが、11月の怒涛のサム・アルトマン氏のやめるやめる詐欺(?)もあって、選外に陥りがちなニッチなIT用語ではあるのですがぎりぎりになって健闘したのではないでしょうか。

生成AIは、今年いろんな組織・団体に大きな影響を与えたのは、間違いありません。

一般向けサービスで生成されたものの扱いによる炎上（は..今年からというより、もっと前からですが）、G7のAIに関するステートメントや、公共団体での扱いに関する記事、夏休み前の教育団体による生成AIに対するガイダンス公開、企業における生成AIの活用についてを各社のページに出すなど、**生成AIの影響で、全国各地..というより世界的にかな..で思いもしなかった仕事や作業が突然舞い降りた人は少なくなかった**のではないでしょうか。

自分も、そういった嵐に巻き込まれたうちの一人だったりします。

## 受講したChatGPT関連のUdemy講座

私が嵐の中ですがったのは、Udemy講座でした。

今(2023年12月)でこそかの堀江氏まで複数冊の本をだすほど国内の生成AI関連の日本語書籍はたくさん出てきていましたが、調べ始めた時期はほとんどありませんでした。

Udemy講座は、売り切りのコンテンツ（Businessはサブスク型？）なこともあり、いわゆるトレンドのITを扱う講座が結構早めに登場します。

ターゲット技術が登場してすぐリリースされるUdemy講座は、英語の公式文書やチュートリアルを翻訳しただけのものが多く、精度..というかわかりやすさがかけているものが多いですが、英語ドキュメントが苦手な人で先進技術をいっちょかみでいいから概要を手っ取り早く知りたいというときには、使えるコンテンツだと私は思っています。情報としては２次、３次ものになり、講師の認知バイアスに実際の内容よりゆがむ可能性はあるのですが、大枠を掴みたいときは便利です。

> ..このあたりの役割も、どんどんLLMが奪っていくかもですけど..

ここでは私が受講した（一部受講中のものもあるのですが..）Udemy講座を紹介したいと思います。


### [【ChatGPT】講座 システム設計・開発・学習のアシスタントとしてフル活用し業務効率化【エンジニア向け】](https://www.udemy.com/course/chatgpt-sw/)

ソフトウェア設計・開発にChatGPTを活用する内容。ChatGPT入門者が設計・開発に使ったら..という事例紹介。要件定義は..正直ざっくりしすぎているし、紹介するプロンプトも初心者が最初に書きそうな内容でとどまっている。なので、今後GPTsなどで強化されていくと..古くなる可能性が高い。が、現時点では __IT設計者・開発者エントリポイントになる講座__ である。

### [【プロンプト テンプレ+練習問題付き】 ChatGPTをフル活用する４Hと、生産性10倍アップのための基礎～応用の勘所](https://www.udemy.com/course/chatgpt_course/)

有料版のChatGPT Plus やCode Interpreter(Advanced Data Analysis)、プラグインの使ったCHatGPTの使い方を紹介する講座。グラフやパワーポイントを出力する方法を紹介している。事例が少ないので、__有料版機能紹介講座__ といったところ。

### [ChatGPT APIとLangChainでChatGPTを最強にするハンズオン](https://www.udemy.com/course/chatgpt_langc/)

ChatGPTとLangChainで独自チャットボットをつくるハンズオン講座。SerpAPIやDeepLのAPIとChatGPTを連携する。ファインチューニングはなし。非Azure系で作る方法の基礎が学べる。Plusではない個人アカウントでも試行可能。__社内でのみでつかう独自チャットボット__ の場合はお金をかけたくないと思うので、こちらの講座が参考になる。

### [Azure OpenAI Service + Bot Service で作る Teams ChatBot](https://www.udemy.com/course/aoai-chatbot/)

すべてAzure系でチャットボットをつくる。Azureなので試すにはお金がかかるが、国内企業が業務で使用する場合は、ポリシーやコンプライアンスなどを考慮するとAzure OpenAI Service をベースにする企業が多いと思うので、__国内企業子会社SIer のSE__ むき。


### [【超初心者向け】ChatGPTのプラグイン講座](https://www.udemy.com/course/chatgpt-plugin/)

プラグインを扱うのでChatGPT Plus契約前提の講座。__たくさんのプラグインを辞書__ として紹介しているので、有料版契約者がどんなプラグインがあるか浅く広く知りたい場合は便利..だが辞書であるがゆえに講座の受講はどのセクションもおなじ構成なのでとても単調で聞き切るには忍耐力がいる。なので完遂をめざさずに、**興味の有りそうな箇所をつまみ食い**すればよい。

### [ChatGPT×ビジネスフレームワークで高精度回答をコピペで簡単に引きだす実践講座](https://www.udemy.com/course/chatgpt-framework/)

いわゆるビジネスコンサルが使うChatGPT講座。要件定義の前のアイディア出しなどで活用できるプロンプトの具体例を出しながら紹介している。ChatGPT3.5/4.0を切り分けて説明している。紹介した中では実は __一番初心者向き__ だと思ったのはこの講座。

## 受講したあとのChatGPT所感

ざっと講座を受けて ChatGPT を俯瞰してみると..

- ChatGPT は **業務熟練者向けの時短ツール**
- 生産性は上がるけど、講座タイトルにうたっているほど上がらない
    - 品質はおそらく ChatGPT なしの時代とほぼ同じになるのでは..
- 社内独自ChatGPTベースボットはおそらく今後たくさん作られる
- （ChatGPTが返答品質がたかいうちは）企業がサービスとして使用する場合はAzure OpenAI Serviceを基本とせざるを得ない
    - Amazon Qなどもでてきているが、結局は精度（現時点で一番事例が多いのはOpenAI/Azure系）

そして ChatGPT向けのプロンプトエンジニアリングは

「__あなたはXXXXです__」＋「__深津方式__」×「__世の中に出ている既存の方法論__」＋「__Step by Stepで__」

をおぼえておけばよいことがわかりました。

### 「__あなたはXXXXです__」

ChatGPTの基本的な使い方のABCのAで、最初にChatGPTがどのロール（役割）を求められているかを明記すると回答精度があがるというもの。

よくあるのは「優秀なITアーキテクト」とか「サプライチェーン分野の業務コンサルタント」などでしょうか。

### 「__深津方式__」

原典を探してみたのですが、この記事を書き出すまでに見つけられなかったので、「おそらく」をつけますが..深津という人が発見したプロンプトの書き方のフォーマットで、この書き方をすることで、ChatGPTに複雑な作業を依頼できるというものです。

Qiitaにも記事が深津方式を紹介する記事がでているので検索して参考にすると良いとおもいます。

深津方式の面倒なところは、作業の細かな手順を中高生のバイトに作業指示をするレベルで文章にして書く必要があるということ。独自の業務をやらせるのだから当たり前なのだけど、最近はマニュアルを書かないとこが美徳（？）とされているソフトウェア開発界隈だと、あまり経験のない人が多いのではないでしょうか。

とくに最近はアジャイル開発と称して文章系の成果物を作らない方向にあります。開発フェーズはいいのですが、基本構想や要件定義フェーズで、文章を減らされるとなにをつくっていいのかスコープがぶれてしまうのですが..

とはいえ、会社の規程集など組織固有の作業をする場合は、そろえている組織は多いと思います。


### 「__世の中に出ている既存の方法論__」

これは、プロンプトに細かな手順がかけない人向けの使い方です。

ChatGPTのAIモデルはインターネット上にころがっている文章を学習させているので、実はいろんな方法論を理解しています。

「__オズボーンのチェックリスト__」や「__STP分析__」など意外とニッチ（もしくは私の無知？）なビジネスコンサルが使う方法も細かな指示を書かないでもやってくれたりします。データベースの属性洗い出しとかでよく「__名詞抽出法__」を使って名詞句を洗い出し切るなんて方法をつかったりできます。

### 「__Step by Stepで__」

この文章をプロンプトに加えると精度が上がることがある..という [論文](https://arxiv.org/abs/2205.11916) があるそうで、これをもとにつけることを推奨する講座がいくつかありました。

だけど、いろいろ試してみると、つけないほうが成功確率が上がるプロンプトも少なくなかったりします。

> ..Oracle7の頃のSQLヒント句みたいなものかもしれません..といって、分かる人あんまりいないかもですが..

## ChatGPTの「正規化、できるかな」

IT系の既存かつ既知の方法論でよく使われるものといえば、「__正規化__」です。

第３正規形に変換するなどのデータベースの正規化などの知識は、ChatGPTはすでに理解しているはず。

だからChatGPT(3.5)に、次のように細かな手順をかかないでもいけるのではないか、ということで以下のプロンプトを書いてみました。

```plaintext
#命令書：
あなたは優秀なデータベーススペシャリストです。
以下の #「注文」表の関係スキーマ は第1正規形ですか？
#「注文」表の関係スキーマ
注文（注文番号, 注文日, 顧客番号, 顧客名, {商品番号, 商品名, 数量}）
```

上記の正解は「第１正規形ではない」です。関係スキーマは、関係表をあらわす表記法の一つで、情報処理試験を受験したことのある人はよくご存知だとおもいます（中括弧が重複をあらわしています）。

これを、実際にCHatGPT3.5(無料版)でつかってみました。

![非正規形が正解](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213774/a232fd86-af0b-ceaa-b1aa-59823eb978a9.png)

と、正解を返答してもらえました。

> ..ですが、ChatGPTは __常に一貫した回答をだすわけではありません__ 。
> 
> ぶっちゃけ、何度かやると「第１正規形である（不正解）」とこたえることもあります。上記はたまたまうまく行ったのかもしれません。
> 
> ChatGPTが「第１正規形である」と判断してしまった場合は、関係スキーマの記述における中括弧｛｝が重複をあらわすことを知らない場合に発生する可能性があります。
> 
> なので、「__関係スキーマの記述において中括弧｛｝は重複をあらわします。それを踏まえて、再度先の質問に答えてください__」と次に問えば、正解を答えてくれる確率が上がります（頑なに第１正規形といいはることもありますが..）。


次に「第１正規形である」回答の質問のプロンプトを作ってみました。

```plaintext
#命令書：
あなたは優秀なデータベーススペシャリストです。
以下の #「注文」表の関係スキーマ は第1正規形ですか？
#「注文」表の関係スキーマ
注文（注文番号, 注文日, 顧客番号, 顧客名）
* 主キーは「注文番号」
```

これをChatGPT3.5に質問すると..

![第１正規形が正解](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213774/9ca03487-cedb-bb51-e6b9-460a5fafd7fe.png)

と正解を回答してくれました。


第１正規形の判断は、実は関係表の構造定義が曖昧（候補キーのない表を関係表とよばない派・呼ぶ派）で判断することが人間でも比較的難しいといわれています。

> 定義は明確にあるのですが、Coddさんの原典にある"関係表"自体の定義のとりかたで、ごにょごにょしたりします。

ですが比較的きちんと回答してくれました。「第１正規形である」問題は、より高次の正規形でもあることが多いので、正解率は高いのでしょう。

## おまけ

とはいえ、難易度は高いものの __第１正規形__ の判断など、実業ではほとんど役に立ちません。

実業務で一番多いのは、情報損失が発生しない限界点の正規化、 __第３正規化への変換__ までです。

なので __第３正規化への変換__ を無償版ChatGPT (3.5) に試してみました。

![NF3_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213774/ced9c920-0b00-e55e-7925-5cbb0d1e55ab.png)

### 無償版はプラグインが使えない

無償版の ChatGPT 3.5 はプラグインが使えません。
図などの生成は無償版だと難しいのが現実です。

..が、Udemy講座には有償版を契約しないで、うまいこと無償版ですませる方法を紹介していました。

### PlantUMLを使う

OSSモデリングツールの[PlantUML](https://plantuml.com/ja/) をつかいます。簡単に言えばコード状態の書式で図を表現すればいいということです。

PlantUML は出力形式がコード状態なので、出力の指示で「PlantUML形式で」と書けばこたえてくれます。

生成されたPlantUML形式のコードを[PlantUMLサイト]https://plantuml.com/ja/() にコピペでPlantUMLサイトの窓に入れて表示させた図は以下の通りです。

![NF3_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213774/9cbf7db4-1a3a-c3b2-f9d1-8cfed6a3c583.png)

このように第３正規形変換も、__単表と各属性の説明、主キーの明記をする__ ことで対応してくれました。

> もちろん回答の一貫性がないので、失敗する場合も多いのですが、個人的な試行では第１正規形の判断よりは正解率は高いと感じました。
> 
> これは憶測ですが、インターネット上に第１正規化の説明よりも、第３正規化の事例は多いのでは..と思ってます。

..実は実務では __そこ（単表と各属性の説明、主キーの明記をする）__ が面倒くさい作業なのですよね。

..それに、玄人のエンジニアはプロンプトを記述している最中に脳内で第３正規形を思い浮かべきっている人がほとんどですよね..

プロンプト書いている最中に脳内第３正規形変換できないSEは、そもそも表の説明にどのような内容を記述すればいいかわからないので、どっちにしても時間がかかり、結局生産性を落とすはずです。

結局、プロンプトを書いているうちに正解を書いている人が思い浮かべてしまうような問題だと、生産性という観点ではChatGPT活用のメリットはあまりたかくない、というのは私の個人の感想です。

あまり知っている人の少ないアイディア出し系方法論（[SWOT分析だとかオズボーンだとかある程度方法論が有名で手順がインターネット上にでているものをChatGPT上で使用する](https://www.udemy.com/course/chatgpt-framework/)）ほうが生産性に効く活用ができるのではないかな..

ChatGPTは、知識・経験がないとAIは使いこなせないツールなのかもしれません..



> 本記事は Advent Calendar 2023 参加記事です。
> 
> I wish you a merry Christmas.