Upgrade to Pro — share decks privately, control downloads, hide ads and more …

未知のプログラミング言語にChatGPTと共に挑む

yudppp
July 20, 2023

 未知のプログラミング言語にChatGPTと共に挑む

DROBE Engineer Night #4 LLM in PracticeのLT資料です

yudppp

July 20, 2023
Tweet

More Decks by yudppp

Other Decks in Technology

Transcript

  1. 未知のプログラミング⾔語に
    ChatGPTと共に挑む
    DROBE Engineer Night #4 LLM in Practice

    View full-size slide

  2. ⼤学では経営⼯学を学んでいました。
    コードは今も昔もたくさん書いています。
    HRBrainではプロダクトチームのテック
    リードとプラットフォームチームを兼務を
    しながら、いろんなことをやっています。
    好きな⾔葉は冪等性。
    嫌いなモノは浮動⼩数点の誤差。
    yudppp

    View full-size slide

  3. Abstract
    未知の⾔語(Lua)をスポットで使いたかったので、
    体系的な学習をせずにChatGPTを利⽤し、開発を⾏なった話をします。

    View full-size slide

  4. Contents
    ● HRBrainについて
    ● 私がやりたかったこと
    ● 私とLuaの関係
    ● 私とChatGPTとの共闘
    ● まとめ

    View full-size slide

  5. HRBrainについて

    View full-size slide

  6. HRBrainについて
    HRBrainは、タレントマネジメント、組織診断サーベイ、⼈事評価、360度評価、
    労務管理、社内向けチャットボットの6サービスからなる、⼈事業務の効率化か
    ら⼈材データの⼀元管理‧活⽤までワンストップで実現するクラウドサービス
    HRBrainを開発運営しています。

    View full-size slide

  7. HRBrainのドメイン設計

    View full-size slide

  8. 私がやりたかったこと

    View full-size slide

  9. ブランチデプロイ環境について
    PRごとに検証できる環境のこと。会社によってはPull Request環境と呼ばれたり
    しているもの

    View full-size slide

  10. ブランチデプロイ環境について
    HRBrainの PlatformチームではPRごとに専⽤の環境を簡単に⽴ち上げる仕組みを
    プロダクトチーム向けに提供しています。
    ⼀つのサービスだけではなく、複数のサービスを同時に動かす必要があり、複雑
    な仕組みで実現しています。
    元々Kubernetes(GKE)上で動いていた仕組みからCloudRunに移⾏しています。
    https://times.hrbrain.co.jp/entry/kubernetes-branch-deploy

    View full-size slide

  11. CloudRunのリビジョンタグについて
    リビジョンタグを使⽤すると、リビジョン(Versionに近いもの)に名前を付けるこ
    とができ、その名前を使って特定のリビジョンにアクセスが可能になります。
    URL: https://service-a.run.app
    TAG: https://tag---service-a.run.app
    PRごとにリビジョンを作成することがで、PRごとに固有のURLでアクセスするこ
    とが可能になります。
    https://cloud.google.com/run/docs/rollouts-rollbacks-traffic-migration?hl=ja#tags

    View full-size slide

  12. 下記のURLでアクセスできるようにしたい

    View full-size slide

  13. 下記ができるProxyを作る

    View full-size slide

  14. 簡単なProxyといったらNginx
    server {
    listen 8080;
    server_name ~^((?[a-z_0-9-]+)---(?[a-z_0-9-]+))\.service-a\.hrbrain\.jp;
    location / {
    set $url https://$pr---service-a.run.app;
    resolver 8.8.8.8 valid=10s;
    proxy_pass $url;
    proxy_set_header X-Forwarded-Host $host;
    }
    }
    server {
    listen 8080;
    server_name ~^(?[a-z_0-9-]+))\.service-a\.hrbrain\.jp;
    location / {
    resolver 8.8.8.8 valid=10s;
    proxy_pass https://service-a.run.app;
    proxy_redirect off;
    proxy_set_header X-Forwarded-Host $host;
    }
    }

    View full-size slide

  15. 簡単なProxyといったらNginx
    server {
    listen 8080;
    server_name ~^((?[a-z_0-9-]+)---(?[a-z_0-9-]+))\.service-a\.hrbrain\.jp;
    location / {
    set $url https://$pr---service-a.run.app;
    resolver 8.8.8.8 valid=10s;
    proxy_pass $url;
    proxy_set_header X-Forwarded-Host $host;
    }
    }
    server {
    listen 8080;
    server_name ~^(?[a-z_0-9-]+))\.service-a\.hrbrain\.jp;
    location / {
    resolver 8.8.8.8 valid=10s;
    proxy_pass https://service-a.run.app;
    proxy_redirect off;
    proxy_set_header X-Forwarded-Host $host;
    }
    }
    これがサービスの数分必要

    View full-size slide

  16. nginx.conf
    20⾏×20サービス(現在時点)→400⾏
    サービスの追加⾃体はプラットフォームチームではなく、プロダクトチームに
    やってもらいたいと思っている。
    400⾏ほぼコピペのコードがあるのはしんどい。
    またプラットフォームチーム的には共通で設定変えたいとかありそう。その時40
    箇所に1⾏ずつ⾜したPR出すのか
    for⽂を使いたい。

    View full-size slide

  17. nginx.conf
    server {
    listen 8080;
    server_name ~^((?[a-z_0-9-]+)---(?[a-z_0-9-]+))\.service-a\.hrbrain\.jp;
    location / {
    set $url https://$pr---service-a.run.app;
    resolver 8.8.8.8 valid=10s;
    proxy_pass $url;
    proxy_set_header X-Forwarded-Host $host;
    }
    }
    server {
    listen 8080;
    server_name ~^(?[a-z_0-9-]+))\.service-a\.hrbrain\.jp;
    location / {
    resolver 8.8.8.8 valid=10s;
    proxy_pass https://service-a.run.app;
    proxy_redirect off;
    proxy_set_header X-Forwarded-Host $host;
    }
    }

    View full-size slide

  18. ChatGPTとのやりとり

    View full-size slide

  19. OpenRestyとLuaついて
    OpenRestyは、NGINXベースのウェブプラットフォームで、Lua⾔語を使⽤して
    ⾼性能なウェブアプリケーションを作成するためのツールです。OpenRestyは、
    サーバーサイドのWeb開発で柔軟性とスケーラビリティを提供します。Luaは、
    優れたスピード、最⼩のメモリフットプリント、そしてCとの簡単なインター
    フェースを提供することで知られています。これにより、LuaはOpenRestyの内部
    でのスクリプト作成に適しています。
    これら⼆つの組み合わせにより、データリッチなウェブアプリケーションを効率
    的に開発することができます。

    View full-size slide

  20. 私とLuaの関係

    View full-size slide

  21. 関係性①
    前職でも今回のようなAPI Gateway⽤途でLuaを利⽤していた。
    ただメインで上司が書いていたので、⼀部のコードを改変した程度(もしかしたら
    ないかもしれない)で⽂法は忘れてしまっている。

    View full-size slide

  22. 関係性②
    4年に1回の頻度でRedisでAtomicな処理をするために利⽤する。
    ただ書いても数⾏なので⽂法を気にしたことはない

    View full-size slide

  23. 私とChatGPTとの共闘

    View full-size slide

  24. 最後にちゃんと動くか確認
    エラーが出て動かなかった

    View full-size slide

  25. 今度こそ動くか確認
    無事動いた

    View full-size slide

  26. 最終結果
    400⾏が54⾏になり13.5%に圧縮できました。
    54⾏のうち20⾏はMapの定義でロジックらしいロジックは10⾏程度

    View full-size slide

  27. まとめ
    Luaについて詳しく知らないまま、動くものを作ることが可能になった。
    OpenRestyではNginxでは⼿の届きにくいところをカバーできるのでちょっと使
    う分には良かった。
    どうChatGPTにニュアンスを伝えるかが重要だった。
    またデバッグ⾃体は現状だと⾃分⾃⾝で⾏う必要があった。

    View full-size slide

  28. 追伸
    結局map directiveやif directiveを駆使すれば、別にLuaいらなかったのでは?

    View full-size slide