{"componentChunkName":"component---src-templates-post-js","path":"/2024/10/10/developing-software-while-asking-questions-to-generative-ai/","result":{"data":{"wordpressPost":{"id":"738fb023-d048-5bf3-a7b4-2b400b089520","title":"生成 AI に質問しまくってシステムを作ってみた","excerpt":"<p>生成 AI に質問しまくりながらシステムを作ってみた（現在進行形ですが）ので、コツやら感想・考察などを書いてみようと思います。 何を作るか 作りたいもの 割と最近、以下の2つの記事を書きました。 せっかくなので、Word [&hellip;]</p>\n","slug":"developing-software-while-asking-questions-to-generative-ai","dateObject":"2024-10-10T08:51:47.000Z","date":"October 10, 2024","categories":[{"name":"Uncategorized","slug":"uncategorized"}],"tags":[{"name":"生成 AI","slug":"%e7%94%9f%e6%88%90-ai"},{"name":"開発環境","slug":"%e9%96%8b%e7%99%ba%e7%92%b0%e5%a2%83"}],"author":{"name":"中の人（管理者）","slug":"engineering_8qmk0b"},"featured_media":null,"wordpress_id":3309}},"pageContext":{"id":"738fb023-d048-5bf3-a7b4-2b400b089520","nextPath":"/2024/10/04/localstack無料でawsサービスを開発・テストする/","nextTitle":"[LocalStack]無料でAWSサービスを開発・テストする","prevPath":"/2024/10/21/flutter-physics-simulation-gravity/","prevTitle":"Flutter の物理シミュレーションを理解する ‐ ② GravitySimulation","tableOfContentsData":[{"id":"何を作るか","tag":"2","text":"何を作るか","active":false},{"id":"作りたいもの","tag":"3","text":"作りたいもの","active":false},{"id":"構成","tag":"3","text":"構成","active":false},{"id":"なぜ生成 AI に質問するのか","tag":"2","text":"なぜ生成 AI に質問するのか","active":false},{"id":"使う予定の技術に馴染みがない","tag":"3","text":"使う予定の技術に馴染みがない","active":false},{"id":"一人でやりたかった","tag":"3","text":"一人でやりたかった","active":false},{"id":"まずは結果。どうなったか","tag":"2","text":"まずは結果。どうなったか","active":false},{"id":"10日でバックエンドがある程度完成","tag":"3","text":"10日でバックエンドがある程度完成","active":false},{"id":"あと1週間程度でデモが出来る程度になりそうな予感","tag":"3","text":"あと1週間程度でデモが出来る程度になりそうな予感","active":false},{"id":"公式ドキュメント＋検索エンジンに比べて圧倒的に速くなった","tag":"3","text":"公式ドキュメント＋検索エンジンに比べて圧倒的に速くなった","active":false},{"id":"具体的にどうやったか","tag":"2","text":"具体的にどうやったか","active":false},{"id":"使った生成 AI","tag":"3","text":"使った生成 AI","active":false},{"id":"どう使ったのか","tag":"3","text":"どう使ったのか","active":false},{"id":"考察","tag":"2","text":"考察","active":false},{"id":"生成 AI が向いている事","tag":"3","text":"生成 AI が向いている事","active":false},{"id":"生成 AI がやってくれない事","tag":"3","text":"生成 AI がやってくれない事","active":false},{"id":"生成 AI を使いこなすために必要な事","tag":"3","text":"生成 AI を使いこなすために必要な事","active":false},{"id":"今後のエンジニア業界","tag":"3","text":"今後のエンジニア業界","active":false},{"id":"その他","tag":"2","text":"その他","active":false},{"id":"JetBrains AI Assistant の質","tag":"3","text":"JetBrains AI Assistant の質","active":false},{"id":"他の生成 AI ツール","tag":"3","text":"他の生成 AI ツール","active":false},{"id":"まとめ","tag":"2","text":"まとめ","active":false}],"replacedContent":"\n<p>生成 AI に質問しまくりながらシステムを作ってみた（現在進行形ですが）ので、コツやら感想・考察などを書いてみようと思います。</p>\n\n\n\n<h2>何を作るか</h2><a class=\"anchor\" id=\"何を作るか\"></a>\n\n\n\n<h3>作りたいもの</h3><a class=\"anchor\" id=\"作りたいもの\"></a>\n\n\n\n<p>割と最近、以下の2つの記事を書きました。</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https://engineering.mobalab.net/2024/09/20/implement-simple-rag-with-wordpress-data-1/\">WordPress のデータを使って簡単な RAG を実装する(1) – もばらぶエンジニアブログ</a></li>\n\n\n\n<li><a href=\"https://engineering.mobalab.net/2024/09/30/implement-simple-rag-with-wordpress-data-2/\">WordPress のデータを使って簡単な RAG を実装する(2) – もばらぶエンジニアブログ</a></li>\n</ul>\n\n\n\n<p>せっかくなので、WordPress のプラグインとして簡単に RAG を構築できるようにしてみようと思いました。</p>\n\n\n\n<h3>構成</h3><a class=\"anchor\" id=\"構成\"></a>\n\n\n\n<p>上のブログ記事の元ネタとなったサンプルプログラムは、LangChain という Python のライブラリーを使っています。そして、今回作っているシステムの構成としては以下を考えています。</p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>WordPress プラグイン</li>\n\n\n\n<li>同プラグインから呼び出される API</li>\n\n\n\n<li>バックグラウンド処理を行うワーカー\n<ul class=\"wp-block-list\">\n<li>WordPress サイトから記事のダウンロード</li>\n\n\n\n<li>記事の埋め込み表現を作成</li>\n\n\n\n<li>生成 AI を使用して回答を生成する</li>\n</ul>\n</li>\n</ol>\n\n\n\n<p>3番は、こないだ作ったサンプルプログラムを元にして作成するのですが、サンプルプログラムが Python なので必然的に Python になります。LangChain に加えてタスクキューの実装のために <a href=\"https://docs.celeryq.dev/en/main/getting-started/introduction.html\" target=\"_blank\" rel=\"noreferrer noopener\">Celery</a> というものを使いました。</p>\n\n\n\n<p>次に2番ですが、2番から呼び出される3番が Python なので、呼び出し元の2番も Python にしようと考え、以前少しだけ使ったことのある Flask を使うことにしました。なお、素の Flask だけでなく、以下のライブラリーも使っています。</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https://flask-restx.readthedocs.io/en/latest/\" data-type=\"link\" data-id=\"https://flask-restx.readthedocs.io/en/latest/\" target=\"_blank\" rel=\"noreferrer noopener\">Flask-RESTX</a>: Flask で RESTful API を作成するためのライブラリー</li>\n\n\n\n<li><a href=\"https://flask-migrate.readthedocs.io/en/latest/\" data-type=\"link\" data-id=\"https://flask-migrate.readthedocs.io/en/latest/\" target=\"_blank\" rel=\"noreferrer noopener\">Flask-Migrate</a>: Flask で DB マイグレーションを実施するためのライブラリー</li>\n</ul>\n\n\n\n<p>インフラですが、API とワーカーは AWS 上に構築する予定です。今まで、Terraform と CloudFormation はそれなりに使ってきましたが、今回は勉強も兼ねて CDK を使う予定です。</p>\n\n\n\n<h2>なぜ生成 AI に質問するのか</h2><a class=\"anchor\" id=\"なぜ生成 AI に質問するのか\"></a>\n\n\n\n<h3>使う予定の技術に馴染みがない</h3><a class=\"anchor\" id=\"使う予定の技術に馴染みがない\"></a>\n\n\n\n<p>そして、今回使う予定の Flask, Flask-RESTX, Flask-Migrate ですが、Flask は大分前に少し触ったことがあるものの、残りの2つは触ったことがありません。また、Python は、ちょっとしたスクリプトや簡単な Lambda 関数を作る時などにたまに触りますが、本格的なソフトウェアを Python で書いたことはありません。</p>\n\n\n\n<p>WordPress のプラグイン関連の技術に関して言うと、PHP は経験がありますし、本格的なプロジェクトもいくつもやってきました。また、WordPress でのサイト構築なども今までそれなりの数をやってきました。ただ、WordPress のプラグインを書いたことは一度もありません。</p>\n\n\n\n<p>と言うことで、今回使う技術にはあまり明るくないため。誰かに聞くしかありません。</p>\n\n\n\n<h3>一人でやりたかった</h3><a class=\"anchor\" id=\"一人でやりたかった\"></a>\n\n\n\n<p>以上のように、今回使う予定の技術にはあまり詳しくありません。もちろん、同僚などに聞くことも可能なのですが、今回は以下のような理由により、まずは一人で開発してみようと思いました。</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>最初の段階では何をやるべきか決まってないことが多いので、リモート中心での同僚のやり取りだと開発の速度が遅くなりそう</li>\n\n\n\n<li>久しぶりに自分でプログラムを書いてみたかった</li>\n</ul>\n\n\n\n<p>実際にはこれ以外にもいくつか理由がありますが、本題ではないので省略します。</p>\n\n\n\n<h2>まずは結果。どうなったか</h2><a class=\"anchor\" id=\"まずは結果。どうなったか\"></a>\n\n\n\n<h3>10日でバックエンドがある程度完成</h3><a class=\"anchor\" id=\"10日でバックエンドがある程度完成\"></a>\n\n\n\n<p>開発し始めてから10日くらいで、ローカル環境（Docker Compose）で以下がとりあえず動くところまで出来ました。</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>WordPress プラグインから呼び出される API</li>\n\n\n\n<li>バックグラウンド処理を行うワーカー</li>\n</ul>\n\n\n\n<h3>あと1週間程度でデモが出来る程度になりそうな予感</h3><a class=\"anchor\" id=\"あと1週間程度でデモが出来る程度になりそうな予感\"></a>\n\n\n\n<p>認証・認可、ログ出力などはとりあえず後回しにするとして、後は</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>WordPress プラグインの実装</li>\n\n\n\n<li>本番環境（AWS）の構築</li>\n</ul>\n\n\n\n<p>をやれば、デモが出来る状態になると思います。ここまでやってきた感覚からすると、必要な日数は前者に5日くらい、後者に1〜2日くらいで、合計で1週間くらいかと思います。</p>\n\n\n\n<h3>公式ドキュメント＋検索エンジンに比べて圧倒的に速くなった</h3><a class=\"anchor\" id=\"公式ドキュメント＋検索エンジンに比べて圧倒的に速くなった\"></a>\n\n\n\n<p>今までであれば、公式ドキュメントをさらっと読んで実装を始めて、分からないところは検索して Stack Overflow や公式ドキュメントで問題解決をする、という感じでやっていたと思います。この方法だと、今の段階（10日経過）まで来るのに多分1ヶ月くらいはかかっていたように思えます。</p>\n\n\n\n<h2>具体的にどうやったか</h2><a class=\"anchor\" id=\"具体的にどうやったか\"></a>\n\n\n\n<h3>使った生成 AI</h3><a class=\"anchor\" id=\"使った生成 AI\"></a>\n\n\n\n<p>今回は以下の2つを使いました。</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Claude</li>\n\n\n\n<li>JetBrains AI Assistant</li>\n</ul>\n\n\n\n<p>Claude は以前から有料版を使っていたので、そのまま使いました。このシステムを作り始める少し前に ChatGPT o1-preview が発表されてそれも少し気になっていたのですが、今回は使いませんでした。</p>\n\n\n\n<p>ソフトウェア開発に特化したツールとしては JetBrains AI Assistant （以下、JetBrains AI）を初めて使ってみました。社内では GitHub Copilot を使っているプロジェクトがあったので、違うツールを、ということで選びました。</p>\n\n\n\n<p>ちなみに、JetBrains AI はお試し期間があるので最初はお試しすれば良かったんですが、面倒だったので最初からお金を払いました。が、その後でレビューの評価が散々だったのに気づきました。（私の感想は後で書きます。）</p>\n\n\n\n<p><a href=\"https://plugins.jetbrains.com/plugin/22282-jetbrains-ai-assistant/reviews\">JetBrains AI Assistant Plugin for JetBrains IDEs | JetBrains Marketplace</a></p>\n\n\n\n<h3>どう使ったのか</h3><a class=\"anchor\" id=\"どう使ったのか\"></a>\n\n\n\n<p>大雑把に、以下のように使い分けました。</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>高レベルの設計や使う技術の選定等は Claude</li>\n\n\n\n<li>細かい実装上の質問は JetBrains AI</li>\n</ul>\n\n\n\n<p>これは、それぞれの生成 AI の能力もありますが、それよりは、UI 的な理由が大きいと思います。</p>\n\n\n\n<p>ちょっとした質問であればわざわざブラウザに切り替えて Claude のタブを開くよりは、IntelliJ 等の IDE 内にあるJetBrains AI の小さなタブ（？）でちょこっと質問して、回答をそのまま IDE 内にコピペする方が楽だと感じました。逆に込み入った質問であれば、JetBrains AI の小さなタブよりは、ブラウザ上で Claude にじっくり何回も質問を繰り返した方が使いやすいです。</p>\n\n\n\n<p>また、複数のファイルを生成してもらうような質問の場合も、Artifacts 機能がある Claude の方が便利です。</p>\n\n\n\n<p><a href=\"https://support.anthropic.com/en/articles/9487310-what-are-artifacts-and-how-do-i-use-them\">What are Artifacts and how do I use them? | Anthropic Help Center</a></p>\n\n\n\n<h2>考察</h2><a class=\"anchor\" id=\"考察\"></a>\n\n\n\n<h3>生成 AI が向いている事</h3><a class=\"anchor\" id=\"生成 AI が向いている事\"></a>\n\n\n\n<p>今年に入って生成 AI を使う機会が増えてきました。個人的に感じている、ソフトウェア開発において生成 AI が向いている事としては、</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>あまり詳しくない技術を使って何かを作る</li>\n\n\n\n<li>プロトタイプをささっと作る</li>\n</ul>\n\n\n\n<p>という、正に今回のような分野だと思っています。</p>\n\n\n\n<p>まず前者ですが、今回の例のように、生成 AI を使わなかった場合に比べて2倍以上速くなる場合もあると思います。逆に自分が詳しい分野の場合、生成 AI に何かを聞かなくても自然に手が動く事が大半なので、生成 AI を使うことによるメリットはそこまで多くないと思います。（メリットはありますが、生産性10%増しくらいかもしれません。まぁそれでも十分凄いのですが。）</p>\n\n\n\n<p>次に後者ですが、プロトタイプをささっと作る場合は、あまり細かいところに拘る必要はありませんので、生成 AI に質問をしてその結果をそのままコピペする＋αでも問題ない事が多いかもしれません。一方、商用サービスやお客様に納品するソフトウェアの開発であれば、セキュリティや性能面も含めて品質を高め、バグも減らしていく必要があります。そのためには、生成されたコードの採用すべき部分・直すべき部分をしっかり判断できる必要があります。</p>\n\n\n\n<h3>生成 AI がやってくれない事</h3><a class=\"anchor\" id=\"生成 AI がやってくれない事\"></a>\n\n\n\n<p>生成 AI はソフトウェア開発に有益なツールですが、やってくれない事も色々あります。代表的なものは以下のものでしょう。</p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>コードの実行結果が正しいかの確認</li>\n\n\n\n<li>質問していない事への回答・アドバイス</li>\n\n\n\n<li>生成されたコードが既存のコードと類似しているかの確認</li>\n</ol>\n\n\n\n<p>1番目は、多くの方がご存知の話なので詳細は省略します。</p>\n\n\n\n<p>2番目ですが、生成 AI に質問すると、それへの直接の回答や関連する情報は教えてくれますが、それ以外の話は教えてくれないことが多いです。これは当たり前の話に思えますが結構重要です。ある技術に詳しい同僚に質問した場合には、質問者のレベルに応じて、</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>それ以外に気をつけたら良い点</li>\n\n\n\n<li>今後詰まりそうな点へのアドバイス</li>\n</ul>\n\n\n\n<p>などを教えてくれますが、生成 AI ではそういう事は（ある程度はしますが）あまりしてくれません。</p>\n\n\n\n<p>3番目は、生成 AI の生成するコードが他者のコードと類似している可能性があり、そのコードのライセンスによっては、自分が開発しているソフトウエア・サービスに組み込めない場合があります。詳しくは検索なり生成 AI に質問してください。</p>\n\n\n\n<h3>生成 AI を使いこなすために必要な事</h3><a class=\"anchor\" id=\"生成 AI を使いこなすために必要な事\"></a>\n\n\n\n<p>これは過去にもどこかで書いたと思いますが、ソフトウェア開発で生成 AI を使いこなすためには、</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>適切な質問をする</li>\n\n\n\n<li>生成されたコードの善し悪しを適切に判断し、取捨選択する</li>\n</ul>\n\n\n\n<p>という力が必要です。そのために何が必要かというと、</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>まずは1つの技術をしっかり使いこなす</li>\n\n\n\n<li>その技術の動作原理などをしっかり理解する</li>\n</ul>\n\n\n\n<p>では無いかと考えます。ウェブ系のエンジニアであれば、例えばまずは Ruby on Rails で色々なサイトを作れるようになり、その後に HTTP の仕組みや、Ruby 自体、Ruby on Rails の構成などを理解する、という感じでしょうか。</p>\n\n\n\n<p>1つの技術をしっかり理解していれば、類似の技術を学ぶ時にも類推が効きます。私自身、PHP や Rails を使ったウェブ API の開発などは過去に沢山やってきましたので、今回 Flask を使った API 開発でも分からない事をどんどん質問しまくりながら何とか開発を進められました。</p>\n\n\n\n<h3>今後のエンジニア業界</h3><a class=\"anchor\" id=\"今後のエンジニア業界\"></a>\n\n\n\n<p>生成 AI によってエンジニア業界を取り巻く環境は大きく変わりました。もちろん、所謂「幻滅期」みたいな時期も今後来るかとは思いますが、エンジニアの進むべき道なども大きく変わりそうです。これについては、別途書こうと思います。</p>\n\n\n\n<h2>その他</h2><a class=\"anchor\" id=\"その他\"></a>\n\n\n\n<h3>JetBrains AI Assistant の質</h3><a class=\"anchor\" id=\"JetBrains AI Assistant の質\"></a>\n\n\n\n<p>機能的には問題無いのですが、1つ前のバージョンではライセンスのアクティベーションが失敗するという事がしょっちゅう起きました。長時間起動していたり、PC をスリープから復帰した時などにアクティベーションを求められて、正しい情報を入力しても失敗するという事象です。IDE を再起動すると直ります。（昨日、プラグインをアップデートしたので、改善されている事を祈ります。）</p>\n\n\n\n<p>肝心の Assistant 機能自体は結構良いと思います。感心したのは Flask-Migrate が内部的に使っている SQLAlchemy という ORM についての質問をした時です。質問時には Flask-Migrate を使っているという事は言わなかったのですが、とあるオブジェクトをどのように初期化しているかを伝えた時に、そのコードの中に Flask-Migrate のクラスがある事に気づいて、Flask-Migrate の場合の回答を返してくれた事です。</p>\n\n\n\n<p>コードの自動補完も、自分が慣れている言語・フレームワークであれば邪魔かもしれませんが、勉強中の技術であれば役に立ちます。（コードの自動補完は設定でオフに出来ます。）</p>\n\n\n\n<h3>他の生成 AI ツール</h3><a class=\"anchor\" id=\"他の生成 AI ツール\"></a>\n\n\n\n<p>最近では、</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Cursor</li>\n\n\n\n<li>Codeium</li>\n\n\n\n<li>Replit Ghost Writer</li>\n</ul>\n\n\n\n<p>等といった新しいツール・サービスがどんどん出てきています。正直なところ、そうした新しいツールにはあまり触る時間が無いのですが、今後もどんどん出続けて、その中から有名になるツールも出てくると思います。また、既存のツールもどんどん進化するはずです。（そして、廃れるものも出てきそうです。）</p>\n\n\n\n<p>これからも既存のツールに満足せずに、生産性を向上してくれそうなものは色々試してみようと思います。</p>\n\n\n\n<h2>まとめ</h2><a class=\"anchor\" id=\"まとめ\"></a>\n\n\n\n<p>世間では生成 AI、生成 AI と至る所で言われて、正直お腹いっぱいの方もいるかもしれません。ただ、ソフトウェア開発に限って言うと、ここ1年くらいでのツールの進歩はかなり速いので、あまり使っていない人は是非使ってみる事をお勧めします。</p>\n\n\n\n<p>生成 AI は、自分がある程度知っている技術での開発の場合にも役立ちますが、あまり詳しくない技術を使ったシステム構築に最も真価を発揮すると個人的には考えます。また、本格的なプロジェクトの場合には、生成 AI が出力したプログラムをしっかり吟味する必要がありますが、PoC やデモなどであればそこまで細かく気にする事も無いかと思います。</p>\n"}},"staticQueryHashes":["156639431","195851561","2295443436","3007017043"]}