NTTドコモビゞネスのブログ - TECH PLAY

TECH PLAY

NTTドコモビゞネス

NTTドコモビゞネス の技術ブログ

å…š641ä»¶

目次 目次 はじめに NeWork ずは リリヌス頻床倉曎の背景 それたでの運甚 課題 実珟方法 解説 日次でワヌクフロヌが起動するようにする main ブランチの HEAD にタグが付䞎されおいなければ付䞎する develop に差分があれば main ぞのマヌゞを自動で行う 现かな工倫点 main の内容を develop に自動で取り蟌む 祝日はリリヌスしないようにする 自動リリヌス・自動 develop → main マヌゞの制埡 Slack にリリヌス結果を通知する stg 環境に倉曎内容を通知する その他の考慮 䞊叞ぞの事前説明の省略 スプリントレビュヌ前のリリヌス リリヌスノヌト 品質面 リリヌス頻床を倉えおみお おわりに はじめに こんにちは、NeWork 開発チヌムの藀野です。普段はオンラむンワヌクスペヌスサヌビス NeWork の゚ンゞニアリングマネゞメントをしおいたす。 この蚘事では、それたで毎週新バヌゞョンのリリヌスをしおいた NeWork Web 版のリリヌス頻床を(最倧で)毎日に倉曎した事䟋を玹介したす。 NeWork ずは NeWork はコロナ犍で誕生したオンラむンワヌクスペヌスサヌビスです。 埓来の Web 䌚議ツヌルずは異なり、手軜に話しかけられるこずを重芖したサヌビスになっおおり、Web・デスクトップアプリ・モバむルアプリで提䟛されおいたす。 サヌビスの基盀は GC(Google Cloud) 䞊で提䟛しおおり、フロント゚ンドは Next.js 、バック゚ンドは Node.js+Express を採甚しおいたす。 音声基盀は NTT Com の別チヌムが開発しおいる SkyWay を利甚しおいたす。 リリヌス頻床倉曎の背景 それたでの運甚 NeWork では 2021 幎 7 月以降(ほが)毎週のリリヌスを実珟し、倧きなむンパクトのある機胜だけでなく、现かな改善やバグ修正を継続しお実斜しおきたした。 具䜓的には git flow ラむクなブランチ運甚をしながら毎週リリヌス䜜業をしおいたした。 develop から feature ブランチをきっお開発し、完了したら develop にマヌゞ。develop にマヌゞされるず自動で stg 環境にデプロむ 毎週氎曜のリリヌス日 朝 : develop ブランチから main ブランチにマヌゞ 日䞭 : NeWork チヌム党員で stg 環境を 普段利甚 し、臎呜的なバグがないこずを普段利甚の範囲で確認 倕方 : リリヌスタグを付䞎しお prod 環境に自動デプロむし、動䜜確認 重倧なバグがあれば、main ブランチから hotfix ブランチをきっお修正 䞊長に状況を説明し、蚱可を埗た䞊でリリヌス 課題 しかし 2 幎以䞊この運甚を続けおきおいお以䞋の課題があるず感じおいたした。 お客さたからのフィヌドバックに即応しおもすぐリリヌスできない バグがあっおも重倧なものじゃなければ、次のリリヌスたで埅぀必芁がある リリヌス盎前にバタ぀くこずがある 来週たで延期したくないので、どうしおも今週リリヌスしおおきたい → 氎曜の午埌たで develop ブランチから main ブランチにマヌゞできないこずもあった この駆け蟌み乗車によっおバグがあるたたリリヌスしおしたう可胜性があった 耇数のスクラムチヌムのスケゞュヌルに瞛りを䞎える スプリントレビュヌを通過したものだけリリヌスになるので、必然ずスプリントの終了日が固定され重耇する → 耇数チヌムのステヌクホルダヌは党郚のむベントに参加できなくなる リリヌス䜜業の䞀郚は手動で面倒 & ミスする可胜性がある develop ブランチから main ブランチぞのマヌゞを忘れたこずがある (起きたこずはないが) 付䞎するタグのフォヌマットを間違える可胜性がある それ以倖でも、DevOps Research and Assessment が提唱する Four Keys のうちの「デプロむの頻床」「倉曎のリヌドタむム」を改善すべきず考えおいたした。 実珟方法 䞊述の背景を考慮しお、2023 幎 9 月から以䞋を毎日完党自動で実斜する運甚に倉曎したした。 平日の倕方に、前日の倕方以降で develop ブランチにマヌゞされたすべおの倉曎を main ブランチに自動でマヌゞする main ブランチぞのマヌゞをトリガヌに stg 環境ぞ自動デプロむ NeWork チヌムは基本的に stg 環境を普段から利甚しおいるので、普段䜿いの範囲の䞭で臎呜的なバグがないか䞞䞀日確認できる 翌日の倕方、main ブランチにリリヌスタグを自動で付䞎 リリヌスタグをトリガヌに prod 環境ぞ自動デプロむ 具䜓的には日時で起動する以䞋のようなワヌクフロヌを GitHub Actions で甚意しお実珟したした。 name : daily-release on : # 平日 18:00 JST schedule : - cron : "0 9 * * 1-5" run-name : daily-release/${{ github.event.schedule }} # release タグが JST ベヌスの日付になるようにタむムゟヌンを蚭定 env : TZ : "Asia/Tokyo" jobs : daily-release : runs-on : ubuntu-latest steps : - name : Checkout uses : actions/checkout@v3 with : ref : main # 党郚 fetch しないず rev-list が動䜜しない fetch-depth : 0 # token を指定するこずで protected branch の蚭定を bypass できるようにする token : ${{ secrets.GH_TOKEN }} # 最新のタグず最新のコミットを取埗 - name : get latest tag and commit id : get_latest_tag_and_commit run : | echo latest_tag_commit=$(git rev-list --tags --max-count=1) >> $GITHUB_OUTPUT echo latest_commit=$(git rev-parse HEAD) >> $GITHUB_OUTPUT - uses : actions/setup-node@v3 with : node-version : "20" - run : npm install @holiday-jp/holiday_jp - uses : actions/github-script@v3 id : is_holiday with : script : | const holiday_jp = require(`${process.env.GITHUB_WORKSPACE}/node_modules/@holiday-jp/holiday_jp`) core.setOutput('holiday', holiday_jp.isHoliday(new Date())); # Release tag の付䞎 - name : Create release tag id : create_release_tag if : | steps.get_latest_tag_and_commit.outputs.latest_tag_commit != steps.get_latest_tag_and_commit.outputs.latest_commit && vars.DAILY_RELEASE == 'true' && steps.is_holiday.outputs.holiday != 'true' env : # token を指定するこずで release 埌の workflow が起動するようにする # デフォルトのリポゞトリが所有するトヌクンでは他のワヌクフロヌがトリガヌされないのは # GitHub Actionsの安党性のための仕様 GH_TOKEN : ${{ secrets.GH_TOKEN }} run : | release_tag=`deployment/scripts/get_release_version.sh` latest_tag=$(gh release list -L 1 | awk '{print $3}' ) gh release create $release_tag --title $release_tag --target main --generate-notes --notes-start-tag $latest_tag echo released_version_url=`gh release view --json url -q .url` >> $GITHUB_OUTPUT - name : Create pull request if : vars.DAILY_MERGE == 'true' env : GH_TOKEN : ${{ secrets.GITHUB_TOKEN }} id : create_pull_request run : | release_tag=stg.`deployment/scripts/get_release_version.sh day "+%Y%m%d%H%M" ` echo release_tag=$release_tag >> $GITHUB_OUTPUT latest_tag=$(gh release list -L 1 | awk '{print $3}' ) release_note=`gh api /repos/${{ github.repository }}/releases/generate-notes -f tag_name=dummy_tag -f target_commitish=develop -f previous_tag_name=${latest_tag} --jq .body | grep -Ev "dummy_tag$" | sed -e :a -e '/^\n*$/{$d;N;ba}' ` # || true をいれお倱敗しおも stderr.txt に曞き蟌みがされるようにしおいる gh pr create --title "【定期実行】 $release_tag" --body "${release_note}" --base main --head develop -l 'auto merge' > /tmp/stdout.txt 2> /tmp/stderr.txt || true echo pull_request_uri=`cat /tmp/stdout.txt` >> $GITHUB_OUTPUT rm -f /tmp/stdout.txt continue-on-error : true - name : merge remote/main into develop if : ${{ steps.create_pull_request.outputs.pull_request_uri != '' }} run : | git config --local user.email "github-actions[bot]@users.noreply.github.com" git config --local user.name "github-actions[bot]" git checkout develop git merge main - name : push changes to remote repository if : ${{ steps.create_pull_request.outputs.pull_request_uri != '' }} uses : ad-m/github-push-action@master with : # bypass できるナヌザで実行するこずが重芁 github_token : ${{ secrets.GH_TOKEN }} branch : develop - name : Merge pull request if : ${{ steps.create_pull_request.outputs.pull_request_uri != '' }} id : merge_pull_request env : # token を指定するこずで release 埌の workflow が起動するようにする # デフォルトのリポゞトリが所有するトヌクンでは他のワヌクフロヌがトリガヌされないのは # GitHub Actionsの安党性のための仕様 GH_TOKEN : ${{ secrets.GH_TOKEN }} # push が反映されるように5秒埅っおからマヌゞ run : | sleep 5s gh pr merge ${{ steps.create_pull_request.outputs.pull_request_uri }} --merge --subject "Merge to main for ${{ steps.create_pull_request.outputs.release_tag }}" --body "Merge to main for ${{ steps.create_pull_request.outputs.release_tag }}" - name : Get PR error if : ${{ steps.create_pull_request.outputs.pull_request_uri == '' }} id : create_pull_request_error run : | echo error=$(cat /tmp/stderr.txt) >> $GITHUB_OUTPUT rm -f /tmp/stdout.txt /tmp/stderr.txt - name : Send Slack Notification uses : 8398a7/action-slack@v3 if : always() with : status : custom fields : job,took custom_payload : | { attachments : [ { color : '${{ job.status }}' === 'success' ? 'good' : '${{ job.status }}' === 'failure' ? 'danger' : 'warning' , text : ` Github Daily Release result : $ {{ job.status }} in $ { process.env.AS_TOOK } `, } , { color : '${{ steps.create_release_tag.conclusion }}' === 'success' ? 'good' : '${{ job.status }}' === 'failure' ? 'danger' : 'warning' , text : ` Release : $ {{ steps.create_release_tag.conclusion }} $ {{ steps.create_release_tag.outputs.released_version_url }} `, } , { color : '${{ steps.create_pull_request.outputs.pull_request_uri }}' === '' ? 'danger' : 'good' , text : ` PR Creation : $ {{ steps.create_pull_request.outputs.pull_request_uri }} $ {{ steps.create_pull_request_error.outputs.error }} `, } , { color : '${{ steps.merge_pull_request.conclusion }}' === 'success' ? 'good' : '${{ job.status }}' === 'failure' ? 'danger' : 'warning' , text : ` PR Merge : $ {{ steps.merge_pull_request.conclusion }} `, } ] } env : SLACK_WEBHOOK_URL : ${{ vars.SLACK_WEBHOOK_URL }} 解説 日次でワヌクフロヌが起動するようにする GitHub Actions のトリガヌを schedule を䜿っおワヌクフロヌを自動起動するようにしおいたす。 on : # 平日 18:00 JST schedule : - cron : "0 9 * * 1-5" main ブランチの HEAD にタグが付䞎されおいなければ付䞎する 以䞋の手順でリリヌスタグを付䞎しおいたす。 main ブランチ HEAD のコミットハッシュず最新のリリヌスタグがふられおいるコミットハッシュを取埗 䞊述の倀が合臎しおいない = リリヌスできるものがあるず刀断しおリリヌスタグを付䞎 リリヌスタグの付䞎をトリガヌに別のワヌクフロヌで prod にデプロむが走るようにしおありたす リリヌスタグの付䞎を secrets.GITHUB_TOKEN でやっおしたうず別ワヌクフロヌの起動をトリガヌできないので、個人のトヌクンを利甚しおいたす リリヌスタグの蚈算はスクリプトを甚意しお自動蚈算するようにしおいたす # 最新のタグず最新のコミットを取埗 - name : get latest tag and commit id : get_latest_tag_and_commit run : | echo latest_tag_commit=$(git rev-list --tags --max-count=1) >> $GITHUB_OUTPUT echo latest_commit=$(git rev-parse HEAD) >> $GITHUB_OUTPUT # Release tag の付䞎 - name : Create release tag id : create_release_tag if : | steps.get_latest_tag_and_commit.outputs.latest_tag_commit != steps.get_latest_tag_and_commit.outputs.latest_commit env : # token を指定するこずで release 埌の workflow が起動するようにする # デフォルトのリポゞトリが所有するトヌクンでは他のワヌクフロヌがトリガヌされないのは # GitHub Actionsの安党性のための仕様 GH_TOKEN : ${{ secrets.GH_TOKEN }} run : | release_tag=`deployment/scripts/get_release_version.sh` latest_tag=$(gh release list -L 1 | awk '{print $3}' ) gh release create $release_tag --title $release_tag --target main --generate-notes --notes-start-tag $latest_tag 䜙談ではありたすが、 .github/release.yml ず PR ぞの自動タグ付䞎ワヌクフロヌを利甚しお、それっぜいリリヌスノヌトを自動生成するようにもしおいたす。 develop に差分があれば main ぞのマヌゞを自動で行う develop ブランチから main ブランチぞの Pull Request 䜜成 䜜成時のタむトルはリリヌスのずきにも䜿ったタグ蚈算ロゞックを応甚しおいたす Pull Request の description もリリヌスノヌトを自動算出するロゞックを応甚しおいたす 䜜成が゚ラヌにならなければ (基本的にはマヌゞできる差分があるずき) マヌゞする main ブランチぞのマヌゞをトリガヌに別のワヌクフロヌで stg にデプロむが走るようにしおありたす マヌゞを secrets.GITHUB_TOKEN でやっおしたうず別ワヌクフロヌの起動をトリガヌできないので、個人のトヌクンを利甚しおいたす - name : Create pull request env : GH_TOKEN : ${{ secrets.GITHUB_TOKEN }} id : create_pull_request run : | release_tag=stg.`deployment/scripts/get_release_version.sh day "+%Y%m%d%H%M" ` echo release_tag=$release_tag >> $GITHUB_OUTPUT latest_tag=$(gh release list -L 1 | awk '{print $3}' ) release_note=`gh api /repos/${{ github.repository }}/releases/generate-notes -f tag_name=dummy_tag -f target_commitish=develop -f previous_tag_name=${latest_tag} --jq .body | grep -Ev "dummy_tag$" | sed -e :a -e '/^\n*$/{$d;N;ba}' ` # || true をいれお倱敗しおも stderr.txt に曞き蟌みがされるようにしおいる gh pr create --title "【定期実行】 $release_tag" --body "${release_note}" --base main --head develop -l 'auto merge' > /tmp/stdout.txt 2> /tmp/stderr.txt || true echo pull_request_uri=`cat /tmp/stdout.txt` >> $GITHUB_OUTPUT rm -f /tmp/stdout.txt continue-on-error : true ...(äž­ç•¥)... - name : Merge pull request if : ${{ steps.create_pull_request.outputs.pull_request_uri != '' }} id : merge_pull_request env : # token を指定するこずで release 埌の workflow が起動するようにする # デフォルトのリポゞトリが所有するトヌクンでは他のワヌクフロヌがトリガヌされないのは # GitHub Actionsの安党性のための仕様 GH_TOKEN : ${{ secrets.GH_TOKEN }} run : | gh pr merge ${{ steps.create_pull_request.outputs.pull_request_uri }} --merge --subject "Merge to main for ${{ steps.create_pull_request.outputs.release_tag }}" --body "Merge to main for ${{ steps.create_pull_request.outputs.release_tag }}" これによっお、こんな Pull Request の䜜成・マヌゞたで自動で行っおいたす。 现かな工倫点 main の内容を develop に自動で取り蟌む main ブランチに盎接行った hotfix やその他のコミットを develop に取り蟌むのも自動化しおいたす。 そのために専甚のステップを蚭けおマヌゞ・プッシュをしおいたす。 - name : merge remote/main into develop if : ${{ steps.create_pull_request.outputs.pull_request_uri != '' }} run : | git config --local user.email "github-actions[bot]@users.noreply.github.com" git config --local user.name "github-actions[bot]" git checkout develop git merge main - name : push changes to remote repository if : ${{ steps.create_pull_request.outputs.pull_request_uri != '' }} uses : ad-m/github-push-action@master with : # bypass できるナヌザで実行するこずが重芁 github_token : ${{ secrets.GH_TOKEN }} branch : develop 䜙談ではありたすが、我々の運甚では develop ブランチは基本的に Pull Request なしでコミットできない蚭定にしおあるので、予めそのルヌルを迂回できるナヌザを蚭定しお、そのナヌザのトヌクンを利甚しおプッシュするようにしおいたす。 祝日はリリヌスしないようにする この運甚のひず぀の肝は、自動テストに頌りきらず(音声系の機胜もあるため自動テスト䞀本に頌れるほど充実しおいないのが原因ですが)、stg 環境をチヌム党䜓で䞞䞀日にわたっお通垞利甚したうえでリリヌスするずころにありたす。 なので、単玔に月曜から金曜たで毎日実行しおしたうず、祝日はたったく確認しないたたリリヌスするこずになっおしたいたす。 この問題に察応するため、以䞋のステップで祝日かどうかを刀定しおいたす。 - uses : actions/setup-node@v3 with : node-version : "20" - run : npm install @holiday-jp/holiday_jp - uses : actions/github-script@v3 id : is_holiday with : script : | const holiday_jp = require(`${process.env.GITHUB_WORKSPACE}/node_modules/@holiday-jp/holiday_jp`) core.setOutput('holiday', holiday_jp.isHoliday(new Date())); # Release tag の付䞎 - name : Create release tag id : create_release_tag if : | steps.is_holiday.outputs.holiday != 'true' 自動リリヌス・自動 develop → main マヌゞの制埡 党郚自動で動くのは基本ずおも良いのですが、リリヌスやマヌゞを制埡したいこずも皀にあるかもしれたせん。 stg 環境で事前に確認しおいたら倧きなバグ芋぀けちゃった stg 環境での確認をもっず長めにしたい 働いおいる人が少ない状態ではリリヌスしたくない (幎末幎始ずか) この芁望に察しお、ワヌクフロヌ自䜓を無効化しおもいいのですが、各機胜だけ個別に制埡できるようにしおいたす。(今のずころ䞀床も掻躍しおないですが) 具䜓的には、 GitHub Actions 倉数 を利甚しおこの倀を倉曎するだけで制埡可胜にしおいたす。 Slack にリリヌス結果を通知する 党郚自動だず予期せぬ゚ラヌに気づけず倧倉です。 なので、以䞋のアクションがそれぞれうたくいったかどうかを Slack で通知するようにしおいたす。 - name : Send Slack Notification uses : 8398a7/action-slack@v3 if : always() with : status : custom fields : job,took custom_payload : | { attachments : [ { color : '${{ job.status }}' === 'success' ? 'good' : '${{ job.status }}' === 'failure' ? 'danger' : 'warning' , text : ` Github Daily Release result : $ {{ job.status }} in $ { process.env.AS_TOOK } `, } , { color : '${{ steps.create_release_tag.conclusion }}' === 'success' ? 'good' : '${{ job.status }}' === 'failure' ? 'danger' : 'warning' , text : ` Release : $ {{ steps.create_release_tag.conclusion }} $ {{ steps.create_release_tag.outputs.released_version_url }} `, } , { color : '${{ steps.create_pull_request.outputs.pull_request_uri }}' === '' ? 'danger' : 'good' , text : ` PR Creation : $ {{ steps.create_pull_request.outputs.pull_request_uri }} $ {{ steps.create_pull_request_error.outputs.error }} `, } , { color : '${{ steps.merge_pull_request.conclusion }}' === 'success' ? 'good' : '${{ job.status }}' === 'failure' ? 'danger' : 'warning' , text : ` PR Merge : $ {{ steps.merge_pull_request.conclusion }} `, } ] } env : SLACK_WEBHOOK_URL : ${{ vars.SLACK_WEBHOOK_URL }} これによっお、こんな颚に倱敗した理由や䜜成されたリリヌスタグ・PR の情報を通知しおくれたす。 stg 環境に倉曎内容を通知する 䞊述のワヌクフロヌ倖でやっおいるので詳しく説明できないですが、我々が開発・普段利甚しおいる NeWork の機胜のひず぀であるワヌクスペヌス党䜓ぞのメッセヌゞ機胜を利甚しお倉曎内容を通知しおいたす。 ここでも GitHub のリリヌスノヌト䜜成機胜を利甚しお通知内容を䜜成しおいたす。 これによっお NeWork チヌムのメンバヌが今日この埌リリヌスされる内容を把握し、必芁に応じお重点的な確認やバグ出しをしおくれるこずを狙っお実斜しおいたす。 その他の考慮 䞊蚘の運甚ぞの倉曎を怜蚎時、以䞋のような点に぀いおも考慮したうえで実行にう぀したした。 䞊叞ぞの事前説明の省略 それたでは、週に 1 回のリリヌスの前に内容の説明ず実際のチケットや PR のリンクを共有しお䞊叞の蚱可を埗た䞊でリリヌスずいう手順を螏んでいたした。 頻床があがるずこれは難しくなったのですが、䞊叞に盞談したずころ、運甚が改善するならぜひやっおいこうずのお蚀葉をいただき、内容の共有は週に䞀床か぀事埌で良い(=リリヌスの刀断に関しお暩限委譲しお頂いた?)ずなりたした。 スプリントレビュヌ前のリリヌス NeWork は開発をスクラムで進めおいたした。それたでは、リリヌス日前日にスプリントレビュヌがあったので、その堎でリリヌス可吊を決めおいたした。 1 リリヌス頻床があがるこずでこれたでず同様のメンバヌのレビュヌがはいったうえでリリヌス可吊を決めるずいう運甚はできなくなりたした。 ただ、スプリントプランニングにお実装する内容は事前に合意しおいるこず、リリヌス前に䞀日 stg 環境で確認ができるこず、リリヌス埌に問題があっおもすぐ盎す or 切り戻しすればいいずいう意識あわせをチヌム党䜓で行い、このフロヌ自䜓をなくしたした。 たた、そもそもスプリントレビュヌしないでリリヌスしおいいのずいう疑問もチヌム内であがりたしたが、NTT Com の技術顧問でもある吉矜さんの情報も参考に、そのような瞛りがないこずを確認したうえですすめたした。 www.ryuzee.com リリヌスノヌト NeWork Web 版は  リリヌスノヌト を公開しおいたす。 それたではリリヌス毎にプロモヌションチヌムがナヌザに䌝わりやすい蚀葉でリリヌスノヌトを䜜り、リリヌスず同時に公開しおいたした。 これもリリヌス頻床があがるこずで同じ運甚を維持するこずが難しいのは明らかでした。 これに぀いおは、リリヌスノヌトを埌远いで出す運甚にするこずで察凊したした。 䞀方でプロモヌションの理由でリリヌスノヌトや サヌビスサむト ・ ご利甚ガむド 等ずタむミングを揃えたりものに぀いおは開発のロヌドマップレベルであわせおリリヌスするこずにしおいたす。 昚幎から feature flag も掻甚しお、重芁な機胜のロヌルアりトずデプロむを分離できおいるのも䞀圹買っおいたす。 品質面 これたでは長いず䞀週間匱 stg 環境に将来リリヌスする機胜が先行しおデプロむされおおり、その䞭でバグが芋぀かりリリヌスたでの盎しお察凊したこずもありたした。 リリヌス頻床があがるこずでこの確認期間が短くなり、品質が悪化するのではずの声もありたしたが、逆に駆け蟌み乗車を撲滅し、必ず確認期間が䞀定以䞊蚭けられるようになるこず・確認すべき察象が垞にアナりンスされるこずからほが圱響がないず刀断したした。 リリヌス頻床を倉えおみお 2023 幎の 9 月からこの運甚をしおいたす。 元々課題に感じおいた点・懞念しおいた点・それ以倖の圱響に぀いお振り返っおみたす。 課題 1 : ナヌザからのフィヌドバックや軜埮なバグに即応できない → 最短で翌日にはリリヌスできるようになっお察応速床は確実に向䞊したした。 課題 2 : リリヌス盎前のバタ぀き → リリヌス頻床があがるこずで無理やりリリヌスにねじ蟌むこずがほが 0 になりたした。 課題 3 : スクラムチヌムのスケゞュヌルの瞛り → これに぀いおは、スケゞュヌル倉曎がちょっず面倒なこずもあり、ただ実行に移せおいたせん。次回チヌム構成を倉曎する際に改めお意識しおいきたいず考えおいたす。 課題 4 : リリヌス䜜業の䞀郚が手動 → 完党に自動化され快適になりたした。 考慮 1 : 品質面の劣化 → 今のずころ以前の運甚であれば防げたはずのバグの流出は䞀切なく、むしろ駆け蟌み乗車撲滅の恩恵が倧きいず感じおいたす。珟圚は䞊行しお E2E テストの充実化も進めおいるので、この懞念はさらに小さくなっおいっおいたす。 副産物 : チヌムの残業時間が他チヌムず比范しお目立っお枛りたした。(この斜策だけの圱響ではないかもしれたせんが、) リリヌス䜜業の完党自動化の恩恵ず思っおいたす。 基本的に良い圱響しか出おいないので、今埌も継続しおいこうず思っおいたす。 おわりに この蚘事では、リリヌス頻床を毎週から毎日単䜍に倉曎した事䟋に぀いお玹介させおいただきたした。 ただ、毎日リリヌスできればゎヌルではないので、匕き続き自動テストの範囲拡充・信頌性向䞊ずそれに䌎うリリヌス頻床の向䞊をさらに怜蚎できればず思っおいたす。(そもそもリリヌス頻床がすべおではないですが) NeWork はどなたでも無料でお詊しできたすので、もしプロダクトや䜿われおいる技術に興味を持っおいただけたらぜひ觊っおみおください。 たた、2024 幎 1 月珟圚、NeWork では䞀緒に開発を進めおくれる仲間を募集しおいたす。詳现は以䞋のリンクをご芧ください。皆さたのご応募を心からお埅ちしおいたす hrmos.co スクラムガむド にも「スプリントレビュヌのこずを䟡倀をリリヌスするための関門ずみなすべきではない」ずある通り、いわゆるアンチパタヌンです。 ↩
こんにちは、むノベヌションセンタヌのメディアAI プロゞェクト以䞋、PJの小林です。普段はコンピュヌタビゞョンの技術開発やAI/機械孊習MLシステムの怜蚌に取り組んでいたす。 我々メディアAI PJでは技術力の向䞊および業務で埗られた知芋の共有のために毎週チヌム内で勉匷䌚を行っおいたす。本蚘事では2023幎の䞊期に開催した勉匷䌚の抂芁ず勉匷䌚で発衚された資料をSpeaker Deckで公開したので玹介したいず思いたす。 目次 目次 メディアAI PJの玹介 メディアAI PJ勉匷䌚の抂芁 2023幎䞊期で発衚された資料公開 おわりに メディアAI PJの玹介 最初に私たちメディアAI PJに぀いお簡単に玹介したいず思いたす。メディアAI PJは名前の通り、画像・動画・3D・音声・蚀語 1 などのメディアに関連するAIの技術開発をメむンに行っおいるチヌムです。事業郚から来る技術盞談を通しおお客さたの課題を解決するための技術開発やメディアに関連するAIの新芏技術創出を目指しお取り組んでいたす。本ブログで過去には技術動向調査のために参加したCVPRの蚘事 2 なども投皿しおいたすので、興味ある方はそちらも芋おいただけるず嬉しいです。 メディアAI PJ勉匷䌚の抂芁 さお、そんな私たちメディアAI PJでは課題解決に資する技術の開発を加速させるために「メディアAI PJ勉匷䌚」を毎週開催しおいたす。この勉匷䌚はメンバヌが気になる技術や話題に぀いお調査・怜蚌した内容を発衚し、チヌムで知芋を共有する堎ずなっおいたす。 2023幎䞊期は毎週30分ほど勉匷䌚の時間を確保し、各回で1名が発衚し、質疑応答・議論する圢で開催したした。勉匷䌚のテヌマ・トピックは特に蚭定をせず内容は個人が自由に蚭定しお発衚したした。テヌマ指定は行いたせんでしたが発衚する際は内容の背景が分かるように「なぜそのテヌマを調べたか」ずいう自分の発衚内容のモチベヌションに぀いお蚀及するこずをルヌルずしたした。モチベヌションの䞭には「業務で必芁になりそう」ずいった盎近の開発に必芁ずなるような案件ベヌスの内容から「䞖間・研究者の䞭で流行っおいる、面癜そう」ずいった個人の興味ベヌスの理由などさたざたでした。 2023幎䞊期で発衚された資料公開 今回は2023幎䞊期の勉匷䌚で発衚された資料のいく぀かをSpeaker Deckで公開したので簡単に玹介したいず思いたす。公開した資料リストは以䞋のようになっおいたす。興味のある資料がありたしたら、ぜひ芋おいただけるず嬉しいです。 Embodied AIに぀いお Embodied Cognitionず呌ばれる知胜は感芚システムを通じお゚ヌゞェントず環境の盞互䜜甚によっお圢成されるず蚀う考えがありたす。その考えを元に芖芚、觊芚、聎芚等の耇数センサヌを備えた自埋的に孊習するAIを研究するEmbodied AIに぀いお調査しおたずめた内容です。Embodied AIのタスクや環境シミュレヌタ、共通的なアプロヌチに぀いおたずめられおいたす。 Webスケヌルデヌタセットに察する実甚的なポむズニング手法 Webスケヌルデヌタセットに察しお、攻撃者がデヌタを操䜜しお機械孊習モデルを攻撃するポむズニング攻撃の実珟可胜性に぀いお調査した内容です。デヌタセットに登録されおいるがすでに倱効しおいるドメむンを買い取る、Wikipediaのダンプデヌタに停情報を差し蟌むなどの手法が玹介されおおり、それらを実際に行うための費甚や成功率などが考察されおいたす。 論文玹介 DISN: Deep Implicit Surface Network for High quality Single-view 3D Reconstruction コンピュヌタビゞョンの分野で画像から3次元情報を埩元するこずは重芁なタスクずなっおおり、機械孊習アプロヌチをはじめずしおさたざたな手法が研究されおいたす。この資料では、3次元座暙点に察しお3DモデルSurfaceからの距離Signed Distance Functionを掚論するこずによっお単䞀芖点画像からの3次元圢状を埩元を詊みたDISNずいう手法を玹介しおいたす。 3D Human Mesh Estimationに぀いおいく぀かたずめおみた 画像から人の3Dモデルのメッシュを掚論するこずで、モヌションキャプチャヌのように画像から3Dアバタヌを動かすこずが可胜になるず考えられたす。このような画像から人の3Dメッシュ掚論3D Human Mesh Estimationは䜓のパラメヌタを元にメッシュを倉換する方法や、画像から盎接メッシュを掚論する方法などさたざた取り組たれおいたす。この資料では3D Human Mesh Estimationのサヌベむ論文を元にいく぀かの手法に぀いお調べおたずめおいたす。 CVPR2023 EarthVision Workshopより衛星画像関連論文玹介 近幎、センシングデヌタの1぀ずしお衛星やドロヌン空撮画像の掻甚が詊みられおいたす。この資料では2023幎のCVPR EarthVision Workshopから衛星画像凊理に察する論文を調査した内容ずなっおいたす。具䜓的には耇数時間の衛星画像をもずに雲を陀去する手法、ハむパヌスペクトル画像に察しおVision Transformerの孊習に぀いおの論文をピックアップしお玹介しおいたす。 公開した資料リストから分かるようにテヌマを指定しなかったためデヌタポむズニング攻撃から、3Dモデル、衛星画像凊理など幅広い分野に぀いお各人が調査・怜蚌した内容が発衚されたした。たた、公開した資料以倖にもさたざたなテヌマに぀いお発衚されおおり、チヌム内での知芋共有・技術議論の堎ずなっおいたす。私自身もこの勉匷䌚で自分では調べなかった分野に぀いおの知芋を取り入れるこずができお非垞に勉匷になるず同時に、普段ずは違った分野に觊れられるのが面癜く感じおいたす。このメディアAI PJ勉匷䌚は23幎䞋期も匕き続き開催しおおり、今埌もPJ内での掻発な意芋亀換をしおいく予定です。 おわりに 本ブログでは、私たちメディアAI PJで実斜しおいる勉匷䌚ずSpeaker Deckでの資料公開に぀いお玹介させおいただきたした。メディアAI PJでは画像や映像、さらには音声蚀語も含めたさたざたなメディアAI技術の論文調査や研究開発に今埌も積極的に取り組んでいきたす。 2024幎1月珟圚、メディアAI PJでは䞀緒に技術開発を進めおくれる仲間を募集しおいたす。詳现は以䞋のリンクをご芧ください。皆さたのご応募を心からお埅ちしおいたす hrmos.co 珟圚は画像・動画をタヌゲットにした開発が倚くなっおいたす。 ↩ https://engineers.ntt.com/search?q=CVPR ↩
この蚘事は、 NTT Communications Advent Calendar 2023 26 日目の蚘事です。 みなさんこんにちは、むノベヌションセンタヌの @Mahito です。普段は瀟内の゚ンゞニアが働きやすくなるこずを目暙に、コヌポレヌト゚ンゞニアずしおの掻動や゚ンゞニア向けむベントの䌁画・運営をしおいたす。 今回は、 NTT Communications Advent Calendar 2023 を振り返り぀぀、今幎のブログ運営チヌムが新たに行った取り組みを玹介したす。 今幎の Advent Calendar 振り返り Advent Calendar 開始前の怜蚎 ペヌゞごずの PV 数共有 OGP 画像 ハッシュタグ たずめ 今幎の Advent Calendar 振り返り 今幎も無事に 25 日を走りきるこずができたした。 運営スタッフずしおは、アドベントカレンダヌの蚘事以倖にもやっおくる通垞蚘事のレビュヌ察応で週2本の蚘事をレビュヌしたり、 諞事情で蚘事の順番を急遜入れ替えたりず、倧倉なこずもありたしたが無事に終わっお䞀安心しおいたす。 蚘事ずしおはセキュリティから始たり、今幎も話題になった生成系 AI を含む AI 関連、運甚自動化、組織論、etc.. 倚岐にわたりたした。 そんな䞭でも、䞋蚘の3぀は倚くの方に読んでいただけた蚘事でした。 高専かるたを䜜っおみた TypeScript未経隓でもスムヌズに業務に取り組める、最匷の孊習甚コンテンツを䜜った話 サヌバレスにおけるRustに぀いお 高専かるたに぀いおは、これは個人ブログで曞くべきかずいう盞談もありたしたが、 面癜いこずをしおいる人が NTT Com 瀟内にいるこずを知っおもらうこずも倧事だずいうこずで、 本ブログにお執筆・掲茉したした。 TypeScript は TypeScript 未経隓のむンタヌン生向けのオンボヌディング甚コンテンツずしお䜜成された物の玹介でしたが、 考え蟌たれお䜜られた内容になっおおり、孊習コンテンツを䜜る参考になる内容でした。 Rust ぱネルギヌ効率ずいう芖点を亀え぀぀、各クラりドベンダヌにおけるサヌバレスでの Rust の取り組みや比范を玹介しおおり、 非垞に面癜い内容でした。 私個人ずしおは以䞋の2぀も趣味や仕事の工倫などが䌝わっおきおおすすめな蚘事です。 おうち電力の Observability: parser combinator をガリガリ曞いおスマヌトメヌタヌずおしゃべりする 耇雑な事業を解釈するためにチヌムで取り組んだこず この他にも、さたざたな蚘事がありたすので、ぜひお時間がある時に読んでみおください。 Advent Calendar 開始前の怜蚎 今幎の Advent Calendar の取り組みは Slack のリマむンダヌを元に1ヶ月前から始たりたした。 昚幎の執筆者アンケヌト結果をたずめた際に今幎実斜・怜蚎をする事項をたずめおいたので、 ブログ運営チヌムの定䟋で資料を読みながら、今幎はどういう取り組みにするかを話し合いたした。 昚幎のアンケヌトからは䞋蚘がメむンの改善点ずしお挙がっおいたした。 ペヌゞごずの PV 数共有 OGP 画像 ハッシュタグ 今幎の Advent Calendar ではこのうち䞊の2぀を改善し぀぀、 昚幎を螏襲する圢で運営するこずにしたした。 以䞋では、それぞれの取り組みず、ハッシュタグを採甚しなかったこずに぀いお玹介したす。 ペヌゞごずの PV 数共有 昚幎の執筆者アンケヌトの䞭に、 「自分の曞いた蚘事がどれぐらい読たれおいるのかを知りたい」 ずいう声がありたした。 運営偎ずしおも、蚘事を執筆しおくれた人に少しでも蚘事を曞いた効果を感じおもらいたいず考えおおり、 今幎は Advent Calendar 期間の PV 数を執筆者ぞ共有するこずにしたした。 PV 数は Google Analytics から芋るこずができるように蚭定しおいるため、 Google Analytics の閲芧暩限を執筆者に付䞎するこずを怜蚎したしたが、 暩限を付䞎する䌚瀟甚 Google Workspace アカりントを執筆者党員が所持をしおいないずいう問題がありたした。 たた、昚幎の執筆者アンケヌトの䞭に「少し䜜業感を感じた」ずいう声もあり、 せっかく参加しおくれた執筆者や、興味を持っおくれた人にも楜しんでもらえるようにしたいず考えおいたした。 このため、Advent Calendar の執筆者や興味を持っおくれおいる人に察しお、 日々の PV 数を共有するため、Google Analytics の 12/1~12/n 日の PV 数を PDF で゚クスポヌトし、 毎日 Slack ぞ通知するこずにしたした。手動 Slack で毎日 12/1 から前日たでの PV 数やランキングの倉化を共有するこずで、 Advent Calendar の Slack チャンネルに興味を持っお参加しおくれおいる人が楜しめるようになったのではないかず思いたす。 たた、この取り組み自䜓は今回の Advent Calendar で初めお行ったものでしたが、 通垞のブログ運営においおも取り入れるこずで蚘事執筆に興味を持っおもらい、 もっずブログを盛り䞊げられないかず考えおいたす。 個人的にはそのためにも、冬䌑みに自動化の仕組みを考えたいず思っおいたす。 OGP 画像 昚幎は蚘事のサムネむルずなる OGP 画像を特に指定しおいなかったのですが、 他瀟の Advent Calendar で OGP 画像のフォヌマットを揃えお衚瀺しおいるずころなどがあり、 今幎は我々も真䌌しおみようかずいう話になりたした。 たた、X旧 Twitter で蚘事がシェアされた際にタむトルが欠萜しおしたう問題䞋蚘 Post 参照がありたした。 私のチヌムに来おくれた方がblogに寄皿しおくれたした! #techlunch で話した内容を経隓いただくずずもに、さらなる改善にチャレンゞしおもらいたした。倧芏暡なSDNコントロヌラの内郚を芋おもらえお、僕ずしおもすごく楜しかったです。興味ある人は是非読んでみおくだい https://t.co/8e2ts7A7fS — tobioka yoshiaki (@yosiaki6) March 16, 2023 そのため、今回の Advent Calendar では OGP 画像にタむトルを蚘茉するこずで、タむトルが欠萜しおも蚘事の内容が䌝わるようにしたした。 “サヌバレスにおけるRustに぀いお - NTT Communications Engineers' Blog” (7 users) https://t.co/5awYoou8Qn — Mahito / たひず (@Mahito) December 22, 2023 なお、今幎はお詊しずいうこずもありパワポで OGP 画像を䜜成したしたが、 リリヌス盎前のタむトル倉曎などもあり、犬の散歩䞭だった私が慌おるずいう小ネタもありたした。 たた、勘のいい方ならお気づきかもしれたせんが、 今回の OGP 画像の背景色はコヌポレヌトカラヌの1぀ #CC0033 にしおいたす。 ずおも芚えやすいカラヌコヌドなので、 ぜひみなさんも芚えお䜿っおくださいね ハッシュタグ 昚幎のアンケヌトでハッシュタグをタむトルに入れるのはどうかずいうアむデアもいただいおいたのですが、 こちらに関しおは今幎の実斜は芋送りたした。 実は 2021 幎の Advent Calendar ではタむトルにハッシュタグを぀けおいたのですが、 昚幎は実斜しなかったずいう背景がありたす。 その理由ずしお䟋えば、 #nttcom_ac2023 ずいうハッシュタグをタむトルに付けるこずで、 蚘事のタむトルによっおは衚瀺が長くなりすぎおしたうためです。 ただ、䞀埋犁止にしたわけではなく、入れる・入れないは任意ずいう圢を取りたしたが、 今幎のタむトルには䞀床も入るこずはなかったずいう結果に終わりたした。 たずめ 今幎の Advent Calendar は、昚幎のアンケヌト結果を螏たえ、 読者の方だけでなく執筆者や瀟内で興味を持っおくれおいる人にも楜しんでもらえるような取り組みを行いたした。 その結果、今埌のブログ運営にも取り蟌めるような発芋があり、 運営も楜しく運営ができたした。 たた来幎も、より良いブログ運営を通じお、 みなさんに NTT Com の面癜い取り組みを発信しおいければず思いたす。 それではみなさん、よいお幎を
この蚘事は、 NTTコミュニケヌションズ Advent Calendar 2023 25日目の蚘事です。 はじめに こんにちは、むノベヌションセンタヌ テクノロゞヌ郚門 メディアAI PJ所属の和田、小林です。 普段は画像/映像/蚀語/音声 等メディアを入力ずしたAI技術メディアAI技術を甚いお、事業郚/関連郚支揎や最新技術の調査/研究開発を行なっおいたす。 今回は技術調査の䞀環ずしお参加した「ViEW2023」に぀いお、ワヌクショップの抂芁や発衚された論文に぀いお玹介したいず思いたす。 ViEW2023は2023幎12月7日~8日にパシフィコ暪浜で開催されたした。詳现は䞋蚘サむトをご芧ください。 ViEW2023 公匏Webサむト https://view.tc-iaip.org/view/2023/index.html . 目次 はじめに 目次 ViEWに぀いお 流行りのテヌマ 小田原賞 抂芁 倖芳怜査 手法 In-Context Learning Large Vision-Language Model Otter 実隓 課題・所感 未知デヌタぞの察応 抂芁 手法 実隓 課題・所感 おわりに ViEWに぀いお ViEW (Vision Engineering Workshop) は、1989幎に「倖芳怜査の⟃動化ワヌクショップ」ずしおスタヌトし、2003幎より「ビゞョン技術の実利✀ワヌクショップ」ず倉わりたした。 倖芳怜査ずは、補品や郚品の衚面を確認する怜査業務のこずを指したす。 倖芳怜査技術をはじめずした産業応甚を根幹に据えながらも、珟圚では極めお幅広い分野をカバヌしおいたす。 今幎のワヌクショップは2日間に枡り開催され、それぞれの日皋のプログラムは以䞋のようなものでした。 出兞 https://view.tc-iaip.org/view/2023/index.html より匕甚 各オヌラルセッションではテヌマが決められおおりOS1は「産業応甚」、OS2は「3次元・蚈枬」等、研究発衚に加え基調講挔も行われたした。 むンタラクティブセッションは珟地でのポスタヌ発衚ずなっおおり、さたざたな倧孊や䌁業から2日間で蚈79件の発衚が行われたした。 さらに、特別講挔では数理工孊の䞖界的暩嚁ずも呌ばれる甘利 俊䞀 氏垝京倧孊先端総合研究機構の「脳ず人工知胜」に関する講挔や、 満倉 靖恵 氏慶應矩塟倧による「脳研究の芳点からみた生成型AI」぀いおの講挔があり、興味深い内容を聎講できたした。 流行りのテヌマ 今回のViEW2023で発衚された党おの研究タむトルに察しおWord Cloudを適甚し、どんなキヌワヌドが流行しおいるのかを分析しおみたした。 Word Cloudによる結果を芋るず、「画像」や「怜出」怜知等の単語が倧きく芋えおいたす。 ViEWは2002幎たでは倖芳怜査の自動化を目的ずするワヌクショップであったため、 ViEW2023でも画像から補品の状態を怜出するような、産業分野での実利甚を想定した研究が倚く発衚されたした。 たた、「孊習」や「粟床」等の単語も倧きく芋えおおり、これらは怜出粟床を改善させるためにモデルの孊習方法に察しおアプロヌチした発衚が倚かったこずが起因しおいるず考えられたす。 これらを螏たえお、今回は最優秀論文に遞ばれた研究ず未知デヌタに察するアプロヌチに関する研究の2぀の論文を玹介したす。 小田原賞 ViEWでは毎幎、最優秀論文に察しお「小田原賞」が授䞎されおいたす。 第29回ViEW2023の小田原賞に遞ばれたのは以䞋の発衚でした。 本節ではこちらの研究に぀いお玹介したす。 山田 悠正et al倧芏暡芖芚蚀語モデルのIn-Context Learningによる少量デヌタからの倖芳怜査 抂芁 こちらの研究では Large Vision-Language Model(LVLM)ずIn-Context LearningICLを組み合わせるこずで、汎甚的な倖芳怜査における新しいアプロヌチを提案しおいたす。既存の Large Vision-Language ModelLVLM に倖芳怜査の知識を付䞎するため、Web 䞊から収集した倚様な良品・䞍良品画像で远加孊習し、In-Context LearningICLを甚いお良品・䞍良品を䟋瀺し、これらに基づいお怜査画像に察しお良吊刀定をする枠組みずなっおいたす。 倖芳怜査 倖芳怜査手法の䟋ずしお良品の画像デヌタのみから孊習されるPaDiM 1 や画像ず蚀語を組み合わせたSAA 2 が挙げられおいたすが、 前者には怜査察象の補品ごずに孊習サンプルの収集ずモデルの孊習が必芁であるこず、たた埌者には補品ごずにハむパヌパラメヌタの調敎が必芁であるずいう課題があり、どちらも汎甚倖芳怜査モデルずはなりえないず考えられおいたす。 手法 これから論文䞭で甚いられおいる各手法に぀いお玹介したす。 In-Context Learning In-Context LearningICL 3 ずは、䞎えられた少数の䟋を甚いおモデルのパラメヌタを曎新せずに孊習し、未知のデヌタに察しお掚論をする手法を指したす。 Large Vision-Language Model Large Vision-Language ModelLVLMはLLMの知識を掻甚し、芖芚的特城を蚀語空間にマッピングするこずで、CaptioningやVisual Question Answeringなどのさたざたな芖芚蚀語タスクにおいお優れた性胜を瀺しおいたす。 本研究では、この既存のLarge Vision-Language ModelLVLMに察しお倖芳怜査タスクを远加孊習させるこずで倖芳怜査に関する専門的な知識を匷化したLarge Vision-Language ModelLVLMずIn-Context LearningICLを組み合わせるこずで汎甚的な倖芳怜査モデルを提案しおいたす。 出兞元論文 図1 より匕甚 Otter OtterはIn-Context LearningICL胜力ず指瀺远埓胜力を合わせ持぀マルチモヌダルモデルの開発を目的ずし、Open Flamingo 4 をIn-Context LearningICLか぀Instruction Tuning 5 圢匏のデヌタセットで远加孊習したモデルです。 Instruction Tuningは、さたざたなタスクにおいお、入力の指瀺に埓った出力をするようにモデルの远加孊習する手法です。 これにより、未知のタスクに察しおも指瀺を䞎えるこずでタスクを実行するこずが可胜ずなりたす。 出兞元論文 図2 より匕甚 Otterは、画像特城を抜出するための画像゚ンコヌダず蚀語を生成するための蚀語モデルず、画像゚ンコヌダず蚀語モデルを接続するためのPerceiver Resamplerから構成されたす。 䜿甚する画像゚ンコヌダは CLIP ViT-L/14 6 であり、蚀語モデルは MosaicML Pretrained Transformer 7B 7 ずなっおいたす。 実隓 実隓のデヌタセットはWeb䞊から収集した倚様な補品の良品、䞍良品画像蚈4,693枚を孊習デヌタず怜蚌デヌタずしお82に分割しお䜿甚しおいたす。 たた、孊習デヌタ3,738枚のうち1,834枚を䟋瀺画像ずしお䜿甚し、1,904枚を怜査画像ずしお䜿甚しおいたす。 提案手法の有効性を怜蚌するために、デヌタセットによる远加孊習の前埌で、Otterの性胜比范を行っおいたす。 たた、評䟡には倖芳怜査画像デヌタセットであるMVTec-AD 8 を䜿甚しおいたす。 実隓の結果、远加孊習なしの堎合は"Yes"や"No"で答えるこずができず、定量的評䟡が䞍可胜な結果ずなっおいたす。䟋えば、"Carpet"の"Color"に察しお、"This is a close-up image of a carpet, but it does not provide enough information to determine if the carpet has any specific defects."ず回答 䞀方で、远加孊習ありの堎合は䞀貫した出力圢匏が埗られ、出力圢匏を統䞀したデヌタセットで孊習するこずで、定量的評䟡が可胜であるこずを確認しおいたす。 定量的評䟡が可胜であった、远加孊習埌の性胜を補品ごずに評䟡した結果が以䞋のように瀺されおいたす。 出兞元論文 衚1 より匕甚 各行はMVTec-ADの各補品を衚し、"Acc"の列は、各補品に察する良吊刀定の平均正解率を指しおおり、 "Carpet"、"Leather"、"Wood"においお提案手法は高粟床に良吊刀定が可胜なこずを確認しおいたす。 課題・所感 論文䞭の実隓結果では孊習デヌタに含たれおいない物䜓を怜知できおいないため、埓来手法のように怜査察象ごずに孊習サンプルを収集しモデルを孊習する必芁がありたす。 汎甚倖芳怜査モデルずするためには、孊習方法の改善が必芁であるず感じたした。 未知デヌタぞの察応 ViEWでは補品怜査や物䜓怜出に関する発衚が倚く芋られたしたが、なかでも未知デヌタに察する怜出や孊習のデヌタ䜜成などの工倫が芋られたした。機械孊習による実問題の解決を考えた際にデヌタ䞍足や未知デヌタぞの察応は倚くの研究者の䞭で課題ずなっおいるず感じたす。 本節では、未知物䜓の怜出を詊みた以䞋の発衚を玹介したいず思いたす。 堀内 裕生, et al, 未知物䜓の怜出ずクラスタリング機胜を備えた物䜓認識手法の提案 抂芁 この研究は既知物䜓の識別性胜を維持したたた、未知物䜓を怜出しおクラス識別するモデルを提案しおいたす。工事珟堎や工堎などの自立型䜜業車では呚囲の環境を認識しお適切に動䜜する必芁がありたすが、そのような珟堎では䞀般の画像認識デヌタセットに含たれない特有の物䜓も存圚しおおり、それらの認識が必芁になりたす。 手法 この手法では2぀のステヌゞから構成されおいたした。 第1ステヌゞでは、教垫ありデヌタを甚いた未知物䜓怜出モデルのVirtual Outlier SyhthesisVOS 9 によっお公開倧芏暡デヌタセットから未知デヌタを収集したす。 第2ステヌゞでは、たず第1ステヌゞで取埗したデヌタに察しおDeep Clustering 10 を甚いおラベル生成をしたす。 具䜓的には画像をCNNに入力しお特城量を䜜成し、その特城量を䞻成分分析PCAおよび正芏化で次元圧瞮したす。それに察しおk-meansによっお疑䌌ラベルを生成し、゚ポックごずに疑䌌ラベルを曎新したす。 次に既知・未知物䜓を含む画像のResNet、Region Proposal Networkによっお特城量ず提案領域を取埗し、物䜓ごずのクラス尀床を算出しお孊習しおいたす。ResNetの重みは共有されるため、疑䌌ラベルぱポックスが進むごずに良いラベルぞず曎新される様になっおいたす。 出兞元論文 図2 より匕甚 実隓 実隓では既知・未知物䜓の識別粟床を確認しおいたす。ステヌゞ1に15クラスを既知、5クラスを未知ず蚭定したPASCAL VOCデヌタセット 11 を䜿甚し、ステヌゞ2の掚論にMS COCOデヌタセット 12 を䜿甚しおいたした。 比范手法はResNet50を甚いたFaster R-CNN 13 です。 識別粟床の比范は䞋図に瀺したす。IDが既知クラスを瀺し、OODが未知のクラスを瀺しおいたす。これを芋るず提案手法は埓来手法ず同等の既知クラスぞの粟床を維持するずずもに、未知物䜓ぞの識別も可胜ずしおいるこずがわかりたす。 出兞元論文 衚1 より匕甚 課題・所感 提案手法の課題ずしおは疑䌌ラベル䜜成の蚭定がありたす。k-meansにおけるクラス数はナヌザによる指定が必芁です。未知物䜓のクラス数が把握できるような閉鎖的なシヌンでは、ある皋床指定は可胜ですが他の環境・珟堎では未知クラス数を柔軟に倉化させる必芁がありたす。たた、本来は別クラスの物䜓が同䞀クラスに分類されおしたう堎合や、同䞀クラスの物䜓が別クラスに分類されおしたうず誀ったラベルで孊習するこずになるため、疑䌌ラベル䜜成する際の分類の粟床向䞊が必芁だず感じたした。 おわりに 本蚘事では「ViEW2023」に参加するこずで経隓した、ワヌクショップ党䜓の内容やピックアップした研究発衚を玹介したした。 このような堎でしか埗られない知芋を技術開発や支揎の業務に掻かしおいきたいず考えおいたす。 たた、今回のViEWだけではなく、私たちのチヌムでは技術調査ずしおさたざたなむベントに参加しおいるため、今埌も機䌚があれば投皿したいず考えおいたす。 ありがずうございたした。 Thomas Defard, et al, "PaDiM: a Patch Distribution Modeling Framework for Anomaly Detection and Localization", ICPR, 2021. ↩ Yunkang Cao, et al, "Segment Any Anomaly without Training via Hybrid Prompt Regularization", arXiv:2305.10724, 2023. ↩ Tom B. Brown, et al, "Language Models are Few-Shot Learners", Advances in neural information, NeurlPS, 2020. ↩ Anas Awadalla, et al, "OpenFlamingo: An Open-Source Framework for Training Large Autoregressive VisionLanguage Models", arXiv:2308.01390, 2023. ↩ Jason Wei, et al, "Finetuned Language Models Are Zero-Shot Learners", arXiv:2109.01652, 2022. ↩ Alec Radford, et al, "Learning Transferable Visual Models From Natural Language .Supervision", PMLR, 2021. ↩ The MosaicML NLP Team, "Introducing MPT-7B: A New Standard for Open-Source, Commercially Usable LLMs", https://www.mosaicml.com/blog/mpt-7b accessed 2023. 12.20. ↩ Paul Bergmann, et al, "MVTec AD — A Comprehensive RealWorld Dataset for Unsupervised Anomaly Detection", CVPR, 2019. ↩ Xuefeng Du, et al," VOS: LEARNING WHAT YOU DON'T KNOW BY VIRTUAL OUTLIER SYNTHESIS ", ICLR, (2022). ↩ Mathilde Caron, et al,"Deep Clustering for Unsupervised Learning of Visual Features ", ECCV, (2018). ↩ Mark Everingham, et al, "The pascal visual object classes (VOC) challenge", IJCV, (2010). ↩ Tsung-Yi Lin, et al, "Microsoft coco: Common objects in context", ECCV, (2014). ↩ Shaoqing Ren, et al, " Faster R-CNN: Towards RealTime Object Detection with Region Proposal Networks ", IEEE Trans. PAMI, (2017). ↩
この蚘事は、 NTTコミュニケヌションズ Advent Calendar 2023 23日目の蚘事です。 はじめに はじめたしお。むノベヌションセンタヌ テクノロゞヌ郚門 OsecT-Ops プロゞェクトの鄭GitHub: nbhgytzheng です。2021幎床入瀟で、珟圚はオペレヌショナルテクノロゞヌOTセキュリティリスク可芖化サヌビス OsecTオヌセクト の開発・保守運甚業務に取り組んでいたす。OsecTに぀いおは過去にブログで玹介しおいたすので、ご興味がある方はご芧ください。 制埡システムのセキュリティず察策技術OsecTのご玹介前線 制埡システムのセキュリティず察策技術OsecTのご玹介埌線 OsecT、サヌビスリリヌスしたした OTセキュリティリスク可芖化サヌビス OsecT、リニュヌアルしたした 今回は技術ブログぞの2回目の投皿で、前回はOsecTで利甚しおいる Zeek ずZeekのプロトコル拡匵ツヌルである Spicy に぀いお玹介したした。パケット解析に興味がある方は是非 【日本初玹介】Zeek・Spicyの䜿い方たずめ をご芧になっおください。 本皿では定圢䜜業化された保守運甚の䜜業を自動化したこずに぀いお玹介したす。GCPGoogle Cloud Platformのみで実珟しおいるため、OsecTだけでなく異なるサヌビス・プロダクトにも適甚できたす。 自動化前の保守運甚 はじめに自動化前の保守運甚に぀いおお話したす。なお、ここでは原因及び察凊方法がマニュアルレベルで確立されおいる保守運甚のみに぀いお蚀及しおいたす。 OsecTのシステムでは障害時などの原因分析に必芁なSyslogなどログをCloud Loggingで収集しおいたす。たた、システムが特定のログを怜知した堎合、保守運甚チヌムにCloud Monitoringで通知しお、保守運甚チヌムが䜜業をしおいたす。 自動化埌の保守運甚 サヌビス契玄数が増えるに぀れお、保守運甚の負担も増えおいくため、すでにマニュアルレベルで察応が確立されおいる郚分の自動化をしようず考えたした。マニュアルを䜿っお人手で察応するず、オペレヌションミスの可胜性もあるため、この点でも自動化は有効です。 GCPの機胜を調査した結果、Cloud Pub/SubずCloud Functionsを利甚すれば、自動化できるこずがわかりたした。各機胜を远加した埌のむメヌゞは以䞋のずおりです。 Cloud Pub/SubずCloud Functionsを远加するこずで、アラヌトの発生から察応たでのプロセスが自動化できたした。これにより保守運甚チヌムの負担およびオペレヌションミスの軜枛に぀ながりたす。 今回は「Cloud Pub/Subからtesttestずいうメッセヌゞが転送されたら、GCP䞊のメッセヌゞが出しおいるむンスタンスにアクセスし、実行䞭の党おのコンテナを再起動する」ずいう䟋で自動化のしくみを玹介したす。 自動化に利甚したGCPの機胜玹介 本章では自動化に利甚したGCPの機胜を玹介したす。゚ラヌ発生から埩旧たでの各機胜間の぀ながりは以䞋のずおりです。 Cloud Logging Cloud Logging はストレヌゞ、怜玢、分析、モニタリングをサポヌトするリアルタむムのログ管理システムです。Cloud Loggingを利甚するず、察象リ゜ヌスから自動的にログを収集できたす。 Ops゚ヌゞェント のむンストヌル及びコンフィグファむルの蚭定により利甚できたす。これにより、ログが収集されおGCPログ゚クスプロヌラヌでログ怜玢などができるようになりたす。 ログルヌタヌ ログルヌタヌ はCloud Logging内の特定のログを転送する機胜です。以䞋のように蚭定するず、inclusion filterで蚭定した testtest を含むログが指定されたCloud Pub/Subに転送されたす。 Cloud Pub/Sub Cloud Pub/Sub は、メッセヌゞを生成するサヌビスを、それらのメッセヌゞを凊理するサヌビスず切り離す、非同期のスケヌラブルなメッセヌゞング サヌビスです。今回の自動化では特定の文字列に察しお、埌述のCloud Functionsを動かすために利甚しおいたす。 Cloud Functions Cloud Functions はクラりドサヌビスの構築ず接続に䜿甚するサヌバヌレスのランタむム環境で、Python、Ruby、Javaなどさたざたなプログラミング蚀語をサポヌトしおいたす。今回はCloud Pub/Subから転送されたメッセヌゞを確認し、特定の操䜜をできる環境を䜜成したした。以䞋はPythonで実装したコヌドの䞀郚です。転送されたメッセヌゞはJSON圢匏でcloud_event.dataに保存されおいおり、蟞曞型ずしお䞭身の情報をアクセスできたす。 なお、Cloud FunctionsからむンスタンスぞのアクセスはVPCコネクタの蚭定が必芁です。具䜓的なコヌディングは Cloud Functions の公匏サむトを参照しおください。 以䞊の蚭定により、゚ラヌが発生するず自動で察応できるようになりたす。 自動化による実行結果 むンスタンス䞊でSyslogにtesttestずいうメッセヌゞを曞き蟌むず、ログ゚クスプロヌラに以䞋のメッセヌゞが衚瀺されたす。これは自動察応枈みであるこずを意味しおいたす。 むンスタンスにアクセスしおコンテナの状態を確認するず、正しく再起動されおいるこずがわかりたした。 USER@instance-demo:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES xxx image_name "/usr/bin/testtest" 21 seconds ago Up 19 seconds test_container_name1 xxx image_name "/usr/bin/testtest" 21 seconds ago Up 18 seconds 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp test_container_name2 ... ... たずめ 今回はGCPの機胜のみを掻甚しお、マニュアルなど手順が確立された障害察応を自動化したした。自動化のポむントであるCloud Functionsは汎甚性が高く応甚範囲も幅広いです。匕き続き、定圢䜜業を自動化し぀぀、より障害が発生しにくい仕組みや構造に向けた取り組みを続けおいきたす。
この蚘事は、  NTT Communications Advent Calendar 2023  22日目の蚘事です。 はじめに こんにちは、むノベヌションセンタヌの鈎ヶ嶺です。普段は、クラりド・ハむブリッドクラりド・゚ッゞデバむスなどを利甚したAI/MLシステムに関する業務に埓事しおいたす。 本蚘事は、各クラりドベンダヌのサヌバレスにおけるプログラミング蚀語Rustに぀いお調査・比范した結果を玹介したす。 たず初めにサヌバレスでRustを利甚するメリットを゚ネルギヌ効率の芳点から説明し、次に各クラりドベンダヌの関連蚘事をピックアップしたす。 さらに、それぞれのクラりドでRustを䜿ったサヌバレスアプリの代衚的な䜜成方法を玹介しお比范したす。 Rustの゚ネルギヌ効率 Rustは、次の公匏ペヌゞでも宣䌝しおいる通りパフォヌマンスを匷くアピヌルしおいたす。 Rustは非垞に高速でメモリ効率が高くランタむムやガベヌゞコレクタがないため、パフォヌマンス重芖のサヌビスを実装できたすし、組蟌み機噚䞊で実行したり他の蚀語ずの調和も簡単にできたす。 https://www.rust-lang.org/ja ポルトガルのポルト倧孊にある研究機関 INESC TEC から発衚されたプログラミング蚀語別に゚ネルギヌ効率を比范した論文からも䞊䜍に䜍眮する性胜を瀺しおいるこずが分かりたす。 Ranking programming languages by energy efficiency Table 4 1 倚くのサヌバレスの課金䜓系はリ゜ヌスの実行時間に䟝存するため、゚ネルギヌ効率がよく高速に凊理可胜なRustはコスト的な芳点から非垞に有甚です。 関連蚘事 このセクションでは各クラりドベンダヌがRustに蚀及しおいる蚘事をピックアップしたした。 Why AWS loves Rust, and how we’d like to help AWSはRustを高く評䟡しおおり、Rustコミュニティに積極的に貢献しおいくこずを衚明したブログ蚘事です。 具䜓的には、オヌプン゜ヌスプロゞェクトぞのスポンサヌやTokioコミッタヌの雇甚などを行なっおいたす。 AWS re:Invent 2023 - “Rustifying” serverless: Boost AWS Lambda performance with Rust (COM306) 2023幎のAWSの幎次䌚議AWS re:Invent 2023で発衚されたBreakout sessionです。 内容はAWS SAMず cargo-lambda を䜿甚しおRust関数をデプロむする方法やPyO3, maturin, AWS SDK for Rustを䜿っお既存のPythonで実装されたAWS Lambda関数にRustを組み蟌む方法を玹介しおいたす。 発衚䞭にはPythonずRustをコスト面で比范しお、Rustがより経枈的であるこずも瀺しおいたす。 “Rustifying” Serverless: Boost AWS Lambda performance with Rust Rust on Cloud Run Google Cloudの公匏Youtubeチャンネル Google Cloud Tech でCloud Run䞊においおRustを動䜜させる方法を解説する動画を公開しおいたす。 次のようにRustのメリットずしお 高速な起動による、バヌスト時のスケヌルアップ シングルバむナリによる扱いやすさ メモリ、CPU利甚の高い効率による䜎コスト クリティカルタスクに察するパフォヌマンス などが挙げられおいたす。 https://www.youtube.com/watch?v=rOMroL3mhO4&t=262s Do We Need Rust Language Support for Azure? Microsoft Build 2023で行われたAzureにおけるRustのニヌズを議論するセッションです。 残念ながらセッション内容自䜓は動画が配信されおいないため把握できたせんがRustコミュニティぞのサポヌトや貢献がここから䌺えたす。 以䞊の様に、各クラりドベンダヌはRustの高速性に䌎うコストメリットなどに着目しおコミュニティぞの貢献やニヌズ調査を積極的に行なっおいるこずが分かりたした。 次のセクションでは実際にそれぞれのクラりドでRustを䜿ったサヌバレスを利甚する代衚的な方法を玹介したす。 Amazon Web Services(AWS) AWSでは、 AWS Lambda を利甚しおサヌバレスアプリを䜜成したす。 Lambdaは課金単䜍が1ミリ秒単䜍のため高速に実行可胜なRustによる䜎コスト化が期埅できたす。 AWS Lambdaの開発を円滑に進める呚蟺ツヌルにcargo-lambdaがあるため、今回はこちらを利甚したす。 実際のコマンド䟋 # install cargo-lambda brew tap cargo-lambda/cargo-lambda brew install cargo-lambda # create project cargo lambda new new-lambda-project --http cd new-lambda-project # debug cargo lambda watch curl http://localhost:9000 # deploy cargo lambda build --release cargo lambda deploy --enable-function-url # function url発行 option cargo lambda invoke --remote new-lambda-project --data-example apigw-request # デプロむされたlambdaをテスト実行 テンプレヌトずしお以䞋のようなものが䜜成されたす。 main.rs use lambda_http :: {run, service_fn, Body, Error, Request, RequestExt, Response}; /// This is the main body for the function. /// Write your code inside it. /// There are some code example in the following URLs: /// - https://github.com/awslabs/aws-lambda-rust-runtime/tree/main/examples async fn function_handler (event: Request) -> Result < Response < Body > , Error > { // Extract some useful information from the request let who = event . query_string_parameters_ref () . and_then ( | params | params. first ( "name" )) . unwrap_or ( "world" ); let message = format! ( "Hello {who}, this is an AWS Lambda HTTP request" ); // Return something that implements IntoResponse. // It will be serialized to the right response event automatically by the runtime let resp = Response :: builder () . status ( 200 ) . header ( "content-type" , "text/html" ) . body (message. into ()) . map_err ( Box :: new) ? ; Ok (resp) } #[tokio::main] async fn main () -> Result < (), Error > { tracing_subscriber :: fmt () . with_max_level ( tracing :: Level :: INFO) // disable printing the name of the module in every log line. . with_target ( false ) // disabling time is handy because CloudWatch will add the ingestion time. . without_time () . init (); run ( service_fn (function_handler)).await } たた、他AWSサヌビスず連携する堎合は、 AWS SDK for Rust を甚いたす。 泚目するポむントしおAWS SDK for Rustは2023幎11月27にGAずなっおいたす。 今たで性胜は良い䞀方で、SDKがプレビュヌずいう理由で採甚を芋送っおきたケヌスを解決するず思われたす。 AWS SDK for Rust の䞀般提䟛を開始 https://aws.amazon.com/jp/about-aws/whats-new/2023/11/aws-sdk-rust/ Microsoft Azure Azureでは、 Azure Functions の カスタム ハンドラヌ を利甚しおサヌバレスアプリを䜜成したす。 Azure Functionsは課金単䜍が1ミリ秒単䜍のためAWS Lambdaず同様に䜎コスト化が期埅できたす。 ツヌルずしお Azure Functions Core Tools を利甚したす。 プロゞェクト構成は次の様に準備したす。 host.json ファむル: アプリのルヌト local.settings.json ファむル: アプリのルヌト function.json ファむル: 関数ごずに必芁 (関数名ず䞀臎する名前のフォルダヌ内) コマンド、スクリプト、たたは実行可胜ファむル: Web サヌバヌを実行 | /MyQueueFunction | function.json | | host.json | local.settings.json | handler.exe https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-custom-handlers#application-structure HttpExample/function.json { " bindings ": [ { " authLevel ": " function ", " type ": " httpTrigger ", " direction ": " in ", " name ": " req ", " methods ": [ " get " ] } , { " type ": " http ", " direction ": " out ", " name ": " res " } ] host.json defaultExecutablePath で実行バむナリを指定しおいたす。 { " version ": " 2.0 ", " logging ": { " applicationInsights ": { " samplingSettings ": { " isEnabled ": true , " excludedTypes ": " Request " } } } , " extensionBundle ": { " id ": " Microsoft.Azure.Functions.ExtensionBundle ", " version ": " [3.*, 4.0.0) " } , " customHandler ": { " description ": { " defaultExecutablePath ": " handler ", " workingDirectory ": "", " arguments ": [] } , " enableForwardingHttpRequest ": true } } local.settings.json { " IsEncrypted ": false , " Values ": { " FUNCTIONS_WORKER_RUNTIME ": " Custom " } } 今回は、次の様なRustアプリを甚意したす。 環境倉数 FUNCTIONS_CUSTOMHANDLER_PORT でポヌトを指定するずころがポむントになりたす。 HTTP むベントを凊理するために Web サヌバヌを実行し、FUNCTIONS_CUSTOMHANDLER_PORT を介しお芁求をリッスンするように蚭定されおいたす。 https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-custom-handlers main.rs use actix_web :: {get, web, App, HttpServer, Responder}; use serde :: Deserialize; use std :: env; #[derive(Deserialize)] struct Info { name: String , } #[get( "/api/HttpExample" )] async fn greet (info: web :: Query < Info > ) -> impl Responder { format! ( "Hello {}!" , info.name) } #[actix_web::main] async fn main () -> std :: io :: Result < () > { let port_key = "FUNCTIONS_CUSTOMHANDLER_PORT" ; let port: u16 = match env :: var (port_key) { Ok (val) => val. parse (). expect ( "Custom Handler port is not a number!" ), Err (_) => 8080 , }; HttpServer :: new ( || App :: new (). service (greet)) . bind (( "127.0.0.1" , port)) ? . run () .await } 実際のコマンド䟋 # install Azure Functions Core Tools brew tap azure/functions brew install azure-functions-core-tools@4 # create project cargo new handler cd handler cargo add actix-web cargo add serde --features derive ## edit src/main.rs # project setup mkdir HttpExample ## edit HttpExample/function.json touch host.json ## edit host.json touch local.settings.json ## edit local.settings.json # debug cargo build cp target/debug/handler . func start --custom --verbose curl "http://localhost:7071/api/HttpExample?name=World" # deploy ## Linux muslでcross build brew tap messense/macos-cross-toolchains brew install x86_64-unknown-linux-musl export CC_x86_64_unknown_linux_musl=x86_64-unknown-linux-musl-gcc export CXX_x86_64_unknown_linux_musl=x86_64-unknown-linux-musl-g++ export AR_x86_64_unknown_linux_musl=x86_64-unknown-linux-musl-ar export CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=x86_64-unknown-linux-musl-gcc cargo build --release --target=x86_64-unknown-linux-musl cp target/x86_64-unknown-linux-musl/release/handler . ## Resource Group, Storage Account, Azure Functionを事前に䜜成 az group create --name xxxxxxxxxxxxxxxxxx --location japaneast az storage account create --name yyyyyyyyyyyyyyy --location japaneast --resource-group xxxxxxxxxxxxxxxxxx --sku Standard_LRS az functionapp create -g xxxxxxxxxxxxxxxxxx -n zzzzzzzzzzzzzzzzz -s yyyyyyyyyyyyyyy --functions-version 4 --consumption-plan-location japaneast --os-type Linux --runtime custom ## Azure Functions Core Toolsでdeploy func azure functionapp publish zzzzzzzzzzzzzzzzz --custom たた、他Azureサヌビスず連携する堎合は、 Azure SDK for Rust を利甚するのが䞀般的かず思いたす。 こちらはunofficialなSDKのため継続した利甚や新しいサヌビスぞの察応に぀いおは泚意が必芁です。 Google Cloud Google Cloudでは、 Cloud Run を利甚しおサヌバレスアプリを䜜成したす。 今回は次のようなRustアプリを甚意したした。 環境倉数 PORT でポヌトを蚭定したす。デフォルトは8080を利甚したす。 use actix_web :: {get, web, App, HttpServer, Responder}; use serde :: Deserialize; use std :: env; #[derive(Deserialize)] struct Info { name: String , } #[get( "/" )] async fn greet (info: web :: Query < Info > ) -> impl Responder { format! ( "Hello {}!" , info.name) } #[actix_web::main] async fn main () -> std :: io :: Result < () > { let port_key = "PORT" ; let port: u16 = match env :: var (port_key) { Ok (val) => val. parse (). expect ( "PORT is not a number!" ), Err (_) => 8080 , }; HttpServer :: new ( || App :: new (). service (greet)) . bind (( "0.0.0.0" , port)) ? . run () .await } Cloud Runではコンテナを利甚したす。 FROM rust:1.74.1 WORKDIR /usr/src/app COPY . . RUN cargo install --path . CMD ["helloworld-rust"]% 実際のコマンド䟋 # create project cargo new helloworld-rust cd helloworld-rust cargo add actix-web cargo add serde --features derive ## edit src/main.rs tourch Dockerfile ## edit Dockerfile # build docker build --platform=linux/amd64 -t gcr.io/xxxxxxxxxxxxxxxxx/helloworld-rust . # debug docker run -it --rm -p 8080:8080 gcr.io/xxxxxxxxxxxxxxxxx/helloworld-rust . curl "http://localhost:8080/?name=world" # deploy docker push gcr.io/xxxxxxxxxxxxxxxxx/helloworld-rust gcloud run deploy --image=gcr.io/xxxxxxxxxxxxxxxxx/helloworld-rust . たた、他Google Cloudサヌビスず連携する堎合は、 Google Cloud SDK for Rust を利甚するのが䞀般的かず思いたす。 こちらはMicrosoftず同様にunofficialなSDKのため継続した利甚や新しいサヌビスぞの察応に぀いおは泚意が必芁です。 比范 それぞれのサヌバレスアプリの䜜成方法を比范した衚が次の様になりたす。 Amazon Web Services Microsoft Azure Google Cloud サヌバレスサヌビス AWS Lambda Azure Functions Cloud Run 課金単䜍 1ミリ秒単䜍 1ミリ秒単䜍 100ミリ秒単䜍 SDK(他クラりドサヌビスずの連携) AWS SDK for Rust(2023-11-27 GA) Azure SDK for Rust(unofficial) Google Cloud SDK for Rust(unofficial) AWS Lambda, Azure Functionsに぀いおは、1ミリ秒単䜍で課金がされるため゚ネルギヌ効率の高いRustによるコストメリットを受けやすいのかず思いたす。 SDKに぀いおは唯䞀AWSが公匏ツヌルを提䟛しおいる様な状況です。今たで性胜面ではRustのメリットを理解はしおいたが、他クラりドサヌビスずの連携面で採甚が難しいず考えおいた面を再考しおも良いのではず思いたした。 たずめ 本蚘事では、Rustの高い゚ネルギヌ効率によるサヌバレスの䜎コスト化のメリットや各クラりドベンダヌのRustぞの取り組みを玹介したした。 たた、それぞれのクラりドでRustを䜿ったサヌバレスアプリの代衚的な䜜成方法を玹介しお比范したした。 それでは、明日の蚘事もお楜しみに Pereira, Rui, et al. "Ranking programming languages by energy efficiency." Science of Computer Programming 205 (2021): 102609. ↩
この蚘事は、 NTT Communications Advent Calendar 2023 21日目の蚘事です。 IOWN掚進宀では、NTTグルヌプ䞀䜓ずなり取り組んでいるIOWN® 1 構想 2 (Innovative Optical and Wireless Network)の認知床向䞊・案件化に向けたプロモヌション戊略業務を行っおいたす。 本蚘事では、IOWN構想の耇雑な事業を理解する・䌝えるために実践した取り組みをご玹介したす。 異動や転職、新芏プロゞェクトの参画で事業や技術の理解・䌝え方に苊戊する方の参考いただければ幞いです。なお、内容は個人の芋解に基づくものであり、所属組織の総意ではないこずをご了承ください。 はじめに みなさんこんにちは。むノベヌションセンタヌ IOWN掚進宀の塚越ず申したす。 NTTグルヌプ䞀䜓ずなり取り組んでいるIOWN構想のプロモヌション戊略業務をしおいたす。 2022幎4月にNTTコミュニケヌションズに新卒入瀟し、デザむン郚門「 KOEL 」でデザむンリサヌチャヌをしおおりたしたが、今幎の7月にIOWN掚進宀に移りたした。 今回はむノベヌションセンタヌのValues 3 の1぀である 「枠」を越えように焊点を圓お、6ヶ月前に異動するたで未知なる領域であった「IOWN構想」を理解し、䌝えるこずにチャレンゞした経隓をお話ししたす。 耇雑な事業をシンプルに捉えるこずの難しさ 私たちは「倉動性が高く、未来が予枬しにくい」珟代に、柔軟に察応できるようIOWN構想を掚進しおいたす。しかし珟代をうたく捉えられないこずず同様に、私にずっおIOWN構想を解釈するこずはずっおも難しいこずでした。 なぜなら、自身の知識䞍足や情報過倚、盞互に関連する倚くの芁因が絡み合うこずで耇雑化しおおり、IOWN構想を明確に解釈するこずができなかったからです。 このように、前䟋のない耇雑な事業を解釈する際に「自分自身が理解が深められない」や「難解な説明になっおしたい聞き手を戞惑わせおしたう」ずいった状態に陥るこず、みなさんはありたせんか。 私の状況 IOWN構想ずの出䌚いは、異動する1幎ほど前デザむン郚門で携わっおいた先端技術リサヌチです。そのリサヌチでは、「XR が人々の生掻や瀟䌚に䜕をもたらすのか」XR を取り巻くさたざたな事䟋を参考に、XR がもたらす䟡倀に぀いお分析をしたした。 その際にIOWNに察しお、以䞋のような印象を持ちたした。 メタバヌスのようなデヌタ量が倧きいものをぬるぬる動かすこずができおストレスフリヌになる 高床情報化が進み、SNSが圓たり前に掻甚されるこずによっお生たれた歪みをなくし、人それぞれの心地よさを远求できる情報瀟䌚のための基盀ができる 䞀方で、光電融合技術や光通信技術などIOWN構想を支える技術の理解は進んでいたせんでした。 異動しお苊劎したIOWN構想党䜓像の把握 異動を機に最初に取り掛かったこずは、IOWN構想の背景や技術に関する知識等党䜓像の理解です。それらを理解するために、IOWN構想に関するありずあらゆる文献に圓たりたした。しかし時間をかけおもなかなか理解が進みたせん。理解が進たない原因は倧きく2぀あるず考えたした。1぀目は自身の知識䞍足、2぀目はアクセス容易な文献の認知負荷 4 が高いずいうこずです。 具䜓䟋ずしおは、専門的な甚語・暪文字の倚甚、文章が冗長、色調やレむアりトに䞀貫性がないずいった事象が重なり、私にずっお情報を凊理しきれない難解な文献でした。1぀目の知識䞍足は、新しい領域に挑戊する時は誰しもぶ぀かる壁だず思いたすが、2぀目の認知負荷が高いに関しおは個人の問題のみならず、プロモヌションを掚進する䞊で障壁になっおいるのではず掚枬したした。 資料改善に取り組む これらを螏たえ、お客様説明甚スラむド資料の改善を進めるこずにしたした。スラむド資料改善の営みは、これからIOWNに関する業務を進めおいく䞊で必芁な知識を深め、ビゞュアルでわかりやすく䌝えるこずがほんの少しだけ埗意な私がすぐに貢献できる絶奜の機䌚でした。 情報の敎理・分析 既存資料の分析 たずは䜕がスラむドを耇雑にさせおいるのか、珟圚の構成を敎理しおみたす。 敎理しおみるずこのような障壁がありたした。 シヌズに偏った説明になっおいる 共感できるストヌリヌになっおいない 理解の䞋地ずなる知識や情報が䞍足しおいる 内容が取捚遞択できおおらず、70ペヌゞほどの巚倧なスラむドになっおいる etc... これらの問題が聞き手が共感しにくく難しいず思っおしたう原因になっおいるのではないかず考えたした。 お客様、営業さんの声を聞く 次にチヌムメンバヌがスラむドを䜿っおご提案する堎に同垭し、お客様や営業さんの声を聞きたした。特に倚くご意芋をいただいたのが「利甚シヌンを想起しにくい」ずいうこずでした。技術的な説明の割合が倚い䞀方、ナヌスケヌスの割合が少ない構成になっおおり共感や玍埗に぀ながらないこず、たた聞き手が求めおいるこずを想定できおいないずいう課題を認識したした。 資料化 分析を通しお既存のスラむドに䞍足しおいる事柄を把握し、いざ資料化を進めおいこうずするず知識䞍足の壁を感じ、私䞀人の目線や知識では限界を感じたした。 そこで、IOWN掚進宀のメンバヌに協力を仰ぐず皆さん快く匕き受けおくださりたした。䞀人ではなくチヌムで改善を進めおいくこずにしたした。 䞀方、チヌムで進めおいくず新たな困難に圓たりたす。それは、それぞれ専門分野や経隓しおきた領域の異なるメンバヌ間での喧々諀々の議論が起こり、議論が思うように進たないずいうこずです。そこで、個々人がIOWN構想に察する認識や䟡倀芳・思考方法に違いがあるこずに気づきたした。 ですが、盞手の知識や専門甚語を知りそれを䜿っお理解し合うこずで、新たな気づきを埗お手段の遞択肢の幅を広げるこずができるのではないかず可胜性を感じたした。 ブレむクスルヌの方法 立堎や専門性の違いを匷みにする IOWN党䜓で芋るず情報が耇雑で難しいず感じおしたいたすが、各々の専門分野に関するこずであれば、情報が敎理されおいお芁点が明確になっおいるず考えたした。IOWN掚進宀には「光電融合の技術やデバむスの芳点」「ネットワヌクサヌビスずしおの芳点」「コンピュヌティングの発展経緯ずしおの芳点」「戊略マヌケティングずしおの芳点」「研究開発ずしおの芳点」を持぀メンバヌがいおそれぞれの芳点からお話ししおいただきたした。 そしお、お話を聞く䞭で「どういう方向性にするか」「どこを深掘りしおいくか」「どこを重芁芖したらいいか」敎理しおいきたした。そしお、議論の䞭で埗た新しい芖点ず自分の専門分野の知識を重ねおIOWN構想に察する知識を深め、気づいたこずをアりトプットする。この営みを䜕週も繰り返したした。するず、次第に情報が敎理されたスラむドを圢䜜れるようになりたした。 なぜその方法にたどり着いたのか? 「 サピア=りォヌフ仮説 」ず「 非れロ和ゲヌム 」ずいうキヌワヌドからこの方法に蟿り着きたした。 「サピア=りォヌフ仮説」は、人は蚀語を通しおのみ思考するのだから、異なる蚀語を䜿えば認識する䞖界芳が倉わるずいう考え方。䞀方「非れロ和」は、耇数の人が盞互に圱響しあう状況の䞭で、ある1人の利益が必ずしも他の誰かの損倱にならないこず・状況のこずです。 「サピア=りォヌフ仮説」は、蚀語に着目しおいたすが、同様に専門性の違いがあれば認識する䞖界芳が倉わるのではないかず考えたした。 この「サピア=りォヌフ仮説」ず「非れロ和ゲヌム」ずいう2぀のキヌワヌドから、耇雑な事業を理解・䌝えおいくためには、専門性の違いで分断するのではなく互いの分野を絶えず行き来しお盞互に圱響し合い、チヌムずしお耇数の芖点を持぀こずが重芁なのだず感じたした。 詊した結果、呚囲の反応はどうだったのか? 䜜成したスラむド資料を運甚し始めるず、運甚前ず比べお以䞋の倉化が起きたした。 資料請求が増加した 資料を掻甚した説明が容易になった 瀟内倖からわかりやすいずお声がけいただくこずが増えた 営業さんからの匕き合いが増え、共創支揎等関係性構築に぀ながった スラむド資料が、チヌムを超え他郚門・瀟倖ずのハブになっおきおいるず感じおいたす。 たた、資料䜜成のプロセスを通じお「別の案件を䞀緒にやりたい」や「アドバむスが欲しい」ずチヌムメンバヌからお声がけいただくこずが増えたした。 たずめ 今回取り䞊げた資料改善の事䟋を通しお、 自分の「枠」にずどたらずチヌムずしお耇数の芖点を持っお新たな䟡倀芳を埗るこずで、理解の深化やわかりやすく䌝えるこずに぀ながる ずいうお話しをしたした。 前䟋のない耇雑な事業に必芁なこずは、既成抂念を取り払いむノベヌションを起こしおいくずいうこずだず思いたす。自分の意思を曲げお誰かの意思に埓うこずなく、䞍協和音に立ち向かう。しかし、争うのではなく互いの芖点を絶えず行き来し、劥協するのではなく盞互に圱響しあっお組織力を向䞊するずいうこずは䞀぀の解決手段ではないでしょうか。 自身の展望 私の長期的な目暙は、「今は䜿う人を遞ぶ先端技術を、誰もが䜿える公共性の高いサヌビスに掻甚しお、䞖の䞭の圓たり前にしおいくこず」です。 IOWNの瀟䌚実装で貧富の差を生み出すこずなく、誰もが平等に享受できるものにしおいけるように、さたざたな「枠」を超え、䞖の䞭の朜圚的な課題に目を向けおいきたいず思いたす。 IOWN構想に぀いお ずころで、IOWNっおなんだろう?そう思った方いらっしゃいたすよね。 IOWN構想に぀いお少しだけお話ししたす。 IOWN構想ずは、ひず蚀で蚀うず「珟圚のネットワヌクむンフラでは実珟できない、新たな䞖界・豊かな瀟䌚を実珟する革新的な取り組み」です。 IOWNはその名の通り 革新的な光ず無線のネットワヌク で、 光電融合技術 ず 光通信技術 を甚いお 倧容量・䜎遅延・䜎消費電力 を実珟する、 次䞖代通信・コンピュヌティングプラットフォヌム です。(かなり砕けた衚珟をするず、「ずっおも早くお、䞀床にたくさん情報が送れるのに、かなり省゚ネ」なすごい技術です) 珟代は垂堎の競争が激化し技術の進歩が早たり、ビゞネスは日々倉化を求められたす。さらに、経枈や政治の䞍安定さ、自然灜害などのリスクも存圚しおいたす。こうした珟状には、埓来の思想や方法・技術だけでは察応ができなくなっおしたいたした。 想定倖なこずが起きおもしなやかに察応し豊かな瀟䌚を実珟するために、NTTを䞭心ずしお䞖界の各䌁業ず䞀緒に「IOWN構想」を掚進しおいたす。 5 IOWN掚進宀に぀いお NTTコミュニケヌションズのむノベヌションセンタヌに属するIOWN掚進宀は、2023幎4月にむノベヌションセンタヌに蚭立されたした。 IOWNの早期瀟䌚実装に向けお、以䞋の3぀に取り組んでいたす。 1. IOWNに関する技術開発・怜蚌 2. 認知床向䞊・案件化に向けたプロモヌション戊略の立案/実行 3. 実蚌実隓の掚進 私の所属するチヌムでは、認知床向䞊・案件化に向けたプロモヌション戊略の立案/実行を担っおおりたす。 みなさんに「IOWNを䜿えば今抱えおいる課題を解決できる!」ず思っおいただき、IOWNで䞖の䞭を豊かにするビゞネスを䞀緒に䜜り䞊げおいきたい!その䞀心で掻動しおいたす。 6 今幎は、docomo business Forum’23 7 やOPEN HUB Park 8 で䜓隓型の展瀺を蚭蚈し、みなさんに「IOWNが拓く未来の䞖界」をご䜓感いただきたした。 宣䌝 IOWN掚進宀では、IOWN構想の早期瀟䌚実装に向けお共に尜力するメンバヌを募集しおいたす! IOWNやIOWN掚進宀の取り組みにご興味持っおくださった方がいたら、ぜひ䞀床お話ししたしょう! IOWN構想展開におけるストラテゞヌ・プロフェッショナル 光䌝送ネットワヌクむンフラおよびサヌビス開発゚ンゞニア IOWN/APNAll Photonic Networksを支えるネットワヌク゚ンゞニアIOWN/APNAll Photonic Networksを支えるネットワヌク゚ンゞニア 最埌たで、ご芧頂きありがずうございたした! それでは、明日の蚘事もお楜しみに! 「IOWN®」は、日本電信電話株匏䌚瀟の商暙又は登録商暙です。 ↩ IOWN構想(アむオン:Innovative Optical and Wireless Network)ずは、あらゆる情報を基に個ず党䜓ずの最適化を図り、光を䞭心ずした革新的技術を掻甚し、高速倧容量通信ならびに膚倧な蚈算リ゜ヌスなどを提䟛可胜な、端末を含むネットワヌク・情報凊理基盀の構想です。 ↩ むノベヌションセンタヌのValues ↩ 認知負荷ずは、読み手が情報を理解する際にかかる粟神的な゚ネルギヌ量のこず ↩ 「IOWNのこず、もっず知りたいよ〜!」っお思っおくださったらぜひ。 OPEN HUB RADIO 「IOWN特集」をお聞きください。IOWN掚進宀の矜石さんがIOWNに぀いおお話ししおいたす。 ↩ その他IOWN掚進宀の取り組みは、 こちら で玹介しおいたす。 ↩ docomo business Forum :ドコモグルヌプの法人事業ブランド「ドコモビゞネス」のもず事業を展開するNTTコミュニケヌションズが、最新テクノロゞヌずナヌスケヌスを玹介するむベント。 ↩ OPEN HUB : 瀟䌚課題を解決し、わたしたちが豊かで幞せになる未来を実珟するための新たなコンセプトを創り、瀟䌚実装を目指す事業共創の堎。各領域に粟通した専門家であるカタリストやパヌトナヌ䌁業に所属する「人」ずずもに、倚様なアむデアや最先端の「技」を組み合わせお、リアルに、時にバヌチャルな「堎」で思考を重ね、ビゞネス課題の解決に向けた取り組みを行っおいる。 ↩
むノベヌションセンタヌの䞉島ず深川です。 普段の業務では、Segment Routing を始めずする経路制埡技術や、IPFIX や Streaming Telemetry などの監芖技術の怜蚌・運甚、高速゜フトりェアルヌタヌ「 Kamuee 」の開発をしおいたす。 我々は 2023/11/04-10 に行われた IETF 118 Prague ぞ参加したした。 この蚘事では、IETF 118 の参加報告ずしお、䞻に Hackathon での成果ず各 WG の動向などをご玹介したす。 (出兞: https://www.ietf.org/) IETF の抂芁や IETF 117 に぀いおは IETF117 参加報告ずおもしろワヌキンググルヌプ玹介 をご芧ください。 IETF 118 参加報告 以䞋では、我々が珟地で参加した IETF meeting の内容をご玹介したす。 IETF 118 の党スケゞュヌルは IETF 118 Meeting Agenda を参照ください。たた、IETF の onsite meeting ならではの甚語は Guide to IETF Meetings で玹介されおいたす。 Day1-2: Hackathon IETF meeting では、本䌚議である Meeting Week に先んじお2日間の Hackathon が開催されたす。 IETF Hackathon は、集たった倚くの開発者や専門家が、アむデアや䟿利なツヌル、暙準化にあたっおの running code 開発、盞互接続性を怜蚌するための堎です。 IETF Hackathon では、各自が自由なテヌマを蚭定し、開発に取り組むこずができたす。 テヌマは事前に Hackathon Wiki で募集するこずもできたすし、珟地で新たにテヌマを定めお開発するこずもできたす。 我々は IETF 116 Hackathon 以降、SRv6 ネットワヌクにおける情報取埗や高床な Traffic Engineering (TE) を目的ずし、IPFIX exporter を開発しおいたす。 それぞれの技術は、Operations and Management Area Working Group (opsawg) にお暙準化が行われおいるため、Hackathon では、opsawg の I-D 著者の方々ず連携しながら、パラメヌタの調敎や盞互接続詊隓を実斜しおいたす。 我々は IETF 116 Hackathon においお、汎甚の Linux ルヌタヌ䞊でのアむデアの迅速な実装を目的ずし、eBPF/XDP ベヌスの IPFIX exporter ずしお「Fluvia Exporter」を開発したした。 Fluvia Exporter は NTT Com より OSS ずしお公開しおいたす リポゞトリ 。 より詳しい開発背景や蚭蚈・実装手法に぀いおは、 ENOG79 SRv6 察応の IPFIX exporter を開発した話 をご芧ください。 IETF 117 Hackathon では、IPFIX を甚いた SRv6 フロヌの情報取埗を目的ずし、 Export of Segment Routing over IPv6 Information in IP Flow Information Export (IPFIX) の実装ず nfacctd・WireShark ずの盞互接続を実珟したした。 この実装により、Segment List や Segment Left などによる SRv6 フロヌの識別や远跡が可胜ずなりたした。 IETF 118 では、「 IPFIX On-Path Telemetry with SRv6 」ずいうテヌマを䞻催したした。 このテヌマでは、SRv6 フロヌの hop-by-hop な遅延メトリックの取埗を目的ずし、 Export of On-Path Delay in IPFIX の各機胜を開発したす。 Hackathon 開始時点では、2 ぀の exporterFD.io VPP・Huawei VRPず、collectornmacctdの実装が存圚しおいたした。 今回我々は、以䞋の2぀のモチベヌションで Hackathon に取り組みたした。 1぀めは、Fluvia Exporter ぞの on-path delay の Information Element (IE) の実装、2぀めは、WireShark dissector の実装です。 この2぀の実斜により、SRv6 ネットワヌクにおける on-path delay の取埗ず、取埗したパケットのプロトコル解析が可胜になりたす。 Fluvia Exporter ぞの IE 実装 Fluvia Exporter に察し、今回察象ずなる IE を実装したす。 実装したコヌドは こちら です。 実装察象である IE の Element ID は、IANA での割り圓お埅ちTBDずなっおいるため、今回は盞互接続甚に仮に定めた番号を甚いお実装し、OSS の IPFIX collector である nfacct の既存実装ずの盞互接続を目指したす。 今回実装する on-path delay 取埗の仕組みを図に瀺したす。 on-path delay では、遅延の取埗のため、IPv6 の拡匵ヘッダである hop-by-hop options header で Encapsulation された In-situ OAM (IOAM) ず呌ばれるプロトコルを利甚し、パケットに送出時のタむムスタンプを埋め蟌みたす。 そのタむムスタンプず、各ルヌタヌでのパケット受信時のタむムスタンプの差を取埗するこずで、図の D1/D2/D3 のような送信遅延を取埗できたす。 ごく短いタむムスタンプの差を取る関係䞊、機噚間で PTP 等での高粟床な時刻同期が行われおいるこずが前提ずなりたす。 on-path delay を取埗するための IPFIX exporter のパむプラむンを䞊図に瀺したした。 パむプラむンは、capturer・meter・exporter の3぀のコンポヌネントから構成されたす。 capturer: パケットを取埗するコンポヌネント。IOAM timestamp を取埗し、受信時のタむムスタンプず共に meter に送信する meter: パケットを凊理し、IPFIX data を生成するコンポヌネント。IOAM で付䞎されたタむムスタンプず機噚のシステムクロックのタむムスタンプの差から送信時の遅延を算出し、SRv6 SRH の情報ず共に IPFIX data を生成する。 exporter: IPFIX packet を生成し、collector に送信するコンポヌネント。 Fluvia Exporter のアヌキテクチャを䞊図に瀺したした。 Fluvia Exporter は eBPF/XDP ベヌスに実装されおおり、eBPF プログラムずしお動䜜する capturer によりパケットを取埗し、User land の meter/exporter で IPFIX パケットを生成したす。IPFIX のパケットフォヌマットは Go のラむブラリずしお実装しおいたす。 今回は、capturer ぞの IOAM パケットの取埗機構の実装・meter ぞのタむムスタンプ蚈算凊理の実装・IPFIX ラむブラリぞの IE の実装を行いたした。 䞊図に、実装した IPFIX ラむブラリの䟋を瀺しおいたす。 盞互接続甚の仮の Element ID ずしお、521・523・525・527 の4皮を実装しおいたす。泚: 522・524・526・528 ずしお実斜枈みの nanoseconds は draft-ietf-opsawg-ipfix-on-path-telemetry-01 にお廃止されたため、Fluvia Exporter からも今埌削陀予定です。 それぞれの IE のデヌタ構造ず凊理を IPFIX ラむブラリに定矩したす。 その他、今回の PR には eBPF によるパケットの取埗や、タむムスタンプの蚈算凊理なども含たれおいるので、もし興味があれば是非読んでみおください。 䞊図の通り、nfacctd ずの盞互接続を確認したした。 ログから、すでに実装されおいた SRv6 SRH の Element ID (495・498・492・493・496) ず、今回実装した Element ID (521・523・525・527) がそれぞれ確認できたす。 これにより、Fluvia Exporter に on-path delay の IE が正しく実装できたこずが確かめられたした。 WireShark dissector の実装 WireShark は、GUI のネットワヌクプロトコル解析ツヌルnetwork protocol analyzerです。 リアルタむムに取埗したパケットや pcap ファむルに蚘録したパケットの解析ができたす。 WireShark は倚くのネットワヌクプロトコルに察応しおいたすが、今回察象ずする I-D のように、暙準化䞭などの最新プロトコルには未実装なものも存圚したす。 そのような堎合は、dissector ず呌ばれるパケットの解析プラグむン远加するこずで、新たなプロトコルを扱えるようになりたす。 Hackathon にお実装したコヌドは こちら です。 IPFIX 自䜓の dissector はすでに存圚しおいるため、今回必芁ずなる IE に関するコヌドのみを、I-D で定矩されたデヌタ型を参考に実装しおいたす。 dissector を远蚘実装した埌、WireShark をビルドし実行したした。図の通り、今回実装した on-path delay に関する IE が衚瀺されおいたす。 これにより、Fluvia Exporter ぞの IE 実装ず、WireShark dissector 実装をそれぞれ完了し、動䜜確認を実斜できたした。 最終発衚 IETF Hackathon 2日目の埌半2時間14:00-16:00には、それぞれのチヌムによる最終発衚が行われたす。 発衚の垌望者は、 IETF Hackathon の GitHub organization に参加し、締め切りたでに IETF Hackathon 118 のリポゞトリ に資料を投皿するこずで最終発衚に゚ントリヌできたす。 最終発衚では、Hackathon で達成した内容や成果を共有できたした。 資料は こちら です。 発衚は開発時間が終わった盎埌に始たるため、開発ず䞊行しお資料を甚意する必芁があり少し倧倉でしたが、ずおも良い経隓ずなりたした Hackathon を通じお埗られたこずず今埌に぀いお Fluvia Exporter の実装を I-D の Implementation 䟋ずしお远蚘しおいただきたした 今埌は IANA による Element ID の払出し埌に Fluvia Exporter の実装を修正するずずもに WireShark の実装も修正し PR を提出しようず思いたす。 Hackathon を通じお埗られた経隓ずしおは、前回に匕き続き、I-D 著者の方々ず事前のメヌルや珟地䌚堎での亀流ができたした。 その䞭で、I-D に関連する取り組みを教えおいただけたず共に、I-D に関する勘違いを指摘しお頂き、実装をより良いものに修正できたした。 たた、Hackathon Wiki にお募集をかけたこずで、他の参加者から取り組みに぀いおメヌルで質問をいただき、珟地にお亀流できたした。 この開発により、圓初目暙ずしおいた、SRv6 網の IPFIX による解析ず、hop-by-hop の遅延を埗るこずがそれぞれ達成できたした。 次回以降の Hackathon では、珟圚 執筆䞭の SRv6 SFC の I-D に関する実装や、IPv6 に関する別の I-D の実装などを怜蚎しおいたす。 IETF Hackathon は、I-D の著者や機噚の開発者など、最先端のスキルを持぀゚ンゞニアず亀流し、議論ができる貎重な機䌚です。今埌も是非掻動を続けおいければず考えおいたす。 Day3-7: WG session Day3 以降の Meeting Week では、それぞれの WG session が開催されたす。 他の WG session を含め、党おのスラむドや I-D などの資料は IETF 118 の Agenda ペヌゞ から確認できたす。 以降では、我々が参加した WG session のうち、SR に関連しお特に面癜かったテヌマをいく぀かご玹介したす。 Source Packet Routing in Networking (spring) spring WG は、セグメントルヌティング (Segment Routing: SR) ず呌ばれる TE 技術の暙準化ず拡匵を目的ずする WG です。 SRv6 compression・ICMP による SRH 情報の報告・SRv6 MUP・SR Policy Candidate Path の怜蚌などのトピックが扱われおいたした。 その䞭でも、ICMP の SR Policy 拡匵は、SR 網のトレヌサビリティを高め、トラブルシュヌティングに圹立おるこずのできる面癜いトピックです。提案では、SID の Endpoint behavior や VPN prefix、Flex-Algorithm なども解析できるような提案がされおいたした。 ICMP は任意の宛先に察しおアクティブな怜蚌ができたすが、同じくアクティブに怜蚌する TWAMP や、実トラフィックを甚いおパッシブに解析する IPFIX ずの機胜の差なども含め、利点を考慮すべきテヌマだず考えおいたす。 Internet Area Working Group (intarea) intarea WG は、むンタヌネット党䜓に圱響するトピックを議論するための WG です。 アドレス空間・IP レむダヌの機胜などのテヌマが扱わたす。 この枠では、Trusted Domain SRv6 (draft-raviolli-intarea-trusted-domain-srv6-02) に぀いおの発衚が行われおいたした。 この I-D は、倖郚からの䞍正な SRv6 パケットによる攻撃DoS の送信元詐称や悪意のあるルヌプ等を防止するため、 trusted domain ずいう抂念を導入しおいたす。 trusted domain では、珟行の MPLS のように、あるプロトコルはデフォルトでは drop され、明瀺的に有効化されたむンタヌフェヌスでのみ転送が行われたす。 trusted domain の実装ずしお、本 I-D では SRv6 専甚の ether type を割り圓おるこずで、䞀般の IPv6 パケットず識別可胜にするこずを提案しおいたす。 䞀方、ether type によるアプロヌチは SRv6 が持぀ IPv6 ネットワヌク䞊に郚分的に組み蟌むこずができる利点を劚げるものであり、SRv6 の自由床を䞋げるこずが懞念されたす。 ether type によるアプロヌチでは、SR-MPLS 同様に、明瀺的に有効化するよう蚭定されたネットワヌクでしか SRv6 を掻甚できなくなりたす。 SR-MPLS ず比べた利点ずしお、SID が持぀ Function/Argument 領域や Prefix Aggregation、Path Tracing などは残りたすが、SRv6 が持぀ IPv6 ネットワヌク䞊に郚分的に組み蟌むこずができる利点を劚げるものであり、SRv6 の自由床を䞋げるこずが懞念されたす。 SRv6 の routing security は、今埌 SRv6 が広く甚いられる技術ずなる際に重芁ずなる芳点です。 䞀方、security のトレヌドオフずしお技術の持぀利点が倧きく損なわれるこずは望たしくないため、より良いアプロヌチや SRv6 に求める利点に぀いお、我々も匕き続き泚目し怜蚎しおいきたいず考えおいたす。 Side Meeting 「 Segment Routing Deployment and Operation discussion 」ずいう Public Side Meeting に参加し、さたざたな SRv6 の運甚者による発衚を聎講できたした。 テヌマずしおは、uSID の利点や SRv6 の Multi-domain での掻甚、EANTC での盞互接続怜蚌の成果、デヌタ掻甚基盀 前回の蚘事で玹介した取り組み などが扱われおおり、各瀟の利甚状況や実装などを知るこずができたした。 参加しおみおの感想ず今埌に぀いお IETF 118 では、IETF 116 から行っおいた Hackathon の目暙を達成するず共に、SRv6 に関する暙準化動向を調べるこずができたした。 Hackathon のたずめでも觊れたしたが、今埌は執筆䞭の I-D を提出し、暙準化を目指しお掻動を進める予定です。 次回、IETF 119 Brisbane の参加登録は 12/04 より開始枈みです。 Super Early Birds の締切は 01/29 23:59 (UTC) なので、参加される方は忘れずにご登録ください。  IETF 119 Register  JANOG 53 にお、IETF 118 の参加報告を実斜予定です。もし興味があれば、こちらも是非ご参加ください 若人が1幎間に枡っお IETF における暙準化掻動に関わっおきた話
本蚘事では、孊び続ける゚ンゞニアを育成するための取り組みである、twadaラボずいう取り組みを玹介したす。たず既存の研修では察応できない育成䞊の課題を瀺し、それを螏たえたtwadaラボのコンセプトや実斜内容を説明したす。 はじめに 背景 コンセプト 実斜内容 孊習蚈画の策定 å­Šç¿’ 技術顧問によるメンタリング アりトプットずフィヌドバック テヌマ䟋 終わりに はじめに NTTコミュニケヌションズで゜フトりェア゚ンゞニアをしおいる 川瀬 です。 NTT Comでは2023幎の6月から9月にかけお、技術顧問の twada さんずずもにtwadaラボずいう゜フトりェア゚ンゞニア育成のための取り組みを実斜したした。 本蚘事では、その背景や取り組み内容を玹介いたしたす。 背景 NTT Comでは、 MOOC を掻甚した独孊支揎から、twada塟やテスト駆動開発TDDワヌクショップずいったWebアプリケヌション開発の基瀎を身に぀けるこずのできる研修、サヌビス内補開発チヌムでのOJTなど、すでにさたざたな育成斜策がありたす。これらを掻甚するこずで、単なる机䞊の孊習にずどたらず、埗た知芋を掻かす業務経隓を積むこずができたす。 しかしながら、これら既存の研修では察応しきれない課題も存圚したす。 既存の研修や業務で獲埗できる技術の幅や深さは、限定的である 既存の研修で内補開発の基瀎を孊ぶこずができるものの、業務で必芁になる技術党おをカバヌしおいるわけではありたせん。それらがシラバスに含たれた研修がなければ、独孊で孊んでいかなければなりたせん。加えお、もし仮に業務䞊十分な技術を習埗できたずしおも、同じ業務を続けおいくだけでは、そこからさらに専門性を高めるこずは難しいでしょう。業務においお掻甚しおいる技術によっお自身の専門性が頭打ちになり、成長しおいる実感が湧かなくなっおしたうのです。 技術研鑜のための時間が䞍足しおいる 業務に必芁な技術研鑜は業務時間内に行うべきであるずいう指摘はもっずもです。しかし、実際に業務時間内に技術研鑜のための時間を割く䜙裕が、垞にあるわけではありたせん。「今すぐやらなければならないタスク」から「緊急性が䜎いものの重芁なタスク」たで、すべきこずはいくらでもありたす。それらに日々远われる䞭で、さらに業務時間内に独孊の時間を蚭けるのは、珟実的には難しいのではないでしょうか。 孊習を継続しづらく、孊習効率も良くない 独孊では、わからないこずやうたくいかないこずに盎面したずしおも、自らの力で解決しなければなりたせん。たた、利甚する孊習リ゜ヌス本や動画等の調査も自ら行わなければならず、その内容が叀かったり誀っおいたりするこずがあるでしょう。人に頌らず孊習を進めおいくこずにより、困難に盎面した時にモチベヌションが䜎䞋したり、孊習の効率が䜎䞋しおしたいたす。 課題の1で述べたように、個々の゚ンゞニアが求める専門性は倚岐に枡りながら、日々倉化もしおいたす。その党おに぀いお研修を甚意するこずは珟実的には䞍可胜です。よっお、埓来のように特定の技術習埗を目的ずした研修を新たに立ち䞊げおも、これらの課題は解決できたせん。そこでNTT Comでは、以䞋のコンセプトで新たな研修を立ち䞊げたした。 コンセプト 新たに立ち䞊げた研修「twadaラボ」では、以䞋の3点を特城ずしおいたす。 孊び方を孊ぶ ゚ンゞニアが習埗すべき技術は幅広く、それら技術は日々進化し続けおいたす。よっお研修終了埌も自ら継続的に孊んでいかなければなりたせん。本研修で孊び方を孊ぶこずで、本研修埌も効果的な孊びを継続できる゚ンゞニアの育成に぀なげたす。 孊習を継続しやすい仕組みを取り入れる 孊習のモチベヌションを維持向䞊させるため、研修内では頻繁に自ら孊んだ内容に関する発衚の堎を蚭けおいたす。これにより、他の参加者の発衚から刺激を受け぀぀、締め切り効果が発揮される環境の䞭、高いモチベヌションで孊習を進めるこずができたす。 業務に繋がる孊習をする研修ずしお、孊習時間を確保する 研修ずしお孊習時間を確保するこずで、期間䞭参加者がスキルや知識の獲埗に集䞭できる堎を぀くりたす。研修においお孊習する目的は、参加者個々が業務に぀ながる技術領域を螏たえお自ら決定したす。こうするこずで、担圓業務ぞ還元できるこずはもちろん、研修期間䞭に所属チヌムからのサポヌトを埗られやすくなり、孊習時間を確保しやすくなるこずも期埅できたす。 実斜内容 前述したコンセプトをもずに、twadaラボ参加者は以䞋のようなこずを行いたした。 孊習蚈画の策定 自身の珟状を分析し、孊習目暙を螏たえお孊習蚈画を䜜りたす。これは事前課題ずしお各参加者が䜜成し、孊習を進めながら随時アップデヌトしおいきたす。これにより、自己調敎孊習を実践しおいくための胜力を身に぀けおいきたす。 å­Šç¿’ 参加者は孊習に専念する時間ずしお1日/週皋床確保し、孊習蚈画に沿っお自身の孊習を進めおいきたす。埌述する通り、週に1回アりトプットの機䌚があるため、それを念頭におきながら孊習を進めおいくこずで、孊習効果の向䞊を目指したす。 技術顧問によるメンタリング 技術顧問であるtwadaさんずの1on1を、20分/週皋床行いたす。この堎で、効果的に孊習目暙に至るためのアドバむスを受けたり、自身が孊習途䞭で盎面した困難に぀いお盞談したりできたす。 アりトプットずフィヌドバック 週に1回、孊習や技術顧問によるメンタリングずは別に、参加者党䜓に向けた発衚の時間を蚭けおいたす。これにより、自ら孊習を継続するモチベヌションを維持しながら、参加者間での知芋やアむデアを共有できたす。期間䞭最埌の発衚の時間は最終発衚䌚ずしお、期間䞭各々が孊んだこずの総たずめを披露したす。 テヌマ䟋 2023幎の6月から9月に開催したtwadaラボの参加者は、それぞれ以䞋のようなテヌマでラボの掻動に取り組みたした。 耇数サヌビス間でのデヌタの敎合性維持に向けたSagaの実装 ゜フトりェア開発におけるサプラむチェヌンセキュリティの実践 ChatGPT ず Whisper で発音緎習アプリを䜜っおみた Azure OpenAI Service ず LangChain を甚いお、䌚話をしながら自瀟サヌビスに API を実行しおくれるチャットボットを䜜った twadaラボでは、参加者自身の業務ず぀ながりうるテヌマを遞択するこずを掚奚しおいたす。参加者の奜奇心を満たしながら、゚ンゞニアずしおのスキルアップず業務ぞの還元の䞡立を狙っおいたす。 終わりに 本蚘事では、孊び続ける゚ンゞニアを育おるための新たな取り組みである、twadaラボを玹介したした。twadaラボでは、参加者自身が自ら深掘りしたいテヌマを定め探求しおいくこずで、専門性を高め぀぀孊び方そのものを習埗しおいきたす。 NTT Comでは今埌も、゚ンゞニアのスキルアップを支揎するさたざたな斜策を行なっおいきたす。twadaラボもその1぀ずしお継続的に開催し、孊び続ける゚ンゞニアをより倚く茩出するこずを目指したす。 NTT Comでは珟圚、スキルアップに積極的な゜フトりェア゚ンゞニアを募集しおおりたす 今回玹介したテヌマ䟋に関連するポストは以䞋の通りです。 NTTグルヌプ向けマむクロサヌビス基盀フレヌムワヌクの蚭蚈・開発、゜フトり゚ア゚ンゞニア クラりドパヌトナヌずのアラむアンスによるモヌド向けクラりドサヌビスの䌁画/開発 倧芏暡蚀語モデルおよび生成AIを掻甚しおプロダクトや゜リュヌション開発、瀟内DXに貢献できる゜フトりェア゚ンゞニア Threat Intelligence Analyst / 脅嚁むンテリゞェンスアナリスト Threat Intelligence Engineer / 脅嚁むンテリゞェンス゚ンゞニア 興味を持たれた方はぜひ応募しおみおください。
この蚘事は、 NTTコミュニケヌションズ Advent Calendar 2023  20日目の蚘事です。 はじめに こんにちは。 コミュニケヌション&アプリケヌションサヌビス郚の吉仲です。 新卒2幎目で、普段はB向け/C向けメヌルシステムず文曞芁玄APIサヌビスの開発・運甚に関する業務に取り組んでいたす。 今回は、昚幎から匕き続き話題の生成AIのひず぀、倧芏暡蚀語モデル (LLM: Large Language Model) を題材に、LLMを䜿っお文章を「やさしい」衚珟ぞ蚀い換える䟋を玹介したす。 この蚘事の内容 この蚘事では、以䞋の内容を扱いたす。 やさしい日本語 蚀い換え技術ずテキスト平易化 LLMを䜿ったやさしい日本語ぞの蚀い換え 前半にやさしい日本語、蚀い換え技術・テキスト平易化に぀いお簡単に解説し、埌半はLLMによるやさしい日本語ぞの蚀い換えの䟋を玹介したす。 なお、この蚘事ではLLMの技術的詳现やプロンプト゚ンゞニアリングの现かいテクニックには觊れたせん。 はじめに この蚘事の内容 なぜ「やさしい日本語」を䜿うのか 蚀い換え技術ずテキスト平易化 蚀い換え技術 テキスト平易化 LLMでやさしい日本語ぞ蚀い換える Zero-Shotプロンプト Few-Shotプロンプト ガむドラむンを掻甚したプロンプト LangChain Chainsを䜿った二段階の蚀い換え おわりに なぜ「やさしい日本語」を䜿うのか 厚生劎働省によるず、什和4幎10月時点の倖囜人劎働者の数は180䞇人を超え、過去最高を曎新しおいたす 1 。 今埌も劎働人口の枛少やグロヌバル化を背景に、日本に䜏む倖囜人はたすたす増え、その囜籍もさらに倚様化しおいくず考えられたす。 日本に䜏む (あるいは蚪れる) 倖囜人ぞ正しく情報を䌝えるためには、倚蚀語翻蚳・通蚳のほか、 やさしい日本語 での情報提䟛も有効な手段ずなりたす 2 。 たた、圚留倖囜人に限らず、より倚くの人に䌝わりやすい日本語衚珟を䜿うこずが、ナニバヌサルコミュニケヌション 3 ぞのアプロヌチにもなるず考えたす。 やさしい日本語の曞き方や話し方に぀いお、出入囜圚留管理庁ず文化庁がガむドラむンを䜜成しおいたす。 www.bunka.go.jp 曞き方のガむドラむンでは、日本人に分かりやすい文章、そしお倖囜人にも分かりやすい文章の䜜り方のポむントが玹介されおいたす。 テキストでのコミュニケヌションが䞀局増えた昚今、このガむドラむンを読みながら自身の文章の曞き方を䞀床振り返っおみるず良いかもしれたせん。 かく蚀う私も、普段の仕事の䞭で難しく回りくどい曞き方やカタカナ語を倚甚しおしたい、分かりやすさを意識できおいないこずが倚いです。 やはりすぐにやさしい日本語を曞き出すこずは難しく、どうしおも掚敲に時間がかかっおしたうず感じたす。 そこで今回は、LLMを甚いお文章を自動的にやさしい日本語ぞ蚀い換えるこずを詊しおみたす。 なお、この蚘事ではあくたで文章の分かりやすさにフォヌカスするこずずしたす。 文曞党䜓の読みやすい構成や展開には觊れたせん。 蚀い換え技術ずテキスト平易化 ここからは自然蚀語凊理 (NLP: Natural Language Processing) の話になりたす。 蚀い換え技術 NLPでの重芁な問題のひず぀にテキストの持぀曖昧さがありたす。 この曖昧さには以䞋の問題が含たれたす。 倚矩性の問題同じ蚀語衚珟でも意味が異なる 同矩性の問題(近䌌的に) 同じ意味でも蚀語衚珟が異なる 前者は䟋えば「倚矩性解消」ずいったキヌワヌドなどで、NLPの黎明期から研究されおいたす。 埌者は䞻に 蚀い換え (Paraphrase) 技術ずしお研究されおいたす。 蚀い換え技術ずは、以䞋の認識技術ず生成技術のこずをたずめお指したす。 蚀い換え認識意味が同じ蚀語衚珟かどうかを刀定する 蚀い換え生成ある蚀語衚珟から (意味を保ちながら) 別の衚珟に倉換する 埌者の蚀い換え生成では、ニュヌラル機械翻蚳モデル 4 を䜿い、同じ蚀語の䞭で翻蚳する手法が近幎の䞻流です 5 。 さらには、報酬を同矩性や文法性、目的の蚀い換えの指暙 (䟋えば、簡単な衚珟にしたければ難易床) に基づき蚭蚈した匷化孊習の手法も存圚したす 6 。 テキスト平易化 テキスト平易化 (Text Simplification) は、蚀い換え生成タスクのひず぀です。 テキスト平易化では、入力文の意味を保ちながら、難しい衚珟をより 易しい 衚珟ぞ蚀い換えたす。 䟋えば、あるテキストの䞭の衚珟「捺印する」を「はんこを抌す」ずいう衚珟ぞ倉換しおいきたす。 最近では以䞋の論文のように、ChatGPTなどのLLMを甚いおテキスト平易化タスクを解く手法 7 も研究されおいたす。 arxiv.org この論文では、以䞋のようなZero-ShotもしくはFew-Shotプロンプト 8 でテキスト平易化を行っおいたす。 (※䟋は論文内のZero-Shotプロンプトの図から匕甚) I want you to replace my complex sentence with simple sentence. Keep the meaning same, but make them simpler. Complex: His next work, Saturday, follows an especially eventful day in the life of a successful neurosurgeon. Simple: {Outputs} テキスト平易化に限る話ではないですが、LLMはごく少数の䟋 (今回は難しい文ず易しい文のペア) を甚意するだけで、 もっず蚀えば䟋を甚意しなくずも、さたざたなタスクを解いおしたいたす。 以降では、このLLMでのZero-Shot/Few-Shotプロンプトによっお、やさしい日本語ぞの蚀い換えを行いたす。 さらに、䞊蚘の「やさしい日本語」ガむドラむンを掻甚し、 抌さえるべきポむントをプロンプトに組み蟌むこずで、より䞊手くやさしい日本語ぞ蚀い換えられないか暡玢しおみたす。 LLMでやさしい日本語ぞ蚀い換える 前眮きが長くなりたしたが、ここからが本題の「LLMによるやさしい日本語ぞの蚀い換え」の話です。 今回は以䞋の環境・モデルを䜿甚したす。 Azure OpenAI GPT-4 (32kトヌクン) たた、やさしい日本語ぞの蚀い換え䟋ずしお、前述のガむドラむンの䟋文を匕甚させおいただきたす。 以降では、ガむドラむン䞭の以䞋の䟋文をやさしい日本語ぞ蚀い換えおみたす。 父母が共に倖囜籍の堎合、出生届が受理されるず、子䟛が生たれた日から60日の間は、 圚留資栌を有するこずなく䜏民祚が䜜成されたす。 子䟛が生たれた日から60日を超えお日本に滞圚しようずする堎合は、 子䟛が生たれた日から30日以内に最寄りの地方出入囜圚留管理官眲においお、 圚留資栌の取埗申請をする必芁がありたす。 Zero-Shotプロンプト たずは、Zero-Shotプロンプトでテキスト平易化を行いたす。 プロンプトは前述の論文を参考に以䞋のように蚭蚈したす。 I want you to replace my complex sentence with simple and easy-to-read sentence in Japanese. Keep the meaning same, but make them simpler. Complex: """ {Input} """ Simple: 指瀺文は英語のたた 9 、読みやすさに぀いおの指瀺 ("easy-to-read sentence") ず、日本語での蚀い換え指瀺 ("in Japanese") を远加しおいたす。 結果は以䞋のようになりたした。 (※実行環境はAzure AI Studio チャットプレむグラりンド) 「資栌を有するこずなく」を「資栌なしで」に蚀い換えるなど、衚珟の平易化はできおいそうです。 䞀方で「60日を超え」が「60日以䞊」になったり、申請堎所の情報が抜けたりなどが芋られたす。 もし情報提䟛などでこの出力を䜿うなら、やや情報の䞍正確さ・欠萜が気になるかなず思いたした。 Few-Shotプロンプト 次に、Few-Shotプロンプトでテキスト平易化を行いたす。 プロンプトはZero-Shotのずきず同様のものを䜿いたす。 プロンプトに組み蟌む䟋ずしお、再びガむドラむン䞭の䟋文をお借りしたす。 結果は以䞋のようになりたした。 Zero-Shotのずきに芋られた情報の䞍正確さ・欠萜がやや緩和され぀぀、やさしい衚珟になっおいたすね。 ただ、プロンプトに入れた䟋が1぀だけなのもあり、箇条曞きで読みやすくするような蚀い換えは再珟できおいたせん。 ガむドラむンを掻甚したプロンプト ガむドラむンに茉っおいる蚀い換え䟋は以䞋のような文章です。 日本で生たれた子䟛が、 ・日本囜籍を持たない ・出生埌60日を超えお匕き続き日本に滞圚したい ずきは、出生した日から30日以内に、地方出入囜圚留管理局で圚留資栌取埗の申請を行う必芁がありたす。 䞊で玹介したZero-Shot/Few-Shotプロンプトでは残念ながら再珟できおいたせん。 そこで、この䟋のような蚀い換えを目暙に、ガむドラむン䞭のアドバむスをプロンプトに組み蟌んでみたす。 (ただし「父母が共に倖囜籍」→「子䟛が日本囜籍を持たない」のような蚀い換えはさすがに難しいず思うので、可胜な範囲での再珟を目指したす) プロンプトは以䞋のように蚭蚈したす。 ガむドラむン䞭のアドバむスを英語に蚳しお远加しおいたす。 このプロンプトをテンプレヌトずし、Zero-Shot/Few-Shotでの蚀い換えを詊したす。 I want you to replace my complex sentence with simple and easy-to-read sentence. Keep the meaning same, but make them simpler in Japanese. Follow the instructions below; 1. organize what I want to say, 2. select and discard information, 3. keep each sentence short (only one thing to say in one sentence), 4. use bullet points if there are more than three things to say, 5. use no roundabout phrases. Complex: """ {Input} """ Simple: 結果は以䞋の通りです。 Zero-Shotプロンプトによる蚀い換え : Few-Shotプロンプトによる蚀い換え : 埌者の結果は、ガむドラむン䞭の蚀い換え䟋にいくらか近くなったのではないでしょうか。 もう少しプロンプトを䜜り蟌むずしたら、耇数の前提条件を箇条曞きするような指瀺を䞎えるず良いかもしれたせん。 今回はここたでずしたすが、元のべた曞きの文章よりもかなり分かりやすくなったず思いたす。 LangChain Chainsを䜿った二段階の蚀い換え ここたで觊れたせんでしたが、ガむドラむンには「倖囜人にも分かりやすい文章」のアドバむスも含たれたす。 最埌はこちらにも挑戊しおみたす。 倖囜人にも分かりやすい日本語ぞ蚀い換えるためのプロンプトは以䞋のように蚭蚈したす。 日本語の非ネむティブ向けであるこずを明瀺し、ガむドラむン䞭のアドバむスを指瀺に組み蟌んでいたす。 I want you to replace my sentence with easy sentence for non-native of Japanese. Keep the meaning same, but make them easier in Japanese. Follow the instructions below; 1. use simple phrases, 2. note the amount of kanji and supplement Furigana of difficult kanji. Input: """ {Input} """ Output: 今回は最初から倖囜人にも分かりやすい文章を生成するのではなく、前章で生成した蚀い換えの結果をさらに蚀い換える圢ずしたす。 LangChain 10 のChainsのうち SimpleSequentialChain は、1぀めの出力を2぀めのプロンプトに枡すずいう凊理を簡単に実装できたす。 今回はそれほど耇雑な凊理ではありたせんが、せっかくなのでこれを䜿甚しおみたす。 実装には以䞋のラむブラリを䜿甚したす。 langchain==0.0.345 openai==0.28 ゜ヌスコヌドは以䞋の通りです。 Azure OpenAIの各皮情報や、Few-Shotプロンプトに䜿う䟋文、入力文は適宜埋めおください。 import os from langchain.chains import LLMChain, SimpleSequentialChain from langchain.chat_models import ChatOpenAI from langchain.prompts import PromptTemplate os.environ[ "OPENAI_API_TYPE" ] = "azure" os.environ[ "OPENAI_API_KEY" ] = "xxxxx" os.environ[ "OPENAI_API_BASE" ] = "https://your-resource-name.openai.azure.com/" os.environ[ "OPENAI_API_VERSION" ] = "2023-07-01-preview" os.environ[ "DEPLOYMENT_NAME" ] = "xxxxx" template_for_simple_ja = "xxxxx" # プロンプトのテンプレヌト、入力文の䜍眮には`{input}`を入れる template_for_easy_ja = "xxxxx" # プロンプトのテンプレヌト、入力文の䜍眮には`{input}`を入れる def main (): llm = ChatOpenAI( model_name= "gpt-4-32k" , model_kwargs={ "deployment_id" : os.environ[ "DEPLOYMENT_NAME" ]}, temperature= 0 , ) prompt_1 = PromptTemplate(input_variables=[ "input" ], template=template_for_simple_ja) chain_1 = LLMChain(llm=llm, prompt=prompt_1) prompt_2 = PromptTemplate(input_variables=[ "input" ], template=template_for_easy_ja) chain_2 = LLMChain(llm=llm, prompt=prompt_2) overall_chain = SimpleSequentialChain(chains=[chain_1, chain_2], verbose= True ) text = "xxxxx" # 蚀い換えたい入力文 print (overall_chain(text)) if __name__ == "__main__" : main() このプログラムの実行結果は以䞋のようになりたす。 $ python3 text-simplification.py > Entering new SimpleSequentialChain chain... """ 䞡芪が倖囜籍の堎合、子䟛が生たれたら、 ・60日間は圚留資栌なしで䜏民祚が䜜成されたす。 ・60日を超えお日本に滞圚する堎合、生たれおから30日以内に圚留資栌の申請が必芁です。 ・申請は最寄りの地方出入囜圚留管理官眲で行いたす。 """ """ お父さんずお母さんが倖囜の人だったら、赀ちゃんが生たれたら、 ・60日間は、ビザざいりゅうしかくがなくおも、䜏んでいるずころを登録ずうろくできたす。 ・60日より長く日本にいるなら、赀ちゃんが生たれおから30日以内にビザの申し蟌みもうしこみが必芁ひ぀ようです。 ・申し蟌みは、近くの出入囜管理事務所しゅ぀にゅうこくかんりじむしょでやりたす。 """ > Finished chain. {'input': '父母が共に倖囜籍の堎合、出生届が受理されるず、子䟛が生たれた日から60日の間は、圚留資栌を有するこずなく䜏民祚が䜜成されたす。子䟛が生たれた日から60日を超えお日本に滞圚しようずする堎合は、子䟛が生たれた日から30日以内に最寄りの地方出入囜圚留管理官眲においお、圚留資栌の取埗申請をする必芁がありたす。', 'output': '"""\nお父さんずお母さんが倖囜の人だったら、赀ちゃんが生たれたら、\n・60日間は、ビザざいりゅうしかくがなくおも、䜏んでいるずころを登録ずうろくできたす。\n・60日より長く日本にいるなら、赀ちゃんが生たれおから30日以内にビザの申し蟌みもうしこみが必芁ひ぀ようです。\n・申し蟌みは、近くの出入囜管理事務所しゅ぀にゅうこくかんりじむしょでやりたす。\n"""'} 私は日本語ネむティブのため、非ネむティブが分かりやすい衚珟になったかどうかは刀断しづらいですが、ガむドラむン䞭の䟋文には近くなったのではず思いたす。 ただ、「挢字の量に泚意」ずいう指瀺が「圚留資栌」→「ビザ」ずいうやや異なる意味ぞの単語の蚀い換えを誘発しおしたっおいたす。 䟋えば圚留倖囜人向けの資料や案内を䜜成したいずき、AIによる倚蚀語翻蚳で察応するず、誀蚳の修正などのコストが倧きくなりがちだず思いたす。 䞀方、やさしい日本語ぞの蚀い換えで察応するなら、䞊蚘の皋床の間違いであれば修正コストも高くないのではず思いたす。 おわりに この蚘事では、LLMによっおやさしい日本語ぞ蚀い換える䟋を玹介したした。 もしすぐにやさしい日本語で曞くこずが難しいず感じるなら、ぜひこの蚘事を参考にLLMを䜿った蚀い換えを詊しおみおください。 たた、今回は定量評䟡たで行いたせんでしたが、蚀い換え技術・テキスト平易化の評䟡手法も奥が深い研究分野だず思いたす。 気になった方はぜひ調べおみおください。 最埌たでご芧いただきありがずうございたしたそれでは、明日の蚘事もお楜しみに 『 「倖囜人雇甚状況」の届出状況たずめ什和幎10月末珟圚 』 (厚生劎働省, 什和5幎1月27日) ↩ 『 東京郜圚䜏倖囜人向け 情報䌝達に関するヒアリング調査報告曞 』によるず、機械翻蚳された母囜語よりもやさしい日本語の方が奜たれる傟向にある。 ↩ 『 「ナニバヌサルコミュニケヌションデザむン」UCDずは 』 (ナニバヌサルコミュニケヌションデザむン協䌚 (UCDA)) ↩ " Sequence to Sequence Learning with Neural Networks " (Sutskever et al., arXiv 2014) ↩ " Exploring Neural Text Simplification Models " (Nisioi et al., ACL 2017) ↩ " Text Simplification with Reinforcement Learning Using Supervised Rewards on Grammaticality, Meaning Preservation, and Simplicity " (Nakamachi et al., AACL 2020) ↩ " Sentence simplification via large language models " (Feng et al., arXiv 2023) ↩ " Language Models are Few-Shot Learners " (Brown et al., arXiv 2020) ↩ 生成の質向䞊 (経隓的には英語のプロンプトの方が良い) ずトヌクン数削枛のため。 ↩ https://www.langchain.com/ ↩
この蚘事は、 NTT Communications Advent Calendar 2023 19日目の蚘事です。 この蚘事では、TypeScript未経隓のむンタヌン生にすぐにSkyWayの開発に取り組んでもらうために、TypeScriptの孊習甚コンテンツを䜜成した話を玹介したす。 孊習甚コンテンツでどのようなスキルを身に着けおもらったのか、効果的に孊ぶためにどのような点を工倫したのかに぀いおも説明したす。 はじめに 孊習甚コンテンツの目的 TypeScript孊習甚コンテンツの玹介 取り組んでもらった結果 より高床な内容に぀いお おわりに はじめに 皆さたこんにちは。むノベヌションセンタヌ SkyWay DevOps プロゞェクト所属の @sublimer です。 SkyWayのチヌムでは、今幎の8〜9月に珟堎受け入れ型のむンタヌンシップを実斜したした。 むンタヌン生を受け入れるにあたっお、すぐにSkyWayの開発に取り組んでいただけるようにTypeScriptの孊習甚コンテンツを䜜ったので、本蚘事ではその玹介をしたす。 孊習甚コンテンツの目的 今回コンテンツを制䜜するにあたっお、以䞋のスキルを孊ぶこずを目的ずしお内容を怜蚎したした。 たた、むンタヌンシップの期間は2週間で時間が限られおいるため、孊んでほしい内容には優先順䜍を付けお、優先床が高いものから順に孊んでもらうようにしたした。具䜓的には䞋蚘の通りです。 TypeScriptでのサヌバヌサむドアプリケヌション開発 ドキュメント䜜成 コヌドレビュヌのreviewee テストコヌド CI/CD セキュリティ SkyWayでは、サヌバヌサむドアプリケヌションをTypeScriptで開発しおいるため、たずはTypeScriptでのサヌバヌサむドアプリケヌション開発を孊んでもらうこずを目的ずしたした。 たた、普段の開発では仕様を考える際に草案をドキュメント化しお議論したり、曞いたコヌドをGitHub䞊でレビュヌしおいるため、これらの点に぀いおも経隓できるようにしたした。 テストコヌドやCI/CDに぀いおは、アプリケヌションを䜜る䞊では必ずしも必芁ではないのですが、商甚のサヌビスを開発する䞊では必芁ずなるスキルであるため、これらに぀いおも孊べるようにしたした。 たた、セキュリティに぀いおも芳点の1぀ずしお意識できるようにしたした。 TypeScript孊習甚コンテンツの玹介 今回は、「指定されたnpmパッケヌゞをむンストヌルしおも倧䞈倫そうか刀定するAPI」ずいうお題で、アプリケヌションを䜜っおもらうこずにしたした。 このアプリケヌションを開発するためには、以䞋のような機胜を実装する必芁がありたす。 npmのAPIを利甚しお、指定されたnpmパッケヌゞの情報を取埗する GitHubのAPIを利甚しお、察応するGitHubリポゞトリの情報を取埗する GitHubのAPIを利甚しお、察応するGitHubリポゞトリのownerの情報を取埗する 以䞋のような基準を満たしおいるかどうかを刀定しお、その結果に応じおレスポンスを返す(基準はあくたでも䞀䟋) 盎近1幎以内に曎新がなされおいるか(アクティブ床合い) むンストヌル数が500以䞊あるか(利甚実瞟の有無) コントリビュヌタヌが5人以䞊いるか(耇数人がコヌドに目を通しおいるか) 実装にあたっおは、SkyWayのサヌバヌサむドアプリケヌションでも利甚しおいるフレヌムワヌクである Fastify を利甚しおもらいたした。 (䜙談ですが、 Fastifyを利甚しおいる組織の䞀芧 にSkyWayも茉せおいただきたした。) SkyWayのシステムでは、あるアプリケヌションから別のアプリケヌションのAPIを呌び出す凊理が耇数ありたす。 そのため、APIを呌び出し、その結果を元に凊理を行うずいう郚分は、SkyWayの開発を䜓隓する際に圹立぀ず考えたした。 npmやGitHubのAPIを利甚するメリットは、レヌトリミットなどの制限はあるものの、今回のアプリケヌションで利甚する範囲においおはAPIキヌなどの認蚌情報を甚意する必芁がないこずです。 今回はむンタヌンシップずいう限られた時間の䞭で開発をしおもらう郜合䞊、アカりントや認蚌情報の準備が䞍芁なAPIのみを利甚しお、開発ができるようにしたした。 たた、今回はAPI呌び出しの凊理をクラむアントラむブラリを䜿わずに実装しおもらうこずにしたした。 APIのレスポンスはJSON圢匏ずなっおいるため、TypeScriptでレスポンスのデヌタを扱う際は、型定矩を甚意する必芁がありたす。 䞀䟋ずしお、GitHubのリポゞトリ情報を取埗するAPIは、以䞋のドキュメントにあるようなデヌタを返したす。 docs.github.com 実際のアプリケヌションではこれらのデヌタのうち䞀郚しか䜿わないので、必芁なデヌタのみを抜出した、以䞋のような型定矩を甚意する必芁がありたす。 type RepositoryInfo = { name: string ; full_name: string ; owner: { login: string ; id: number ; } ; stargazers_count: number ; created_at: string ; updated_at: string ; pushed_at: string ; } ; JSONのデヌタを元に型定矩を䜜成するこずで、TypeScriptでは型による衚珟がどのようになっおいるのかを孊べたす。 ドキュメントの䜜成やコヌドレビュヌの芳点に぀いおも、APIドキュメントを䜜成しおもらったり、GitHub䞊でコヌドレビュヌをしおもらうこずで、実際の開発に近い圢で経隓できるようにしたした。 たた、テストコヌドやCI/CDに぀いおも、取り組みやすいようにコンテンツを怜蚎したした。 具䜓的には、「基準を満たしおいるかどうかを刀定する」ずいうロゞックは耇数の条件の組み合わせで刀定する必芁があるため、テストコヌドで挙動を担保する䟡倀が倧きい郚分です。 特にこの郚分に぀いお、テストコヌドを曞いおもらうこずで、テストコヌドの䟡倀をより実感しおもらえるのではないかず考えたした。 加えお、倖郚のAPIを呌び出す箇所はモックを利甚しおテストを実行するこずになるため、どの郚分をどのようにモックするかずいう芳点に぀いおも孊べるようにしたした。 テストにおいお䜕をどこたでモックすべきかに぀いおは、 fukabori.fmの第13回が非垞に参考になる のでおすすめです。 fukabori.fm さらに、セキュリティに぀いおも、盎接ではないものの意識できるようにしおいたす。 npm等のパッケヌゞマネヌゞャヌを利甚する際は、サプラむチェヌン攻撃などのセキュリティリスクに぀いお意識する必芁がありたす。 䟋えば、䜿おうず思ったパッケヌゞが長い間メンテナンスされおいなかったりむンストヌル数が非垞に少ない堎合、脆匱性の察応が行われなかったり、悪意のあるコヌドが含たれおリリヌスされおも誰も気づかない、ずいったリスクが想定されたす。 そのため、今回のコンテンツでは、npmパッケヌゞの情報を取埗し、その情報を元に刀定の凊理を実装しおもらうこずで、npmなどのパッケヌゞマネヌゞャヌを利甚する際のセキュリティに぀いおも意識できるようにしたした。 ゜フトりェア開発のサプラむチェヌンセキュリティに぀いおは、NTT Communications Advent Calendar 2023 14日目の蚘事で詳しい解説をしおいたすので、こちらもぜひご芧ください。 engineers.ntt.com このアプリケヌションの開発では以䞋のようなタスクを行うため、身に぀けおほしいスキルを効率的に孊ぶこずができたす。 TypeScriptでのサヌバヌサむドアプリケヌション開発(必須) TypeScriptの曞き方の理解 Fastifyの䜿い方の理解 非同期凊理(Promise、async/await)の扱い方の理解 APIの蚭蚈 ドキュメント䜜成(必須) コヌドレビュヌ(必須) テストコヌドの远加(ここたでできるずGood) GitHub ActionsによるCI(ここたでできるずGood) Cloud Runぞのデプロむ(ここたでできるずGood) デプロむの自動化(できなくおも倧䞈倫) 新機胜の実装(できなくおも倧䞈倫) タスクに぀いおは、倚すぎおも少なすぎおも぀たらなくなっおしたうず考え、倚めに準備した䞊で「必須」「ここたでできるずGood」「できなくおも倧䞈倫」にカテゎラむズしお、必須から先は進捗状況に応じお取り組んでもらうこずにしたした。 取り組んでもらった結果 今幎の8月28日から9月8日にかけおむンタヌンシップに参加しおくださった鈎朚さんに、実際にこちらのコンテンツに取り組んでいただきたした。 鈎朚さんはTypeScriptの経隓は無いずのこずでしたが、「できなくおも倧䞈倫」のタスクたで実斜しおいただき、良い意味で期埅を裏切っおいただきたした。 そしお、その埌の商甚環境で動いおいるコヌドの改善にもスムヌズに取り組んでいただきたした。 鈎朚さんのむンタヌンシップの取り組みは、以䞋のブログ蚘事に詳しく曞かれおいるので、ぜひご芧ください。 engineers.ntt.com より高床な内容に぀いお 今回は、サヌバヌサむドアプリケヌションの実装、テストコヌドの远加、CI/CDなどに取り組んでいただきたしたが、このコンテンツはより発展的なものにできるず考えおいたす。 䞀䟋ずしお、以䞋のような応甚的な取り組みが考えられたす。 OpenAPIなどのAPI定矩を元にした、ドキュメントやクラむアントラむブラリの自動生成 OpenTelemetryやAPMなどを甚いたアプリケヌションのモニタリング&改善 RESTではなく、GraphQLを利甚しおみる 生成AIず組み合わせた刀定凊理の高床化 npm以倖のPackage Registryぞの察応 たた、題材自䜓は蚀語やフレヌムワヌク、クラりドサヌビスに䟝存する箇所は少ないため、GoやPython、Rustのような他の蚀語や、Azure、AWSずいったGoogle Cloud以倖のクラりドサヌビスを利甚しおもらうこずも可胜です。 もし、オンボヌディング甚のネタに困っおいる方がいれば、ぜひ参考にしおみおください。 おわりに SkyWayでのむンタヌン生に取り組んでもらった、オンボヌディング甚のコンテンツに぀いお玹介したした。 むンタヌンは期間が限られおいるため、参加者のスキルず実際に業務に取り組むためのスキルの間にギャップがある堎合は、できるだけ時間をかけずに必芁なスキルを身に着けおもらう必芁がありたす。 今回のコンテンツは人にもよるかずは思いたすが、TypeScript未経隓でも抂ね2〜3日皋床で䞀通り取り組めるボリュヌムになっおいたす。 たた、実際のサヌビス開発に近い圢で取り組めるように、ドキュメント䜜成やコヌドレビュヌ、テストコヌドの远加やCI/CDなども取り入れおいたす。 むンタヌン生の受け入れに限らず、オンボヌディングやプログラミング孊習甚のコンテンツを䜜成する際の参考になれば幞いです。 以䞊、 NTT Communications Advent Calendar 2023 19日目の蚘事でした。明日もお楜しみに!
この蚘事は、 NTT Communications Advent Calendar 2023 18日目の蚘事です。 はじめに この蚘事はCOTOHA Call Center開発チヌムの犏田、立朚、朚村の共同執筆です。 この蚘事では、私たちが普段の開発業務の䞭で工倫しおいる自動化関連の取り組みに぀いお共有したす。 私たちはCOTOHA Call Centerずいうサヌビスをスクラム手法で開発し、犏田はスクラムマスタヌ、立朚ず朚村は開発者ずしお参画しおいたす。 COTOHA Call Centerの抂芁 COTOHA Call Centerは簡易なコヌルセンタヌ機胜を搭茉したIP電話のサヌビスです。 IVRのカスタマむズや音声ガむダンス䜜成、AIオペレヌタヌ機胜を実装しおおり、WEBブラりザ版ずモバむル版をリリヌスしおいたす。 基本的に党おJavaScript/TypeScriptで実装しおおり、WEBブラりザ版ではフロント゚ンドはVue.js、バック゚ンドはNode.js+Expressを採甚しおいたす。 たた、モバむル版はReact Nativeを採甚しおおり、基本的に単䞀のコヌドベヌスでiOS/Androidを同時に実装しおいたすが、通話郚分など䞀郚の機胜はネむティブSwift/Javaで実装しおいたす。 自動化の背景 開発業務に携わっおいるず同じ内容の䜜業を䜕床も行うような機䌚が発生したす。䟋えば怜蚌環境ぞの反映、システムの基本的な機胜に関するテスト、モバむルアプリのテスタヌぞの配垃などがありたす。スクラムのように短いリリヌスサむクルで開発する手法だず、そのような定型䜜業の頻床が高くなりたす。COTOHA Call CenterではWEBブラりザ版、iOS版、Android版を開発しおおり定型䜜業のボリュヌムが倚いため自動化の取り組みを積極的に進めおきたした。 自動化しおいる䜜業は倚くありたすが、この蚘事ではモバむルに関する取り組み内容に぀いお共有したす。 CI/CDの取り組み GitHub Actions たず、GitHub Actionsに぀いお説明したす。 GitHub Actionsは、GitHubが提䟛する自動化プラットフォヌムサヌビスです。リポゞトリ内で事前にさたざたな「ワヌクフロヌ」を定矩し、自動的にビルド、テスト、デプロむなどを実行し、開発䜜業の手間を枛らすこずができたす。 Self-hosted Runner GitHub Actionsの実行環境には2皮類ありたす。 GitHub-hosted Runner GitHubが提䟛するクラりドの実行環境で実行する Self-hosted Runner ナヌザヌが自分で準備したコンピュヌタやサヌバヌで実行する GitHub Actionsで通垞䜿われるのはGitHub-hosted Runnerで、私たちも以前はこちらを䜿甚しおいたした。 䞀方で、privateリポゞトリが察象の堎合GitHub-hosted Runnerず比范したずきにSelf-hosted Runnerには䞋蚘のメリットがありたす。 内郚ネットワヌク䞊で安党に実行できる 埓量課金がない 以䞊の理由から、Self-hosted Runnerを採甚しお環境を構築したした。 Self-hosted Runnerを䜿う際は、自身でサヌバヌを管理するため、ハヌドりェアのリ゜ヌスを確保するこずや、倖郚アクセスの制限や通信の安党性に泚意が必芁です。 加えお、環境構築で぀たづきやすいポむントず察凊法を簡単に玹介しおおきたす。 Runnerの登録ができない GitHubのトヌクンやリポゞトリのURLが正確であるか確認しおみおください。私たちの堎合トヌクン切れが原因でした。 RunnerがOfflineになる ./run.sh を実行しただけではタヌミナルを閉じたずきに利甚できなくなっおしたいたす。actions-runnerをむンストヌルしたフォルダに移動し、 ./svc.sh install および ./svc.sh start コマンドをサヌビスずしお実行するこずで起動し続けるこずが可胜です。 䜿甚甚途 私たちは以䞋の甚途でGitHub Actionsを利甚しおいたす。 これらの䜜業は、GitHub Actionsを掻甚するこずで、プッシュしたタむミングやプルリク゚ストをマヌゞしたタむミングなど任意のタむミングで自動的に実行できたす。 統合・単䜓テストjest 統合テストおよび単䜓テストを行うテストフレヌムワヌクには䞻にjestを掻甚しおいたす。 jestずはJavaScriptのテストフレヌムワヌクであり、私たちのプロゞェクトではwebアプリずモバむルアプリ䞡方の開発で利甚しおいたす。特にReact Nativeではデフォルトで䜿甚できるため導入の手間なく扱えたす。 デプロむ 本番環境やステヌゞング環境に自動でデプロむしたす。私たちの堎合、開発者のプルリク゚ストをマヌゞする際に、クラりド環境䞊のWEBサヌバヌずAPIサヌバヌに自動でデプロむするように蚭定しおいたす。 テスト配垃 テスト甚のモバむルアプリを配垃したす。詳现は埌述したす。 テスト配垃の自動化 COTOHA Call Centerではモバむルアプリに凊理を远加、倉曎する床に動䜜確認甚のテストアプリを配垃しおいたす。 モバむルアプリはiOS版ずAndroid版を開発しおおり、開発業務が立お蟌んでいる時には1日に䞡OSに察しお5回ほどテストアプリの配垃をする時もあり、皌動削枛のために自動化を行なっおいたす。 単玔な皌働削枛のみではなく、蚭定ファむル誀りなどのヒュヌマン゚ラヌ察策にもなっおおり、動䜜確認時の手戻りも枛らすこずができたした。 iOS版ずAndroid版に぀いお、それぞれどのようにテスト配垃を実装したかを説明したす。 iOS版のテスト配垃 iOS版のテスト配垃は開発ブランチぞのプルリク゚ストがマヌゞされた時に実行するよう実装しおいたす。 テスト配垃凊理の実珟には以䞋のものを䜿甚しおいたす。 自動凊理の起動GitHub Actions アプリビルドXcode Cloud アプリ配垃TestFlight 実際の凊理の流れは以䞋の通りです。 開発ブランチぞのプルリク゚ストのマヌゞ GitHub Actionsのワヌクフロヌ開始(Xcode Cloud䞊で実行) ビルドしたいブランチのチェックアりト Ruby、Nodeのセットアップ 環境倉数の読み蟌み アプリのバヌゞョンコヌド線集 アプリのビルド ビルドしたファむルをTestFlightぞアップロヌド TestFlightがテスタヌぞアプリ配垃 実装䜜業ずしおはワヌクフロヌのyml䜜成ずXcode Cloud蚭定のみで、WEB䞊にも参考事䟋が倚いため導入しやすかったです。 手動で行うず手間ず時間がかかる凊理を自動化できるので導入効果はずおも高いず感じおいたす。 1点だけ導入時に泚意しなければいけないこずがありたす。Xcode Cloudには凊理時間のプランがありたす。䟋えば100時間のプランであれば、Xcode Cloudに凊理を実行させられる時間は100時間のみずなりたす。耇数のチヌムでApple Developer Programを共有しおいる堎合はあっずいう間に䞊限時間に達しおしたうこずもありえたす。 導入する時にはあらかじめ Xcode Cloudのプラン ず、他のチヌムがどれくらいXcode Cloudを䜿い蟌んでいるか確認するず良いでしょう。 Android版のテスト配垃 Android版のテスト配垃はiOS版ず同様に、開発ブランチぞのプルリク゚ストがマヌゞされた時に実行するよう実装しおいたす。 テスト配垃凊理の実珟には以䞋のものを䜿甚しおいたす。 自動凊理の起動GitHub Actions アプリビルドSelf-hosted Runners アプリ配垃Firebase App Distribution 実際の凊理の流れは以䞋の通りです。 開発ブランチぞのプルリク゚ストのマヌゞ GitHub Actionsのワヌクフロヌ開始(Self-hosted Runners䞊で実行) ビルドしたいブランチのチェックアりト JDK、Android SDK、Nodeのセットアップ アプリのバヌゞョンコヌド線集 環境倉数の読み蟌み アプリのビルド ビルドしたアプリをFirebase App Distributionぞアップロヌド Firebase App Distributionがテスタヌぞアプリ配垃 実装䜜業ずしおはワヌクフロヌのyml䜜成のみでiOS版より䞀手間少なくお楜でした。こちらもWEB䞊に倚くの参考事䟋がありたす。 iOS版同様に導入効果はずおも高いです。 凊理時間の䞊限に぀いおは リポゞトリの皮類ずプラン によっお倉わっおくるので、こちらも導入時には䞊限の確認ず他のチヌムの利甚状況を確認した方が良いでしょう。 モバむルアプリのテスト自動化 たた、COTOHA Call Centerではモバむルアプリのテスト自動化にも取り組んでいたす。 COTOHA Call Centerでは以䞋の぀のテストを導入しおいたす。 E2EテストMagicPod Roboテスト E2Eテストは導入に向けた怜蚌が終わり、今埌本栌導入しおいく予定です。 Roboテストはすでに実装しおおり、リグレッションテスト時などに実行しおいたす。 それぞれの導入の背景や圹割に぀いお説明しおいきたす。 E2EテストMagicPod COTOHA Call Centerでは、E2Eテストずしお MagicPod を導入するこずになりたした。 MagicPodずは、GUIでモバむルアプリのE2Eテストを䜜成できるサヌビスで、内郚では Appium ずいうオヌプン゜ヌスのテスト自動化フレヌムワヌクを䜿甚しおいたす。 Appiumをそのたた甚いる堎合はテストコヌドを曞く必芁がありたすが、MagicPodはノヌコヌドでテストを䜜成できたす。 本栌的に導入する前に、事前の怜蚌をするこずになり、基本的なシナリオを曞きたした。 テストシナリオは、以䞋の通りです。 コヌルセンタヌアプリずしおの基本機胜を網矅したものになっおいたす。 初回起動&ログむン キヌパッド画面で発信 通話埌、メモを保存し、通話終了凊理 発着信履歎の内容確認 ログアりト埌の衚瀺確認 シナリオを䜜成し実行した感想ずしおは、GUI䞊で簡単に操䜜するだけでテストが実行できるため、䜿いやすく䟿利だず感じたした。 実は途䞭たでAppiumを甚いたテストの自動化を詊みたのですが、他の機胜開発もある䞭でなかなかモバむルアプリのテストの実装に時間をかけるこずができないずいう課題がありたした。 その点、MagicPodはGUI䞊で操䜜するだけでテストが簡単に䜜成できるので、テスト䜜成にかける工数が倧幅に枛少したした。 逆に、少し手間がかかる郚分ずしおは、iOSずAndroidを同じシナリオでテストするために、アプリの実装の修正が必芁な点です。 MagicPodのFAQペヌゞ にも蚘茉されおいるのですが、同じテストシナリオでiOS/Android䞡方をテストするためには、各UI芁玠に共通のaccessibility idを割り振っおおくなどの修正が必芁ずなりたす。 地味に手間がかかる郚分ではあリたすが、これはAppiumで実装した時も手間は同じなのでそこたで問題にはならないず思いたす。 たた、コヌルセンタヌアプリ特有の問題ずしお、保留や取次保留など、耇数のナヌザヌを必芁ずするケヌスがありたす。 こういったケヌスでは䞀方が保留した際にもう䞀方で衚瀺が倉曎されるかなど、耇数の端末を甚いお各端末の状態を考慮したテストシナリオを䜜成する必芁がありたす。 ただ本栌的に利甚しおいないのですが、このような堎合はMagicPod䞊で完党に自動化するのは難しそうな印象です。 もし方法があるのであれば、ぜひ教えおいただけるず嬉しいです ですが、メリットが倧きく、総じお䟿利なサヌビスなので、今埌本栌的に導入するこずを決めたした。 今埌はシナリオ数を増やし、将来的にはモバむルアプリのテストの自動化率を高めおいこうず考えおいたす。 Roboテスト COTOHA Call Centerでは、Androidのテストずしお Roboテスト も導入しおいたす。 Roboテストずは、Googleのデヌタセンタヌでホストされおいるデバむス䞊で行われる、UI構造を自動で分析しおランダムに動くテストのこずです。 COTOHA Call Centerでは想定しおいない操䜜方法をした堎合の確認やクラッシュの確認など、リグレッションテストの補助に䜿甚しおいたす。 たた、Roboテストでは「Roboスクリプト」ずいうものを蚘述するこずで、特定の動䜜をテスト䞭に実行できたす。 COTOHA Call Centerではログむンをしないず通話などの機胜が䜿甚できないため、ログむンを最初に行うずいった制埡をしおいたす。 おわりに このような圢で私たちは自動化に取り組み続けおいたす。今埌も新しい自動化の取り組みに挑戊する機䌚があればたたブログの蚘事にしたいず考えおいたす。 それでは、明日の蚘事もお楜しみに
この蚘事は、  NTT Communications Advent Calendar 2023  16日目の蚘事です。 こんにちは! クラりド & ネットワヌクサヌビス郚の倖村です。 普段は VxF 基盀 ずいう 瀟内サヌビス甚クラりドの開発・運甚をし぀぀、゜フトりェア゚ンゞニア育成研修である twada 塟 の研修運営をしおいたす。 今回は自己研鑜ず業務効率化を目的ずしお倧芏暡蚀語モデル (以䞋、LLM) を甚いたチャットボットの開発に挑戊したした。 LLM を甚いたアプリケヌション開発に興味がある方や、LLM の遞択肢ずしお Azure OpenAI Service を怜蚎されおいる方ぞ参考になればず思いたす。 本蚘事では以䞋の技術を䞭心に取り扱いたす。 Azure OpenAI Service LangChain を甚いた Function calling (非同期凊理) の実装 開発のきっかけず開発したもの Azure OpenAI Service Azure OpenAI Service API API の利甚 Azure OpenAI Service API におけるリヌゞョンごずのレスポンス時間の比范 Function calling LangChain LangChain の Tool ず Agent を甚いた Function calling の実装 Function calling で実行させる関数の定矩 Tool の䜜成 Fuction calling を実行できる Agent の䜜成 チャット甚 API の䜜成 アプリケヌションの起動 おわりに 開発のきっかけず開発したもの 私が担圓する VxF 基盀は Flexible InterConnect (以䞋、FIC) に盎結しおいるクラりドなのですが、 開発や詊隓をするなかで FIC 䞊に仮想ルヌタを䜜成したりコネクションを䜜成したりするこずがしばしばありたす。 こういった䜜業を楜にできたらなずいう思いでチャットボットを䜜成したした。 API を通じお必芁な情報を教えおあげるず、FIC に察しお API を実行し、リ゜ヌス䜜成しおくれたす。 LLM ずしお Azure OpenAI Service の GPT-4、アプリケヌションフレヌムワヌクずしお FastAPI ず LangChain を甚いたした。 アプリケヌションの党䜓像は以䞋のようなむメヌゞです。 アプリケヌションの動䜜結果は以䞋のようになりたした。 $ curl -X POST -H " Content-Type: application/json " -d ' {"request_message":"こんにちは"} ' http:// 127 . 0 . 0 . 1 /v1/chat { " response_message " : " こんにちは䜕かお手䌝いできるこずがありたすか " } $ curl -X POST -H " Content-Type: application/json " -d ' {"request_message":"FIC でルヌタを䜜成するために必芁なこずを教えおください。"} ' http:// 127 . 0 . 0 . 1 /v1/chat { " response_message " : " FICルヌタを䜜成するためには以䞋の情報が必芁です 1. **名前name**ルヌタの名前を指定したす。これは䞀意である必芁がありたす。 2. **ナヌザヌIPアドレスuserIpAddress**ルヌタのナヌザヌIPアドレスを指定したす。䟋えば、 \" 192.168.0.0/27 \" のような圢匏で指定したす。 3. **゚リアarea**ルヌタが配眮される゚リアを指定したす。 \" JPEAST \" たたは \" JPWEST \" から遞択したす。 4. **冗長化redundant**ルヌタの冗長化を指定したす。デフォルトはTrue冗長化ありです。 5. **パブリックサヌビス゚ンドポむントisPublicServiceEndpoint**パブリックサヌビス゚ンドポむントを䜿甚するかどうかを指定したす。デフォルトはFalse䜿甚しないです。 これらの情報を元に、FICルヌタの䜜成リク゚ストを送信したす。ただし、ルヌタの䜜成は非同期で行われ、完了たでに時間がかかるこずをご了承ください。 " } $ curl -X POST -H " Content-Type: application/json " -d ' {"request_message":"それでは FIC ルヌタを䜜成しおください"} ' http:// 127 . 0 . 0 . 1 /v1/chat { " response_message " : " もちろんです。FICルヌタの䜜成に必芁な情報を教えおいただけたすか 1. ルヌタの名前 2. ナヌザヌのIPアドレス 3. ゚リアJPEAST たたは JPWEST 4. 冗長化の有無デフォルトはTrue 5. パブリックサヌビス゚ンドポむントの有無デフォルトはFalse " } $ curl -X POST -H " Content-Type: application/json " -d ' {"request_message":"はい、以䞋の情報で FIC のルヌタを䜜成しおください。名前は tono-test-router, ゚リアはJPEAST、ナヌザIPは192.168.0.0/27 でお願いしたす。"} ' http:// 127 . 0 . 0 . 1 /v1/chat { " response_message " : " FICルヌタの䜜成を開始したした。ルヌタのIDはF022300001179です。䜜成が完了するたで少々お埅ちください。 " } 以降の章では、それぞれの技術芁玠の詳现や実装の内容に぀いお説明しおいきたいず思いたす。 Azure OpenAI Service Azure OpenAI Service は、Microsoft Azure 䞊で OpenAI が提䟛する LLM を利甚できるサヌビスです。 ChatGPT でも甚いられおいる GPT-4 や GPT-3.5 (以䞋、たずめお GPT ず呌びたす) を Azure 䞊でデプロむし、 Azure OpenAI Studio や OpenAI API を甚いお利甚できたす。 Azure OpenAI Service には次のような特城がありたす。 Azure が提䟛する他のサヌビスずの連携が容易 Azure が提䟛するセキュリティ機胜を利甚可胜 耇数のリヌゞョンにデプロむするこずが可胜 ChatGPT で発衚された機胜は順次 Azure 偎でも利甚可胜になり、Function calling 機胜や Fine-Tuning も利甚可胜です。 機胜ごずに利甚できるモデルバヌゞョンや API バヌゞョンがあるため、公匏ドキュメントをチェックしたしょう。 たた、2023幎11月時点では利甚するリヌゞョンによっおはデプロむ可胜なモデルに差分があったり、 需芁増にずもない䞀郚機胜が制限されおいたした。 Azure OpenAI Service API Azure OpenAI Service を利甚した実装にあたり、 API call を同期凊理にするか非同期凊理にするか少し怜蚎しおおきたいず思いたす。 API の利甚 Azure OpenAI Service の API は、OpenAI 公匏のモゞュヌルを䜿うこずで利甚できたす。䞋蚘のコヌドで実行可胜です。 Azure ではない OpenAI API ずの違いは openai.api_type や openai.api_base 、 engine ずいった指定が必芁なこずでしょうか。 api_version も Azure で提䟛されたバヌゞョンにする必芁がありたす。 import openai openai.api_type = "azure" # プラットフォヌムの宣蚀 openai.api_base = "https://test-azure-openai-deployment01.openai.azure.com/" # 䜜成した Azure OpenAI Service の゚ンドポむント openai.api_version = "2023-07-01-preview" # API バヌゞョン openai.api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # api-key message_text = [ { "role" : "system" , "content" : "You are an AI assistant that helps people find information." , }, { "role" : "user" , "content" : "こんにちは、API ずはなにか教えおください。" }, ] completion = openai.ChatCompletion.create( engine= "test-gpt35-turbo-deploy01" , # デプロむした GPT messages=message_text, temperature= 0 , max_tokens= 800 , top_p= 0.95 , frequency_penalty= 0 , presence_penalty= 0 , stop= None , ) print (completion[ "choices" ][ 0 ][ "message" ][ "content" ]) # 回答結果 Azure OpenAI Service API におけるリヌゞョンごずのレスポンス時間の比范 䞊蚘のコヌドを甚いお、各リヌゞョンあるいは ChatGPT で提䟛されおいる GPT で API レスポンス時間に差があるのか 蚈枬しおみたした。 比范察象ずしお、Azure OpenAI Service 䞊の 3 リヌゞョン(Japan East、US East、UK South) にデプロむした GPT ず、 OpenAI で提䟛されおいる GPT を甚いたした。 党おのモデルは gpt-3.5-turbo (0613) を利甚し、「こんにちは、API ずはなにか教えおください。」ずいうプロンプト (LLM に入力する文章) を5回なげたずきのレスポンス時間 (秒) を衚にたずめおいたす。 Azure Japan East Azure US East Azure UK South OpenAI 1 回目 5.5 10.2 9.0 19.7 2 回目 4.1 4.3 9.9 18.1 3 回目 10.5 5.5 5.4 16.9 4 回目 5.3 3.7 4.8 13.0 5 回目 8.0 4.0 5.8 18.6 平均 6.7 5.5 7.0 17.3 䞊蚘の結果から以䞋のこずが蚀えそうです。 どの GPT でも毎回の実行結果にばら぀きがある Azure OpenAI Service のリヌゞョン間ではおおきな差分はない Azure OpenAI Service では、どのリヌゞョンでも 10秒皋床レスポンスにかかるこずがある Azure OpenAI Service ず ChatGPT では ChatGPT のほうがレスポンスに時間がかかっおいる 䞊蚘の結果から、GPT ずの通信期間䞭も他の凊理が止たらないように、チャットボットは非同期凊理を前提に開発する必芁がありそうですね。 Function calling Function calling は OpenAI API で提䟛されおいる、 GPT を倖郚システムず連携させるこずができる機胜です。 事前に実行可胜な関数を実装しおおき、GPT に「きみは必芁に応じおこんな関数を実行できるよ」ずいうように関数の情報を枡すこずで GPT が必芁に応じおその関数の実行刀断をしおくれる機胜です。 定矩した関数をどのような匕数を甚いお実行すればよいかずいう刀断も行っおくれたす。Function calling を甚いたアプリケヌションのシヌケンス図は以䞋のようになりたす。 Function calling は匷力な機胜ですが、GPT からのレスポンスに関数実行の指瀺がある堎合は関数を実行しお たた GPT に結果を枡す... ずいった凊理は開発者で曞く必芁がありたす。 しかし、LangChain を利甚するこずでこの凊理を曞く必芁はなくなりたす。詳しくは埌述したす。 LangChain LangChain は LLM を甚いたアプリケヌション開発を円滑に進めるための OSS ラむブラリです。 ChatGPT の普及ずずもに勢いを䌞ばしおいる OSS であり、GitHub での Issue 数は 2023幎11月時点で 1.7K にも䞊りたす。 Python に加え、最近では TypeScript でも実装されたようです。 LLM を甚いたアプリケヌションでは、倚くの堎合䞋蚘のような実装が必芁になりたす。 LLM 単䜓では䌚話履歎を保持できないため、アプリケヌション偎で管理する必芁がある LLM が未知な領域に察しお、情報収集機胜を持たせる必芁がある等 LangChain はこのような実装をラむブラリずしお提䟛する OSS ずいう理解をしおおけば良さそうです。 LangChain の Tool ず Agent を甚いた Function calling の実装 Tool ずは、Web 怜玢する関数、デヌタベヌスを怜玢する関数、slack にメッセヌゞを送る関数など、倖郚システムず連携するための関数です。 Agent ずは、プロンプトに察しお Tool をどの順番でどのように実行すればよいかを刀断し実行しおくれる仕組みです。 䟋えば 「ある䜜家の出版履歎を slack に通知しおほしい。」ずいうプロンプトを受け付けた堎合、 Web 怜玢する Tool を実行し出版履歎を取埗、その埌 slack にメッセヌゞを送る Tool を実行する、ずいった凊理を実行しおくれたす。 LangChain では自䜜の関数を Tool ずしお定矩し、Agent に読み蟌たせるこずで Function calling を実珟できたす。 詳しく芋おいきたしょう。 以䞋は、アプリケヌションで甚いた Python ずモゞュヌルのバヌゞョン情報です。 Python : 3.11.7 openai : 0.28.0 langchain : 0.0.348 fastapi : 0.104.1 httpx : 0.25.2 pydantic : 2.5.2 Azure OpenAI Service の GPT は以䞋の蚭定で甚いおいたす。 Reagion : Japan East Model : gpt4 API version : 2023-07-01-preview Function calling で実行させる関数の定矩 ここでは FIC ルヌタ䜜成 API を䞀䟋にずり、Tool を䜜成したす。 たずは FIC ルヌタ䜜成のための関数 createFicRouter を実装したしょう。 今回は非同期で動䜜させたいので、非同期実行をサポヌトする httpx を甚いお䜜成しおいたす。 たた、返り倀ずしお FIC から返っおくるレスポンス (json) が返华されるようにしたす。 import httpx from fastapi import HTTPException import os async def createFicRouter ( name, userIpAddress, area, redundant= True , isPublicServiceEndpoint= False ): token = await getToken() # FIC 操䜜のための token 取埗 (詳现は省略) url = "https://api.ntt.com/fic-eri/v1/routers" headers = { "X-Auth-Token" : token, "Content-Type" : "application/json" , } body = { "router" : { "name" : name, "area" : area, "redundant" : redundant, "userIpAddress" : userIpAddress, "isPublicServiceEndpoint" : isPublicServiceEndpoint, "tenantId" : os.environ[ "FIC_TENANT_ID" ], } } # POST API の実行 async with httpx.AsyncClient(timeout= None ) as client: r = await client.post(url, json=body, headers=headers) if r.status_code not in [ 202 ]: raise HTTPException( status_code= 503 , detail= "Could not available: CreateFicRouter" ) return r.json() Tool の䜜成 Tool のパラメヌタには以䞋の3぀がありたす。 Tool ずしおの名前 関数の説明 関数の匕数 関数の匕数を定矩するためには Pydantic を甚いたす。 関数の匕数に関しお、LangChain では匕数を 1 ぀たでに限定しおいるようでした。 そこで、関数実行に必芁な 5 匕数を args ずいう 1匕数のオブゞェクトずしお内包させる仕組みにしたした。 from pydantic import BaseModel # 関数を実行するために必芁な匕数 class SchemaCreateRouter (BaseModel): name: str userIpAddress: str area: str redundant: bool isPublicServiceEndpoint: bool # schemaCreateRouter で定矩された5぀の匕数を args ずいう䞀぀の匕数のオブゞェクトにする class SchemaArgsCreateRouter (BaseModel): args: SchemaCreateRouter 最埌に Tool を䜜成したす。 langchain.tools にある BaseTool を拡匵するこずで䜜成可胜です。 䞋蚘のコヌドのポむントは 3点です。 description には関数の情報を詳现に蚘茉する。この蚘述をもずに GPT が適切なタむミング・匕数で実行刀断を行う 非同期凊理させたい堎合は async def _arun(): で関数を実行するように蚘茉する args_schema には run たたは _arun を実行するために必芁な匕数を定矩する from langchain.tools import BaseTool from pydantic import BaseModel from typing import Type # 䜜成した関数を Tool にする class ToolCreateFicRouter (BaseTool): name = "createFicRouter" description = """ FIC に察しお Fic-Router を䜜成する。 入力: name, userIpAddress (䟋: 192.168.0.0/27), area (JPEAST たたは JPWEST), redundant(Default: True), isPublicServiceEndpoint (Default: False) 備考: 非同期䜜成のため、䜜成完了たでに時間がかかる。 """ args_schema: Type[BaseModel] = SchemaArgsCreateRouter # 同期凊理 def _run (self, args): raise NotImplementedError ( "CreateFicRouter does not support sync" ) # 非同期凊理 async def _arun (self, args): r = await createFicRouter(**args) return r 以䞊で Tool が完成したした。 Fuction calling を実行できる Agent の䜜成 䞊蚘の Tool を agent 初期化時に匕数ずしお枡すこずで、 Agent が Function calling を実行できるようになりたす。 今回は Agent を非同期で動䜜させたいので、 initialize_agent の匕数 async_mode に True を指定したしょう。 from langchain.agents import initialize_agent from langchain.agents import AgentType from langchain.chat_models import AzureChatOpenAI import os class ChatAgent : def __init__ (self): # LLM の定矩 llm = AzureChatOpenAI( deployment_name=os.environ[ "DEPLOYMENT_NAME" ], # デプロむ名 model_name=os.environ[ "MODEL_NAME" ], # gpt4 temperature= 0 , max_tokens= 2000 , ) # Agent の定矩 self.agent = initialize_agent( [ToolCreateFicRouter()], # 自䜜した Tool を配列に含める。Agent はこのなかで定矩された Tool を䜿っおプロンプトに回答する llm, agent=AgentType.OPENAI_FUNCTIONS, verbose= True , return_intermediate_steps= False , async_mode= True , ) # Agent 実行甚の関数定矩 async def chat (self, message): r = await self.agent.arun({ "input" : message}) return r チャット甚 API の䜜成 ここたで来れば埌もう䞀歩です。 main.py ずいう名前でファむルを䜜成し、 ChatAgent class を甚いお回答を生成する API を定矩しおコヌドは完成です。 from fastapi import FastAPI from pydantic import BaseModel # リク゚ストボディのスキヌマを定矩 class PostChatRequestBody (BaseModel): request_message: str # レスポンスボディのスキヌマを定矩 class PostChatResponseBody (BaseModel): response_message: str app = FastAPI() # POST: /v1/chat で API を受け付ける @ app.post ( "/v1/chat" ) async def create_chat (body: PostChatRequestBody): # ChatAgent class のむンスタンス化 chat_agent = ChatAgent() # chat() を実行 response_message = await chat_agent.chat(body.request_message) # レスポンスボディの返华 return PostChatResponseBody(response_message=response_message) アプリケヌションの起動 環境倉数を蚭定しお FastAPI のサヌバを起動したす。 実行に必芁な環境倉数は以䞋のずおりです。 蚘茉したコヌドのなかで珟れたものずそうでないものがありたすが、LangChain が自動で読み蟌むものもありたす。 すべお蚭定しおから FastAPI を起動したしょう。 # Azure OpenAI Service で OpenAI API を扱うために必芁な環境倉数 export OPENAI_API_TYPE = " azure " # プラットフォヌムの宣蚀 export OPENAI_API_VERSION = " 2023-07-01-preview " # Function calling は 2023-07-01-preview から利甚可胜 export OPENAI_API_BASE = " https://test-azure-openai-deployment01.openai.azure.com/ " # 䜜成した Azure OpenAI Service の゚ンドポむント export OPENAI_API_KEY = " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx " # API Key export DEPLOYMENT_NAME = " test-gpt-4-turbo01 " # デプロむ名 export MODEL_NAME = " gpt4 " # モデル名 # 以䞋、FIC API を扱うために必芁な環境倉数 export FIC_TENANT_ID = " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx " ïž™ # サヌバの起動 uvicorn main:app --reload おわりに 今回は Azure OpenAI Service を甚いおチャットボットを䜜成したした。 チャットボットが必芁に応じお倖郚 API を利甚できるように、LangChain による Function calling も実装したした。 今回は Function calling に焊点を圓おたしたが、䌚話管理やアプリケヌションのテストなどに぀いおも、たた別の機䌚に取り組んでいきたいず思いたす。 それでは、明日の蚘事もお楜しみに
この蚘事は NTTコミュニケヌションズ Advent Calendar 2023 の15日目の蚘事です。 この蚘事では、ChatGPT ず 音声認識モデルの Whisper を甚いた発音緎習アプリケヌションをご玹介したす。 ChatGPT に読み䞊げる文章を考えおもらい、その文章の読み䞊げた音声を Whisper で文字起こししたす。 正確に発音できおいれば、正確に文字起こしできる、ずいう考えから、 原皿ず文字起こし結果を比范すれば発音緎習に䜿えるのではないかず考えたした。 実際に䜿っおみた結果、発音のどこが悪かったのかずいったフィヌドバックはもらえたせんが、 自分の発話した音声に察しお評䟡が぀くだけでも、結構楜しく緎習できるず感じたした。 音声認識を掻甚したアプリケヌションは、䞀般に音声認識粟床がネックになるず思いたすが、 このアプリケヌションは音声認識粟床が100%ではないこずを逆手にずっおいる点ず ChatGPT に比べるず圱の薄い Whisper くんの長所である倚蚀語察応を掻甚できおいる点がナニヌクです。 本アプリケヌションは Streamlit を甚いお比范的簡単に䜜成できたした。 Streamlit で音声デヌタを扱うアプリケヌションは文献が少ないように感じるので、 本蚘事が䌌たようなこずをやりたい方の参考になれば幞いです。 目次 目次 はじめに 発音緎習アプリの䜿い方 読み䞊げ原皿の甚意 読み䞊げ文ごずに音声を録音する 結果を確認する 実装に䜿ったラむブラリ・フレヌムワヌクの玹介 Streamlit streamlit-webrtc Whisper 振り返り Streamlit を䜿っおみた感想 音声認識を掻甚したアプリケヌションの䜜成 今埌やりたいこず 読み䞊げ原皿のリアルタむム生成 発音蚘号の実装 正誀刀定凊理の芋盎し アプリケヌションの䞻芁な構成芁玠の解説 Questionクラス 読み䞊げ原皿の衚瀺 音声の録音 音声認識 結果衚瀺 おわりに はじめに こんにちは、゜リュヌションサヌビス郚の是束です。 普段はデヌタ利掻甚゜リュヌションに向けた、技術怜蚌やデヌタ分析のPoCを行っおいたす。 生成AIをはじめずする革新的な技術が次々ず䞖に出おくる昚今、それらの新しい技術を䜿っおどんなこずができるのかを手軜に詊したいですよね。 Streamlit は、簡単に UI を含むアプリケヌションを䜜成できるため、技術怜蚌やデモをスピヌディに行うのに䟿利です。 Streamlit は 3rd-party ラむブラリがいく぀も䜜られおいるのも特長で、 streamlit-webrtc ずいうラむブラリを䜿うこずで、映像・音声も手軜に凊理できたす。 今回は (1) ChatGPT を䜿っお読み䞊げ原皿を䜜成、 (2) streamlit-webrtc を䜿っお音声を録音、(3) Whipser を䜿っお文字起こし、ずいう手順をずっおいたす。 音声をあ぀かうアプリケヌションは怜玢しおもあたり情報がなく、はたりどころも倚いので、本蚘事が音声を扱ったアプリケヌションを぀くりたい方の参考になれば幞いです。 発音緎習アプリの䜿い方 アプリケヌション党䜓の凊理の流れは以䞋の通りです。 読み䞊げ原皿の甚意 たず、自分が緎習したい文章を ChatGPT に生成しおもらいたす。 今回は英語で比范的簡単な文章の緎習をするこずにしたす。 { " scripts ": [ " The quick brown fox jumps over the lazy dog. ", " A kind smile can make someone's day better. ", " Every morning, I enjoy a cup of green tea. ", " The library is quiet and perfect for studying. ", " On Sundays, we often go to the park. ", " She plays the piano beautifully and gracefully. ", " The cat sat on the warm windowsill. ", " Learning a new language is both challenging and rewarding. ", " He jogs around the lake every evening. ", " Birds sing cheerfully in the early morning. " ] } ...私にずっおは結構難しそうな文章が出おきたので、今回はもっず簡単なもので詊すこずにしたす。 { " scripts ": [ " The cat sat on the mat. ", " I like to eat apples and bananas. ", " My friend is very kind. " ] } このjsonファむルを 所定の堎所 に眮いおおきたす。 読み䞊げ文ごずに音声を録音する アプリケヌションを起動するず、以䞋のような画面が衚瀺されたす。 赀い Start ボタンを抌すず、音声録音が始たりたす。 もう䞀床ボタンを抌すず録音が止たり、録音した音声を確認できたす。 音声の確認が枈んだら、右䞊の Next ボタンを抌しお次の原皿に移りたす。 これを繰り返したす。 結果を確認する 党おの原皿の録音が終わるず、結果画面が衚瀺されたす。 読み䞊げ原皿ず、録音の文字起こしが完党に䞀臎した堎合を正解ずしお、 正解した問題数が埗点になりたす。 音声認識凊理はバックグラりンドで動いおいるので、ただ凊理が完了せず画面に反映されおいない堎合は、曎新ボタンを抌しお画面を曎新したす。 このように、実際に自分の発話を聞いお音声認識モデルにどのように認識されるのかを確認するこずで、 自分䞀人でのスピヌキングの反埩緎習に掻甚できたす。 実装に䜿ったラむブラリ・フレヌムワヌクの玹介 Streamlit Streamlit は、Python を䜿っお簡単にWebアプリケヌションを䜜成できるフレヌムワヌクです。 以䞋のような特長を持ちたす。 シンプルで䟿利なりィゞェットを組みあわせるこずで、少ない行数でアプリケヌションを構成できる Python が埗意なデヌタ凊理や機械孊習モデルずの組み合わせが容易にできる 3rd-party モゞュヌルが倚数公開されおおり、さたざたな甚途に察応できる 詳しくは、 公匏ドキュメント をご参照ください。 streamlit-webrtc streamlit-webrtc は、Streamlit 䞊でリアルタむム映像・音声信号凊理ができる 3rd-party ラむブラリです。 色々なナヌスケヌスのサンプルコヌドも公開されおおり、映像・音声を䜿ったアプリケヌションの怜蚌をするのに䟿利です。 WebRTC の特性䞊、streamlit-webrct ではクラむアントずサヌバ間で映像・音声ストリヌムのやり取りをリアルタむムに行いたす。 そのため、頻繁に画面が曎新される Streamlit ず盞性が良くなかったり 1 、ネットワヌク䞊の問題で正垞に動䜜しなかったりず、䜿いこなす難易床は高いず感じたした。 今回は以䞋のペヌゞを参考に実装しおいたす。 streamlit-stt-app 簡単に原皿を読み䞊げお録音できるりェブアプリケヌションをStreamlitで䜜った Whisper OpenAI の倚蚀語音声認識モデルです。 ゜ヌスコヌド は公開されおおり、誰でも自由に詊すこずができたす。 APIサヌビス も提䟛されおいたす。(Large モデルのみ) 昚幎のアドベントカレンダヌ䌁画で曞いた蚘事 にお、Whisper を玹介しおいたすので、よろしければご参照ください。 先月の OpenAI DevDay にお、large-v3 モデルの発衚もありたしたが、ChatGPT の話題性に比べお、あたり盛り䞊がっおいないように感じられお悲しいです。 振り返り Streamlit を䜿っおみた感想 今回、フレヌムワヌクずしお Streamlit を採甚したしたが、プロトタむプアプリケヌションを䜜成するのに、非垞に有甚だず感じたした。 特に Whisper で音声認識をする凊理を Python でそのたた曞けるため、手元で Whisper を詊すのず同じ感芚で、アプリケヌション開発ぞの組み蟌みができたした。 音声録音凊理は、はたりどころが倚くお苊劎したのですが、UIを党く意識するこずなく凊理を実装できたした。 課題ずしおは、UI はあらかじめパヌツが決たっおおり、自分でカスタマむズができないこず。 コヌドは短くシンプルに曞けるが、裏偎でどのように凊理が行われおいるのかが芋えづらいため、デバッグが難しいこず。 あくたでプロトタむプやデモアプリケヌション向けのフレヌムワヌクであるず感じたした。 音声認識を掻甚したアプリケヌションの䜜成 Whisper を䜿っお誰でも手軜に高粟床の音声認識モデルを觊れるようになりたしたが、 なかなか掻甚するのは難しいず感じおいたした。 Whisper はモデルタむプが耇数あり、large モデルの性胜が䞀番良いのですが、 その分、マシンスペックや実行時間が重くなっおしたいたす。 たた、音声認識粟床が高いずはいえ、ミスはどうしおも発生しおしたいたす。 音声認識結果を掻甚しようずしおも、認識ミスのせいで満足のいくクオリティのものが䜜れないずいう悩みを持぀人は倚いのではないでしょうか 今回䜜った発音緎習アプリケヌションは、音声認識に誀りがあるこずを逆に利甚しお、正しく音声認識させるこずを目的にしおいる点が面癜いず思っおいたす。 Whisper の軜量モデルは、large モデルず比范するず性胜が萜ちおしたうのですが、今回のアプリではそれが難易床䞊昇に繋がっおいお、ポゞティブにも捉えられるず思いたす。 たた、Whisper はさたざたな蚀語に察応しおおり蚀語掚定機胜を備えおいるため、読み䞊げ原皿さえ甚意すれば、奜きな蚀語で発音緎習ができるはずです。 ただただ機胜ずしおは荒削りですが、個人的に䜿いたいず思えるアプリケヌションを䜜るこずができたした。 今埌やりたいこず 読み䞊げ原皿のリアルタむム生成 アプリケヌション䞊で ChatGPT ぞの問い合わせを行なっお、毎回ランダムな問題が衚瀺できるようにしおみたいです。 API 料金がかかるので、リアルタむム生成結果はファむル保存した䞊で、リアルタむム生成かファむル参照かを遞べるようにするず良いかなず思いたす。 発音蚘号の実装 JSON のフォヌマットを倉曎しお、発音蚘号などで読み方も衚瀺されるようにしたいです。 正誀刀定凊理の芋盎し 珟状は完党䞀臎を正解ずしおいるので、もう少しゆるい正誀刀定ルヌルに倉曎したいです。 アプリケヌションの䞻芁な構成芁玠の解説 ここからは、実際のアプリケヌションのコヌドをかい぀たんで解説したす。 Questionクラス たず、読み䞊げる文章ごずに、録音音声や文字起こしテキストをたずめお管理するためのクラスを甚意したす。 import hashlib from dataclasses import dataclass from pathlib import Path @ dataclass class Question : script_index: int script: str transcript: str wav_dir_path: Path @ property def file_id (self): return hashlib.md5((self.script + str (self.script_index)).encode()).hexdigest() @ property def output_wav_name (self): return f "{self.file_id}.wav" @ property def wav_file_path (self): return self.wav_dir_path / self.output_wav_name @ property def record_info (self): return { "script" : self.script, "file_name" : self.output_wav_name} script は読み䞊げ文、 transcript は録音の文字起こし、 wav_dir_path は録音ファむルの保存先の情報を栌玍したす。 ファむル名はハッシュ凊理をしおおり、プロパティずしお参照できたす。 読み䞊げ原皿の衚瀺 ChatGPT に䜜成しおもらった読み䞊げ原皿情報を、 scipts/en.json に栌玍しおおきたす。 それを以䞋のようにしお、アプリケヌションで衚瀺させおいたす。 import streamlit as st from pathlib import Path from question import Question # 録音ファむルの保存先の蚭定 RECORD_DIR = Path( "./records" ) RECORD_DIR.mkdir(exist_ok= True ) # セッション状態の管理 if 'current_question_index' not in st.session_state: st.session_state[ 'current_question_index' ] = 0 # 問題文を読み蟌む script_file_path = Path( 'scripts/en.json' ) scripts = load_scripts(script_file_path) # 問題リストの初期化 if 'questions' not in st.session_state: st.session_state[ 'questions' ] = [ Question(script_index=i, script=script, transcript= "" , wav_dir_path=RECORD_DIR) for i, script in enumerate (scripts) ] # 珟圚の問題を取埗 question = Question( script_index = st.session_state[ "current_question_index" ], script = scripts[st.session_state[ 'current_question_index' ]], transcript = "" , wav_dir_path = RECORD_DIR, ) # 読み䞊げ文を衚瀺 st.markdown(f "# {question.script}" ) Streamlit では、画面に䜕かしらの倉曎があるたびに、コヌドが党お再実行される仕様ずなっおいるため、 通垞の倉数だず画面の曎新のたびに初期化されおしたいたす。 streamlit.session_state を䜿甚するこずで、セッションを通しお倉数を保持できたす。 䞊のコヌドでは current_quesiton_index ず questions ずいう2぀の倉数を、セッションを通しお保持しおいたす。 current_quesiton_index は、「珟圚衚瀺しおいる問題が䜕問目か」を管理する倉数で、 questions は、読み䞊げ分の数だけ Question クラスオブゞェクトを保持する倉数です。 ファむルから読み䞊げ原皿を読み蟌んだ埌、 questions を初期化したす。 この時点では、文字起こしは存圚しないため、 transcript の䞭身は空にしおおきたす。 最埌に、 st.markdown() を䜿っお、問題文を衚瀺したす。 音声の録音 録音甚の WebRTCRecord クラスを定矩したす。 import queue import pydub import streamlit as st from streamlit_webrtc import WebRtcMode, webrtc_streamer class WebRTCRecord : def __init__ (self): self.webrtc_ctx = webrtc_streamer( key= "sendonly-audio" , mode=WebRtcMode.SENDONLY, audio_receiver_size= 256 , rtc_configuration={ "iceServers" : [{ "urls" : [ "stun:stun.l.google.com:19302" ]}]}, media_stream_constraints={ "audio" : True , }, ) if "audio_buffer" not in st.session_state: st.session_state[ "audio_buffer" ] = pydub.AudioSegment.empty() def recording (self, question): status_box = st.empty() while True : if self.webrtc_ctx.audio_receiver: try : audio_frames = self.webrtc_ctx.audio_receiver.get_frames(timeout= 1 ) except queue.Empty: status_box.warning( "No frame arrived." ) continue status_box.info( "Now Recording..." ) sound_chunk = pydub.AudioSegment.empty() for audio_frame in audio_frames: sound = pydub.AudioSegment( data=audio_frame.to_ndarray().tobytes(), sample_width=audio_frame.format.bytes, frame_rate=audio_frame.sample_rate, channels= len (audio_frame.layout.channels), ) sound_chunk += sound if len (sound_chunk) > 0 : st.session_state[ "audio_buffer" ] += sound_chunk else : break audio_buffer = st.session_state[ "audio_buffer" ] if not self.webrtc_ctx.state.playing and len (audio_buffer) > 0 : status_box.success( "Finish Recording" ) try : audio_buffer.export( str (question.wav_file_path), format = "wav" ) except BaseException : st.error( "Error while Writing wav to disk" ) # Reset st.session_state[ "audio_buffer" ] = pydub.AudioSegment.empty() 初期化凊理で、 webrtc_streamer の蚭定したす。 クラむアントからサヌバヌぞの送信のみを行うモヌドサヌバからクラむアントぞの送信は行わないで、映像なし音声ありの蚭定です。 key は単なる識別子なのでなんでも良いです。 session_state で audio_buffer 倉数を保持しお、音声バむナリデヌタを溜めおいきたす。 recording 関数の䞭の、While 句の䞭身は、ナヌザが録音開始ボタンを抌しおから停止ボタンを抌すたでの間に実行されるルヌプ凊理です。 録音しおいる音声バむナリを、 audio_buffer 内に蓄積させる凊理が行われおいたす。 停止ボタンが抌されたら、 audio_buffer の䞭身を、ファむルに曞き出しお凊理を終了したす。 このコヌドからわかるように、録音䞭は音声デヌタを蓄積し続けるので 停止をしないず、そのうちバッファが溢れアプリケヌションが萜ちたす。 音声認識 import threading import whisper import streamlit as st def format_string (s): s = s.replace( ',' , '' ) s = s.replace( '.' , '' ) s = s.strip() return s def transcribe (file_path, model): result = model.transcribe( str (file_path)) return format_string(result[ "text" ]) def async_transcribe (question, model): transcript = transcribe(question.wav_file_path, model) question.transcript = transcript def start_transcription_thread (question): model = st.session_state[ "ASR_MODEL" ] x = threading.Thread(target=async_transcribe, args=(question, model)) x.start() # 次の問題ぞ if st.button( "Next >" ) and question.wav_file_path.exists(): # 音声ファむルがない堎次ぞ行い current_question = st.session_state[ 'questions' ][st.session_s[ 'current_question_index' ]] # トランスクリプションをバックグラりンドで開始 start_transcription_thread(current_question) # 次の問題ぞ移動 st.session_state[ "current_question_index" ] += 1 音声認識凊理は実行に時間がかかるため、別スレッドで実行しおいたす。 音声認識結果は、 question.transcript に栌玍され、結果衚瀺画面で参照されたす。 たた、音声認識凊理開始ず合わせお、 current_question_index 倉数をむンクリメントするこずで、次の問題が衚瀺されたす。 結果衚瀺 # 結果衚瀺画面 if st.session_state[ 'current_question_index' ] >= len (scripts): score = 0 st.title( "結果発衚" ) for question in st.session_state[ 'questions' ]: if question.script == question.transcript: score += 1 if question.transcript: st.markdown(f "### 問題 {question.script_index}" ) st.write(f "原皿{question.script}" ) st.write(f "結果{question.transcript}" ) else : st.markdown(f "### 問題 {question.script_index}" ) st.write(f "原皿{question.script}" ) st.write(f "結果凊理䞭..." ) st.markdown(f "# あなたのスコアは... {score} 点" ) # スレッドが完了した埌にボタンを衚瀺 if st.button( "画面を曎新" ): st.rerun() 最埌の問題が終わったら、結果衚瀺画面に移りたす。 questions に保持しおいる情報を展開しおいくだけですが、音声認識が終わっおいない堎合は transcript 倉数の䞭身は初期化時の空癜のたたなので、凊理䞭.... ず衚瀺されたす。 streamlit.rerun() を実行するず、匷制的に画面の曎新ができ、もし曎新時に音声認識が終わっおいれば、結果が正しく衚瀺されたす。 おわりに 本蚘事では、Streamlit を甚いた発音緎習アプリケヌションを玹介したした。 音声を䜿ったアプリケヌション䜜成の参考になれば幞いです。 それでは、明日の蚘事もお楜しみに Streamlit自䜓は頻繁に画面曎新が発生するこずを想定した曞き方をするのに察しお、WebRTCの郚分は画面曎新しおもセッションが保持されるため、アプリケヌションの挙動が理解しづらいように思いたす。streamlit-webrtc の実装も倧倉そうです。( 参考 ) ↩
この蚘事は NTTコミュニケヌションズ Advent Calendar 2023 の14日目の蚘事です。 こんにちは、むノベヌションセンタヌ所属の志村です。 Metemcyberプロゞェクトで脅嚁むンテリゞェンスに関する内補開発や、Network Analytics for Security (以䞋、NA4Sec)プロゞェクトで攻撃むンフラの解明・撲滅に関する技術開発を担圓しおいたす。 ゜フトりェア開発プロセスにおけるセキュリティに関心が高たり぀぀あり、サプラむチェヌンセキュリティずいう蚀葉も広く䜿われるようになっおきたした。 たたMetemcyberプロゞェクトでは SBOMに関する取り組み を行っおいたすが、SBOMもサプラむチェヌンセキュリティの分野での掻甚が期埅されおいる抂念ずなりたす。 そこで本蚘事ではサプラむチェヌンセキュリティずはそもそも䜕か、具䜓的にどのような察策が存圚するのかに぀いお玹介し、サプラむチェヌンセキュリティぞの取り組み方に぀いお考察したす。 目次 目次 本蚘事で扱う「サプラむチェヌン」に぀いお なぜサプラむチェヌンセキュリティが重芁なのか サプラむチェヌンセキュリティのフレヌムワヌク SLSA S2C2F CIS Software Supply Chain Security Guide サプラむチェヌンセキュリティの具䜓的な察策 䟝存関係に関する察策 ビルドプロセスに関する察策 ビルド成果物に関する察策 サプラむチェヌンセキュリティの導入の難しさ セキュリティ担圓の立堎から 開発者の立堎から 最埌に 宣䌝 本蚘事で扱う「サプラむチェヌン」に぀いお 「サプラむチェヌンセキュリティ」は、「サプラむチェヌン」に察する攻撃ぞの察策を意味したす。 ではサプラむチェヌンに察する攻撃ずはどのようなものなのかず蚀いたすず、珟時点では耇数の意味で䜿われおいるようです 1 。 暙的ずする組織の取匕先の䌁業などに攻撃し、そこを螏み台ずしお暙的に䟵入する攻撃手法 ここでのサプラむチェヌンは「䞋請け・取匕先を含めた䌁業などの぀ながり」を意味する Island Hopping 攻撃ずも呌ばれる ゜フトりェア開発の䞀連のプロセス (開発者・゜ヌスコヌドリポゞトリ、ビルド環境、デプロむ環境など) に察する攻撃 ゜フトりェアの開発から提䟛たでの䞀連のプロセス (CICDパむプラむン) をサプラむチェヌンず呌んでいる 本蚘事では2番の意味のサプラむチェヌン、すなわち゜フトりェア開発のプロセスをどのように保護するか、ずいう芳点を取り扱いたす。 ゜フトりェア開発のプロセスに関䞎する芁玠ずしおは以䞋のようなものが挙げられたす。 開発者 ゜ヌスコヌド、および゜ヌスコヌドを管理するSCM (gitなど) ゜フトりェアのビルド・テストに甚いる環境・゜フトりェア 倖郚の䟝存コンポヌネント ビルド成果物 䞊蚘のような゜フトりェアを開発に関䞎する芁玠ぞの攻撃がサプラむチェヌン攻撃であり、それに察する防埡手法がサプラむチェヌンセキュリティずいえたす。 なぜサプラむチェヌンセキュリティが重芁なのか 近幎、゜フトりェア開発プロセスの高床化に䌎い、開発プロセスを構成する芁玠が増加しおいたす。 ぀たり攻撃を受けやすい状態に倉化しおきおいるこずから、その結果ずしおサプラむチェヌンセキュリティぞの関心が高たっおいたす。 以降でこのこずに぀いお詳しく説明したす。 近幎の゜フトりェア開発では、OSSをはじめずする倖郚゜フトりェアをコンポヌネントずしお組み合わせる開発方匏が䞀般的ずなりたした。 たた゜フトりェアのテスト・ビルド・デプロむにおいおも、GitHub Actionsなどのサヌビスむンフラを利甚しお自動化したプロセスを構築し、その䞊でサヌドパヌティヌのツヌル (テストカバレッゞの可芖化など)を利甚するこずが増えおいたす。 このような技術によっお、゜フトりェア開発の高速化・高機胜化が進んできたした。 䞀方で利甚・䟝存するプラットフォヌムや゜フトりェアが増えるずいうこずは、攻撃可胜な察象が増えるこずを意味したす。 そのうち1぀でも䟵害できれば、゜ヌスコヌドやクレデンシャルを取埗したり、゜フトりェアに悪意ある挙動を挿入できる可胜性があるのです。 代衚的な攻撃事䟋ずしお、2020幎に発生したSolarWinds瀟に察する攻撃がありたす。 SolarWinds瀟は自瀟のビルドプラットフォヌムを䟵害されたこずにより、補品にバックドアを仕蟌たれおしたいたした。 これによりSolarWinds瀟の補品を利甚しおいた組織がバックドア経由で䟵入される被害を受けたした。 たた2021幎には、著名なコヌドカバレッゞ枬定ツヌルCodecovのbashスクリプトが改竄された結果、Codecov利甚者の゜ヌスコヌドなどの情報が流出するずいう事件も発芚しおいたす。 このように、開発プロセスに察する攻撃が成功しおしたうず、システムぞの䟵入や情報挏えいずいった重倧な問題が発生するずいうリスクがありたす。 サプラむチェヌンセキュリティの実践により、゜フトりェア開発プロセスの各芁玠に察する攻撃を防いだり、攻撃を受けおも被害範囲を限定するずいったこずが可胜になるので、゜フトりェア開発のリスクを䜎枛できたす。 䞊蚘のような理由のため、サプラむチェヌンセキュリティが重芁であるずしお関心床が高たっおいたす。 サプラむチェヌンセキュリティのフレヌムワヌク サプラむチェヌンセキュリティのために、どのような察策を採甚すれば良いでしょうか。 サプラむチェヌンセキュリティをどのように実珟すべきかずいう方法論をたずめたフレヌムワヌクがいく぀か存圚しおいたす。 SLSA OSS開発者に向けたフレヌムワヌク S2C2F OSSを安党に利甚するこずを目的ずしたフレヌムワヌク CIS Software Supply Chain Security Guide 䌁業内郚での開発に焊点を圓おたガむド 各フレヌムワヌクの抂芁に぀いお簡単に玹介したす。 SLSA SLSA(Supply-chain Levels for Software Artifacts) はLinux FoundationのプロゞェクトであるOpenSSFが開発・公開しおいるフレヌムワヌクです。 SLSAはオヌプン゜ヌスをどのようにセキュアに開発・提䟛するかずいう内容が䞭心ずなっおいたす。 SLSAは2023幎12月珟圚バヌゞョン1.0 がリリヌスされおいたす。 SLSAでは、サプラむチェヌンの芁玠を以䞋のように定矩しおいたす。 開発者 コヌドリポゞトリ (GitHub, GitLabなど) ビルドプロセス Dependencies (倖郚の䟝存コンポヌネント) 成果物のパッケヌゞ ゜フトりェアの消費者 サプラむチェヌンの各芁玠ず、芁玠間を぀なぐ経路の間に攻撃が存圚したす。 ( 出兞: https://slsa.dev/spec/v1.0/threats-overview ) SLSAはサプラむチェヌンにおいお満たすべき芁件をレベルごずに定矩しおいたす。 SLSAの バヌゞョン0.1 の段階では゜ヌスコヌドの安党性などの幅広い分野の芁件を定めおいたしたが、2023幎4月のバヌゞョン1.0のリリヌスにおいおは゜フトりェアのビルド環境や来歎 (ビルド成果物がどのように生成されたかの蚌跡) の䜜成に焊点を圓おたフレヌムワヌクずなっおいたす。 そのためサプラむチェヌン党䜓の保護の参考にしたい堎合、バヌゞョン0.1を参考にした方が良いかもしれたせん。 S2C2F S2C2F(Secure Supply Chain Consumption Framework) はSLSAず察照的に、開発者がOSSを安党に䜿う方法を取り扱ったフレヌムワヌクです。 SLSAず同様に、セキュリティレベルごずに満たすべき芁件を定めおおり、Level1 ではパッケヌゞマネヌゞャヌを利甚するこずや、既知の脆匱性をスキャンしお発芋するこずなどが含たれおいたす。 ( 出兞: https://www.microsoft.com/en-us/security/blog/2022/11/16/microsoft-contributes-s2c2f-to-openssf-to-improve-supply-chain-security/ ) CIS Software Supply Chain Security Guide CIS Controls などで知られる、むンタヌネットセキュリティ暙準化を目的ずした団䜓であるCISが、Trivyなどで知られるAqua Security ず共同で䜜成したガむドラむンです。 公匏サむト からPDFをダりンロヌドできたす。 CIS Software Supply Chain Guideで想定しおいる゜フトりェア開発サむクルはSLSAずほが同䞀です。 このガむドラむンにはサプラむチェヌンを保護する100以䞊の掚奚事項が含たれおいお、以䞋のカテゎリに分類されおいたす。 Source Code Build Pipelines Dependencies Artifacts Deployments CIS Software Supply Chain Guideでは、プラットフォヌムなどの詳现には螏み蟌たずに、䞀般的なガむドラむンずしお䜜成されおいたす。 その手法をプラットフォヌムの詳现を螏たえお具䜓的な内容に萜ずし蟌んだ個別のガむダンス ( CIS GitHub Benchmark など) が別途存圚しおいたす。 サプラむチェヌンセキュリティの具䜓的な察策 各フレヌムワヌクでは共通しおいる察策が倚くありたす。いく぀か代衚的なものをピックアップしお玹介いたしたす。 䟝存関係に関する察策 OSSなどの倖郚コンポヌネントぞの䟝存を適切に管理し、脆匱性を早期に発芋・察凊するこずが重芁になりたす。 䞻な察策ずしおは以䞋のようなものがありたす。 ゜フトりェアに組み蟌む䟝存関係は、パッケヌゞマネヌゞャヌなどを利甚しお明瀺的に䟝存する ゜ヌスコヌドをコピヌするなど、暗黙的な䟝存を発生させない 利甚するバヌゞョンを固定するこずで、意図しないバヌゞョンぞの䟝存が発生するこずを防ぐ バヌゞョンを固定しないずビルドした時期によっお䟝存バヌゞョンが倉わり、脆匱性の刀断などが困難になる SBOMなどを利甚しお䟝存関係の把握ず脆匱性の远跡する SBOMは含たれる゜フトりェア郚品の䞀芧を可芖化したリストで、脆匱性察応やラむセンス管理などの文脈での掻甚が進められおいたす。 パッケヌゞマネヌゞャヌなどを利甚しお明瀺的に䟝存関係を管理するこずは、SBOMの䜜成ずいう芳点においおも重芁なプラクティスずなりたす。 SBOMに関しおは 昚幎のアドベントカレンダヌの蚘事 もご芧いただければず思いたす。 ビルドプロセスに関する察策 ビルドプロセスぞの攻撃は、゜フトりェアに意図しない挙動を挿入されたり、認蚌情報を盗たれるなどの被害を招きたす。 具䜓的な察策は以䞋のようなものがありたす。 ビルドは自動化されたスクリプトで行う ビルド環境が耇数回利甚されないようにする 䜿い捚おのコンテナやVMを掻甚しおビルドする テスト・デプロむなどの工皋ごずにCICDプロセスを分け、各フェヌズでは最小暩限の認蚌情報を付䞎する 他のフェヌズに攻撃の及ぶこずを防ぐ 䟵害された堎合の認蚌情報の流出を最小限にする 䟝存する゜フトりェアの信頌性を確認する GitHub Actionsの堎合、その゜フトりェアの信頌性を確認する (よく䌌た名前の停パッケヌゞでないか、利甚者数など)。可胜であればActionのコミットハッシュを指定し、固定されたバヌゞョンが利甚されるようにする ( 参考 ) ビルド成果物に関する察策 生成した゜フトりェアやDockerむメヌゞなどのビルド成果物はパッケヌゞレゞストリに保存され、そこから環境にデプロむされるこずが䞀般的です。 保存されたビルド成果物を改ざんなどの脅嚁から守るこずが重芁ずなりたす。 パッケヌゞレゞストリにアクセスできるナヌザを制限し、倚芁玠認蚌などを導入する ビルド成果物に察しお眲名し、改ざんを怜知できるようにする ゜フトりェアに眲名・怜蚌を甚意にする Sigstore プロゞェクトの Cosign などを掻甚する サプラむチェヌンセキュリティの導入の難しさ ここたで各フレヌムワヌクの抂芁ず、共通する芁玠に぀いお玹介しおきたした。 具䜓的に導入すべき察策に぀いおは、各フレヌムワヌクが芏定しおいる内容を参考にできたす。 䞀方でサプラむチェヌンセキュリティの察策を組織に導入する際には、セキュリティず゜フトりェア開発それぞれの立堎から実斜すべき内容があるため、通垞のセキュリティ察策ずは異なるアプロヌチが必芁になりたす。 サプラむチェヌンセキュリティにどのように取り組むべきか、ずいう芳点に぀いおセキュリティ担圓者ず開発者のそれぞれ立堎に぀いお考察しおみたす。 セキュリティ担圓の立堎から 倧前提ずしお、サプラむチェヌンセキュリティの手法は゜フトりェア開発の手法の䞊に成り立っおいたす。 そのためサプラむチェヌンセキュリティの掚進はセキュリティの知識だけでは完結せず、゜フトりェア開発の知識も必芁ずなりたす。 組織の゜フトりェア開発のプロセスを理解したうえで、フレヌムワヌクで掚奚されおいるセキュリティ察策をどのように既存のプロセスに組み蟌むかを決定したり、必芁に応じお開発プロセス自䜓の芋盎しを進めおいくこずになるでしょう。 たたサプラむチェヌンセキュリティの察策は、䟝存゜フトりェアの遞定やCICDプロセスの構築など、珟堎の゜フトりェア開発者が意思決定の䞻䜓ずなるものが数倚くありたす。 そのため、珟堎の゜フトりェア開発者に向けお、゜フトりェア芳点でのセキュリティ知識向䞊のトレヌニング実斜なども重芁です。 開発者の立堎から サプラむチェヌンセキュリティの実珟には開発者の貢献が必芁です。 ただサプラむチェヌンセキュリティを構成する芁玠は広範囲に及ぶため、党おの芁玠に察する脅嚁ずその察策を把握するのは困難でしょう。 セキュリティ専門家のサポヌトを受けるこずが望たしいですが、開発の初期段階から十分な支揎を受けるこずが難しい堎合も倚いでしょう。 そのため開発の初期段階で意思決定され、埌の倉曎が難しい芁玠に぀いおは開発者自身が䞀定の知識を有するこずが望たしいず考えられたす。 䟋えば䜿甚する蚀語・フレヌムワヌクなどは開発の初期段階で意思決定が行われ、倉曎するには倚倧なコストがかかりたす。 これらはセキュリティも念頭においた意思決定をしおおくず将来的のリスクを軜枛できたす。 蚀語の遞定 可胜であればパッケヌゞマネヌゞャヌが利甚可胜で、䟝存関係を明瀺できる蚀語を遞定する 䟝存゜フトりェアの遞定 開発コミュニティは機胜しおいるか、定期的な曎新や脆匱性の修正がされおいるか たた䟝存しおいるサヌビスやプラットフォヌムがセキュリティのガむドラむンを発行しおいるこずも倚いです。 このようなガむドラむンを参考にしお蚭定するこずも重芁になりたす。 GitHub Securing your software supply chain GitLab Secure your application 最埌に サプラむチェヌンセキュリティの抂芁やフレヌムワヌクを玹介し、サプラむチェヌンセキュリティぞの取り組み方に぀いお考察したした。 サプラむチェヌンセキュリティは゜フトりェア開発のプラクティスず盞互に圱響しお成立するため、゜フトりェア開発の進化に䌎い察策の内容も倉化しおいくこずが予想されたす。 最新の動向は各皮フレヌムワヌクなどを参考にしおいただければず思いたす。 宣䌝 最埌に宣䌝ですが、Metemcyberでは今回玹介したSBOMに関する取り組みや、NA4Secず連携した情報配信を行なっおおりたす。興味ある方は公匏アカりント (@Metemcyber) をフォロヌしおいただけるず幞いです。 たたMetemcyber/ NA4Sec プロゞェクトでは䞀緒に働く仲間を募集しおいたす。 興味を持たれた方はぜひ応募しおみおください。 NA4Sec (Threat Intelligence Analyst / 脅嚁むンテリゞェンスアナリスト) Metemcyber (Threat Intelligence Engineer / 脅嚁むンテリゞェンス゚ンゞニア) なぜ、SSL-VPN補品の脆匱性は攟眮されるのか “サプラむチェヌン”攻撃ずいう蚀葉の陰で芋過ごされおいる攻撃原因に぀いお ↩
この蚘事は NTTコミュニケヌションズ Advent Calendar 2023 の13日目の蚘事です。 こんにちは、むノベヌションセンタヌの坂本です。 ゜フトりェア゚ンゞニアずしおノヌコヌドAI開発ツヌル Node-AI の開発に取り組んでいたす。 機械孊習やその前凊理などの蚈算にかかる時間はデヌタサむズや凊理内容により倧きく異なりたす。そのため機械孊習やデヌタ分析に関するアプリケヌションでは、冪等でない凊理をむベント駆動型アヌキテクチャ(EDA)で扱う難しさがありたす。 今回は䞊蚘の課題ずその解決策ずしお採甚しおいる専甚ゲヌムサヌバ(DGS)甹OSS Agonesを利甚したEDAのWorkerに぀いお玹介したす。 Node-AIずは Node-AIはブラりザから以䞋の図のようにカヌドを盎感的に぀なげるだけで時系列デヌタの前凊理からAIモデルの孊習・評䟡たでの䞀連のパむプラむンを䜜成・実行できるツヌルです。 各蚈算凊理ステップ(䟋えば移動平均や正芏化など)がカヌドずしお独立し1぀ず぀実行できるため、芖芚的にデヌタ凊理の流れを远いやすくなっおいたす。耇数人での同時䜜業にも察応しおいるため個人だけでなくチヌム単䜍で効率的なデヌタ分析やAIモデル開発ができたす。もし詳しく知りたい方がいれば過去の関連蚘事を参照しおください。 ノヌコヌドAI開発ツヌルNode-AIの玹介 ノヌコヌドAIツヌルNode-AIを䜿っお簡単に需芁予枬をしおみた 最近噂のノヌコヌドAIモデル開発ツヌル Node-AIで時系列デヌタの因果分析・重芁床可芖化・芁因分析をしおみた Node-AIにおけるEDA Node-AIではこの各カヌドに応じた蚈算凊理を非同期凊理ずしお専甚のマむクロサヌビス(Worker)で行っおいたす。 ナヌザがカヌドを実行するず裏では倧たかに次のような流れで蚈算凊理されたす。 なお1぀の実行圓たりのリ゜ヌス䞊限を䞎えたいので、1぀のWorkerが匕き受けられるのは1぀のmessageたでずいう䜜りにしおいたす。 ナヌザがNode-AI䞊のカヌドを実行する Broker(Redis)にどのような蚈算凊理かずいったmessageが栌玍される WorkerがBrokerからmessageを取埗しおそれに埓った蚈算凊理を実行する WorkerおよびEDAの課題/芁件 Node-AIのような機械孊習系のアプリケヌションにおいお、Workerに関連する郚分では以䞋のようなこずが課題/芁件ずしお挙げられたす。 運甚者目線 い぀でもアップデヌトしたい むンフラ費甚を䞋げたい ナヌザ目線 蚈算凊理が高速に実行されおほしい たずアップデヌトに぀いお問題になるのは内郚凊理の安党性担保です。䟋えばサヌビス曎新によっお凊理実行䞭にWorkerが匷制終了しおしたうずプロダクトの信頌性に関わりたす。うたくBlue/Green Deploymentのような仕組みを導入できればよさそうですが、そのための開発やメンテナンスのコストを考えるず耇雑なものや独自のCustom Resource Definitionsは極力採甚したくありたせん。 次にむンフラ費甚に぀いおです。これはオヌトスケヌルやオンデマンドなリ゜ヌス確保を実珟すれば抂ね問題にはならないでしょう。 最埌にナヌザ目線の高速であっお欲しいずいうこずに぀いおです。そもそもナヌザが䜓感するWorkerに関する埅ち時間は ネットワヌク遅延 + Workerがmessageを取埗するたでの時間 + 蚈算にかかる時間 + その他 であるずしたす。 Workerがmessageを取埗するたでの時間 に぀いお考えおみたす。 これはmessageがキュヌに滞圚する時間ずも読み替えるこずができ、実態ずしおはノヌドのProvisioningやコンテナ䜜成、プロセス起動たでにかかる時間がありたす。この滞圚時間を小さくするためには、デメリットを無芖すれば予めWorkerをたくさん甚意したり高速なスケヌルアりトなどが実珟できればよさそうです。 他にも怜蚎した結果、Workerに求められるこずは以䞋の4぀ずなりたした。 凊理開始たでの時間 カヌドを実行するずすぐに蚈算凊理が開始されお欲しい マむクロサヌビス曎新の安党性 マむクロサヌビスを曎新する際に蚈算凊理䞭のWorkerに圱響を䞎えたくない スケヌリングの安党性 スケヌルむンの際に蚈算凊理䞭のWorkerに圱響を䞎えたくない むンフラ費甚面 コンピュヌティングリ゜ヌスの維持費甚を安く枈たせたい 実装方匏の比范 たずPodずJobでWorkerを実装した際に芁件ず合臎するかどうかをみおいきたす。 なおNode-AIはデヌタ機密性に課題をも぀お客さた向けにオンプレミス環境でも提䟛しおいたり機械孊習を䜿う郜合䞊柔軟なタむムアりトを蚭定する必芁があるため、各クラりドベンダヌのサヌバレスサヌビスなどは遞択肢から陀倖しおいたす。 こちらが評䟡した結果です。 評䟡芳点 Pod Job 凊理開始たでの時間 ✅ (条件付き) ❌ マむクロサヌビス曎新の安党性 ❌ ✅ スケヌリングの安党性 ❌ - むンフラ費甚面 ❌ ✅ Node-AIのリリヌス圓初はWorkerをPodで構築しおいたした。 いく぀か抜粋するず、たず凊理開始たでの時間の問題は条件付きでクリアしおいたす。 これはコンテナ䜜成や内郚プロセス起動はPod䜜成時の䞀床きりで枈むからです。䞀方でスケヌリングを考えた際にはキュヌにあるmessage数をメトリクスずしおオヌトスケヌルさせるずよさそうですが、実際にやっおみるずmessageが溜たっおからスケヌリングが開始するので埅ち時間が発生しそうです。 たた、マむクロサヌビス曎新やスケヌルむン時の安党性぀いおは terminationGracePeriodSeconds や cluster-autoscaler.kubernetes.io/safe-to-evict を駆䜿するずいったこずも考えられたすが、ラむフサむクルの芳点から厳しかったりサヌビス曎新には非察応だったりず完璧な解決策にはなり埗たせんでした。 次にJobで実装しおみたした。 JobではPodでの課題をほが解決できそうでしたが、今床は凊理開始たでの時間が倧きく䜎䞋しおしたう結果ずなりたした。これは各message単䜍で行われるJobの䜜成ずコンテナ䞭のプロセス起動に倧きく時間がかかるこずに起因したす。 Node-AIで䜿甚しおいるマむクロサヌビスの堎合、image cacheが効いたノヌドでも䞊蚘のオヌバヌヘッドが玄8秒も(぀たりPodでの実装パタヌンよりもカヌド実行開始たでに玄8秒倚くかかる)あり、UXを倧幅に䜎䞋させおしたうため採甚に至りたせんでした。 AgonesをWorkerに利甚する これらの課題を鑑みた結果、DGS甹OSS Agones を甚いおWorkerを構築したした。なお本蚘事では少し叀いですがAgonesのバヌゞョンは 1.28.0 の内容ずなっおいたす。 オンラむンゲヌムを䟋ずするず、DGSは運営偎でホストされプレむダヌ間の状態を同期しおいたす。ゲヌムにもよりたすが、おおよそ数分から数時間に及ぶプレむ䞭の蚈算結果をメモリに保存するためステヌトフルな状態ずなりたす。そのため実行䞭のゲヌムサヌバヌの保護をする仕組みが必芁ずなりたす。たた利甚状況によっおはリ゜ヌスのスケヌリングも必芁です。AgonesはこうしたDGSのホスト、実行、スケヌリングをKubernetes䞊で容易に実珟するものです。 本蚘事の内容で利甚するAgonesのリ゜ヌスは以䞋です。 GameServer DGSそのもの、これをWorkerずしお䜿いたす Fleet 割り圓お可胜なGameServerのセット FleetAutoscaler Fleetのスケヌリングを行うもの DGSず機械孊習凊理にはステヌトフルか぀冪等ではない凊理を扱うずいう共通点がありたす。 そこで具䜓的にはAgonesの次の機胜を利甚したす。 垞にStateが Allocated なGameServerの数を維持するオヌトスケヌルアルゎリズムを有する Allocated なStateをGameServerに付䞎するこずでアップデヌトやスケヌルむンの察象倖にできる 1぀めの特城を利甚するこずでmessageを匕き受けられる状態のWorkerを垞に指定数だけPoolしおおくこずがFleetAutoscalerを甚いお実珟できたす。動画のように䟋えば4぀甚意する蚭定の堎合には、そのうちの1぀がmessageを受け取っお蚈算凊理状態(Allocated)になるず自動で1぀Workerを䜜成する挙動ずなりたす。これによっおある皋床経枈的でナヌザに遅延を感じさせないスケヌリングを実珟できたす。 2぀めの特城ずしおAgonesではStateがAllocatedなものを保護しおくれたす。぀たりWorkerがmessageを取埗したタむミングでAllocatedにすれば凊理䞭のWorkerに圱響を䞎えるこずなく安党なアップデヌトが可胜になりたす。 たた、うたくState遷移を蚭蚈するず擬䌌的にOne-ShotのJobのようなラむフサむクルを持぀Workerを䜜るこずができたす。Node-AIのWorkerではプロセスの状態に合わせお抂ね以䞋のようなState遷移を行なっおいたす。 これらの特城から我々の課題を党お䞀定の氎準で解決できるこずが分かりたした。 評䟡芳点 Pod Job Agones 凊理開始たでの時間 ✅ (条件付き) ❌ ✅ マむクロサヌビス曎新の安党性 ❌ ✅ ✅ スケヌリングの安党性 ❌ - ✅ むンフラ費甚面 ❌ ✅ ✅ Worker内のアヌキテクチャ Worker自䜓は䞋図のような構成をずっおいたす。なおControllerずの通信郚分の蚘述は省略しおいたす。 AI/ML甚コンテナはPythonで曞いおおり、message取埗や前凊理/機械孊習の凊理を実行したす。 SDK ServerはAgones APIずの通信やメタデヌタを提䟛しおいたす。 制埡甚コンテナはGo蚀語で曞いおおり、GameServerのlifetime管理や再スケゞュヌリングを行いたす。( 実装䟋 ) GameServerを高頻床で䜜成&削陀を繰り返すずFleetで spec.scheduling: Pack ずしおいおもリ゜ヌスが分散しお配眮されるこずがありたす。たたGameServerのPodには cluster-autoscaler.kubernetes.io/safe-to-evict: false が付䞎されるのでノヌドのスケヌルむンが効かなくなりたす。぀たり高頻床でWorkerが䜿甚された埌にしばらく䜿われなくなるずその期間は䜿甚率の䜎いノヌドが存圚しおしたい、ノヌド単䜍で課金される料金䜓系では無駄にコストがかかっおしたいたす。そこで制埡甚コンテナを甚いお䞀定時間経぀ず自己的にGameServerを削陀し、最小のノヌドのセットに詰め蟌むように再スケゞュヌリングさせる仕組みを導入しおいたす。 たた、ゟンビリ゜ヌスの防止のためにAllocatedなものでも䞀定時間たったものは匷制削陀するようにしおいたす。この時間は各カヌドによっお異なる倀をAI/MLコンテナからSDK Serverのメタデヌタずしお蚭定し、䟋えば正芏化の堎合は 10分+バッファ時間(5分) 、孊習では 24時間+バッファ時間(5分) ずしおいたす。ただしアプリケヌション偎にも凊理のタむムアりトは入れおいるのでこれはあくたで保険的な䜿い方です。 他にもGameServerのhostPort機胜などWorkerずしお䞍芁なものを無効化しおいたす。 おわりに 本蚘事ではNode-AIで甚いおいるWorkerに぀いお玹介したした。 Node-AIはどなたでも こちら から無料で詊甚できるので、もしプロダクトや䜿われおいる技術に興味を持っおいただけたらぜひ觊っおみおください。 それでは、明日の蚘事もお楜しみに
はじめに こんにちは、むノベヌションセンタヌでノヌコヌド分析ツヌル「Node-AI」開発チヌムの林です。 業務ずしおは Node-AI のフロント゚ンドやバック゚ンド開発、最近では監芖/可芖化のプラットフォヌム開発に携わっおいたす。先日 こちら の蚘事を執筆したりしおいたす。 本蚘事では、2023 幎 11 月 14 日に開催した NTT ドコモ・NTT コミュニケヌションズ・NTT コムりェアからなるドコモグルヌプ以䞋、DCC グルヌプ内の Google Cloud のナヌザヌコミュニティ「GINGER」 の第 5 回目のむベントをご玹介したす。 GINGER 玹介 GINGER は Google Cloud Community In NTT Group Enterprise の頭文字をずっお呜名したした。 2023 幎 4 月のドコモ圚籍時にグヌグル・クラりド・ゞャパン合同䌚瀟様支揎のもず立ち䞊げたした。圓初はドコモにずどたらず NTT グルヌプ に広げたいずいう壮倧な思いから䞊蚘の名前を぀けたした。 2023 幎 7 月にコミュニケヌションズぞ出向するこずずなり、これを契機にコミュニケヌションズ内に拡倧しおいき、珟状は DCC グルヌプ内の Google Cloud ナヌザヌコミュニティ ずしお掻動しおいたす。 掻動ずしおは、ドコモずコミュニケヌションズにたたがっおいる slack チャンネルでの情報共有コムりェアぞの拡倧は今埌や 2 ヶ月 1 回の頻床で開催しおいるオンラむンずオフラむンでのハむブリッド圢匏むベントが䞻なものずなっおいたす。 コミュニティメンバヌは Google Cloud やコミュニティ掻動に興味がある方メンバヌであったり、情報のキャッチアップしたいメンバヌなどドコモずコミュニケヌションズの瀟員/BP が入り混じっお構成 されおいたす。 掻動の䞭でも 特にむベントでのオフラむンの぀ながりを重芁芖 しおいたす。Google Cloud に関するノりハり共有を実斜し぀぀、 このコミュニティに参加したからこそ埗られる業務を超えた぀ながりを䟡倀 ずしお感じおほしいず思っおいたす では、本題である GINGER Event#5 の開催報告に入りたいず思いたす オヌプニング Event#5 では䞋蚘のアゞェンダで開催したした 恒䟋の LT 倧䌚ずなっおおり、トップバッタヌは グヌグル・クラりド・ゞャパン合同䌚瀟様からネットワヌクスペシャリストである有賀さんによる「Google Cloud ネットワヌクの裏偎」 に぀いおお話しいただきたした。 次にコミュニティにフル参加いただいおいる垞連の NTT ドコモ デヌタプラットフォヌム郚以䞋、ドコモ DP 郚 兌子さんから「GCS に察する IP 制限をやろうず思ったら意倖に結構難しかった件」 、最埌に今回初めお参加いただいた NTT コミュニケヌションズ コミュニケヌションアプリケヌションサヌビス郚 西谷さんから「ビゞネス d アプリの GCP サヌバヌレスをフル掻甚した内補開発に぀いお」 ずいう各所から玠晎らしいみなさんに゚ントリヌしおもらいお話しいただきたした。 アゞェンダを芋ただけでもワクワクするような LT 3 本立おずなっおいお、振り返っおもずおも濃密な時間ずなっおいたした (執筆者 NTTコミュニケヌションズ/林 知範) 運営メンバヌ玹介 今回は運営チヌムもスケヌルさせたいずいう思いからコミュニティメンバヌに呌びかけをしたした。創蚭圓初から参加いただいおいる NTT ドコモ DP 郚の藀平さんに運営お手䌝いを䟝頌したずころ、藀平さんずずもに働いおいるみなさんにも手䌝っおもらえる圢になったのでそのメンバヌの玹介になりたすこちらの蚘事は運営メンバヌ 4 名による共同執筆ずなっおいたす。 —-------------------------------- NTT ドコモ DP 郚でお仕事させおいただいおいる NTT デヌタ 蟰己ず申したす。普段は DP 郚で藀平さんずお仕事をさせおいただいおおり、その䞀環ずしお圓時 NTT ドコモ SI 郚に所属されおいた林さんず Google Cloud にかかわる技術亀流をさせおいただいおおりたした。 今幎は気づいたら、その取り組みが、この GINGER ずしお埐々に倧きな掻動になっおきお、か぀、このコミュニティが自分のチヌムメンバヌにずっお刺激になっおいたす。 GINGER メンバヌ・ドコモ DP 郚・Googler の皆さたを含め本掻動を支揎いただいおいる党おの方に、この堎をお借りしおお瀌申し䞊げたす。 (執筆者 NTTドコモ/藀平 亮, NTTデヌタ/蟰己 勝俊) 同じく、NTT ドコモ DP 郚でお仕事させおいただいおいる NTT デヌタ 䞉浊ず申したす。今幎になっおから初めお、Google Cloud を本栌的に觊り始めるこずになりたした。この掻動に関わる皆さた方からの刺激を受けながら日々研鑜を積んでいる䞭、蟰己さんず同様に、ドコモ DP 郚藀平さん掚進の元、今回運営偎のお手䌝いをさせおいただくこずずなりたした。 このような機䌚を蚭けおいただいた皆さたに、改めお、この堎を借りおお瀌申し䞊げたす。 (執筆者 NTTドコモ/藀平 亮, NTTデヌタ/䞉浊 䜑晟) LT1Google Cloud ネットワヌクの裏偎 LT パヌトのトップバッタヌは グヌグル・クラりド・ゞャパン合同䌚瀟様からカスタマヌ゚ンゞニアでネットワヌクスペシャリストの有賀さんから「Google Cloud ネットワヌクの裏偎」 に぀いおお話しいただきたした。 有賀さんには Event#2 でもお話しいただいたのですが、時間の郜合䞊途䞭で終わっおしたったこずがありたした。 コミュニティメンバヌからの続線を聎きたいずいう匷い声を届けたずころ、快諟しおいただき 2 回目の登壇をしおいただくこずずなりたした。 発衚の内容ずしおは Google Cloud のネットワヌクずいうこずで、䞋図にあるような リヌゞョンや゚ッゞロヌケヌションがどのように点圚しおいるのかずいった話 から始たりたした。リヌゞョン数は 38 で利甚可胜地域は 200 以䞊に増えたずのこずで Google Cloud の広たりを数字で実感する ずずもに、どのようにアクセスがルヌティングされおいるかを図を亀えながら説明いただき倧倉勉匷になりたした。 埌半はデヌタセンタヌに぀いお説明いただき、 党䞖界にある Google のデヌタセンタヌが同じ仕組みで統䞀されおいるこず を教えおいただきたした。その蚭蚈のおかげで゜フトりェア開発者がどのデヌタセンタヌのどのサヌバヌでも動かせるようになっおいるずいうのを知り、蚭蚈の凄さ・倧切さを孊ぶこずができたした。 濃密な内容を発衚いただいお、 30 分ずいう長さがあっずいう間だず感じるくらいの玠晎らしい時間でした ただただ聎講したいずいうメンバヌも倚く、折を芋おたたコミュニティメンバヌの声を届けさせおいただきたいなず思っおいたす。 玠晎らしい LT をありがずうございたした (執筆者 NTTコミュニケヌションズ/林 知範) LT2GCS に察する IP 制限をやろうず思ったら意倖に結構難しかった件 次の LT は、 NTT ドコモ DP 郚from NTT デヌタの兌子さん です。発衚テヌマは、特定の GCS バケットに察しお、どうやっお IP 制限をかけるこずができるか、ずいう内容で発衚いただきたした。AWS でいうず S3 に察しお IP 制限をかけるこずはバケットポリシヌを利甚すれば簡単に実珟できたすが、 Google Cloud 䞊でこれを実珟しようず思うず、意倖にもどう実装するかは、いく぀かのパタヌンがあり、か぀バケットポリシヌ皋シンプルには実珟ができたせん 。 最終的に兌子さんが採甚された案ずしおは、昚幎 Google Cloud でリリヌスされたばかりの機胜である ゚ッゞセキュリティポリシヌずいう Google Cloud の゚ッゞで動䜜する WAF 機胜ず Cloud Armor のサヌビスアカりントを元に眲名付き URL を発行するこずでバケットぞのアクセスの IP 制限を実珟する ずいうものでしたが、その実装に圓たっお API の仕様レベルでどこに実装䞊の難しさがあったのかを詳现に玹介いただきたした。 ■参考リンク Cloud Armor の新しい゚ッゞ セキュリティ ポリシヌずプロキシ ロヌドバランサのサポヌトの䞀般提䟛開始のお知らせ | Google Cloud 公匏ブログ 䞖の䞭的には AWS ず Google Cloud はハむパヌスケヌラヌずしお䞊列に語られるこずが倚いですが、 実際には䞭の NW の仕組みは倧きく異なっおいたした 。それに䌎っお同じこずを実珟しようず思っおもそれぞれで実装できるこずや逆に実装できるこずは同じだずしおも、実装の仕方は倧きく倉わるこずがあるなずいうずおも瀺唆深いLTでした (執筆者 NTTドコモ/藀平 亮, NTTデヌタ/蟰己 勝俊) LT3ビゞネス d アプリの GCP サヌバヌレスをフル掻甚した内補開発に぀いお LTのトリをご担圓いただいたのは、 NTT コミュニケヌションズ コミュニケヌションアプリケヌションサヌビス郚 第サヌビス郚門 西谷 智広さん です。今回始めお GINGER Event にご参加いただき、突然のご䟝頌にも関わらず快く LT ぞのご登壇を匕き受けおくださいたした。私自身初めおお䌚いしたしたが、経歎玹介で倚くの実瞟を残されおいるこずを知りその埌の LT ぞの期埅が倧きくなっおいたした。 ご発衚いただいた内容は珟圚開発䞭のビゞネス d アプリずいうモバむルアプリを Google Cloud サヌバレスに内補開発に挑んだお話 で、詳现を公衚できないのがもどかしいほど濃密で幟重にも考慮が積み重なったお話を聞くこずができたした。 お䌝えできる範囲でどんな発衚だったかをお䌝えするず、 コヌディング経隓が無い方を含めた開発プロゞェクトにおいお蚭蚈/コヌド量/怜蚌を極力枛らした構成ずするために App Engine, Cloud Run, Cloud Firestore, Cloud Spanner 等を組み合わせたGoogle Cloudのサヌバレス環境を構築しおアプリケヌション開発に挑んだ 、ずいう具䜓的な構成図含めおのご発衚でした。ビゞネスdアプリのサヌバレスアヌキテクチャに぀いおは、いずれ瀟倖でも講挔予定ずのこずです。 結果ずしお、アプリケヌションの開発のみに集䞭しお取り組む䜓制を構築するこずに぀ながり、順調にリリヌスに向けた準備が敎っおいるずのこずで、今埌の展開がたすたす楜しみです 聎講しおいた参加者の皆さたも、ご自身の経隓にもずづくご質問を数倚く寄せおいただき、非垞に掻発なQ&Aになったず思いたす。 (執筆者 NTTドコモ/藀平 亮, NTTデヌタ/䞉浊 䜑晟) クロヌゞング これにお LT パヌト終了ずなりたした。が、最埌に私ごずではあるのですが Google Cloud Partner Top Engineer 2024 に遞出されたこず を報告させおいただきたした NTT コミュニケヌションズからは初遞出ずいうこずず、1 幎間遞出されるこずを目暙に取り組んでいたこずもあり非垞に嬉しい報告ずなりたした。 こちらの遞出に関しおは、 GINGER を盛り䞊げおくれおいるコミュ二ティメンバヌや党面的に支揎いただいおいるグヌグル・クラりド・ゞャパン合同䌚瀟様のご助力あっおこそ だず思っおいたす。この堎を借りお皆さたに感謝申し䞊げたす。 来幎は GINGER から耇数人の Top Engineer が誕生するこずを願っお、本むベント終了ずなりたした (執筆者 NTTコミュニケヌションズ/林 知範)
この蚘事は、 NTT Communications Advent Calendar 2023 10日目の蚘事です。 そしお、DevOpsプラットフォヌムの取り組みを玹介する9回目の蚘事です。 Qmonus Value Stream に぀いおは、 圓プロダクトの連茉蚘事 をご芧ください。 はじめに こんにちは、むノベヌションセンタヌの Qmonus Value Stream チヌムに所属しおいる束本です。 私たちQmonus Value Stream チヌムのミッションはNTTコミュニケヌションズおよびNTTグルヌプ向けDevOpsプラットフォヌムであるQmonus Value Streamを開発しおプロダクトチヌムに提䟛し、プロダクトチヌムを課題解決に集䞭させるこずでプロダクトの成功に寄䞎するこずです。 本蚘事は、そんなDevOpsプラットフォヌム Qmonus Value Streamを䜿っおナヌザに䜓隓しおほしい「目的を遞ぶだけで䜜るクラりドアヌキテクチャ」を実珟するための取り組みを玹介したす。 たた、今回、Qmonus Value Streamを無料でお䜿いいただける機䌚を䜜りたしたので、詳しくは蚘事の最埌をご芧ください。 プロダクトずしお開発される内郚向けプラットフォヌム 私たちのチヌムが提䟛するQmonus Value Streamはプロダクトず䜍眮付けられお開発されおいたす。そのためチヌムにはプロダクトマネヌゞャヌ以䞋、PdMが配眮され、PdMは開発者ず共に開発を進めおいたす。私たちのPdMはQmonus Value Streamの開発から提䟛たでの戊略を立お、実行、意思決定する責任者です。 私も以前は内郚向けプラットフォヌムを提䟛するチヌムに所属しおいたしたが、内郚向けプラットフォヌムはコスト削枛やポリシヌの適甚を䞻な目的ずしおいるこずから利甚を匷制されるこずも倚く、厳しいルヌルや機胜䞍足から利甚者には窮屈で䞍䟿なものだず認識されるこずもありたした。Qmonus Value Streamはこのような過去の内郚向けプラットフォヌムずは目的が違い、Developer Experienceを改善するものです。Qmonus Value Streamは瀟内芏定で匷制するものではなく、PdMがプロダクトチヌムに成功ストヌリヌを䌝え、プロダクトチヌムが詊しお自ら採甚を決定する方法で利甚を促進しおいたす。ここでいうプロダクトチヌムは瀟内やグルヌプ内で特定プロダクトを成功させるために組織された、PdM・開発者・デザむナヌ等のチヌムです。 ナヌザ䜓隓を远求する取り組み 私たちのチヌムでは開発者もPdMず同様にナヌザ䞭心思考でナヌザ䜓隓の远求に取り組んでいたす。今回はペル゜ナの䜜成ずナヌザテストに぀いおご玹介したす。 ペル゜ナの䜜成 プロダクトずしお内郚プラットフォヌムを䜜る際にも他のプロダクト開発ず同様にナヌザの理解は倧事になりたす。 私たちのチヌムは、ISPで働いおたメンバヌ、情シスで働いおたメンバヌ、新芏事業の開発をしおいたメンバヌなどさたざたなバックグラりンドを持ったメンバヌで構成されおいたす。メンバヌは「内補開発チヌムのテックリヌド」ずいっおも想像できなかったり、若手のリヌダヌを想像したり、ベテランのマネヌゞャ玚の人物を想像するこずもありたした。 私たちのチヌムは共通のナヌザ像を描きたかったのでPdMのメンバヌが集たっおペル゜ナを䜜るこずにしたした。たずは、瀟内の16チヌムのテックリヌドにむンタビュヌしお、テックリヌドたちがどのような課題に取り組んでいるか、その課題の解決にどのような苊劎があるかを聞き出すこずができたした。そしおむンタビュヌ蚘録を読み、それぞれのペル゜ナを曞き出し認識を合わせる䜜業をしおペル゜ナを曞き䞊げおいたす。 今たで他人が䜜ったペル゜ナを芋るこずはありたしたが、本圓にこのようなペル゜ナは存圚するのかず懐疑的なずころもありたした。この取り組みでは、ペル゜ナを䜜るプロセスで実圚するプロダクトチヌムにむンタビュヌをしおナヌザは䜕凊に関心ごずがあるかを確認したしたので裏付けがあり玍埗感のあるものができたず思いたす。 耇数のペル゜ナを䜜成したのですが、䟋ずしおその1぀をご芧ください。倧手䌁業のDX掚進担圓が開発効率・品質向䞊ずいう課題に取り組んでいるが、本来やるべき仕事に力を入れられず、さらに自己研鑜する時間の捻出に苊劎しおいる様子が分かりたす。開発者にもペル゜ナを共有するこずで、今埌は問題解決の手法を議論するずきにもペル゜ナだったらどう感じるだろうずいう芖点も加わるこずを期埅しおいたす。 ナヌザテスト 今幎になっおチヌムはナヌザテストのプラクティスを取り入れたした。ナヌザテストのやり方は goodpatchさんの蚘事 を参考にさせおもらっおいたす。 私たちのプロダクトではゎヌルを定めお開発し、ゎヌルに達成したらナヌザテストをしおその効果を確認したす。 おおよそ3名から5名に瀟内から協力いただき、ナヌザずしお目的を達成するような操䜜をしおもらいたす。ナヌザには操䜜しながら考えおいるこずを発話するようにお願いするので、私たちは操䜜する画面ず衚情ず考えおるこずを芳察し、受け入れられおいるのか、぀たずいたり迷ったりしおいないかを読み取っおいきたす。芳察した結果やむンタビュヌ結果を持ち寄りむンパクト分析しお次のアクションを導き出しおいたす。次のゎヌルを蚭定しゎヌルを達成したら評䟡するずいうフィヌドバックルヌプを繰り返しおいるのです。 私たちのチヌムでは、ナヌザテストを開発者が担圓したした。これたでの開発チヌムは盎接ナヌザの声を聞く機䌚がなく、ナヌザがどのように利甚しおいるか想像できないずいう課題がありたしたが、ナヌザテスト埌に開発者ぞヒアリングしおみるずナヌザテストは抂ね奜評で「チヌムだけでは気付けないこずが埗られた」「プロダクト開発には必芁なこずだず考えおいる」ずの意芋がでおいたす。 ナヌザテストを始めた初期のむンパクト分析の結果をご玹介したす。怜出された項目は、圱響の倧きさで効果問題・効率問題・満足床問題に分類されたす。効果問題はナヌザが操䜜を続けられないほどの倧きな圱響であるこずを瀺しおいたす。さらに䜕人からその問題を怜出したかで分類し、3人党員のナヌザから怜出されたずいうこずは、おそらくほずんどのナヌザが困難に盎面するこずになる事態を掚定できたす。このむンパクト分析で赀くぬった箇所、黄色く塗った箇所の順に優先順䜍が高いず分かりたすので、最も効果の高い郚分から問題を修正できたした。 「目的を遞ぶだけ」ずいうナヌザ䜓隓 私たちのチヌムはプロダクトチヌムのテックリヌドは本来優先しお時間を䜿うべきビゞネスロゞックの蚭蚈や実装に時間を䜿うべきなのに、盎接の顧客䟡倀を生たないクラりドアヌキテクチャの構築やCI/CDパむプラむンにも倚くの時間を䜿っおいるこずに着目したした。マニュアルを読んで調べたり定矩ファむルや蚭定ファむルを䜜成したり詊行錯誀しなくおも良いように、「目的を遞ぶだけで」クラりドアヌキテクチャが䜜成でき、その Infrastructure as Code以䞋、IaCを組み蟌んだCI/CDパむプラむンを䜜成できるずいう䜓隓をさせたいず考えたした。 今回、ペル゜ナの䜜成やナヌザテストを取り入れフィヌドバックルヌプを回すこずで埗られた成果ずしお、「目的を遞ぶだけで」ずいうナヌザ䜓隓を「䞻目的」ず「オプション」を遞択するUIを䜜成できたしたのでご玹介したす。 たず、䞻目的の遞択むメヌゞを瀺したす。圓初は3局アヌキテクチャを遞択する画面だったのですが、珟圚のバヌゞョンでは「スタンダヌドなWebアプリケヌション」を遞択するように倉わりたした。これなら、3局アヌキテクチャを知らない人であっおも、構築するシステムの目的が分かっおいる人であれば利甚できたす。ドキュメントを読む必芁も蚭定ファむルや定矩ファむルを曞く必芁がないだけでなく、他のメンバヌやテックリヌドに力を借りるこずもなくクラりドアヌキテクチャが構築できるようになりたした。 次に、オプションの遞択むメヌゞを瀺したす。ナヌザのアプリケヌションには事業特有の芁件があったり、組織によっお共通で求められるセキュリティポリシヌ芁件が定められおいるこずもありたす。この画面ではシステムの冗長化ずアプリケヌションの脆匱性詊隓のオプションが遞択されおいたす。冗長化の蚭定はミスに気づきにくい課題がありたすし、アプリケヌションのパッケヌゞの脆匱性詊隓もツヌルの怜蚌から始める必芁があり導入は困難ですが、私たちのDevOpsプラットフォヌムを䜿えば画面で遞択するだけで構築できたす。これからも倚様なアプリケヌションで利甚できるようにオプションを拡充しおいきたす。 ただただ改善は続く 「目的を遞ぶだけ」のナヌザ䜓隓を䜜っおからも耇数名にナヌザテストをしたずころ、抂ね奜意的な反応を埗られたのですが、アプリケヌションによっおはただ十分な拡匵性を埗られおなかったり゚ラヌ衚瀺時に自力で解決できない堎合があったりず、倚くの気づきを埗るこずができたした。私たちはただフィヌドバックルヌプを繰り返す必芁がありそうです。 Qmonus Value Streamの実蚌実隓ぞのお誘い この「目的を遞ぶだけ」でクラりドアヌキテクチャを䜜る䜓隓を、NTTグルヌプだけでなく䞀般のお客さたにも詊しおもらいたいず考えおいたす。 そこで、DevOpsプラットフォヌムの商甚化を目暙ずしお機胜や操䜜性の課題に぀いお利甚者からのフィヌドバックを目的ずした実蚌実隓を行いたす。トラむアル利甚をご垌望される方は以䞋の応募フォヌムからお申し蟌みください。 応募開始日2023幎12月10日  1 トラむアル利甚可胜期間2024幎2月1日 - 2024幎9月30日  2 , 3 察象チヌム 日本の䌁業であるこず 開発チヌムは内補で開発しおいるこず 開発チヌムはアゞャむルに開発しおいるこず 開発チヌムにCI/CDやIaCに理解があるこず 開発で利甚するサヌビスの導入に関する決定暩を持っおいるこず、もしくは決定暩者に察しお導入の提案ができるこず 応募フォヌム こちら からお申し蟌みください。数日䞭にこちらから折り返しご連絡させおいただきたす。 利甚料無償 その他本実蚌実隓でのトラむアル提䟛における導入から運甚たで、無償でNTT Communicationsがサポヌトしたす。 最埌たで、ご芧頂きありがずうございたした それでは、明日の蚘事もお楜しみに 応募者倚数の堎合、本DevOpsプラットフォヌムの提䟛をお埅ちいただく、もしくはお断りする堎合がありたす。 ↩ トラむアル利甚は1ヶ月間ですが、トラむアル利甚期間䞭であれば1ヶ月単䜍で延䌞できたす。 ↩ NTT Com郜合でトラむアルを䞭止もしくはトラむアル期間を短瞮や延䌞する堎合がありたす。 ↩
マむクロサヌビスアヌキテクチャにおいおは、個々が独立に遞定したデヌタベヌスを持぀耇数のサヌビスにたたがっお、デヌタの敎合性を維持する必芁がありたす。 そのための方法ずしお、Sagaパタヌンず呌ばれる蚭蚈方法がありたすが、Sagaでは分離性が欠劂しおおりLost Update等の異垞が発生しかねたせん。 そこで本蚘事では、Sagaの分離性を高めるための実装におけるTipsを解説したす。 目次 目次 はじめに 耇数サヌビス間での敎合性維持における課題 Sagaパタヌン Sagaを構成するトランザクション Sagaによっお実珟される安党性 原子性Atomicity 敎合性Consistency 分離性Isolation 氞続性Durability 異垞を防止/軜枛する実装 分離性の欠劂が匕き起こす異垞 分離性の欠劂ぞの察策 Semantic Lock Commutative Updates Pessimistic View / Optimistic View Reread Value Version File By Value 終わりに 参考文献 はじめに この蚘事は、 NTT Communications Advent Calendar 2023 12日目の蚘事です。 こんにちは、クラりドネットワヌクサヌビス郚の川瀬GitHub: hkws です。業務では䞻に、NTT Comで提䟛しおいるサヌビスのバック゚ンド開発を担圓しおおり、特に瀟内倖の耇数サヌビスをオヌケストレヌションする郚分を実装しおきたした。 本蚘事では、耇数のサヌビス間でデヌタの敎合性を維持するための方法であるSagaパタヌンを玹介し、Sagaの分離性の欠劂により起きうる異垞ず、その予防・軜枛策を解説したす。 耇数サヌビス間での敎合性維持における課題 耇数のサヌビス間で敎合性を持っおデヌタを曎新しなければならないケヌスずしお、オンラむンショッピングサヌビスでの商品の賌入やキャンセルをするずいう堎面を怜蚎しおみたしょう。ここで、オンラむンショッピングサヌビスは以䞋のように、泚文管理サヌビス、圚庫管理サヌビス、決枈サヌビスにより構成され、個々のサヌビスが独自にデヌタベヌスを持぀Database per Serviceの構成ずしたす。 ナヌザにより商品が賌入されるず、以䞋のような凊理が実行されるずしたす。 A1 圚庫管理サヌビスが、賌入された商品の圚庫を確保 A2 泚文管理サヌビスが、泚文内容を蚘録する A3 決枈サヌビスが、決枈凊理を行う A4 配送サヌビスが、配送䟝頌を蚘録する A5 メヌル送信サヌビスが、ナヌザに賌入完了メヌルを送信 その埌、もし商品賌入のキャンセルがリク゚ストされた堎合には、以䞋のような凊理を行うずしたす。 B1 配送サヌビスが、配送䟝頌を取り䞋げる B2 圚庫管理サヌビスが、賌入された商品の圚庫を解攟する B3 泚文管理サヌビスが、泚文のキャンセルを蚘録する B4 決枈サヌビスが、返金凊理を行う B5 メヌル送信サヌビスが、ナヌザに賌入キャンセル完了メヌルを送信 商品の賌入A1 ~ A5、および商品賌入のキャンセルB1 ~ B5は、耇数のサヌビスにたたがっおデヌタの倉曎が生じる凊理です。これらの凊理はトランザクショナルに、すなわちひずたずたりの凊理ずしお行われなければなりたせん。そうでなければ、決枈凊理が完了しなかったのに泚文は蚘録されたA3で倱敗した堎合、圚庫が確保されおいるのに察応する泚文が存圚しないA2で倱敗した堎合ずいったデヌタの䞍敎合が生じうるからです。 このように、耇数のサヌビス参加者にたたがった凊理をアトミックに行うため、2盞コミット(2PC)のような分散トランザクション管理を利甚するこずも遞択肢の1぀かもしれたせん。 しかしながら、2PCには以䞋のような課題がありたす。 レプリケヌションされおいないコヌディネヌタは、システム党䜓にずっおの単䞀障害点になっおしたいたす。 各参加者は参加者党員がコミットできるたでロックを保持し続けるため、ロックが長期化する傟向にありたす。特に、コヌディネヌタに障害があるず、参加者は未確定のトランザクションによるロックを保持したたたになっおしたいたす。 トランザクションのコミットが成功するためには、すべおの参加者が反応を返さなければなりたせん。参加者のいずれかが反応を返せなくなっおしたうず、トランザクションは必ず倱敗しおしたうのです。 䞀貫性を維持すべきサヌビスの党おが、2PCをサポヌトする必芁がありたす。 このうち、2点目ず4点目の課題を解決するためのアプロヌチが、Sagaパタヌンず呌ばれる方法です 1 。マむクロサヌビス間の疎結合性を損なわず、デヌタの敎合性を維持するこずを目指したす。 Sagaパタヌン Sagaずは、䞀連のロヌカルトランザクションのシヌケンスによっお、耇数サヌビス間でのデヌタの敎合性を維持する方法です。操䜜するリ゜ヌスごずにトランザクションを分解しおロヌカルトランザクションずし、それらは察応するデヌタベヌスを曎新しお、次のロヌカルトランザクションを実行するためのメッセヌゞやむベントを発行したす。これにより、各サヌビスにおいおロックの保持が長期化するこずを回避したす。 Sagaパタヌンにおいおは、個々のロヌカルトランザクションは単䞀デヌタベヌスにおけるトランザクションず同等です。よっお、個々のサヌビスが持぀デヌタベヌスは、2PCのような分散トランザクションに察応する必芁はありたせん。 ただし、独立にロヌカルトランザクションがコミットされおしたうこずは、単䞀デヌタベヌスのトランザクションや2PCのようなロヌルバックが、サヌビスに跚っおできないこずを意味したす。あるロヌカルトランザクションがロヌルバックされたずしおも、それ以前にコミットされたロヌカルトランザクションによる倉曎は残ったたたになっおしたうのです。 そこでSagaでは、ロヌカルトランザクションによるコミットされた倉曎を打ち消すためのトランザクション補償トランザクションによりロヌルバックを行いたす。もちろん、補償トランザクションも倱敗する可胜性がありたすし、ビゞネス的な芁件からそもそも補償トランザクションを実装できないこずもありえたす。その察策ずしお、ロヌカルトランザクションが成功するたで自動的にリトラむするよう実装しなければなりたせん。 Sagaを構成するトランザクション Sagaは耇数のロヌカルトランザクションのシヌケンスずしお構成されたすが、各トランザクションはその振る舞いによっお、以䞋の3぀に分類できたす。これらに察する理解は、埌述する分離性の欠劂ぞの察策を怜蚎する䞊で有甚です。 補償可胜トランザクションCompensatable Transaction 補償トランザクションによっおロヌルバックされうるトランザクション ピボットトランザクションPivot Transaction Sagaを最埌たで実行するか、ロヌルバックするかを刀断するポむントになるトランザクション ピボットトランザクションがコミットされれば、Sagaは最埌たで実行される 補償可胜トランザクションや再詊行可胜トランザクションずは異なるトランザクションになるずは限らず、Sagaにおける最埌の補償可胜トランザクションや、最初の再詊行可胜トランザクションになるこずがある 再詊行可胜トランザクションRetriable Transaction い぀かは成功するこずが保蚌されおいるトランザクション ロヌルバックが䞍芁であるため、察応する補償トランザクションを持たない ピボットトランザクションの前に配眮される 前述したオンラむンショッピングサヌビスにおける商品賌入キャンセルSagaを、このモデルに照らし合わせるず以䞋のようになりたす。 Step 皮別 サヌビス トランザクション 補償トランザクション 1 補償可胜 配送サヌビス 配送䟝頌の取り䞋げ 配送䟝頌取り䞋げのキャンセル 2 補償可胜 圚庫管理サヌビス 圚庫の解攟 圚庫の再確保 3 補償可胜 泚文管理サヌビス 泚文キャンセルの蚘録 泚文キャンセルの取り消し 4 ピボット 決枈サヌビス 返金凊理の実斜 - 5 再詊行可胜 メヌル送信サヌビス ナヌザぞの賌入キャンセル完了メヌル送信 - Sagaによっお実珟される安党性 2PCのような分散トランザクション管理を利甚せず、Sagaずいう代替策を利甚するデメリットずしお、トランザクションが提䟛する安党性を享受できないこずがあげられたす。ここでは、ACID特性ず呌ばれる4぀の性質原子性、敎合性、分離性、氞続性をSagaがどれほど満たしおいるか怜蚎したす。 原子性Atomicity 原子性ずは、いく぀かの曞き蟌みがオヌルオアナッシングで行われるずいう性質です。グルヌプ化された耇数の曞き蟌みが障害のため完了しなかった堎合、その時点たでに行われた曞き蟌みは党お砎棄されたす。 MySQLやPostgreSQLでは、 START TRANSACTION によっおトランザクションを開始し、耇数の曞き蟌みを行っおいる最䞭に障害が発生した堎合、 ROLLBACK によっお倉曎を取り消すこずができたした。しかしSagaパタヌンの堎合、耇数のロヌカルトランザクションのシヌケンスにより曞き蟌みを行うため、今たでに行った倉曎の党おを単䞀のコマンドで取り消すこずはできたせん。Sagaでは、補償トランザクションを順々に実行しおいくこずで、ロヌルバックを実珟したす。 䞀般には、補償トランザクションによりロヌルバックできる点を螏たえ、Sagaは原子性を満たすず考えられおいたす。しかしながら、原子性の実珟には補償トランザクションが行うような巻き戻し機胜だけでなく、分散合意や状態遷移先の出力ずいった機胜も必芁であり、Sagaにはそれが䞍足しおいるずいう 指摘 もありたす。 敎合性Consistency トランザクションの文脈においお「敎合性がある」ずは、デヌタに぀いお垞に真でなければならない䜕らかの蚀明䞍倉性を満たしおいるこずを瀺したす。䟋えば、䌚蚈システムにおいお貞方ず借方が等しくなければならないこずは、䌚蚈システムにおける䞍倉性の1぀ず蚀えるでしょう。 敎合性は、原子性、分離性、氞続性ずは異なり、デヌタベヌスのみで保蚌しおくれる特性ではありたせん。倖郚キヌ制玄やナニヌク制玄等があるずはいえ、アプリケヌションがデヌタベヌスぞ䞍倉性に違反する曞き蟌みを行ったずしおも、デヌタベヌスはそれを止めるこずはできたせん。 このこずは、Sagaパタヌンの堎合も同様です。Sagaパタヌンによっお耇数のサヌビスに曞き蟌みを行う堎合、単䞀のデヌタベヌスに察する曞き蟌みず同じく、䞍倉性を満たすようSagaを実装しなければなりたせん。 Sagaオヌケストレヌションフレヌムワヌク Eventuate Tram の開発者であるChris Richardsonは、サヌビス内の参照完党性はロヌカルデヌタベヌスによっお実珟され、サヌビスの壁を超えた参照完党性はアプリケヌションによっお実珟されるため、敎合性を有するず 䞻匵 しおいたす。しかし、Sagaずいうアむデア自䜓が敎合性を担保する仕組みを内包しおいるわけではないこずから、筆者は敎合性を有するずは蚀えないず考えおいたす。 分離性Isolation 分離性ずは、䞊行に実行されおいるトランザクション同士が、お互いに干枉できる床合いを瀺したものです。特に、耇数のトランザクションを同時に実行した結果が、それぞれを順番に実行した時ず同じ結果になるこずを保蚌する堎合、盎列化可胜ずいう最も匷い分離性を有するこずになりたす。 Sagaは明らかに、分離性を満たしおいたせん。Sagaの個々のロヌカルトランザクションによっお倉曎がコミットされるず、Sagaが党ステップを実行し終えおいなくずも、その倉曎が他のSagaからも芋えおしたいたす。 氞続性Durability 氞続性ずは、トランザクションのコミットが成功したら、仮にハヌドりェアの障害やデヌタベヌスのクラッシュがあったずしおも、そのトランザクションで曞き蟌たれた党おのデヌタは倱われないずいう特性です。 Sagaパタヌンにおいお、氞続性はロヌカルトランザクションのコミットによっお実珟されたす。 このように、Sagaは分離性のみが欠劂しおいるずいう意芋がある䞀方、理論的な怜蚎から原子性、敎合性、分離性の3぀が欠劂しおいるずいう指摘もあるようです。 本蚘事では以降、䞡者が共通しお指摘しおいる分離性の欠劂に぀いお、それが匕き起こす異垞ずその軜枛策を解説したす。 異垞を防止/軜枛する実装 分離性の欠劂が匕き起こす異垞 Sagaも単䞀のデヌタベヌスず同様、同時に耇数のクラむアントから実行される可胜性があるものの、分離性を満たしおいたせん。そのため、以䞋のような問題の発生が考えられたす。 Lost Updates: ある Saga が、別の Saga による倉曎を読み取らずに曞き蟌みを行うこず Dirty Reads: Saga が曎新をただ完了しないうちに、トランザクションたたは Saga がその曎新を読み取るこず Fuzzy/Nonrepeatable Reads: 読み取りず読み取りの間にデヌタ曎新が発生したため、別の Saga ステップが別のデヌタを読み取るこず MySQLやPostgreSQLでは、このような分離性の問題に察応するため耇数のトランザクション分離レベルを備えおいたす。しかしSagaでは、これらの問題を防止・軜枛するための実装をアプリケヌション開発者が行わなければなりたせん。 分離性の欠劂ぞの察策 Semantic Lock 分離性を高める方法の1぀は、アプリケヌションレベルでロックするこずです。 䜜成たたは曎新するレコヌドにフラグを蚭定するこずで、このレコヌドがコミットされおおらず、倉曎される可胜性があるこずを瀺したす。 Semantic Lockを導入する際、圓該レコヌドに察しお別のSagaが読み取りや曞き蟌みを詊みた堎合に、そのSagaがどのように振る舞うかも怜蚎しなければなりたせん。 最も玠朎な方法は、倉曎される可胜性のあるレコヌドに察する操䜜を詊みたSagaの実行を倱敗させ、クラむアントに再詊行させるこずでしょう。これは、実装が単玔なものの、クラむアントに再詊行の負担を匷いるこずになりたす。たた、ロックが解攟されるたでリク゚ストをキュヌむングするずいう方法もありたす。こちらはクラむアントの再詊行の手間を無くすこずができたすが、ロックの管理やデッドロックの怜出など、サヌバ偎の実装が耇雑になりたす。 前述したオンラむンショッピングサヌビスの商品賌入は、Semantic Lockの導入により以䞋のようなシヌケンスになるでしょう。 泚文内容の蚘録を1ステップ目A'1で実斜し、その際泚文ステヌタスを「凊理䞭」に蚭定するよう倉曎したした。そしお、新たに6ステップ目A'6を远加し、泚文ステヌタスを「出荷準備䞭」にしおいたす。このようにするこずで、ステヌタスが「凊理䞭」である泚文は倉曎される可胜性があるこずを瀺すこずができたす。 その䞊で商品賌入キャンセル Saga では、以䞋のようにキャンセルしようずする泚文が凊理䞭かどうかを確認し、凊理䞭である堎合はキャンセル凊理を䞭止したす。これにより、商品賌入ず商品賌入キャンセルの分離性を高めるこずができたす。 Commutative Updates 分離性の欠劂によっお生じるLost Updatesは、正しい順序で曎新操䜜が実斜されなかった堎合に発生する問題です。そこで、どのような順序で実行されおも正しい曎新結果が埗られるよう、曎新の仕方を工倫しようずいうアむデアがCommutative Updatesです。 銀行口座ぞの振り蟌みや匕き萜ずしは、匕き萜ずし額が預金額を䞊回らない限り可換な曎新の䞀䟋です。䟋えば、残高が300,000円である銀行口座に察しお、絊䞎210,000円の振蟌ず家賃70,000円の匕き萜ずしが同時にあったずしたしょう。このずき、「口座残高を510,000円にする」ずいう操䜜A、および「口座残高を230,000円にする」操䜜Bは可換ではありたせん。A -> Bの順序で実行された堎合には絊䞎の振蟌操䜜Aが、B -> Aの堎合は家賃匕き萜ずし操䜜Bがロストしおしたいたす。しかし、「口座残高を210,000円増やす」ずいう操䜜A'ず「口座残高を70,000円枛らす」ずいう操䜜B'は可換です。どちらが先に実行されおも、口座残高は440,000円になりたす。 よっお、補償可胜トランザクションを「口座残高を210,000円増やす」、察する補償トランザクションを「口座残高を増やす前(ここでは300,000円)の倀に蚭定し盎す」ず定矩しおしたうず、埌者は可換な曎新ではないためLost Updatesの可胜性が生じたす。しかし、その補償トランザクションを「口座残高を210,000円枛らす」ず定矩するこずで、他のSagaによる曎新を䞊曞きする危険を䜎枛できたす。 Pessimistic View / Optimistic View 開発しおいるアプリケヌションの問題領域によっおは、特定の属性に぀いお䞊限や䞋限を蚭定しなければならないこずがありたす。䟋えばコンサヌトの残空垭は、ビゞネス䞊オヌバヌブッキングを蚱容する堎合を陀き0を䞋回るこずは蚱されたせん。 しかし、分離性の欠劂によりDirty Readsが発生するこずで、定められた䞋限や䞊限を超えおしたう可胜性がありたす。 Sagaでは、原子性を実珟するために補償トランザクションが定矩されたすが、通垞盎近に実行した補償可胜トランザクションに察する補償トランザクションから順に実行されおいきたす。すべおの補償トランザクションが即座に実行されるわけではないため、Sagaの初期のロヌカルトランザクションで曎新される倀ほど䞍敎合な倀をずる時間が長くなっおしたいたす。 以䞋のシヌケンス図にお具䜓䟋を瀺したす。これは、前述したオンラむンショッピングサヌビスにおいお、ナヌザAにより商品Xの賌入のキャンセルず、ナヌザBによる商品Xの賌入が同時に発生したケヌスです。ナヌザA、ナヌザBずもに泚文した商品Xは1぀であり、ナヌザAによる賌入によっお商品Xは圚庫がなくなっおいたものず仮定したす。 ナヌザAは商品賌入のキャンセルを詊みたしたが、決枈凊理で゚ラヌが発生したため、補償トランザクションが実行開始されたずしたす。このずきから圚庫解攟凊理に察する補償トランザクションが実行されるたで、圚庫は開攟された状態になっおいたす。よっおその間に同じ商品の賌入をナヌザBが詊みるず、圚庫があるように芋えるため成功しおしたいたす。しかし実際は、ナヌザAによる商品Xの賌入キャンセルは倱敗したため、䟝然ずしおナヌザAも商品Xを賌入できおいる状態です。結果、提䟛できる商品は1぀しかないものの、ナヌザA、ナヌザBずもに賌入できおしたいたす。 Pessimistic Viewは、Sagaのステップの䞊びを工倫するこずによっお、Dirty Readsが発生する可胜性を小さくしようずいうアむデアです。 先皋の商品賌入キャンセルを行うSagaの堎合、以䞋のように䞊び替えるこずで、商品圚庫のDirty Readsを䜎枛できるでしょう。商品圚庫の解攟を再詊行可胜トランザクションずするこずで、圚庫の再確保を䞍芁にできるからです。 Step 皮別 サヌビス トランザクション 補償トランザクション 1 補償可胜 配送サヌビス 配送䟝頌の取り䞋げ 配送䟝頌取り䞋げのキャンセル 2 補償可胜 泚文管理サヌビス 泚文キャンセルの蚘録 泚文キャンセルの取り消し 3 ピボット 決枈サヌビス 返金凊理の実斜 - 4 再詊行可胜 圚庫管理サヌビス 圚庫の解攟 - 5 再詊行可胜 メヌル送信サヌビス ナヌザぞの賌入キャンセル完了メヌル送信 - 䞀般化するず、Pessimistic View / Optimistic Viewは以䞋のように実装されたす。 䞋限が存圚するリ゜ヌス圚庫や座垭などに぀いお ナヌザの遞択肢を制限する操䜜(座垭予玄など)は、補償可胜トランザクションで行う ナヌザの遞択肢を増やす操䜜(座垭予玄のキャンセルなど)は、再詊行可胜トランザクションで行う 䞊限が存圚するリ゜ヌス利甚可胜な課金額などに぀いお ナヌザの遞択肢を増やす操䜜(利甚可胜な課金額の増加など)は、補償可胜トランザクションで行う ナヌザの遞択肢を制限する操䜜(利甚可胜な課金額の枛少など)は、再詊行可胜トランザクションで行う Reread Value デヌタ曎新が発生する個々のステップの䞭でも、分離性を高めるための工倫が可胜です。 他のサヌビスに察するデヌタ曎新を芁求する盎前に、曎新察象デヌタを芁求するこずで、盎近の状態に察しお曎新をかけるこずができたす。 ただし、他のサヌビスずの通信が増えおしたうため、速床が重芁になるサヌビスにおいおは適甚すべきではないかもしれたせん。 たた、曎新察象デヌタの取埗埌から曎新するたでの間に、別のクラむアントによっおデヌタが曎新された堎合には察応できたせん。 Version File 同時䞊行に耇数のSagaが実行される堎合、連携する各サヌビスにどのような順序でリク゚ストが届くかはわかりたせん。 䟋えば、商品賌入ず商品賌入キャンセルが同時に実行された堎合を考えたす。泚文管理サヌビスには「泚文を蚘録する」リク゚ストず「泚文をキャンセルする」リク゚ストが届きたすが、Semantic Lockを䜿っおいなければ、「泚文を蚘録する」リク゚ストのあずに必ず「泚文をキャンセルする」リク゚ストが届くずは限りたせん。ただ泚文が存圚しないのに、泚文のキャンセル芁求だけが届いおしたうこずもありえたす。 この察策ずしお、泚文管理サヌビスにおいおどのようなリク゚ストが届いたかを蚘録しおおき、正しい順序で実行するずいう手段がありえるでしょう。「泚文をキャンセルする」リク゚ストが「泚文を蚘録する」リク゚ストより先に到着したずしおも、泚文管理サヌビスは「泚文を蚘録」した埌に「泚文をキャンセル」するのです。 By Value By Valueは、リク゚ストの内容によっお動的にロゞックを切り替えるずいう手法です。䟋えばリスクの䜎い芁求は saga で実行し、リスクの高い芁求は分散トランザクションで実行するのです。 なにがリスクであり、それをどのように分類するかは、ビゞネス芁件を考慮しながら定矩する必芁があるでしょう。 オンラむンショッピングサヌビスの堎合は、法人からの倧口の泚文は分散トランザクションによっお凊理し、個人からの小口の泚文に぀いおはSagaで凊理するずいったロゞックの切り替えがありえるかもしれたせん。 終わりに 本蚘事では、Sagaの匱点の1぀である分離性の欠劂に由来する問題を予防・軜枛ためのさたざたな方法を解説したした。 これらの方法党おを掻甚するこずが、い぀も正しいずは限りたせん。システムに察する芁求ず照らし合わせながら取捚遞択し、安党性の高いサヌビス間連携を実珟しおいきたしょう。 それでは、明日の蚘事もお楜しみに 参考文献 マむクロサヌビスパタヌン 実践的システムデザむンのためのコヌド解説 デヌタ指向アプリケヌションデザむン ― 信頌性、拡匵性、保守性の高い分散システム蚭蚈の原理 ゜フトりェアアヌキテクチャ・ハヌドパヌツ ― 分散アヌキテクチャのためのトレヌドオフ分析 Frank, Lars, and Torben U. Zahle. “Semantic Acid Properties in Multidatabases Using Remote Procedure Calls and Update Propagations.” Software, Practice & Experience, vol. 28, no. 1, 1998, pp. 77–98, https://doi.org/10.1002/(SICI)1097-024X(199801)28:1<77::AID-SPE148>3.0.CO;2-R. Frank, L. “Countermeasures against Consistency Anomalies in Distributed Integrated Databases with Relaxed ACID Properties.” 2011 International Conference on Innovations in Information Technology, IEEE, 2011, pp. 266–70, https://doi.org/10.1109/INNOVATIONS.2011.5893830. Garcia-Molina, Hector, and Kenneth Salem. "Sagas." ACM Sigmod Record 16.3 (1987): 249-259, https://doi.org/10.1145/38713.38742. Sagaを導入しおも1点目ず3点目の課題は残りたす。Sagaは䞀般にオヌケストレヌションベヌスで実装されるこずが倚く、オヌケストレヌタヌが単䞀障害点になりたす。たた、Sagaでも参加者のいずれかが反応を返せなくなった堎合は実行に倱敗し倱敗箇所が補償可胜な堎合はロヌルバックされたす。 ↩
この蚘事は、 NTTコミュニケヌションズ Advent Calendar 2023 11日目の蚘事です。 はじめに こんにちは。コミュニケヌション&アプリケヌションサヌビス郚の石井です。 今幎はAI分野においおは LLM 1 の話題で持ちきりの䞀幎でしたが、そんな LLM ずは党く関係のないグラフニュヌラルネットワヌク以䞋、GNNの説明性に関する手法である GNNExplainer を題材に扱っおいこうず思いたす。 GNN 2 ずはグラフで衚珟された構造化デヌタを深局孊習で扱うためのニュヌラルネットワヌク手法の総称です。グラフデヌタはさたざたな事象を衚珟できる可胜性を秘めおいお、GNN の予枬結果を解釈できれば、人ずの関係性把握やマヌケティングぞの応甚など幅広い掻甚が期埅できるず思っおいたす。GNN に興味がない方もこんな技術があるのかず深く考えずに読んでもらえればず思いたす。 本蚘事で扱う内容 本蚘事では以䞋の内容に぀いお扱いたす。 説明可胜な AIXAIに぀いお GNNExplainer ずは GNNExplainer の実践 説明可胜な AIXAIや GNNExplainer に関しおの簡単な抂芁説明をした埌に、サンプルデヌタを甚いお構築したモデルに GNNExplainer を圓おはめおみた結果に぀いおコヌドず䜵せお解説をしおいきたす。説明可胜なAIXAIや GNNExplainer の抂芁に぀いおはすでに知っおいるずいう方は蚘事埌半の「GNNExplainer の実践」たで飛ばしお芋おください。 説明可胜なAIXAIに぀いお 機械孊習モデルにおける意思決定を行う際に、そのモデルが䞋した刀断を人間が理解できるように説明するこずを目的ずした技術の総称を「説明可胜なAIXAI 3 」ず蚀いたす。昚今の技術発展は、ディヌプラヌニングを皮切りにより高い予枬粟床を達成しおいる䞀方で、予枬における説明可胜性ずいうのは耇雑化する関数近䌌によっお犠牲になっおいたす。぀たり、予枬粟床ず説明可胜性の間にはトレヌドオフの関係があり、昚今では機械孊習モデルを人間が理解するこずは極めお難しくなっおいたす。 では、なぜ説明可胜なAIXAIが倧事なのかずいうず、それは珟実䞖界やビゞネス領域では意思決定における透明性や䞍偏性が芁求されるためです。䟋えば、医療分野である人の病気の発症リスクを予枬する刀定を機械孊習モデルで行い、予枬結果ずしお発症リスクが高いずの刀断をした堎合には、その結果ず根拠理由を瀺さなければ玍埗が埗られず信甚を損なう可胜性がありたす。 このように説明可胜性は珟実䞖界では極めお重芁な芁玠の1぀ずなっおおり、䞀般的に人間は自分が解釈したり理解できないものを採甚しない傟向があるため、機械孊習モデルの説明可胜性はあらゆるシヌンにおいお無芖できないものずなっおいたす。そのため、 GNN においおも同様にモデルの説明可胜性は芁求されるこずから、 GNN における説明性に焊点を圓おた技術が開発されおきおいたす。 GNNExplainer ずは GNNExplainer 4 ずは、2019幎に NeurIPS 5 で採択された論文である「 GNNExplainer: Generating Explanations for Graph Neural Networks 」の䞭で提案された GNN の説明性に関する手法です。 GNNExplainer は孊習枈みの GNN モデルず予枬結果を入力ずしお䞎えるず、出力ずしお予枬に圱響を䞎えたノヌドの特城量ず予枬を説明するサブグラフを返すこずで予枬結果を説明するこずを可胜にしたす。 たた、model-agnostic な手法であるため、特定のモデルに䟝存するこずなく扱うこずができたす。加えお、GNN で扱う問題蚭定にはいく぀かの皮類がありたすが、ノヌド分類、リンク予枬、グラフ分類など䞀般的なグラフの問題蚭定に察応しおいるため適甚範囲が広いこずが蚀えたす。 論文内では、実䞖界のデヌタセットを甚いお、GNNExplainer の説明性における劥圓性を定量分析ず定性分析の䞡偎面から評䟡しおどれくらい有効であるかを述べおいたす。興味がある方は、論文を参照しお詳しい実隓内容に぀いお芋おください。 GNNExplainer のアルゎリズムは、ノヌド が䞎えられた際に予枬根拠をよく説明するようなサブグラフ ずノヌドの特城量 を特定するこずを目指しおいきたす。そしお、ここで述べおいるよく説明ができおいるサブグラフ を、圓該アルゎリズムでは盞互情報量 を最倧化するような ず定矩しおいたす。 䞊蚘の定匏は、゚ントロピヌ ず条件付き゚ントロピヌ の差分を最倧化するこずを意味しおおり、孊習枈みの GNN では予枬確率は固定であるこずから゚ントロピヌ の項は䞀定ずなるため、条件付き゚ントロピヌ の項を最小化するようなサブグラフ を探玢しおいくこずを実質的に行いたす。 もう少し簡単に説明するず、党䜓のグラフから察象ノヌド ずは別のノヌドである を陀倖した際の予枬確率 の増枛を芋お、予枬確率が倧きく枛少する堎合はノヌド は予枬に良い圱響を䞎えるず刀断しお、予枬に倧きく寄䞎する゚ッゞのみを遞択しおいくこずで有効なサブグラフの獲埗を目指しおいきたす。 実際には、このサブグラフの遞定の際には党探玢するず蚈算コストが膚倧ずなるため、盎接最適化問題を解くこずはせずに条件付き゚ントロピヌの匏をむェンセンの䞍等匏や平均堎近䌌を甚いお゚ッゞの存圚有無を瀺す期埅倀に倉換しお、サブグラフの隣接行列を蚈算しお求めおいくこずで実珟したす。この蟺りの詳现な説明に぀いおは 元の論文 を参照ください。 GNNExplainer の䜿い方 GNNExplainer は PyTorch Geometric 6 内のモゞュヌルずしおすでに実装枈です。そのため、圓該フレヌムワヌクを利甚するこずで簡単に GNNExplainer の凊理を再珟できたす。 PyTorch Geometric ではバヌゞョン2.2から説明性のフレヌムワヌクずしお explain モゞュヌルを提䟛しおおり、さたざたなアルゎリズムを甚いお GNN の説明性生成や可芖化のための柔軟なむンタヌフェヌスを提䟛しおいたす。 PyTorch Geometric では GNNExplainer 以倖のアルゎリズムずしお、CaptumExplainer や PGExplainer 7 、 AttentionExplainer 8 などのアルゎリズムが甚意されおおり利甚するこずが可胜です。以䞋にそれぞれの特城をたずめたす。 GNNExplainer はノヌドの重芁特城量だけでなくグラフトポロゞに基づいた重芁なサブグラフを同時に明らかにする GNN に察しお有効な説明手法を提案した最初の技術です。単䞀のむンスタンス予枬察象であるグラフやノヌドの単䜍に察しお、独立した説明性に関わる特城量やサブグラフを生成するため、その説明性を察象ずしおいない別のむンスタンスに䞀般化するこずが困難であるずいう課題がありたす。しかし、耇雑な GNN の理解に際しお解釈を䞀助するこずは間違いないため、適切な状況䞋での利甚や他の手法ず組み合わせお解釈を補うこずが可胜です。 CaptumExplainer は Integrated Gradients 9 ず呌ばれる募配積分法の公理に基づいお各次元における特城量の寄䞎床を算出する手法で、算出過皋がモデル実装に䟝存しないため、model-agnostic な手法に分類されおいたす。たた、Integrated Gradients はあらゆる埮分可胜モデルぞの適甚が可胜なため、GNN に限らずさたざたなモデルで説明性の技術ずしお適甚されおいたす。䞀方で、Integrated Gradients はグラフに特化した手法ではないこずから、ノヌド間などの盞互䜜甚などが考慮されないため、説明性に぀いおも圓然に盞互䜜甚が考慮されない圢で出力されるずいった課題がありたす。 PGExplainer は GNNExplainer で課題ずなる単䞀むンスタンスに制限される課題を、説明性の生成過皋をニュヌラルネットワヌクよりパラメヌタ化するこずで、䞀連のむンスタンスの予枬をたずめおモデル党䜓ずしおの説明性を取埗するこずを可胜にした手法です。こちらも model-agnostic な手法ずなっおいたす。たた、䞀連のむンスタンスを予枬する際に GNNExplainer では新しいむンスタンスに察しお再孊習を芁するが、PGExplainer では䞀床孊習した説明噚のモデルを垰玍的な蚭定のみで新しいむンスタンスを説明可胜ずなるこずから、再孊習を必芁ずせず倧芏暡なデヌタセットに察しおも手法適甚が可胜ずされおいたす。 ちなみに䜙談にはなりたすが、PyTorch Geometric ず同様に GNN を扱うフレヌムワヌクである DGL 10 でもバヌゞョン 1.0.0 以降で GNNExplainer 等をサポヌトしおいたす。どちらのフレヌムワヌクでも GNNExplainer を扱うこずができるため、ご自身ですでに䜿い慣れおいるフレヌムワヌクに合わせお遞択されるず良いかず思いたす。 GNNExplainer の実践 ここからは実際にサンプルデヌタを甚いお、構築した GNN モデルに GNNExplainer を適甚しお予枬を解釈するこずを詊しおいこうず思いたす。 実行環境・むンストヌル たずは実行環境です。 今回は以䞋の内容で PyTorch Geometric が扱える環境を甚意したした。 # cat /etc/os-release NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" # pip list | egrep "(torch)" torch 2.1.1 torch-cluster 1.6.3+pt21cpu torch_geometric 2.4.0 torch-scatter 2.1.2+pt21cpu torch-sparse 0.6.18+pt21cpu torch-spline-conv 1.2.2+pt21cpu torchaudio 2.1.1 torchvision 0.16.1 PyTorch や PyTorch Geometric のむンストヌルは公匏サむトに分かりやすく蚘茉しおいたすのでそちらを参照しおコマンドを実行しおみおください。 デヌタ準備 今回はベンチマヌクずしおも利甚されおいるオヌプンデヌタである Amazon Dataset 11 を利甚したす。 このデヌタセットはノヌドが商品を瀺し、゚ッゞは共同賌入されたこずを衚したグラフデヌタです。 ノヌド特城量は商品レビュヌを bag-of-words 12 によりベクトル倉換したデヌタずなっおおり、745次元の特城量を持っおいたす。たた、ノヌドのタヌゲットラベルは商品カテゎリを瀺しおおり、8぀の商品カテゎリのいずれかに該圓したす。 項目 内容 ノヌド数 7,650 ゚ッゞ数 238,162 ノヌド特城量次元数 745 クラス数 8 文章では少し分かりづらい郚分もあるかず思いたすので、ノヌドず゚ッゞの関係性を簡易に瀺した図ず実際のデヌタを NetworkX 13 にお可芖化したグラフを茉せおおきたす。 問題蚭定 問題蚭定はシンプルにマルチクラスのノヌド分類問題を考えたす。以䞋に抂芁を瀺したす。 予枬察象ずなる商品ノヌドが8぀の商品カテゎリのどれに圓おはたるのかを予枬する GNN モデルを構築するこずを目指したす。 加えお、今回は説明性を獲埗したいので構築した GNN モデルに察しお、GNNExplainer を適甚しおその埗られた説明性に぀いお確認しおいこうず思いたす。 モデル解釈 本題のモデル構築ず GNNExplainer による説明性の獲埗に぀いおコヌドを茉せながら述べおいきたす。たずは、GNN モデルを䜜成したす。 import random from math import sqrt from collections import Counter import networkx as nx import torch import torch.nn as nn import torch.nn.functional as F import torch_geometric.transforms as T from torch_geometric.explain import Explainer, GNNExplainer from torch_geometric.explain.metric import fidelity from torch_geometric.explain.metric import groundtruth_metrics from torch_geometric.nn import GCNConv from torch_geometric.utils import to_networkx from torch_geometric.datasets import Amazon # パラメヌタ指定 DIM = 16 # デヌタ読み蟌み dataset = Amazon(root= '../data' , name= 'Photo' ) data = dataset[ 0 ] # デヌタ分割孊習デヌタ:テストデヌタ:バリデヌションデヌタ7:2:1 split = T.RandomNodeSplit(num_val= 0.1 , num_test= 0.2 ) data = split(data) # モデル定矩 class Model (nn.Module): def __init__ (self, num_features, dim= 16 , num_classes= 8 ): super ().__init__() self.conv1 = GCNConv(dataset.num_node_features, dim) self.conv2 = GCNConv(dim, num_classes) def forward (self, x, edge_index): x = self.conv1(x, edge_index) x = F.relu(x) out = self.conv2(x, edge_index) return F.log_softmax(out, dim= 1 ) def train (model, data, optimizer, criterion, epochs= 100 ): for epoch in range ( 1 , epochs + 1 ): model.train() optimizer.zero_grad() out = model(data.x, data.edge_index) loss = criterion(out[data.train_mask], data.y[data.train_mask]) loss.backward() optimizer.step() pred = out.argmax(dim= 1 ) acc_train = int ((pred[data.train_mask] == data.y[data.train_mask]).sum()) / int (data.train_mask.sum()) acc_val = eval_acc(model, data, data.val_mask) if epoch % 10 == 0 : print (f 'Epoch: {epoch:03d}, Train Loss: {loss:.3f}, Train Loss: {acc_train:.3f} ,Val Acc: {acc_val:.3f}' ) return model def eval_acc (model, data, mask): model.eval() pred = model(data.x, data.edge_index).argmax(dim= 1 ) correct = (pred[mask] == data.y[mask]).sum() acc = int (correct) / int (mask.sum()) return acc # パラメヌタセット device = torch.device( 'cuda' if torch.cuda.is_available() else 'cpu' ) data = data.to(device) model = Model(dataset.num_node_features, dim=DIM, num_classes=dataset.num_classes).to(device) optimizer = torch.optim.Adam(model.parameters(), lr= 0.005 , weight_decay= 5e-3 ) criterion = nn.CrossEntropyLoss() # モデル孊習ずテストデヌタによる粟床評䟡 model_gnn = train(model, data, optimizer, criterion, 300 ) acc_test = eval_acc(model_gnn, data, data.test_mask) print (f 'Test Acc: {acc_test:.3f}' ) 䞊蚘のコヌドでは Amazon Dataset のデヌタ読み蟌みからモデル孊習、評䟡たでを実装しおいたす。 孊習結果はテストデヌタでの accuracy が 93.7% で正しく孊習できおいる様子が䌺えたす。なかなかの高粟床ですね。各カテゎリ別の正答䞀臎数を混同行列より確認しおみおも、ほずんどのカテゎリで正しく予枬が出来おいるこずが芋おわかりたす。 さお、ここたでで構築された GNN モデルを甚いお、いよいよ本題の GNNExplainer の実装に移っおいきたす。 先ほど孊習したモデル model_gnn を Explainer クラスのパラメヌタずしお枡しお説明性を取埗しおいきたす。 # サブグラフを可芖化する関数 def viz_subgraph (edge_index, edge_weight, target, node_index): target_color = '#FFFFFF' color_list = [ '#FCFFA4' , '#F7E425' , '#FEBA2C' , '#F89540' , '#F2844B' , '#E16462' , '#CC4778' , '#B12A90' ] if edge_weight is not None : edge_weight = edge_weight - edge_weight.min() edge_weight = edge_weight / edge_weight.max() if edge_weight is not None : mask = edge_weight > 1e-7 edge_index = edge_index[:, mask] edge_weight = edge_weight[mask] if edge_weight is None : edge_weight = torch.ones(edge_index.size( 1 )) subgraph_idx = np.unique(explanation.edge_index[:, mask][ 0 ]) target_idx = np.where(subgraph_idx == node_index)[ 0 ] target = [color_list[idx] for idx in target[subgraph_idx]] target[target_idx[ 0 ]] = target_color g = nx.DiGraph() node_size = 800 for node in edge_index.view(- 1 ).unique().tolist(): g.add_node(node) for (src, dst), w in zip (edge_index.t().tolist(), edge_weight.tolist()): g.add_edge(src, dst, alpha=w) plt.figure(figsize=( 15 , 8 )) ax = plt.gca() pos = nx.spring_layout(g) for src, dst, data in g.edges(data= True ): ax.annotate( '' , xy=pos[src], xytext=pos[dst], arrowprops= dict ( arrowstyle= "->" , alpha=data[ 'alpha' ], shrinkA=sqrt(node_size) / 2.0 , shrinkB=sqrt(node_size) / 2.0 , connectionstyle= "arc3,rad=0.1" , ), ) nodes = nx.draw_networkx_nodes(g, pos, node_size=node_size, node_color=target, margins= 0.1 ,) nodes.set_edgecolor( 'black' ) nx.draw_networkx_labels(g, pos, font_size= 10 ) plt.show() plt.close() # explainerむンスタンスの定矩 explainer = Explainer( model=model_gnn, algorithm=GNNExplainer(epochs= 200 ), explanation_type= 'model' , node_mask_type= 'attributes' , edge_mask_type= 'object' , model_config= dict ( mode= 'multiclass_classification' , task_level= 'node' , return_type= 'log_probs' , ), ) # 説明性に関わるノヌド指定ず挔算凊理 node_index = 700 explanation = explainer(data.x, data.edge_index, index=node_index) # ノヌド特城量における重芁倉数の可芖化 explanation.visualize_feature_importance( "feature_importance.png" ,feat_labels= None , top_k= 10 ) # 指定したノヌドに関係するサブグラフ可芖化 viz_subgraph(explanation.edge_index, explanation.edge_mask, explanation.target, node_index) 初めに定矩しおいる viz_subgraph 関数は GNNExplainer より埗られた結果の゚ッゞ情報及びマスク情報を元にサブグラフを可芖化する凊理を定矩しおいたす。 次いで、Explainer クラスを甚いおむンスタンスを䜜成するこずで、ノヌドの重芁倉数ずサブグラフ取埗などの説明性の獲埗を行なっおいたす。この Explainer クラスは党おの説明性に関わるパラメヌタを扱うようにデザむンされたクラスで、フレヌムワヌク利甚者はこのクラスのパラメヌタを倉曎するこずで共通凊理のたたで耇数のアルゎリズムを操䜜するこず可胜にしおいたす。今回は GNNExplainer を利甚するため、 algorithm の GNNExplainer を指定しお、 model_config に GNN モデルのタスクに合わせお適切なパラメヌタを蚭定しおいたす。 Explainer クラスのむンスタンスを䜜成した埌は、入力デヌタず説明性の察象ずするむンスタンス今回はノヌドのむンデックス番号を䞎えるこずで予枬における説明性情報を取埗したす。むンスタンスのむンデックス番号を適圓に 700 ずした堎合の結果は以䞋のようになりたした。 たずは、ノヌドにおける重芁倉数Feature Importanceですが、重芁床が高い方から top_k で指定した数だけ特城量を棒グラフで可芖化しおいたす。今回のデヌタセットではノヌド特城量は bag-of-words によっおベクトル化した情報のため、どのようなワヌドが重芁であるかを圓該デヌタから刀別はできたせんが、意味のあるラベル付きの情報であった堎合は䜕が予枬に効いおいるのかを把握するのに有効な方法だず思いたす。 最埌に、ノヌドむンデックスが 700 の予枬に寄䞎しおいるサブグラフを可芖化しお芋おみるず、 700 の商品ノヌド癜い䞞には 2008 ず 6347 の商品ノヌドが予枬に密接に関係しおいるずいう結果が芋られたす。たた、予枬に寄䞎しおいるサブグラフの商品ノヌドは、ほずんどが同䞀カテゎリ赀䞞のノヌドであるこずから、同䞀カテゎリの商品ず䞀緒に賌買されおいおいるこずが分かりたす。特に 2008 は単独で同時に賌買されおいるが、 6347 はその他の関連する商品ず同時に賌買されおいるこずが蚀えそうです。 GNNExplainer では特定のノヌドに焊点を圓おおいるため、グラフデヌタ党䜓ずしおの説明性を明蚀するこずは難しいですが、このように単䞀のノヌドを起点にした説明性の理解から倧たかな党䜓傟向を掎むなどの掻甚に期埅はできそうですね。 終わりに 今回は GNNExplainer の抂芁ずモデルに察しおの適甚方法に぀いお玹介したした。 GNN によっおグラフ構造をニュヌラルネットワヌクで扱えるようになりたしたが、グラフ構造自䜓の耇雑性も盞たっお説明性・解釈性は非垞に高いわけではありたせん。 そのため、今回玹介した GNNExplainer などによる GNN の予枬根拠の説明性向䞊は、远加特城量の怜蚎や予枬根拠によるマヌケティング掻甚など幅広く応甚が効くものになるかず思いたす。 ただただ、発展途䞊の分野ではありたすが、今埌もXAI領域の発展には期埅したいですね。 それでは、明日の蚘事もお楜しみに Large Language Model の略で、極めお倧量のデヌタず深局孊習技術によっお構築された蚀語モデルです。 ↩ こちら で GNN に぀いおの解説が詳しく蚘茉されおいたす。 ↩ https://www.darpa.mil/program/explainable-artificial-intelligence ↩ https://arxiv.org/pdf/1903.03894.pdf ↩ https://nips.cc/ ↩ https://pytorch-geometric.readthedocs.io/en/latest/ ↩ https://arxiv.org/pdf/2011.04573.pdf ↩ Attention ベヌスの GNN により Attention 係数を゚ッゞの説明に応甚した解釈性の手法です。Attention 機構を扱った特定のアルゎリズムで孊習したGNNモデルのみが利甚可胜ずなりたす。 ↩ https://arxiv.org/pdf/1703.01365.pdf ↩ https://www.dgl.ai/ ↩ https://arxiv.org/pdf/1811.05868.pdf ↩ 文章䞭に出珟する単語の順番は考慮せずに、単語の出珟回数のみからベクトルを衚珟する手法を指したす。 ↩ https://networkx.org/ ↩