
日々の業務に生成AIを取り入れて - 1年間の学びと発見
こんにちは。
小売流通ソリューション部 SRE チームの池田です。
AI については既に多くの活用方法やコツなどを紹介しているコンテンツがあり、若干いまさら感があるかなぁと思ってはおります。
が、先日マネージャーとの 1on1 の中で、AI の利用について話題になりました。その際、うまくいったことと失敗したこと、その時のシステムプロンプトをメモしていることや AI と一緒に自分用タスク管理ツールを作ったことを伝えたところ「部内のみんなにシェアして欲しい」と言われました。
AI Starter をメインに利用しており、使い始める前から現在までの体験を部内 wiki でシェアしたのですが、せっかくだから内容を整理して社外公開もしてしまおうと思いました。
最初は使い方がイメージできなかった
社内で生成 AI が業務利用できるようになってもすぐには使いませんでした。
なぜなら、どう使えば良いのか、何をしてもらえるのかがイメージできていなかったからです。
社内の Slack Workspace で使える「くらにゃん GPT」で遊んだことはありましたが、その経験から「AI といっても、たいしたことない」というネガティブな印象(自分の使い方は棚の上です)があったのも事実です。
ただ、くらにゃん GPT を相手に Slack の times チャンネルでブレストというか、壁打ちのようなことをやったときに「このやりとりはチャンネル参加者にも見えるしちょっと恥ずかしいな」と思うことがありました。そこで、だったら別の生成 AI を使ってみるか。と思い立ったのが初めて利用するきっかけでした。
最初はシステムプロンプトなど考えず(そもそも知らなかった)、デフォルトのまま単なる相談相手というか雑談相手のような気持ちで、ボット相手にチャットをしているような感覚でした。たまに Web 検索する代わりに「〇〇ってどういう意味?」とか「日本語に訳して」とか頼む程度の使い方をしばらく続けていました。
いきなり AI にコードを書かせた
最初の頃はただのチャットボットくらいの気持ちで接していたのですが、ある日、古いバージョンのまま使っていた Python のコードを修正しなければならなくなりました。
AI Starter にコードを添えて「既存のコードはこれで、バージョンはいくつ。これをこのバージョンで動作するように修正して」といった内容で頼んでみました。
結果、何がどう変更されたのかわからないうえに、本当にそれで正しく動作するのかも判断できない、そして一度の出力では収まらず途中で応答が停止するような膨大なコードが提示されました。正直こんなん、どうやって使えば良いの?って感じでしたが、気を取り直して「バージョン間での変更点を考慮した修正をするとしたら、何が変わる?」とか聞いたりした気がします。
とにかく、特に工夫もせずコードの修正を頼むとか無謀なことをしてたなーと今では思います。
作戦を練った
AI Starter デフォルトの状態のままでのコード修正はさすがに期待した結果を得るのは難しいと感じ、どうしたらいいのか自分作戦会議を開きました。
その頃くらいから、社内 Slack のあちこちで「あなたは hogehoge です。」から始まる催眠術のようなペルソナを伝えるシステムプロンプトの情報を見かけるようになりました。
そこで、自分も「あなたは優秀なプログラマーで、特に Python や AWS に関する知見が豊かです」みたいなことを書いてみましたが、あまり変化はなかったのでさらにいくつかの指示をシステムプロンプトに追加してみたりしました。
- 「ユーザーからの質問に対して、すぐに修正したコードを提示するのではなく、最初は問題点や改善箇所を文章で説明してください」
- 「コードを提案する場合はコードブロックで囲んで出力してください」
- 「100行を超える場合は、クラスやメソッド単位で出力してください」
当時、どんなシステムプロンプトを使ったのかメモを残していなかったので、朧げな記憶頼りですがこんな感じのことを書いた気がします。
そして、提案されるコードを実行しては発生するエラーを伝えて、エラーを解消するための修正を提示させる。を繰り返していきました。Python というよりも、そもそもプログラミング経験がほとんどなかったので、他のエンジニアが見るととんでもない無駄なことをしていたんだろうとは思います。
それでも、自分にとって読みにくかったりコピペしにくい出力があったら都度、範囲と出力方法を指定して改めて出力し直すよう指示をしてみたり、提示された修正案の説明をさせたり、その時点でのコード全体をチェックさせたりしていくうちに、だんだん AI とのやりとりに慣れていった気がしています。
AI にシステムプロンプトを考えさせてみた
ある日、唐突に思いつきました。
「あなたに Python のプログラムを効率よく修正してもらえるようにするため、いまあなたに伝えているシステムプロンプトを改善してほしいです。現在のシステムプロンプトは以下です。」
みたいなことを依頼しました。で、出てきたシステムプロンプトを渡したうえで同じことをもう一度させたり、良い点悪い点を教えてもらったりしながら、Python コーディングに最適(と AI が自画自賛した)システムプロンプトができあがりました。
このときはたぶん500行くらいのシステムプロンプトだったと思います。前述の社内 Slack で見かけるペルソナを伝えるシステムプロンプトたちはせいぜい 5行〜10行程度のものばかりだったので、驚きのボリュームになっていました。
とりあえずエラーなくテストも通過するものができた。そして気づいた
日数はかかりましたが、どうにかこうにか期待したバージョンの Python できちんと動作するコードを作り上げることができました。
そして「動くものはできたけど、内容をちゃんと理解できてない自分」に気がつきました。
「このコードの内容をメソッド単位とかで AI に解説させたら自分の勉強になるのでは?」
AI を利用されている方はご存知とは思いますが、チャットを行うたびにトークンというものを消費して行くため、いつまでも同じチャットセッションで文脈を維持したままやりとりを続けることはできません。トークンを消費し切ったら新たなチャットでやり直しになります。
夢中になってチャットを続けてしまい、ちょうど大事なところでチャットが継続できなくなる場面に何度も遭遇しました。
新しいチャットを開いたとき、システムプロンプトはその前に利用していたものが引き継がれますが、過去のやりとりにおける文脈は失われます。
そのため、ある程度のやりとりを続けたら「そこまでのやりとりの要約」を出力させるようにしました。これにより、ある程度の文脈を新しいチャットセッションに引き継がせることができました。
コード作成の過程で何度もトークン切れによる会話のやり直しに遭遇して、最初はイチから伝え直したり、最初に長文で何をしていたかとか対象のコードを渡し直すとかしていましたが、要約を使うことでトークン切れによる中断でのやり直しも減り、やりとりの文脈が失われる心配はほぼなくなりました。
こうなればこっちのものと、遠慮なく作成したコードについての解説をさせまくりました。
わからない箇所は徹底的に質問を繰り返したので、いまなら他の方にそのコードの解説ができると思います(たぶん、忘れてなければ)。
システムプロンプトのコツを知った(気がした)
既にそのシステムプロンプトは手元に残っていないのですが、Python のコードを修正するために使用したシステムプロンプトは最終的に 800行くらいになっていたと思います。
良い感じだなと思ったシステムプロンプトを一旦、テキストエディタにコピー&ペーストしておき、隙間時間に少しずつプログラミング学習支援のための最適化を AI にやらせた結果、現在は 100行に満たないボリュームまでスリムになりました。
これでも、自分レベルのプログラミング初心者には十分です。
どうやら、次のような点を意識しておけば良いのかなと思っています。
- システムプロンプト(チャットセッションでのキャラ付け):基本的な方針や一貫して守るべき制約
- ユーザープロンプト(チャットで入力する情報):具体的な要件や期待する出力の詳細
そのうえで、一度に全情報を与えるのではなく、対話形式で詳細を掘り下げるように指示をすることにしています。さながら家庭教師を相手にしているような快適な学習体験を得られています。
プログラミングの家庭教師ができたので、今度はドキュメント作成の家庭教師になるシステムプロンプトも欲しくなりました。最初は AI Starter のユースケースにある文章校正向きのモデルを使ったと思います。
「AI に業務資料作成の支援をしてもらいたいと考えています。ドキュメントの作成に関する知識や知見をユーザーに提供し、スピーディーな文章作成を支援する AI に適したシステムプロンプトを提案してください。」といった感じで依頼した気がします。
その結果を新しいチャットのシステムプロンプトに設定して、そのシステムプロンプトが適切か改善の余地がないかをチェックさせる。を2-3回やったと思います。
そして 5分もかからずにドキュメント作成の家庭教師が誕生しました。
文字数が多い
家庭教師にどんなドキュメントを作りたいかを伝え、必要な情報や記録方法(マークダウンで wiki に書くとか Slack に投稿するとか)を渡すと良い感じに仕上がって行くので、結構楽しくなってきました。そのうち、もっとラクをしたい欲が増えてきて、作業メモや既存資料をマルっと渡して「いい感じにまとめて」とかやり始めました。
出力結果ひとつひとつをザッと眺める限りおかしな点はないので、社内 wiki に転記していましたが、当時進めていた取り組みのメモ群から最終的な記録用ドキュメントを作らせてみたら罠が待っていました。
当時、AI にドキュメントを作成させる作業は連続で行わず、作業の区切りが良い時や隙間時間とかに行っていたので、自分の記憶も曖昧な状態で進めていました。
一通り、必要と思われるドキュメントを作り終えましたが、とんでもないボリュームになってしまっていました。あらゆるメモに残した情報をほぼ全て渡していたので、AI も丁寧にほぼ全ての情報を使ったドキュメントを書いてくれていたのです。
具体的には次のようなドキュメントを作成しようとしていました。
- 取り組みの意思決定記録
- 取り組みの概要
- プログラムに関する解説
- 関連ツールに関する解説
- 作成したアプリや Python コードに関する設計資料
取り組みで扱ったものや過去の経緯などを踏まえると、文字数の多さはある意味仕方ないかなと受け入れてましたが、一緒に取り組んでいた同僚から「情報量多いっすね...複数の資料に同じこと書いてあったりもしますし」とのコメントで目が覚めました。AI が提案してきたドキュメントに対してチェックをしてから記録していたつもりでしたが、いつのまにか思考停止し AI の提案をそのまま受け入れていたのです。
一緒にドキュメントを改善する
思考停止した状態で作成してしまったドキュメント群を AI にファイルとして渡して(AI Starter にはテキストファイルをアップロードすることができます)「複数のファイルに同じことが記載されているのでスリム化したいから支援してほしい。」と依頼しました。
最初に、主体としたい資料はどれなのかを伝え、ドキュメントの構造と関係性を整理しました。このとき、AI がやろうとしていることと自分の認識(期待)に齟齬がないかの確認も行うようにしました。
スリム化の条件を決めたうえで設計資料から修正していこうと思うがどう思う?と、進め方や考え方について自分の考えを伝え、AI の回答に対し合意したり拒否したりというやりとりをしながら進めました。また、文章量が多くなることが想定されている場合、一度に出力可能な文字数に到達することもあるため、セクションごとに分割して提示するよう指示を工夫しました。
一見すると違いがわからないこともあったため、原文と提案内容に違いがあるのか変更点を説明してもらう場面もありました。提案してくれる文面に対して「こっちの方が良いと思うけどどう?」と問いかけるなど、完全に同僚とチャットでやりとりしながら共同編集しているような気分でした。
絵心なくてもどうにかできる?
唐突に「画像生成もやってみよう」と思い立ったので、まずは壁打ちに利用しているシステムプロンプトを渡した AI に「画像生成 AI を使ってみようと思うので、プロンプトのコツなど教えてほしい」とお願いしてみました。
画像生成を目的としたプロンプトには次のような要素を含めると良いとアドバイスをもらいました。
- 主題/被写体 : 何を描くか(人物、風景、物体など)
- スタイル : どのような芸術様式や表現方法か
- 構図/視点 : どのような角度や配置か
- 照明/色調 : どのような光の当たり方や色の雰囲気か
- 詳細度/品質指定 : 解像度や細部の表現レベル
- 雰囲気/感情 : 伝えたい気分や感情
- 参照/インスピレーション : 似た作品やアーティスト名
同時に、いくつか例も提示してくれました。
× 「美しい風景」
○ 「夕暮れ時の富士山の風景、葛飾北斎風の浮世絵スタイル、鮮やかな青と赤のコントラスト、前景に桜の木」
否定的要素も明示すると良い
「美しい日本庭園、伝統的な和風建築、池と石橋、紅葉、no people(人物なし)、no text(テキストなし)」
イラストや写真撮影などに関する専門用語はあまり知りませんが、自分がイメージしている景色の要素を簡潔に列挙して伝えれば良いようです。教えてもらった情報を元に、社内会議風の画像を生成してもらうにはどのようなプロンプトが良いか考えてみました。
一番最初のプロンプトとその結果は次のとおりです。上記の例と一緒に提示された複数のプロンプトを参考にアレンジしました。
IT 企業のビジネスマン3人が打ち合わせ、適度に明るいオフィス、1人はPCでプレゼン、真剣な表情で話を聞く椅子に座った2人、ひとりは30代の日本人ビジネスマン、スリムフィットの紺色スーツ、白いシャツ、赤いネクタイ、黒縁眼鏡、短い黒髪、真剣な表情でノートパソコンを操作している、着席している1人は20代の女性、長めの茶色い髪、清楚なワンピース、机に置いたノートパソコンでメモをとっている、着席しているもう1人は40代の男性、水色のシャツ、ノーネクタイ、中肉中背、メガネなし、左手で頬杖
結果画像
プレゼンしている男性は立っていて欲しかったのですが、3人とも着席しちゃってました。また、女性は PC のテキストエディタなどでメモを取っていて欲しかったのですが、紙と鉛筆でメモを取っている様子です。AI が教えてくれた画像生成のコツを読み直しながら、入力したプロンプトをチェックしてみます。
構図/視点 : どのような角度や配置か
どうやらこの情報が不足していたため、3人で打ち合わせしている風景を描いてくれたのかなと推測しました。
ということで、今度は次のようなプロンプトにしてみようと思います。
IT 企業のビジネスマン3人が打ち合わせ、適度に明るいオフィス、3人の体の正面には大型モニター、真剣な表情で話を聞く椅子に座った2人、全員後ろ姿、ひとりは30代の日本人男性、スリムフィットの紺色スーツ、白いシャツ、短い黒髪、黒縁眼鏡、大型モニターに向かって立つ後ろ姿、自分の隣に並んで座る2人にモニターに映る資料の説明をしている、着席している1人は20代の日本人女性、椅子に座る後ろ姿、長く明るい茶色のストレートヘアー、淡いピンク色のワンピース、机に置いたノートパソコンを操作している、着席しているもう1人は40代の日本人男性、水色の半袖シャツ、髪の色はやや茶色、ややボサボサの髪、自分の正面の机にノートパソコンを置いているが操作はしていない、椅子の背もたれに体を預けた姿勢で腕組み、椅子に座る後ろ姿、会議室の机は一辺4人掛け、机の上には3台のノートパソコン、ノートパソコンの色はシルバー、人物は実写調
結果は以下です。
たしかに 3人とも後ろ姿(右の男性は振り向いてるだけですが)になりましたが、女性は背もたれに向かって座ったうえに後ろの机に置いた PC に手だけ残ってしまい、ちょっとしたホラー画像になってしまいました...
もう少し工夫が必要なようです。なお、登場人物の設定にモデルは居ません。AI に例示されたものの中にあった記述を組み合わせたりしたものです。
ついにイメージしていた画像ができた
想定外のホラー画像が生成されてしまいましたので、改めてプロンプトを見直しました。構図について、イメージした様子を手前から順に伝えてみます。
IT 企業のビジネスマン3人が打ち合わせ、適度に明るいオフィス、手前に男女が椅子に座った後ろ姿、その奥に会議机、その奥に30代の日本人男性、スリムフィットの紺色スーツ、白いシャツ、短い黒髪、黒縁眼鏡、一番奥の壁に大型モニター、自分の後ろに並んで座る2人にモニターに映る資料の説明をしている、着席している1人は20代の日本人女性、茶色のストレートヘアー、淡いピンク色のワンピース、机に置いたノートパソコンを操作している、着席しているもう1人は40代の日本人男性、水色の半袖シャツ、髪の色はやや茶色、ややボサボサの髪、自分の正面の机にノートパソコンを置いているが操作はしていない、椅子の背もたれに体を預けた姿勢で腕組み、会議室の机は一辺4人掛け、机の上には3台のノートパソコン、ノートパソコンの色はシルバー、人物は実写調
やりました。ついにいい感じの画像が生成されました。(あまりにもリアルで実在しそうなイケメンだったので一部加工しています)
会議机は横長になることを期待していたのに食卓テーブルのようになっているのは我慢することにします。
「自分がイメージしている場面に見えるものを手前から順に、人物や動物、置物などの特徴は連続して(他のものの説明を挟まないで)列挙して伝える」というのが、ここまでの試みから得られた画像生成プロンプトのコツかなと思います。
また、たとえば実写調で良い感じのものができたからイラスト調でも欲しいからと「同じ内容でイラスト調に」といった依頼をしても期待通りにイラスト調で出力してくれる場合と、構図や内容自体も変更される場合がありました。
利用した AI Starter のユースケース Image Generation Imagen 4 Ultra 固有の話かもしれませんが、異なる画像を生成して欲しいときは「新しいチャット」で仕切り直さないと、直近の画像に利用したプロンプトの影響が残るのかもしれません(女性が登場する画像を生成した後に、男性を描くよう指示をしても女性だけが描かれるといったこともありました)。
繰り返しを避け簡潔に
文章作成において「文字数が多い」でも触れた、長文になりがちという落とし穴ですが、その後の文章作成ではかなり意識するようにしました。
システムプロンプトによっては、常に対話形式で意思確認や不足している情報の要求、文章作成の方針などを確認しながら進められるのですが、たまに「どのシステムプロンプトか」を確認せず、たとえばプログラミング用に調整したシステムプロンプトに文章作成を依頼することがありました。
こういうときは一見すると、しっかりとした文章を生成してもらえたように思えますが、実際は同じ意味合いに受け取れる表現が繰り返し出てきたり、冗長な文章になっていることが多いと感じました。
これを回避して、トークンを効率的に利用するには、別のブラウザタブで新規チャットを開き直して目的に適したシステムプロンプトを設定するか、依頼する際に「できるだけ繰り返しを避け、簡潔で読み手の認知負荷が低くなるよう意識してください」といった一文やおおよその文字数制限を加えると、かなりすっきりした文章を生成してもらえることを知りました。
また、生成した文章をその後どのように扱いたいのかも添えるとより良い結果を得られるとわかりました(マークダウンで wiki に記録するのか Slack に投稿するかなど)。
関連ドキュメントがあるものや、繰り返し作成することがわかっているドキュメントなどの場合は、出力形式のテンプレートをシステムプロンプトで指定するのも有効だと思います。見出しの階層レベル、各情報の粒度、デスマス長なのか体言止めなのかとかの指定をすることで、関連ドキュメントとの連続性を維持させつつ、好みの文章となるまでプロンプトを調整していくのも良いと思います。
進化は止まらない
最後に今までの体験から得たことを振り返ってみたいと思います。
- プログラミング支援のコツ
- やってはいけないことを明確にする
- 必須事項を明確にする
- できれば最初に対話形式で要件定義を行う
- ユーザーの希望と AI の認識に齟齬がないか確認するプロセスを作る
以上はすべて AI Starter を利用した際のものであって、自律コーディング AI やコーディング支援 AI 向けではありません。
こういったコツは、AI Starter で Claude Sonnet を利用して自分用タスク管理ツールを作る中で発見しました。
作成過程は詳しく触れませんが大雑把に書くと次のようなことを AI とやりとりしながら進めました。
- まず作りたいものとおおまかな条件(ローカルで動作する、CUI 操作、Python、JSON、シンプルに単一機能から)などを伝える
- 要件定義に必要な情報をヒアリングするよう依頼する
- 要件定義をまとめて認識合わせをする
- いきなりコード全体を提案するのではなく、最初に作る機能を決め、コードの構成を相談するよう指示
- Class / Method 単位でコードを提案してもらい、その解説もしてもらう
- テストコードも作るが、これもテストそのものの意味から説明してもらう
- 時々、あえて歯抜けコードを提示してもらい、そこに入るコードを自分で考えるクイズ形式にしてもらう
- 難しいときはヒントを出してもらう
- ひとつの機能ができたら、次のステップについて相談し、認識を合わせてから進む
そのほかは次のような感じです
-
ドキュメント作成のコツ
- フォーマットやテンプレートを指定してあげる
- 重複や冗長な表現を制限してあげる
- 対象読者を教えてあげる
-
画像生成のコツ
- 描いて欲しい景色を想像し、手前から見えている順に伝える
- できるだけ曖昧な表現を避ける=具体的な説明をする
- 細かすぎる指示は反映されないことを許容する
-
システムプロンプト設計のコツ
- 原則、細かく書きすぎない
- 基本的なキャラ設定と守るべきルールにとどめても良い
- 必要に応じてユーザープロンプトで補足する
- システムプロンプト自体のチェックをしてもらう
-
AI 利用全般で感じたこと
- 自然言語でプログラミング指示や画像生成の指示をするのは慣れが必要
- うまくいかない、期待通りにならないときは違うアシスタントで試す(得意不得意、向き不向きがある)
- 成果物に対してユーザープロンプトで修正して欲しい箇所を具体的に伝えると一気に改良されることがある
利用開始初期と比較して、AI Starter で利用可能なアシスタントたちも他の AI サービス同様、日々アップデートされています。
以前はうまくいかなかったことも現在では難なくこなせたり、数ヶ月後にはもっと良いものが生成できるかもしれません。
ここまでの経験を経て、頭の中にあるイメージをできるだけ詳しく言語化すること、AI に「よしなにやってもらう」は難しいケースが多いこと、最終的なチェックと判断はやはり人力が大切なこと(誤字脱字やドキュメント内の矛盾チェックなどは任せられる)、制約事項がないと思わぬ変更や謎の情報が生まれることがある。といったことも知りました。
「いきなり AI にコードを書かせた」の最後に記載した「特に工夫もせずコードの修正を頼むとか無謀なことをしてたなーと今では思います。」はまさに、いまだから思えることです。
AI に何かを依頼する場合、目的と前提条件や制限事項、背景、期待する結果などを最初に伝え、期待通りの解釈、理解をしているかを確認してから進めるという点は、誰かに仕事を依頼するときと同じだとも感じています。
大切なのは、ちょっとした事でも良いから日々継続的に利用し、その特性を理解し、自分に合った活用法を見つける事だと思います。
そして時々、いつもと違うことを試してみると新たな発見もあるかもしれません。利用者である我々も AI に負けず、進化していく必要がありそうだなと感じました。
以上、使い始めてからおよそ一年ほどの体験を通じて知ったことや思ったことなど、なるべく時系列に整理してご紹介してみました。
生成 AI に興味はあるけどまだ使ったことがない、どう使ったら良いかわからないといった方々が最初の一歩を踏み出す一助になれば嬉しいです。