🤖

Generative AIが日常に溶け込んだ世界で"エンジニアの働き方"はどうなるのだろうか

2023/12/01に公開

はじめに

株式会社マクアケ CTO室の @tokutoku3 です。

Makuake Advent Calendar 2023 1日目の記事ということで何を書こうか迷ったのですが、もっといろんな人や会社の考えを聞きたいよ!という願いも込めてGenerative AIについてあれこれ書いていこうかと思います。

対象読者

  • Generative AI(LLM)をどう活用するかに興味がある人
  • これからの働き方、開発フローがどうなるかについて他の人の意見を知りたい人

書いていること

  • 世の中で実現されている事例のピックアップ
  • 開発においてどのような関わりが生まれるかの1意見
  • 筆者のポエム

書いていないこと

  • "開発"から遠い領域におけるGenerative AIの活用話
  • 具体的な実装サンプル

Generative AI(生成AI)とは?

今更あらためて説明することもないかもしれませんが、テキスト、画像、音声などのコンテンツを新たに生成できるAIのことをGenerative AIと呼びます。

ChatGPTがおよそ1年前にリリースされ、そこで爆発的な認知の拡大と注目を集めました。イラストや写真を扱うような界隈では、そのさらに少し前からStable DiffusionやMidjourny、DALL・Eといったサービスによって激震が走っていた記憶があります。

ある程度の方向づけをするだけで何かを生み出すことができる力を誰もが使えるようになったのがまさに今。映画や小説で見たAGIに近しい概念が手の届くところにできたのだなぁと考えると、夢がひろがりますよね。

Generative AI(LLM)は何が得意なのか

開発の領域では、Generative AIの中でも特にLLM(大規模言語モデル)を活用した事例が多く見られます。
LLMに何ができるのか〜という話はさまざまな研究や挑戦が行われていますが、主に以下のような領域がわかりやすい得意分野なんじゃないでしょうか。

左上の心理的安全性は意外と無視できない概念で、人との対話や質問、フィードバックを受け取るという行為に対して一定の困難が発生するケースはままあり、そういった場面で人の感情を通さず、情報や事実だけを抽出して取り扱えるようにできるのは、開発進行や組織の運営を円滑に、スピード感をもって進める一助になる可能性を秘めていると感じています。

実例

実際のプロダクトや活用事例を見てみましょう。

分析や設計

データから特定の傾向を探ったり、要件定義書を一緒につくる際のパートナーとして頼れる機会は多いでしょう。
ChatGPTであればデータがまとまったCSVを渡すことで集計や観点の抽出が行えるので、手作業で分析するには骨の折れる情報の整理などではパワフルな性能を発揮します。

個人的には、実際の機能開発やプロジェクト進行において考えるべき観点の叩きを提案してもらったり、考えていることに対して抜け漏れがないかのFBをいつでももらえるのが、かなり捗るなぁと感じているポイントです。

データの整形

人にとっては読みやすいがプログラムが扱いづらいデータ、またはその逆のデータを望む形式に変換したり、1つのデータを言い換えたり別の構成に組み替えるというタスクをLLMは得意としています。たとえば大量のテストデータを作成したり、DBに格納されたデータからグラフィカルな図を作成したりといった作業が今よりもっと簡単になっていくのだと思います。
https://logmi.jp/tech/articles/328825

OpenAPIの定義からGraphQLの定義を考えてもらったり、シンプルなPHPのプログラムをGoに置き換えてもらうといった処理もある程度の精度で実現できるので、 そういった領域での準備作業は今後どんどん快適になりそうですね。

コーディング支援

Github CopilotGithub Copilot Chatを普段の開発に取り入れている個人、企業はかなり増えたのではないでしょうか。

主要なエディタと連携することで、チャットを通じたコード生成やそれについて質問したり、

実際のコメントやコードから推測されたサジェストをしてくれるなど、痒いところに手が届く便利な存在になりました。正直もうこれなしでコードを書きたくないレベル。

