はじめに
本記事は、私のように生成AIって難しいなと思っている人が、学び始めるきっかけになってくれたらいいなと思って書いた記事になります。
私はここ数年間、社内システムの開発・運用に携わっておりましたが、
つい最近部署異動がありまして、AIに関するプロジェクトの企画メンバーとして参加することになりました。
前部署でも利用者として生成AIに触れてはいましたが、「Google検索とは別の調べ物する手段」というくらいの認識でしかありませんでした。
生成AIは私には縁のない難しい分野だと思っていましたが、前向きに向き合って学んだ結果、AIや未来をより身近に感じることができるようになった気がします。
生成AIはただのソフトウェア
まず最初にびっくりしたのは、生成AIはただのソフトウェアだったということ。
まるで人間であるかのようなふるまいをするAI。
これは自分みたいな素人が手を出せる代物ではないな、と思っていました。
しかし、実際に書籍を参考に触ってみたところ、自宅のPC上で簡単にチャットアプリが作れてしまったのでした。
研究者とかゴリゴリの開発者でないと触れないものとばかり思っていた生成AIですが、ただのAPIを利用したソフトウェアだったのです。
ちなみに参考にした書籍はこちらです。
ソフト側で回答精度を高めようとするとハードルが高くなってしまいますが、ただチャットボットを作る分にはアプリ開発の知識があれば簡単に作れることが分かりました。
モデル
次に生成AIのモデルについてです。
そもそもモデルという言葉すらなじみがない状態でして、恥ずかしながら割と最近まで「生成AI=ChatGPT」だと思っていました。(共感得たい)
ChatGPTはモデルではなく、GPTと呼ばれるモデルを使ったアプリケーションなんですね。
このモデルというのは、大量のデータを学習した「脳」のようなもので、ユーザの入力(質問や命令)を受け取ると、その内容を理解し、「次にどんな単語が来るか」を予測。それを繰り返し、繋げることで文章を生成しています。
世の中には多くのモデルがあり、日々増え続けています。
テキスト生成が得意なモデルや、画像生成が得意なモデルなど、様々な分野に対するモデルが存在します。
さらにテキスト生成だけで見ても、オープンソースのモデル(Meta社のLlama)や、日本語に特化したようなモデル(ELYZA社のELYZA LLM)などがあります。
最近ですと、テキストだけでなく画像、動画、音声を扱えるようなマルチモーダルなモデルも登場しています。(Google社のGemini、OpenAI社のGPTなど)
モデル開発している各社、より便利に、かつ回答精度を高めるべく、ものすごいスピードで生成AIを進化させていっています。
ファインチューニングとRAG
回答精度を高める方法として、ファインチューニングという手法と、RAGという手法があることを学びました。
ファインチューニング
ファインチューニングは、既に学習済のモデルに対して、新たな学習データを使って追加学習を行うことを言います。例えば、企業内のドキュメントなど、一般的公開してないようなデータを取り込ませることで、その企業専用のモデルを作ることができます。
もっと簡易的にできて精度も良い手段として、RAGという手法があります。
RAG(Retrieval-Augmented Generation)
RAGは、生成AIにベクトル情報検索を組み合わせたものになります。
ベクトルストアや情報源から情報を取得し、その情報をもとに応答を生成することで、精度の高い回答が得られます。
こちらはモデルを作るわけではないため、学習データではなく、知識ベース(データベースやドキュメント)を用意する必要があります。
外部ドキュメントをembedding(ベクトル化)したものをベクトルストアに保管。生成AIは、そこを参照しつつ回答をします。
回答精度向上手法
回答精度を高めるための手法としてファインチューニングとRAGを紹介しました。この2つは開発側で精度を上げていく手法でして、利用者が手を付けられない部分です。
利用者はプロンプトエンジニアリングをすることで回答精度を上げることができます。
プロンプトエンジニアリング
プロンプト(prompt)には「指示を促す」といった意味があります。ユーザーがシステムやプログラムとやり取りするための「きっかけ」や「問いかけ」として使われます。
生成AIにおけるプロンプトとは、生成AIに対して指示や質問する際の「入力テキスト」を指します。
そして、エンジニアリングとは、課題を解決するための設計や構築、運用、改良を行うプロセスや活動を指します。
つまり、プロンプトエンジニアリングとは、生成AIへに対する入力に改良を加えて、より良い回答を引き出すためのテクニックということになります。
取り組むメリット
以下のようなメリットがあるようです。
- 出力品質の向上
具体的なプロンプトを設計することでユーザーが欲する応答を生成してくれるようになります。 - 時間削減
期待する応答を得るのに最適なプロンプトを設計できれば、プロンプトの書き直しや繰り返し質問(壁打ち)する手間が減らせます。 - コスト削減
生成AIはトークン数に応じた従量課金が多いです。応答させる回数を減らすことができればトークン数が減るため節約になります。(トークンについての説明は割愛しますが、一旦は単語数と思っておけばOKです)
LLMの設定パラメータ
ChatGPTを利用するときには、パラメータ設定は表示されていませんが、WEBAPIを使って大規模言語モデル(LLM)を利用する場合は、TemperatureやTop_pなどの設定パラメータを設定することで、プロンプトに異なる結果を回答させることができるようになります。
Temperature
多様性・ランダム性を指定するパラメータです。LLMは膨大な学習語句の中から、ある語句に対して続きになりそうな語句を選んできます。ある語句に対して、次の語句になる確率が高いものばかり選ばれてしまうと、創造的さが失われてしまいます。
そこで、Temperatureを使います。
この値が、0.2や0.1など低ければ低い値になるほど、最も確率が高い回答が常に選ばれることになり、創造的さがない回答ばかりになります。逆に、この値を1.0以上といった高い数字に上げると、ランダム性が増し、より多様で創造的なアウトプットが得られるようになります。
例えばFAQなどでは、この値を低く設定することで誤った回答にならないようにします。
逆に、歌詞の生成といった創造的さを重要視するような場合は、temperatureを上げると効果的だそうです。
Top_p
こちらも出力語句の制御をするパラメータです。
核サンプリング(Nucleus Sampling)と呼ばれるサンプリング手法を使い、次の候補になる語句の上位p%のトークンを取得します。デフォルトの1.0を選択すると、すべての語句が選択となり、0.5を選択すると、上位50%の語句の中からランダムで選ばれるようになります。
その他
他にも設定パラメータがあります。
以下のサイトで紹介されているので参考にしてみてください。
プロンプトエンジニアリングの例
区切り記号とコンポーネントの扱いは覚えておこうと思いました。
区切り記号とコンポーネント
区切り記号をいれることで、次の文章が何を意味しているか理解した上で回答してくれるようになります。以下の例の区切り記号は###になります。
###の後ろの「指示」はプロンプトコンポーネントと呼び、他にも「目的」「出力例」「制約」「条件」「前提」「例外」といった色々なコンポーネントがあります。
### 指示
以下のテキストを日本語に翻訳してください。
Text: "hello!"
テキスト:「こんにちは!」
出力形式を指定する
出力形式を指定することもできます。
CSV形式、JSON形式、リスト形式、マークダウン形式など。
他にもMermaid、Graphviz、PlantUMLといった作図記法も指定できます。
### 指示
日本の有名な武将と出生地を5つ列挙してください。
### 出力形式
CSV形式でお願いします。
武将名,出生地
織田信長,尾張国(現在の愛知県名古屋市周辺)
豊臣秀吉,尾張国(現在の愛知県中村区)
徳川家康,三河国(現在の愛知県岡崎市)
上杉謙信,越後国(現在の新潟県上越市)
武田信玄,甲斐国(現在の山梨県甲府市)
出力テンプレートを指定する
テンプレートの指定もできます。```で囲ったところはテンプレートであると明示しています。
### 質問
美味しいカレーの作り方を教えてください。
### テンプレート
"""
# 美味しいカレーの作り方
{ここに概要}
## 材料
{ここに材料を列挙}
## 調理手順
{ここに調理手順を記載}
"""
# 美味しいカレーの作り方
家庭で手軽に作れる本格的なカレーのレシピです。豊かな風味とスパイスが絶妙なバランスで、食欲をそそります。
## 材料
- 鶏肉(もも肉または胸肉)300g
- 玉ねぎ 1個
- ニンジン 1本
- じゃがいも 2個
- カレールウ 1箱(お好みのブランド)
- 生姜 1片
- にんにく 1片
- サラダ油 大さじ2
- 塩 適量
- コショウ 適量
- 水 800ml
- コンソメキューブ 1個(お好みで)
- 醤油 小さじ1(お好みで)
- ガラムマサラ(お好みで)
## 調理手順
1. **野菜の準備**
玉ねぎを薄切り、ニンジンとじゃがいもを一口大に切ります。生姜とにんにくはみじん切りにします。
2. **鶏肉の下ごしらえ**
鶏肉は一口大に切り、塩とコショウで軽く下味をつけます。
3. **炒める**
鍋にサラダ油を熱し、玉ねぎを中火で炒め、色が透明になるまで炒めます。その後、にんにくと生姜を加え、香りが立つまで炒めます。
4. **鶏肉を加える**
鶏肉を鍋に加え、表面が焼けるまで炒めます。
5. **野菜を加える**
ニンジンとじゃがいもを鍋に加え、軽く炒めた後、水を加えます。コンソメキューブを加え、沸騰させます。
6. **煮込む**
中火で約20分、野菜が柔らかくなるまで煮込みます。
7. **カレールウを加える**
カレールウを加えて溶かし、さらに10分ほど煮込みます。好みでガラムマサラや醤油を加えて風味を整えます。
8. **仕上げ**
最後に塩で味を調整し、火を止めて少し置いて味をなじませたら完成です。
温かいご飯と一緒にお楽しみください!
要約する
条件を指定して要約(書き換え)してみた例になります。
### 指示
以下の文章について要約してください。
### 条件
- 10文字で要約すること
- 小学生にも伝わる文章に書き換えること
- 重要な箇所は強調して表示すること
### 入力
家庭で手軽に作れる本格的なカレーのレシピです。豊かな風味とスパイスが絶妙なバランスで、食欲をそそります。
**おいしいカレー**の作り方
テキスト分類
テキストの分類分けも得意です。感情分析もできます。
### 指示
以下の文章をネガティブもしくはポジティブに分類してください。
### 文章
- 冬でも事務所は暖房が効いてて快適です
- 寒くて朝起きれない
- 毎日鍋ばかり
### 出力例
- 朝のランニングは気持ちがいい → ポジティブ
冬でも事務所は暖房が効いてて快適です → ポジティブ
寒くて朝起きれない → ネガティブ
毎日鍋ばかり → ネガティブ
推論させる
推論することも得意です。
### 指示
次の情報から推論して導き出される結果を出力してください。
### 情報
- 果物
- 赤色
- すっぱい
- 青森が有名
推論される結果: りんご(特に酸味のある品種、例えば「ふじ」や「紅玉」)
ロールプロンプティング
役割を与えて回答させる手法もあります。役になりきって答えてくれます。
### 役割
あなたは愛知県にある観光案内所のコンシェルジュです。
### 指示
観光地のおすすめスポットとアクセス方法を案内してください。
愛知県の観光スポットでおすすめの場所とそのアクセス方法をご案内します。
名古屋城
おすすめ理由: 日本の代表的な城で、美しい天守閣や広大な庭園が魅力です。
アクセス方法: 名古屋駅から地下鉄名城線で「市役所駅」下車、徒歩5分。
熱田神宮
おすすめ理由: 日本三大名所の一つで、歴史的な神社です。日本刀「草薙の剣」が祀られています。
アクセス方法: 名古屋駅からJR東海道本線で「熱田駅」下車、徒歩10分。
名古屋市科学館
おすすめ理由: 世界最大級のプラネタリウムや多彩な展示があり、特にお子様連れに人気です。
アクセス方法: 名古屋駅から地下鉄東山線で「伏見駅」下車、徒歩5分。
豊田市美術館
おすすめ理由: 現代アートの展示が豊富で、静かな環境の中で芸術を楽しめます。
アクセス方法: 名古屋駅から名鉄三河線で「豊田市駅」下車、徒歩15分。
犬山城
おすすめ理由: 日本最古の木造天守閣を持つ犬山城は、ユネスコ世界文化遺産に登録されており、素晴らしい眺めが楽しめます。
アクセス方法: 名古屋駅から名鉄犬山線で「犬山駅」下車、徒歩10分。
これらのスポットは、それぞれが持つ歴史や文化、自然の美しさを堪能できる場所です。ぜひ訪れてみてください!
役割を与える使い方の応用例として、全肯定お姉さまを作ってみたという記事が面白かったので紹介します。こういう面白い使い方を思いつけるようになりたい!
最後に
生成AIはアイデア出し、業務効率化など、色々なことに役立てることができることを実際に使ってみることで実感しました。
また、生成AIについて理解できてくると、工夫次第で様々な分野に活用できるものなんじゃないかと、将来どうなるんだろうというワクワクした気持ちになりました。
そんな、楽しい未来を描けるように、AIを活用した企画を頑張っていこうと思いました!
以上です!