最近ではAIの活用に特化したエディタも出始めていて、その中でもCursorはリポジトリを丸ごと理解した状態で対話ができるChat機能があって便利だ、と言われたりしていますね。VScode派生なので拡張機能をそのまま引き継げるところがポイント高かったです。

エディタを通じたローカルでのコーディング活動もさることながら、Github Copilot WorkspaceなどではAIエージェントに機能開発そのものを任せられるようにしよう、という動きも出てきています。

AIアシスタント

コードベースに限った支援ではなく特定の知識ベースを用いた対話や提案をチャットベースで行う、という形も一般化が進んでいると思います。

Microsoft CopilotGoogle Duet AIなどは今まで作成したスライドや資料を探したり、その中から提案するといった業務知識、社内知識の集約と活用を実現していますし、ほんの2日前に発表されたAmazon Qでは、AWSに関する質問や支援をAWSコンソールの中で受けることができるようになりました。

こういった特定の知識をLLMに与え、回答の質を向上させるためのAIフレームワークとしてRAGというものがあります。OpenAI APIでRAGを実現する場合にLangChainとLlamaIndexというライブラリを用いることが多いようですが、例えば開発向けのドキュメントなどをRAGで扱えるようにすると、開発フローを教えてくれるトレーナーやペアプロのお供としての動きをABアシスタントに任せられるようになるかもしれません。

マネージドなGenerative AI利用環境

AWS、GCP、Azureのどれもが、マネージドな環境でGenerative AIを活用できる環境を提供し始めています。シンプルなチャットAPI環境を爆速で立ち上げ、前述のRAGの仕組みを自前で実装することなく、参照するデータセットを簡単に渡して実現することができたりします。

開発のパラダイムシフト

Generative AIの発展によって、開発におけるアタリマエが少しずつ変わっていると思います。
たとえば以下のような変化は、実際に起き始めている人も多いのではないでしょうか。

いままで 出てきている事例
わからないところがあればGoogleで検索する わからないところがあればAIアシスタント(Copilot)に聞く
アーキテクチャやロジックの設計を、本や人との議論を参考に組み立てる アーキテクチャやロジックの設計を、AIと対話しながら組み立てて人にレビューしてもらう
0->1は過去の類似コードやインターネットで探したものをベースに実装する 0->1はLLMを駆使して大まかに動くベースを生成する
デザインファイルに沿って画面を実装する image2textなどで大まかなコードを生成してから手直しする
テストが落ちないようにコードをリファクタする リファクタ案を生成し、テストが落ちないかを確認する

最近ではAmazon Q Code Transformationのように、アプリケーションの大規模なバージョンアップデートや別言語、クロスプラットフォームへの変換コストをGenerative AIの活用によって大幅に下げよう、という取り組みも見られます。

今後も開発の流れの至る所に、Generative AIが組み込まれるような世界観になっていく気がしますよね。
たとえば

  • 社内のドキュメントを読むよりも、AIに聞いて社内の知識を得る機会の方が増える
  • テストケース作成や、テスト実行->修正が自動化される
  • エラーや障害、脆弱性を把握して、適切だと思われる対応や改修をAIが提案、または実行する
  • レビューやディスカッションの場にAIが一員として参加する

とかとか。

全体として、「どう実現するか」という目的に対して選択できる手段の中に、今までよりもはるかに効率的なものが次々に現れるでしょう。それらをどう組み合わせ、望む形に持っていくかを判断する能力や機会の重要性が高まっていくんじゃないかと思っています。

考えるべきこと

データの重要性が高まる

リポジトリやドキュメント、データベースなどの情報を用いて新たなコンテンツを作成するという概念が当たり前になる世の中では、いかに大量の、コンテンツの元ネタにできるデータを確保できるかという観点が重要になります。

個人的に注目しているのは社内向けのドキュメントで、これが多ければ多いほど、「社内に1人はいる聞いたらなんでも答えてくれる人」をAIで再現できる可能性が高まります。
こうのようなキャラクター性を持つ人がチームや組織に与える貢献度の高さは誰もが理解しているかと思いますが、それが属人化せず、システムを止めない限り進化し続ける状態で提供できることは組織にとって大きなインパクトがあると思います。

また、たとえばAPI定義やERD、ADRなどのようなドキュメントを積極的に残すことによって、「歴史的経緯やシステムに詳しい人」の再現も可能になるかもしれません。

それらを実現するためには知識のもとになるドキュメントが必要で、日々の業務の中でいかに知見をためていくかが今後かなり重要なポイントになるんじゃないかと感じています。

生産性の高まりをどう測るか

Generative AIを活用した開発支援ツールやサービスは色々と出てきていますし、時には内製で開発するケースもあるでしょう。

どのケースにおいても、無料で組織単位での開発に耐えるものは現状多くありません。一定のコストを払ってこれらの概念を導入する際、それがコスパの良い、見合ったものになっているのかという観点は整理できるとより意義や恩恵を感じられるのかなと思います。

https://techblog.zozo.com/entry/introducing_github_copilot

https://speakerdeck.com/kurotaky/how-github-copilot-transforms-development-productivity

痒いところ

ハルシネーション

Generative AIはもっともらしい嘘をつく、という難しさがあります。

画像、たとえば人のイラストであれば指の本数がおかしいなどといった観点で(自分にとっての)嘘の部分を見つけることが比較的簡単にできますが、テキストにおけるハルシネーションは時に専門家でも気付けない巧妙な表現になるケースもあります。

現状、プログラムの生成は少数のファイルや局所的なロジックに対して用いられるケースが多いと思いますが、将来的にリポジトリを丸々解釈した状態でレビューや改修提案を行えるようになったとき、一見もっともらしい生成物に対してどのように妥当性や正当性を評価するか、という観点が課題になるのではないかなと思います。

一貫性の問題

開発においてGenerative AI、とくにLLMは非常に頼りになる存在ですが、一方で「その場その場で常にそれらしいことを発言する」という特徴にどう向き合うかを考える必要があるでしょう。

たとえばAIに実装のレビューをお願いした時、そのプロンプトや質問のタイミングによって、全く逆の提案をしてきたり、前回と繋がりのない発言をするケースが多々あります。
人であれば、「一貫してこの人はこういう思想で考えてツッコミをくれている」という信頼や前提をもってレビューを受けることができますが、LLMの場合はその一貫性をうまく表現することが(少なくともただ使うだけでは)難しいです。

チャット形式であれば以前のやり取りをある程度引き継ぐこともできますが、それ以外の形式でAIの行動に軸を作るためには、一定の工夫や4次元的な情報解釈をどう実現するかといった観点が必要になってくるかもしれません。

もちろん一貫性のない発言でも十分参考にできる領域は多いですが、僕たちの日常に深く根付いた時、これが課題になるのかもしれないなぁと感じています。

僕たちはどう生きるか

(ポエムです)

とても、ワクワクする時代になりましたね。

創作の中で語られていた未来の入り口に立っているのかもしれない、という状況の中で、僕たちエンジニアの働き方や、ずっと続けてきた"開発"という概念にどう向き合っていくのかは、今後もいろいろな場所で話題になるのでしょう。

それでも、課題をみつけ解決し、面白い・インパクトのあるアイデアを形にするというモチベーション自体は、どんなにAIが発達して便利になったとしても無くなるものではないと思っています。30年前とエンジニアの働き方は大きく変わっているかもしれませんが、それでもエンジニアリングという概念やその面白さを見出す人はいて、それは今後も変わらないんじゃないかなぁと。

世の中の当たり前や日常が進化しても、変わらず良いものを作っていきたいなと思うのでした。

「儂の若い頃はな、Exception in thread "main" java.lang.NullPointerException を人間が頑張って手で直していたんじゃよ」
「もーおじいちゃんったらまた変なこと言ってるー」

さいごに

マクアケではGenerative AIなども活用しながら、世の中に生まれるアタラシイを支えるサービス開発に取り組んでいます。

そういった開発に興味がある方、普段の取り組みをもっと知りたい方がいれば、ぜひご連絡ください!

Discussion