Timee Product Team Blog

タイミー開発者ブログ

Claude Code Skillを使ったベクトルベース推薦の半自動改善

はじめに

こんにちは、株式会社タイミーでデータサイエンティストをしている藤井です。 普段は推薦システムの改善を担当しています。

早速ですが、皆さんは推薦モデルの改善実験を月に何本回せていますか?

仮説を立てて、実装し、実験し、結果を整理し、次を考える。
1サイクル回すだけでも、相応の負荷がかかります。片手間でサイクル数を増やすのは簡単ではありません。

しかし、もし「仮説を立てる」から「結果を整理する」までを AI が担えるとしたら?
実際に AI の案から改善が生まれています。しかも、人間が担うのは方針の選択、コードレビュー、実験の実行に絞れています。

では、実際にどれだけ回せて、どれだけ当たるのか?
人間が思いつかない切り口は出てくるのか?

私たちはそれを確かめるために、Claude Code の Skill 機能を使った半自動の実験プロセスを組み、実際に回してみましたので、紹介したいと思います。

先に結論

AI が出した改善案は 13件で、そのうち実験まで進めたのは 8件でした。
改善が確認できたのは 3件、横ばいが 2件、下落が 3件です。

打率だけを見ると突出して高いわけではありません。

ただ、人間が手を動かしたのは方針の選択、コードレビューと実験の実行だけで、それ以外は AI が担っています。通常業務と並行しながら、このサイクル数を回せたこと自体が、この取り組みのいちばんの成果でした。

モデル改善は 1回ごとの改善幅だけでなく、試行回数を増やせるかどうかが効いてくる領域です。

片手間で回せる仕組みがあれば、改善の累積速度が変わります。

解決したかった課題

AI に推薦モデルの改善案を聞くだけなら、チャットでもできます。
しかし、それを継続的な実験プロセスとして回そうとすると、運用上のボトルネックがいくつか出てきます。

長期記憶がない

セッションが切れるたびに AI は過去の実験を忘れます。

同じ失敗を繰り返すリスクがあるだけでなく、過去の失敗を踏まえて次の方向を絞る、改善が出た方向を深掘りするといった、蓄積を活かした提案ができません。

コンテキストの無駄遣い

毎回生のログや大量のファイルを読ませると、トークンを消費するだけで、期待したほど精度も上がりません。
必要な情報を構造化して渡す仕組みがないと、コストだけが膨らみます。

これらを解決するために、Claude Code の Skill 機能を使って半自動の実験プロセスを組みました。

Skill と記憶の設計

このプロセスには 2種類の記憶があります。

knowledge(長期記憶)

過去の実験記録を構造化した Markdown ファイルとして蓄積するフォルダです。
各 Skill はここを読み、過去の試行を把握した状態から動きます。

実験結果はサマリとして圧縮されて書き戻されるので、サイクルを重ねてもトークン消費が膨らみにくい設計です。

scratch(作業記憶)

サイクル途中の方針メモや実装の下書きなど、一時的な情報を置く場所です。
長期記憶に残すほどではないが、セッション内では参照したい情報がここに入ります。

また、AI のコンテキストウィンドウが圧縮された場合でも、ファイルとして残っていれば再読み込みで復元できるため、意図しないコンテキスト消失への備えにもなっています。

Skill

Skill 自体には、参照すべきファイルパスやテーブル定義、コーディングルールに加えて、実験コストの前提、安全性チェックの観点、実装原則、過去実験との重複を避けるための自問自答リストなどを埋め込んでいます。

これにより、毎回ゼロから指示しなくても、各フェーズで必要な文脈と制約が揃った状態で AI が動けます。

また、長期記憶と作業記憶はリポジトリ上に存在するため、Cursor など別の AI ツールからも同じ情報を参照でき、Claude Code の提案を独立に検証することも可能です。

半自動実験プロセスの仕組み

このプロセスは、上記の Skill と記憶の仕組みを使って構築しています。

1サイクルの流れ

  1. AI がテーブル定義やコーディングルールを確認する
  2. AI が過去の実験記録を読み、現状を把握する
  3. AI が次に試す改善案を複数提案する
  4. 人間が方針を選ぶ
  5. AI が実装する
  6. AI が変更の安全性を確認する
  7. AI が実施予定の内容を記録する
  8. 人間が実験を実行する
  9. AI が結果を記録に反映する

人間が手を動かすのは、方針の選択、コードレビュー、実験の実行だけです。

定義の確認、過去実験の整理、提案、実装、安全性チェック、記録は主に AI が担います。

実験結果

個別の実験内容の詳細は割愛し、ここでは改善幅の傾向のみを共有します。

13件の提案のうち、実験に進めなかった 5件を除いた 8件の結果です。

実験 主要な機械学習指標の改善幅(複数指標の範囲)
A +2〜+7%
B +0.5〜+3%
C +1〜+3%
D ±2%以内
E ±2%以内
F -3〜-7%
G -3〜-6%
H -35〜-20%

学び

以下はあくまで運用を通じた感想であり、厳密に検証された結論ではありません。

提案の方向性

  • 変更が小さくなりがちな傾向がある。 AI に自走させると、実験結果の正確性を担保しやすい方向、つまり対照実験がしやすい最小限の変更に寄りやすい傾向がありました。
  • 指示を入れると質が変わる。 「小さい改善ではなく構造ごと変える改善を考えてほしい」と明示的に伝えたところ、論文の知識を参照した鋭い提案が複数出てきました。AI の提案の質は、渡す制約や方向付けに強く依存します。
  • 既存手法の非自明な応用が出てくる。 たとえば、DIN(Deep Interest Network)の target-aware attention を two-tower モデルに持ち込む提案がありました。two-tower では推論時に候補アイテムが不明なためそのまま適用できませんが、AI は「学習時だけ正例を attention query として使い、推論時はフォールバックする」という変形を考えました。この切り口自体、推薦チーム内では出ていなかったもので私たちには非自明でした。当然、学習と推論の不一致(train-serve skew)がリスクになりますが、提案自体にそのリスクと失敗した場合に何がわかるかが含まれていました。成功の保証はなく、失敗する可能性は高そうですが、失敗しても学びが得られる実験設計になっています。また、仮にこの方式がそのまま機能しなくても、事前学習フェーズでのみ target-aware に学習させるといった派生が考えられ、アイデアの種として意味のある提案でした。
  • 壁打ち相手としては十分実用的だった。 厳密な比較をしたわけではありませんが、少なくとも今回の運用では、AI が出す提案は人間の壁打ち相手として十分実用的だと感じました。場面によっては、自分たちだけではすぐに出なかった切り口が出てくることもありました。

蓄積と学習

  • 最も鋭い提案は最後に出てきた。 偶然の可能性はありますが、サイクルを重ねて過去実験の蓄積が増えたタイミングで、最も構造的な提案が出ています。蓄積が提案の質に寄与している可能性は否定できません。
  • 過去の失敗を踏まえた推論が出てくる。 AI が提案を出す際に、「過去にこの実験は失敗したので、こういう可能性がある。だからこちらの方向を試してみましょう」といった推論のログを出してくることがよくありました。蓄積された記憶を参照しながら提案理由を組み立てている様子が見て取れます。

運用コスト

  • 人間の作業時間の大半はバグ対応。 実験が問題なく動く回では、人間の仕事は方針を選び、コードをレビューし、実験を実行することに絞られます。一方でバグが出ると調査・修正・再実行に手を取られ、体感で人間の作業時間の 8〜9割はバグ起因でした。逆にいえば、バグが出た回を無理に立て直さず次の実験に進めば、手数自体はさらに増やせる可能性があります。実装にバグが出た実験案も、提案自体は knowledge に記録しておけば、AI のコーディング能力が向上した時点で低コストに再挑戦できます。

現時点でまだ分かっていないこと

  • サンプルサイズが不足している。 この半自動改善プロセスを運用し始めたのは最近であり、実験数は 8 件です。ここから得られた傾向が一般化できるかは、まだわかりません。
  • 長期記憶の効果は未検証。 長期記憶なしのフローと比較した実験は行っていません。蓄積が提案の質に寄与している可能性は示唆されますが、長期記憶が本当に効いているのか、それとも同じ品質の提案が記憶なしでも出るのかは、現時点では検証できていません。

まとめ

このプロセスの価値は、AI が良い改善案を出すことそのものではなく、試行の回転数を上げられることにあります。

13件の提案から 8件を実験し、3件の改善を得る。個々の実験の改善幅は小さくても、改善を積み重ねれば累積的な効果は大きくなります。

つまり、モデル改善は打率ではなく打席数が効いてくる可能性が高い。この取り組みの価値は、試行錯誤を片手間でも継続して回せるようになる点にあります。

長期記憶の効果や AI の提案精度については、まだ言い切れることは多くありません。

ただ、少なくとも「AI に改善案を出させて回す」というサイクル自体は、実用的に機能しています。今後はサンプルを増やしながら、このプロセス自体の改善も続けていきます。

こうした推薦改善の試行錯誤や、評価・運用の仕組みづくりに興味がある方は、ぜひ以下もご覧ください。

We’re hiring!

現在、タイミーではデータサイエンスやエンジニアリングの分野で、共に成長し、革新を推し進めてくれる新たなチームメンバーを積極的に探しています!

データ | 採用情報 |株式会社タイミー

また、気軽な雰囲気でのカジュアル面談も随時行っておりますので、ぜひお気軽にエントリーしてください。↓

hrmos.co hrmos.co hrmos.co

Reference

Skillを作成するにあたっては、Y Combinator の Garry Tan さんによる gstack リポジトリ(MITライセンス)を大いに参考にしました。

なお、本記事を書いている途中に、AI に継続的に作業させる方向の動きがいくつか出ていました。今回の取り組みと直接の関係はありませんが、同じ方向性の事例としてメモ的に置いておきます。

  • Automated Alignment Researchers: Using large language models to scale scalable oversight(Anthropic, 2026/04/14)― 9 体の Claude Opus 4.6 を自律的なアライメント研究者として走らせた実験。複数 AI に役割分担させて探索を回す、という方向の一例。
  • Introducing routines in Claude Code(Anthropic, 2026/04/14)― Claude Code にスケジュール実行や webhook トリガーで動かせる routines が追加。今回は Skill で手動起動していますが、こうした仕組みに載せれば定期的な提案・記録反映まで自動化できそうです。

「理解してから作る」から「作りながら理解する」へ ― 入社3ヶ月、AIが変えた学習の順序

はじめに

こんにちは。タイミー プロダクトエンジニアの津守です。今年1月にタイミーに入社し、気づけば早3ヶ月が経ちました。

この記事では、入社して数ヶ月働いて感じた「AIツールがオンボーディングプロセスをどう変えたか」という体験をまとめます。技術的な深掘りというより、新しい環境に飛び込んだエンジニアの個人的な気づきとして読んでもらえると嬉しいです。

従来のオンボーディングプロセスのイメージ

新しい会社に入ったとき、多くのエンジニアは最初の数週間を

ドキュメントを読む。コードベースを読む。アーキテクチャを把握する。チームの開発スタイルを理解する。そして、ある程度理解できたと感じてから、ようやく手を動かし始める。

というような順序で過ごしてきたと思います。

言ってみれば「インプット先行」の学習スタイルです。この期間は"情報を受け取る期間"と暗黙的に認識されていることが多く、アウトプットは後回しになりがちでした。チームへの貢献よりも、まず「追いつくこと」が優先されるイメージです。

AI活用によって感じた変化

入社して最も強く感じたのは、この「順序」が変わったということです。

AIツールを使うことで、コードベースへの理解が浅い段階でも、まず動くものを作ることが現実的になりました。実際Cursor や Claude Code を主体に実装を進めると、知識のギャップをAIがある程度埋めてくれます。おかげで、入社初期からチームメンバーやステークホルダーのレビューやフィードバックを素早く受け取ることができました。

実際、チームメンバーやステークホルダーからのフィードバックやレビューには、基礎的な知識だけでなく、「タイミーではこうやってる」といった暗黙のコンテキストが含まれており、ドキュメントから得られる知識に加えて、より多くの背景情報を得られる場面があります。

開発アプローチとして広く受け入れられているアジャイルでは、「いかに早くステークホルダーがレビューできる状態を作るか」が重要な論点のひとつです。これは、個人が環境に適応するうえでも重要な要件だと思います。完璧な理解を待ってから動くのではなく、まず動くものを見せてフィードバックをもらう。そのサイクルを素早く回すことが、結果的に最も効率的な学習を生み出し、属する組織で求められる行動を起こせるようになるために重要と考えています。

適切に学習サイクルが回るための条件

ただ、このアウトプット先行の学習サイクルが機能するには、2つの環境が整っている必要があると感じました。どちらもAIツールの登場で新たに生まれた課題ではなく、組織の開発体験として元々重要だったものですが、AIツールの発達によってその重要性はさらに増しています。

1. AIが適切なアウトプットを出せる環境

AIが出すアウトプットの質は与えるコンテキストに大きく左右されます。学習サイクルの中でフィードバックを通じて暗黙のコンテキストを受け取れるとはいえ、そもそも明示的に言語化されているほうが望ましく、AIのアウトプットの精度も上がります。

実際、タイミーではバックエンド開発Handbookを通じて、開発プロセスを明示的に言語化する動きがあります。設計・実装・運用にまたがるガイドラインが体系的にまとめられており、さらにそれがAIエージェントのスキルとして提供されています(詳しくは新谷さんの記事「バックエンド開発Handbookを届けるために ― AI時代の知の高速道路を敷く」をご覧ください)。

Handbookが生まれた背景のひとつには、メンバーの増加やAIツールの進化により、バックエンド以外のエンジニアが越境してコードを書く機会が増えたという事情があります。ただ実際に使ってみて感じたのは、暗黙知をまだ何も持っていない入社直後のメンバーにこそ、そのインパクトが大きいということです。「そもそも何を知らないかもわからない」状態でも、AIがHandbookに沿ったアウトプットを出してくれることは、単なる品質担保以上の意味を持ちます。

自分がHandbookを意識していなくても、AIがガイドラインに沿った設計や実装を提案してくれる——「気づいたらタイミー流の書き方になっていた」という感覚は、入社して間もない時期にとても心強いものでした。

2. フィードバックをもらえる環境・体制

もうひとつの前提条件は、フィードバックの環境です。どんなに早くアウトプットを出しても、適切なフィードバックが返ってこなければ学習サイクルは止まります。

この3ヶ月間は、チームメンバーやステークホルダーから丁寧なフィードバックをもらえる環境にあり、そのおかげで学習が加速しました。特に、PRベースのコードレビューは厳密に行われており、そこでの指摘やディスカッションがとても多くの学びになりました。

ただ、3ヶ月を通じて感じたのは、現状ではフィードバックの質が運用や状況によってばらつきが出やすい状態にあるということです。体制として担保されているというよりは、チームメンバーの意識や余裕に左右される面があり、持続的に機能させるには仕組みとしての設計が必要だと感じています。

もうひとつ、AIがアウトプットを加速させることで生まれるトレードオフも見えてきました。学ぶ側が早く動けるようになった分、レビューする側が見るべきPRの量も増えます。学習サイクルが速くなった恩恵が、レビュワーの負荷という形で偏在してしまうわけです。

また、PRベースのレビューは厳密に行われている一方で、暗黙知やコンテキストを深く共有したうえでのフィードバックを、どう生み出すかという問いも残ります。これらに対してモブプログラミングやペアプログラミングのような形式は有効な解のひとつだと思っていて、後からまとめてレビューするコストを分散させながら、よりリッチなフィードバックを生みやすい構造だと感じています。

持続的に相互フィードバックが行われる開発体制をどう設計するか——これはまだ答えの出ていない問いですが、AIが学習サイクルを高速化させるほど、フィードバックを循環させる体制の重要性は増していくと感じています。

おわりに

3ヶ月を振り返ると、AIは入社直後の学習の「量」を変えたのではなく、「順序」を変えた、というのが一番しっくりくる表現です。

以前なら「理解してから作る」だったものが、「作りながら理解する」に変わりました。この変化は、入社直後という時期をより能動的に過ごす後押しをしてくれると感じています。

ただし、そのサイクルを本当に機能させるには、AIが適切なアウトプットを出せる環境と、フィードバックを届ける体制という、人間側の設計が不可欠だと感じました。Handbookをはじめとした環境を整えてくれたチームには、改めて感謝しています。

同じように新しい環境に飛び込んでいる方や、新しいメンバーを迎える立場の方に、少しでも参考になれば嬉しいです。

EMConf JP 2026 参加レポート(taishi、otake)

こんにちは。タイミーでプロダクトエンジニアをしている福島(taishi)と大竹(otake)です。

EMConf JP 2026が3月4日に開催されました。

2026.emconf.jp

タイミーは今年、EMConf JP 2026のスポンサーをさせていただきました。

タイミーには、世界中で開催されているすべての技術カンファレンスに無制限で参加できる「Kaigi Pass」という制度があります。今回はこの制度を使って参加しました。

詳細は以下をご覧ください。

productpr.timee.co.jp

EMConf はエンジニアリングマネージャー(EM)向けのカンファレンスですが、私たちのようなマネジメントをしていないメンバーにとっても学びの多いイベントでした。

本記事では、印象に残ったセッションをいくつかピックアップしてご紹介します。

冒険する組織のつくりかた

著書「冒険する組織のつくりかた」を執筆された、株式会社MIMIGURIの安斎勇樹さんによるセッション。メンバーの興味傾向を把握し、目標と個人の動機を接続する場をデザインするための具体的なアプローチや、思考のフレームワークが紹介されていました。

目標のマネジメント:SMARTからALIVEへ

目標設定において、管理側の論理である「SMART」と、取り組む側の視点である「ALIVE」を両立させることが重要です。

  • SMARTの法則: 業務を精緻に遂行させるための指標(Specific, Measurable, Achievable, Relevant, Time-bound)
  • ALIVEの法則: メンバーが前向きな意味を感じられる指標
    • Adaptive(適応): 変化に適応し、将来役立つ能力を身につけている安心感
    • Learningful(学習): 学びの機会となる
    • Interesting(興味): 好奇心をそそる
    • Visionary(未来): 未来を見据える
    • Experimental(実験): 実験的な試みである

さらに重要なのは、目標設定の「前」と「後」のプロセスです。目標を単に提示するのではなく、メンバーの内発的動機と目標を「ミート」させることが肝心です。

  • 設定するまで: ヒアリングで意見を踏まえ、参加型デザインで一緒に考える
  • 設定したあと: リーダーがストーリーテリングで意図を語り、ダイアログ(対話)で取り組む意味を共有する

興味のマネジメント:8つの「活動スタイル」

個人の「興味のツボ」を把握することで、目標にALIVEな要素を組み込めます。興味は「ヒト」か「コト」か、そして「どのレンズ(役割)で見るか」の組み合わせで8タイプに分類されます。

興味のレンズ ヒトに興味がある コトに興味がある
創造 新しいコミュニティやカルチャーを生み出したい 新しいプロダクトやビジネスモデルを創出したい
解明 人間の心理や集団の力学を明らかにしたい 現象のデータを分析し法則性を明らかにしたい
介入 人やチームに寄り添い、変化や成長を支援したい 現場の課題に働きかけ、状況を改善・解決したい
運用 秩序や制度を維持し、公平に運営したい 手続きを正しく回し、品質を保ちたい

コメント

これまで「SMARTの法則」に則った目標設定は意識していましたが、それは管理する側の視点でした。そのため、取り組む側のモチベーションの観点が不足しうる、という指摘が興味深かったです。SMARTとALIVE両方の観点を取り入れることで、メンバーが主体性をもって取り組めるようになり、結果的に目標達成の確度が上がります。生成AIの急速な進歩で目まぐるしく変化する世の中だからこそ、モチベーションを高く保ち、腰を据えて取り組める目標設定のアプローチとして、私も心がけてみようと思いました。(taishi)

数年後のキャリアプランを立てることに難しさを感じていましたが、「今この瞬間の興味(好奇心)」を起点にするというアプローチは非常に腹落ちしました。技術トレンドの移り変わりが激しいからこそ、無理に未来を固定するのではなく、自分の「好き」や「気になる」を組織の課題と接続し、適応しながら進んでいけるよう、前向きな気持ちで業務に取り組んでいきたいと感じました。(otake)

「ストレッチゾーンに挑戦し続ける」ことって難しくないですか?

speakerdeck.com

成長には、現状のスキルで難なくこなせるコンフォートゾーンを抜け出し、適度な負荷がかかるストレッチゾーンに身を置き続けることが不可欠です。しかし、実際には「今の自分に最適な挑戦が不明」「日々の忙しさによる自然消滅」「外部要因による阻害」といった要因で、ストレッチゾーンに居続けることが難しい場合があります。本セッションでは、これらを克服するための環境設計が示されました。

  • 現状分析: Will/Can/Mustのフレームワークに加え、具体的な事象を問い(Why)で抽象化し、新たなアクション(How)に繋げる「具体と抽象の往復」が重要
  • 目標設定: コンフォートゾーンの誘惑を断ち切るための武器として、具体的で測定可能な「SMART」だけでなく、チームで共有・可視化され野心的な「FAST」な目標設定を活用する
  • 仕組み化: マネージャーの支援前提ではなく、権限委譲やシステム思考(因果ループ図など)を用いて、組織として挑戦が推奨される構造を作る

コメント

特に印象的だったのは、スナッキング(簡単で達成感はあるが学びが少ない仕事)の誘惑という概念です。忙しいときほど慣れた仕事に逃げてしまいがちですが、それを防ぐために自らFASTな目標を掲げ、周囲に宣言することで、意識的にストレッチゾーンに身を置く工夫を取り入れたいと感じました。

また、SMARTな目標は達成までの道のりが具体的にイメージできる反面、大きな成長につながる目標が生まれにくい側面もあります。これまでチームで目標を共有しても、協力体制が生まれたり切磋琢磨する状態になったりしにくかったため、その点でもFASTな目標設定を取り入れてみたいと思いました。(otake)

「事業目線」の正体 〜3つのフェーズのCTO経験から見えてきた、EMが持つべき視点

speakerdeck.com

EMが持つべき「事業目線」を、3つのステップで具体化したセッションです。

  • Lv.1 数字を知る: 自組織に関わる数字(売上、MAU等)を把握し、事業予算の構造を因数分解して、自分のエンジニアリング組織がどこに作用しているかを理解する
  • Lv.2 お客さまと隣接組織を知る: 数字の裏にある「なぜそうなっているか」を知るために、お客さまの声(生の声)を聞き、経理・営業・CSといった他部門の力学(大切にしていること)を理解する
  • Lv.3 戦略に反映する: 得られた知見をエンジニアリング戦略や組織の仕組み(ダッシュボード化や研修等)に落とし込み、「明日」の大きな問題を解決するために「今日」何をすべきかを決める。

コメント

事業目線という言葉の解像度が劇的に上がったセッションでした。特に隣接組織の構造を知ることで、自分の開発が他部署のオペレーションにどう影響するかまで想像を膨らませるという視点は、シニアなエンジニアを目指す上で欠かせないものだと痛感しました。また、何のために開発しているのかを改めて考えてみて、価値を最大化できるように日々の行動を変えてみたいと思いました。まずは自分のチームに関わる数字を言えるようにするという小さな一歩から始めてみます(otake)

技術的負債の泥沼から組織を救う3つの転換点

speakerdeck.com

著書「アーキテクチャモダナイゼーション 組織とビジネスの未来を設計する」の翻訳を担当された、株式会社スリーシェイクのnwiizoさんによるセッション。技術的負債は「技術」の問題ではなく、組織構造やプロセスの問題が技術的な問題として表出したものだと捉え、モダナイゼーションを推進する手法が紹介されていました。最初に組織に学習する構造を持たせ(転換点1)、次にどこに集中投資するかを意思決定者の言語で語り(転換点2)、最後に不確実性を受け入れつつ小さく始め、学習するサイクルを作る(転換点3)。そのための手法や考え方について詳細に解説いただきました。

転換点1:学ぶ力(組織に学習する構造を持たせる)

組織が自律的にシステムとビジネスの構造を理解し、学び続ける状態を作る段階です。AMET(Architecture Modernization Enabling Team)を触媒として、イベントストーミングやワードリーマッピングなどの手法を活用しつつ、チームが自律的に学習を続けられるようになるまで支援します。

転換点2:語る力(意思決定者の言語で投資判断を促す)

技術的な課題を「コードが汚い」といった技術者の言葉ではなく、経営や事業の成長を阻害する「ビジネスリスク」として翻訳する段階です。Core Domain Chartで自社のドメインを「差別化度」と「複雑性」の2軸で整理した上で、それを事業の選択肢の制約として提示することで、経営層が自分の判断軸で技術投資を評価できる構造を作ることが重要です。

転換点3:始める力(不確実性を受け入れ、小さくサイクルを回す)

成果を出しながら段階的に変革を進める段階です。1つのバリューストリームで小さく始め、3〜6ヶ月以内にモダナイゼーションの第一歩となる成果を出すことを目指します。逆コンウェイ戦略に基づき、理想のアーキテクチャに合わせて組織構造も同時にデザインします。

コメント

モダナイゼーションにおける具体的なステップと実践的な手法が紹介されており、とても良質なセッションでした。変革の推進力を高めるだけでなく、変化を阻む摩擦を取り除く重要性とアプローチについても語られており、現場目線で参考になりました。「モダナイゼーションで最も難しいのは着手すること。2番目に難しいのは勢いを維持すること」という言葉も印象に残りました。チームがいかに強い意志をもって持続可能な変化を続けられるかが最重要だと感じています。著書「アーキテクチャモダナイゼーション 組織とビジネスの未来を設計する」もぜひ読んでみたいです。(taishi)

まとめ

今回のEMConf JP 2026では、エンジニアリング組織における幅広いテーマが取り上げられていました。

メンバーの視点でも、今この瞬間の興味を起点にした成長戦略、ストレッチゾーンに身を置くための仕組みづくり、事業の数字や隣接組織への解像度を上げることなど、自身の成長とチームへの貢献を加速させるヒントが詰まっていました。

EMConfという名前ではありますが、エンジニアリングに関わるすべての人にとって価値のあるイベントだと感じています。

得られた知見を日々の業務に活かして、個人と組織の両方で成長できるように努力したいと思います!

JaSST'26 Tokyoに参加しました

はじめに

タイミー QA Enabling Gの矢尻、岸、松田です。

ソフトウェアテストに関する国内最大級のカンファレンス「JaSST (Japan Symposium on Software Testing) ‘26 Tokyo」が、2026年03月20日に開催されました。

タイミーには、世界中で開催されるすべての技術カンファレンスに参加できる「KaigiPass」という制度があり、この制度を利用してオフラインで参加しました。

jasst.jp

今年の会場は東京ビッグサイトでした。

本レポートでは、印象に残ったセッションの内容を中心にお伝えします。

JaSST Tokyo 2026 参加レポート — AI駆動QA時代の到来とタイミーの現在地

タイミーの矢尻です。

今回のJaSSTは、前回にもから増してAI関連セッションが圧倒的に多い回でした。基調講演からクロージングまで、ほぼすべてのトラックでAIが議論の軸となり、AI駆動開発における品質保証(QA for AI-Driven Development = QA4AIDD)が業界全体のメインテーマに昇格した印象です。

タイミーでは社内のQAガイドライン「QA Handbook」を通じてAI時代のQA戦略を先行して整備してきました。本レポートでは、セッション横断で見えた 3つの業界トレンド と、タイミーの取り組みとのフィットギャップを総論的にまとめます。

セッション横断で見えた3つのトレンド

今回、私が視聴したのは以下の6セッションです。

  • AIがテストチームに加わるとき- 期待、落とし穴、そしてソフトウェア品質の未来 –
  • スペシャルトークセッション『AIと品質保証のこれまでとこれから』
  • AIがQAエンジニアの仕事を奪うのか?
  • 生成AI時代、ソフトウェア品質保証のロールと組織はどこへ向かうのか?
  • 品質を経営にどう語るか
  • 人と関わるロボットの研究開発 –ロボットにおける人間らしさの重要性 –

横断すると、業界の議論は大きく 3つのテーマ に収束していました。

1. AIへの「プロセス要求」と人間の監督

複数セッションで共通して語られたのは、AIに「何を作るか」だけでなく「どう作るか」を明示する必要性です。

ベリサーブ様のセッションでは「ハーネスエンジニアリング」として、AIにプロセス要求を与えアクティビティログでオーディットするアプローチが紹介されました。SIG SQAの井芹様は「HITL(Human-in-the-Loop)」と「Everything as Code」をキーワードに、人が適切なポイントで介在するプロセス設計の重要性を強調。安野様のセッションでは、AIが一次スクリーニング(リコール向上)を担い、人間がコンテキストを踏まえた精査(プレシジョン向上)を行う「2層スクリーニング」モデルが示されました。

基調講演のGayathri Mohan様も、AIは「ベビーシッター」のように常に監視と調整が必要な存在であると指摘しており、「AIに任せきりにしない品質保証のプロセス設計」が業界の最大関心事になっていることを強く感じました。

2. リリース後の継続的品質バリデーション

もう一つ、独立した複数セッションで繰り返し言及されたのが、プロダクション環境での継続的モニタリングです。

ベリサーブ様のセッションでは「フライホイール型品質保証」として、リリース前で完結せず本番環境で継続的にスコアを監視→フィードバック→再リリースを回す「運用型QA」が提唱されました。Adobe様の小島様もAIエージェント評価において、事前テストだけでは限界があり実データでの課題探索が不可欠だと強調。基調講演でも、非決定論的なAIの出力に対して確率論的・メトリクスベースの評価が必要だと語られました。

リリース後の品質バリデーションは、もはや「やるかどうか」ではなく「いつ・どう始めるか」のフェーズに入っていると感じます。

3. 品質を経営の言葉で語る

3つ目のトレンドは、品質と経営の対話です。

kyon_mm様らのセッションでは、品質を「技術の詳細を説明する場」から「事業の優先順位を決める場」に移すための翻訳プロトコルとして、バランススコアカード(BSC)Cost of Quality(COQ)NIST AIリスクマネジメントフレームワークの3つが示されました。ベリサーブ様のセッションでも「QAエンジニアは経営の意思決定に必要な情報を提供する立場に移行する」という見通しが語られ、SIG SQAの伊藤様も「事業戦略と連携した品質戦略策定」を高度化すべきスキルとして挙げていました。

作業をAIに委ね、QAエンジニアの役割がより上流・経営(ビジネス)寄りにシフトしていくという方向性は、セッションを跨いだ一貫したメッセージでした。

タイミーQA Handbookとのフィットギャップ

タイミーでは「QA Handbook」として、3つの戦略(Business Reliability / Standardized Process / AI-DLC & QaC)を柱にQA活動を体系化しています。上記の業界トレンドと照合した結果を整理します。

✅ フィットしている領域

業界潮流 タイミーの対応 評価
Everything as Code / AIフレンドリーな成果物 Gherkin/Markdownでの仕様標準化+教師データ蓄積 先行
HITL型プロセス設計 Generative Testing Pipeline(Human=意思決定、AI=実装) 先行
プロセス要求+オーディット DoR/AC/DoD+壁打ちリファインメント 同期
AI×人間の分業テスト設計 テスト仕様書生成(AI一次生成→人間レビュー) 同期
リスクベースドテスト ISTQB準拠のRPN分析を体系的に整備済み 先行

⚠️ ギャップがある領域

業界潮流 現状と推奨アクション 優先度
リリース後の継続的品質バリデーション 構想済みだが未着手。CUJベースの指標でスモールスタートすべき
品質活動のビジネス価値換算(BSC / COQ) エラーバジェット概念をCOQ文脈で再定義するアプローチが有効
AIエージェント評価の体系化 4テスト種類×二軸評価指標を自社AI評価に応用可能
非決定論的テストへの対応 パイプラインに統計的評価レイヤーの追加設計が必要

まとめ

JaSST Tokyo 2026を通じて確信したのは、タイミーのQA Handbookが掲げる方向性は業界潮流と高い整合性を持っているということです。Everything as Codeによる教師データ蓄積、HITL型のプロセス設計、リスクベースドテストの体系化は、業界が「これからやるべき」と議論しているものを先行して体系化できています。

一方、最大のギャップは「リリース後の継続的品質バリデーション」と「品質活動のビジネス価値換算」 の2点。いずれも複数セッションで繰り返し言及され、業界コンセンサスが形成されつつあるテーマです。

今回のJaSSTは、AI駆動開発が「一部の先進企業の取り組み」から「業界標準の議論テーマ」に移行したことを実感する場でした。先行して整備してきた資産を活かしつつ、ギャップの解消に取り組むことで、QA4AIDDの実践をさらに一歩進めていきます。

開発チームとの協業とトレーサビリティ基盤

タイミーの岸です。私からは印象に残った二つのセッションの紹介と感想をお届けします。

開発チームとQAエンジニアの新しい協業モデル:年末調整開発チームで実践する [QAリード施策] / SmartHR

speakerdeck.com

SmartHRの平澤さん・依田さんによる、開発エンジニアとQAエンジニアとの協業の取り組みについての講演でした。

開発チームによる自律的なQAを支援する施策であり、QAエンジニアが開発チームに入り込んで、最初はQAについて支援しつつ最終的にはチームから抜けていくというものです。 特徴的なのは、チームに参加するQAエンジニア以外に、チーム内からもQAを推進するメンバーを立てるという点でした。このメンバーは「QAリード」と呼ばれ、QAエンジニアとの1on1やチーム内での旗振り、テスト技法の勉強会などを通してQAプラクティスを根付かせていきます。QAリードの役割は目標設定にもきちんと反映されていくとのことでした。人選は指名ではなくチームからの立候補を基本とする形とのことで、SmartHRの開発チームにおける品質意識の高さがうかがえました。

こういったチームの自律性支援はタイミーでも実践の真っ最中です。QAリードの役割やQAエンジニアからの推進の方法など、私たちにとっても参考になる点が多く、とても興味深く聴かせていただきました。

仕様漏れ実装漏れをなくすトレーサビリティAI基盤のご紹介 / コインチェック

speakerdeck.com

コインチェックの国分さんによる、ドキュメント間のトレーサビリティとそれを検査する基盤についての講演でした。

ドキュメント間には関連性があります。例えば、要求からは仕様が派生し、仕様からは設計、設計からは実装が、また設計からはテストケースも派生します。このため、派生元と派生先は矢印で結ぶことでグラフとして表現できます。ここで、矢印の片方にドキュメントが存在しなかった場合は「アノマリー」となり、何かがおかしいことがわかります。派生先が存在しなければ、実装やテストが漏れている可能性があり、派生元が存在しなければ不必要な成果物が作成されている可能性があるということです。そして、コインチェックではこのグラフを検証するシステムをAIを活用して作っているとのことでした。

AI基盤については、可能な限り人手を抑えつつ、偽陽性・偽陰性を抑えるためのチューニングが行われていました。一方でAIを並列して稼働させるためには何よりも金銭コストがかかり、これを抑えるために敢えて軽量なモデルを使用するなど苦慮されている様子でした。

タイミーにおいては、ドキュメントを作成するかどうかチームによるバラツキがあります。そのためこういった検証基盤については、同じものを作っても定着するかどうかは未知数です。とはいえ、複雑化している仕様をどのように管理していくかは私たちにとっても大きな課題です。こういった取り組みを参考にしつつ、自分たちにマッチする仕組みを開発していくことは重要であると感じました。

要求・暗黙知・越境から見る AI 時代の QA

タイミーの松田です。 昨年はタイミーとして登壇する側でしたが、今回は一参加者として様々なセッションに参加し多くの学びを得ることができました。

今回の JaSST Tokyo では AI と QA に関するトピックが多く、参加したセッションにはそれぞれ共通するテーマがあると感じました。私はその共通項を 3つ に整理しました。

  1. 要求エンジニアリング — QA の基礎能力としての重要性
  2. 暗黙知 — AI への適切なコンテキスト提供
  3. 越境 — エンジニアリングと QA の役割の進化

本レポートでは、それぞれの学びについてまとめます。

1. 要求工学(エンジニアリング )— QA の基礎能力としての重要性

こちらは、freeeの苅田さん・栗田さんが発表された「曖昧な要求は仕様かバグか-―ai時代の仕様とテストを考える」の発表から得た学びです。

ここでは「要求工学(エンジニアリング)」 に関しての発表を軸に話が進みました。

カンファレンスでは要求工学に関する発表があり、その重要性が改めて強調されました。

プロダクトには必ず何かしらの価値が求められます。その価値を言語化し、プロジェクトとして具体化するためには、要求を適切に言語化 → 仕様を策定 → 設計に落とし込む というフローが欠かせません。この流れは、AI を活用する時代になっても変わらない本質的なプロセスです。

AI がどれだけ進化しても、「なぜ作るのか」が不明瞭もしくは曖昧であれば、意図通り・要求通りのプロダクトを作ることは困難 です。作るべきものの目的と価値を明確にすることは、AI 時代においても変わらず重要な技術です。

シフトレフトの流れの中で、QA エンジニアは 要求事項の適切性を検証する 役割を担います。要求が適切でない場合、そこには暗黙の前提や仮定が隠されている可能性があります。要求獲得などの技法を活用し、暗黙知を明確に引き出して、必要な情報から作り上げていくことが求められます。

2. 暗黙知 — AI への適切なコンテキスト提供

二つ目は 「暗黙知」 です。

こちらは、チームみらいの安野さんとテクバンの豊田さん・長島さんによるセッション「AIがQAエンジニアの仕事を奪うのか?」から得た学びです

現在、AI をできる限り活用し、精度を上げて素早く価値を出すことが大きなトピックになっています。この流れは今後も変わらないでしょう。

しかし、AI に意図通りの価値を出させるには、適切なコンテキストを渡すこと が不可欠です。そのコンテキストは私たち人間から情報として伝達されます。つまり、どのような情報をどう入力するかが、AI を最大限に活用するための鍵になります。

ここで重要になるのが、暗黙知の言語化、つまり「暗黙知を形式知に変えること 」です。人間が持つ暗黙知をできる限り言語化し、AI が学習・認識できる状態にする必要があります。

会話やメール、Slackなどのやり取りをログとして集めることも、コンテキストを得るうえで有効だと話されていました。

また、先ほどのfreee様の発表でも相手の真の要求を知るためにヒアリングするなどの「要求獲得」といった話題とも繋がると感じました。

3. 越境 — エンジニアリングと QA の役割の進化

三つ目は 「越境」 です。

チームみらいの安野さんから「QA もエンジニアも、今後同じ作業をし続けるわけではなく、その 業務内容自体が変わっていく」 という話がありました。エンジニアという職業はなくならないものの、担う内容は大きく変化していきます。

「ものを作り上げる」という過程そのものは変わりません。しかし、どうやって作るのか、なぜ作るのか、作った後にどう運用するのか といった、従来のエンジニアリングよりも幅広い領域に踏み込むことが求められるようになります。

QA においても同様です。プロダクトの品質保証にとどまらず、プロダクトを通じて自社にどのようなリスクが潜んでいるかを提示する ことが必要になります。

例えば、QA がPdMだけでなく事業部や経営層ともつながり、プロジェクトの意思決定に必要な情報を提示する役割を担うとことも、今後は視野に入れていくことが重要です。

品質保証の 範囲・方法・効果の説明責任 などが、今後のエンジニアの責務の一つとして求められていくと感じました。

まとめ

JaSST Tokyo'26 を通じて、以上の 3つのキーワード を持ち帰ることができました。

これらはいずれも、AI 時代により一層求められる力 だと感じました。今回の学びを今後の業務に活かしていきたいと思います。

おわりに

弊社ではQA、SETの採用も積極的に行っております。

hrmos.co

タイミーのQA、ソフトウェアテストについてもっと知りたいという方はぜひカジュアル面談でお話ししましょう。

product-recruit.timee.co.jp

DAのABテスト業務をAIで加速する ── 実験設計レビューの自動化

はじめに

こんにちは。タイミーのデータアナリティクス部でデータアナリストをしているishidaです。普段は、タイミーのプロダクトに関する分析業務に従事しています。

タイミーのデータアナリスト(DA)チームでは、プロダクト施策の効果検証としてABテストを頻繁に実施しています。ABテストの業務は、大きく「実験設計」「クエリ作成」「可視化・レポート」の3工程に分かれますが、これらすべてをDAが担当しています。

施策の数が増えるにつれ、ABテストの “回転数” がボトルネックになりつつありました。そこで私たちは Claude / Cursor を活用し、まず実験設計のレビューを自動化する取り組みを始めました。

本記事では、その仕組みと設計思想をご紹介します。

なお、タイミーにおけるABテストは「① 実験設計 → ② クエリ作成 → ③ 可視化・レポート」の3ステップで進みます。本記事で扱うのは、①の実験設計レビューの自動化です。

1. 実験設計レビューの自動化

課題:レビューの属人化

ABテストの実験設計にはいくつかの重要なチェックポイントがあります。

チェックポイント 確認内容
SUTVA TG/CG間でリソースの奪い合いが起きないか
Unit Alignment ランダマイズ単位とメトリクス集計単位は一致しているか
SRM サンプル比率のミスマッチを検知できる設計か
Novelty/Primacy 経時的変化を考慮した期間設定か
Multiple Testing 多重比較の問題を制御できているか
Guardrail 副作用を監視するガードレール指標は定義されているか

これらのレビューは経験や前提知識によって見落としが生じやすく、属人化しがちでした。

解決策:AIによるチェックリストレビュー

私たちは、実験設計チェックリストを Claude / Cursor のコンテキストに含め、実験設計ドキュメントを入力するとチェックポイントごとにレビューが返るようにしました。

具体的には、以下の2種類のファイルをプロジェクトのルールとして設定し、AIに読み込ませています。

  • 実験設計ドキュメントのテンプレート: テスト概要・テスト設計・評価指標などの項目が定義されたMarkdown
  • チェックポイント定義: 6つの観点それぞれについて「判定の観点」「よくある違反例」「対応方針」を構造化したドキュメント

AIレビューの出力イメージ

## CP1: SUTVA
⚠️ リスクあり
-TG/CG間でリソースの奪い合いが発生する可能性があります
-推奨: クラスタ単位でのランダマイズを検討してください

## CP2: Unit Alignment
✅ 問題なし
-ランダマイズ単位と集計単位が一致しています

## CP3: SRM
✅ 設計済み
-Debugging Metric として介入の影響を受けない指標を設定
-カイ二乗検定を実験開始時に実行する設計
...

ポイント:AIレビューは「最低限の品質保証」として位置づける

重要なのは、AIレビューを 人間のレビューの代替 としてではなく、最低限実行されるべきレビュー として位置づけていることです。

  • AIレビュー = チェックリストの網羅的な確認(漏れ防止)
  • 人間レビュー = ビジネスコンテキストを踏まえた判断(例:この施策ならSUTVA違反は許容範囲か)

これにより、レビュー依頼を受けたDAは「AIが見つけた問題点」を起点に議論できます。

学び

AIレビューは「ゲートキーパー」ではなく「下書き」

AIレビューの結果を鵜呑みにせず、「少なくともこのレベルのレビューは済んでいる」という 品質の下限保証 として使っています。最終判断は必ず人間が行います。

この位置づけにしたことで、「AIに任せて大丈夫か」という心理的なハードルも下がります。

We’re Hiring!

私たちは、ともに働くメンバーを募集しています!!

データアナリストの募集ページはこちら

カジュアル面談も行っていますので、少しでも興味がありましたら、気軽にご連絡ください。

Terraform + Aurora Data APIでDBユーザー作成をIaC化した話

はじめに

こんにちは。プラットフォームエンジニアリングチームに所属している徳富(@yannKazu1)です。

新規プロダクトを立ち上げるとき、インフラ構築って意外とやることが多いですよね。その中でも地味にめんどくさいのがDBユーザーの作成と権限付与。手動でやると「あ、権限つけ忘れた」「このユーザー名スペルミスってない?」みたいなヒヤリハットが発生しがちです。

今回は、この作業をTerraformでIaC化した話を書いていきます。

背景:ボイラープレートでインフラ構築を爆速にしている

弊社ではTerraformのボイラープレートと、それをもとにインフラを構築するためのDevinへの指示プロンプトをセットで管理しているリポジトリがあります。

新規プロダクトのインフラが必要になったら、このリポを使ってDevinにお願いするだけ。数時間もあれば、AWSアカウントの作成、VPC・ECS・Auroraなどの基盤構築、Terraform実行に必要なIAMロール・バックエンド・CI/CDワークフローの設定に加え、Datadog設定、監査設定、ログ基盤の作成まで、必要なインフラがひととおり立ち上がります。

このボイラープレートを整備するにあたって目指したのは、「Devinにお願いするだけで、新規プロダクトのインフラを簡単に作れる状態」でした。ところが、DBユーザーの作成だけはどうしても手動作業が残ってしまっていました

せっかくDevinに投げれば数時間でインフラができるのに、DBユーザーだけは人間が踏み台経由でDBに繋いで CREATE USER して GRANT して……とやらないといけない。これだとボイラープレートの意味が薄れてしまいますし、手動オペレーションにはミスのリスクもあります。

ここをTerraformでIaC化できれば、ボイラープレートにサクッと組み込めて、Devinに任せるだけでインフラ構築が完結するようになります。

なぜTerraform?

DBユーザーの管理といえばAnsibleを使うパターンも考えました。ただ、弊社のインフラは基本的にTerraformで一元管理しているので、できればTerraformの中で完結させたい。ツールが増えると学習コストも運用コストも増えますし、ボイラープレートにAnsibleのステップを追加するよりも、Terraformモジュールとして組み込む方がシンプルです。

というわけで、Terraformでなんとかする方向で調査を進めました。

Aurora Data APIという選択肢

弊社ではAurora MySQLを使用しており、バージョン3.07以降でRDS Data APIに対応しています。

Data APIは、HTTPSエンドポイント経由でSQLを実行できるAPIです。従来のようにVPC内から直接DBに接続する必要がなく、AWS CLIやSDKからサクッとSQLを叩けます。

これを terraform_data リソースの local-exec プロビジョナーと組み合わせれば、Terraformの中からDBユーザーを作成できるというわけです。

モジュールの実装

実際に作ったTerraformモジュールを紹介します。

DBユーザーの作成・削除

resource "terraform_data" "db_user" {
  input = {
    rds_cluster_arn    = var.rds_cluster_arn
    rds_secret_arn     = var.rds_secret_arn
    database_name      = var.database_name
    username           = var.username
    ssm_parameter_name = var.ssm_parameter_name
  }

  provisioner "local-exec" {
    command = <<-EOT
      PASSWORD=$(aws ssm get-parameter --name "${self.input.ssm_parameter_name}" --with-decryption --query 'Parameter.Value' --output text)
      aws rds-data execute-statement \
        --resource-arn "${self.input.rds_cluster_arn}" \
        --secret-arn "${self.input.rds_secret_arn}" \
        --database "${self.input.database_name}" \
        --sql "CREATE USER IF NOT EXISTS '${self.input.username}'@'%' IDENTIFIED BY '$PASSWORD'"
    EOT
  }

  provisioner "local-exec" {
    when = destroy

    command = <<-EOT
      aws rds-data execute-statement \
        --resource-arn "${self.input.rds_cluster_arn}" \
        --secret-arn "${self.input.rds_secret_arn}" \
        --database "${self.input.database_name}" \
        --sql "DROP USER IF EXISTS '${self.input.username}'@'%'"
    EOT
  }
}

ポイントは以下のとおりです。

  • terraform_data リソースを使って、local-exec プロビジョナーでData API経由のSQLを実行
  • CREATE USER IF NOT EXISTS で冪等性を担保
  • when = destroy のプロビジョナーで、terraform destroy 時にユーザーを自動削除
  • パスワードはSSM Parameter Storeから取得(後述の工夫で安全に管理)

権限の付与・取り消し

resource "terraform_data" "db_grant" {
  for_each = { for idx, grant in var.grants : idx => grant }

  depends_on = [terraform_data.db_user]

  input = {
    rds_cluster_arn = var.rds_cluster_arn
    rds_secret_arn  = var.rds_secret_arn
    database_name   = var.database_name
    username        = var.username
    privileges      = each.value.privileges
    grant_database  = coalesce(each.value.database, var.database_name)
    grant_table     = coalesce(each.value.table, "*")
  }

  provisioner "local-exec" {
    command = <<-EOT
      aws rds-data execute-statement \
        --resource-arn "${self.input.rds_cluster_arn}" \
        --secret-arn "${self.input.rds_secret_arn}" \
        --database "${self.input.database_name}" \
        --sql "GRANT ${self.input.privileges} ON ${self.input.grant_database}.${self.input.grant_table} TO '${self.input.username}'@'%'"
    EOT
  }

  provisioner "local-exec" {
    when = destroy

    command = <<-EOT
      aws rds-data execute-statement \
        --resource-arn "${self.input.rds_cluster_arn}" \
        --secret-arn "${self.input.rds_secret_arn}" \
        --database "${self.input.database_name}" \
        --sql "REVOKE ${self.input.privileges} ON ${self.input.grant_database}.${self.input.grant_table} FROM '${self.input.username}'@'%'" || true
    EOT
  }
}

for_each で権限セットを柔軟に定義できるようにしています。DMLとDDLを分けて付与したい、みたいなケースにも対応可能です。

使い方

モジュールの呼び出しはこんな感じです。

module "db_user_app" {
  source = "../../modules/db_user"

  rds_cluster_arn    = module.aurora_main.cluster_arn
  rds_secret_arn     = module.aurora_main.cluster_master_user_secret[0].secret_arn
  database_name      = "hoge_db"
  username           = "hoge_app_user"
  ssm_parameter_name = aws_ssm_parameter.app_db_password.name

  depends_on = [
    aws_ssm_parameter.app_db_password,
    module.aurora_main,
  ]

  grants = [
    {
      # DML権限: データの読み書き
      privileges = "SELECT, INSERT, UPDATE, DELETE"
    },
    {
      # DDL権限: マイグレーション実行用(テーブル作成・変更・削除、インデックス操作)
      privileges = "CREATE, ALTER, DROP, INDEX, REFERENCES"
    }
  ]
}

DMLとDDLの権限を分けて書けるのが個人的に気に入っています。どの権限を付与しているかが一目でわかりますし、将来的に読み取り専用ユーザーを追加したいときもモジュールを再利用するだけでOKです。

パスワードをstateに残さない工夫

ここが今回一番こだわったポイントです。

Terraformでパスワードを扱うとき、普通にやるとstateファイルにパスワードが平文で残ってしまいます。sensitive = true をつけても、plan出力でマスクされるだけでstateには書き込まれてしまう。これはセキュリティ的によろしくないですよね。

そこで活用したのが、Terraform 1.10で導入された ephemeral リソースと、Terraform 1.11で導入された value_wo(write-only引数) です。

ephemeral "random_password" "app_db" {
  length  = 32
  special = false
}

resource "aws_ssm_parameter" "app_db_password" {
  name             = "/${var.app_name}/${var.env}/db/app_user_password"
  type             = "SecureString"
  value_wo         = ephemeral.random_password.app_db.result
  value_wo_version = 1
}

ephemeral リソースとは

Terraform 1.10で登場した新しいリソースタイプです。通常の resourcedata と違い、planやstateに一切値が保存されません。毎回のplan/apply時に一時的に生成され、使い終わったら破棄されます。

ephemeral "random_password" を使うことで、パスワードの生成結果がstateに残ることを防げます。従来の resource "random_password" だと、生成したパスワードがstateファイルにそのまま記録されてしまっていたので、これは大きな改善です。

value_wo(write-only引数)とは

Terraform 1.11で導入されたwrite-only引数の仕組みです。aws_ssm_parameter リソースの value_wo を使うと、SSM Parameter Storeへの書き込みは行われますが、その値がTerraformのstateやplanファイルに保存されることはありません。

value_wo_version は変更検知のためのバージョン番号です。パスワードをローテーションしたい場合はこの値をインクリメントすれば、次のapply時に新しいパスワードが生成・設定されます。逆にバージョンを変えなければ、ephemeral が毎回新しいパスワードを生成しても、SSM Parameter Storeの値は更新されません。

この2つを組み合わせることで、パスワードの生成から保存まで、一度もstateファイルにパスワードが記録されないフローが実現できました。

現時点での制約:パスワードの更新には対応していない

ここまで読んで「パスワードのローテーションはどうするの?」と思った方もいるかもしれません。正直に言うと、このモジュールはパスワードの更新(ALTER USER)には対応していません

理由はシンプルで、Terraformのプロビジョナーには when = createwhen = destroy しかなく、when = update が存在しないからです。つまり、リソースの入力値が変わったときに「更新用のSQLを実行する」ということができません。

terraform_datainput が変わると、Terraformは古いリソースをdestroyしてから新しいリソースをcreateする(replace)動きになります。DBユーザーの場合、これは DROP USERCREATE USER という流れになるので、パスワード変更だけしたいケースには少々大げさです。

この when = update の追加については、HashiCorpのGitHubリポジトリにIssueが上がっています(hashicorp/terraform#35825)。いつか実装されれば、パスワードローテーションもこのモジュールの中でスマートに対応できるようになるはずです。それまでは、パスワードの更新が必要になった場合は手動対応か、別の仕組みで対応する必要があります。

とはいえ、新規プロダクト立ち上げ時の初期ユーザー作成という用途においては、create/destroyだけで十分に機能しています。

まとめ

やったことをまとめると以下のとおりです。

  • Aurora MySQLのData API(3.07以降で利用可能)を使って、Terraformの terraform_data + local-exec でDBユーザーの作成・権限付与をIaC化
  • Terraform 1.10の ephemeral リソースと1.11の value_wo を活用して、パスワードをstateに残さないセキュアな構成を実現
  • これらをモジュール化してボイラープレートに組み込み、新規プロダクトのインフラ構築をさらにスムーズに
  • プロビジョナーに when = update がないため、パスワードの更新には現時点では未対応

Terraformの ephemeralvalue_wo はまだ比較的新しい機能なので、知らない方も多いかもしれません。パスワード管理で困っている方はぜひ試してみてください。

参考リンク

NLP2026現地参加レポート : LLM評価・品質保証の実践知

はじめに

こんにちは、株式会社タイミーでプロダクトAIエンジニアとして働いている貝出です。直近は、タイミーの求人内容などのコンテンツモデレーションにLLMを利用した、システム開発や性能改善を行っています。

2026年3月9日(月)〜3月13日(金)に開催された「言語処理学会第32回年次大会(NLP2026)」に、今年は初めて現地参加しました。大会2日目は記録的な大雪に見舞われ、会場にたどり着くだけでひと苦労でしたが、それでも現地ならではの熱気は格別で、ポスター発表や他社エンジニアとの立ち話など、オンラインでは得られない学びが随所にありました。

NLP2026では多くの発表がありましたが、本記事ではLLMの評価・品質保証・安全性に関する発表に絞って紹介します。単に発表内容を紹介するだけでなく、実際のプロダクト開発や評価データ設計にどう接続できるかという観点で読み解きます。研究と実務をつなぐ視点として、評価設計やベンチマーク整備のヒントになれば幸いです。

大会2日目の大雪

言語処理学会年次大会について

会場内看板

anlp.jp

言語処理学会年次大会は言語処理学会が主催する学術会議であり、国内における言語処理の研究成果発表の場として最大規模のイベントです。

今年で第32回を迎え、発表件数は797件、最終日までの参加者数は2,316人と過去最大を記録しました。年々規模が拡大しており、NLP分野への関心の高さが伺えます。LLMの登場により一時は「研究することがなくなるのでは?」という懸念もあり、2023年には「ChatGPTで自然言語処理は終わるのか」というテーマでパネルディスカッションが行われたこともありました。しかしその懸念に反して、近年は「安全にLLMをどう使うか」「LLMの挙動をどう解釈するか」といった観点の研究が増えてきており、まだまだ研究題材は尽きない印象です。

なお、発表論文は言語処理学会のWebページで公開されているため、当日参加できなかった方でも閲覧可能です。

私自身も今回、社会人大学院での研究内容をもとにポスター発表を行いました。多くの方と議論でき、大変刺激になりました。合計90分間、ポスターの前で参加者に説明したり質問に答えたりと、途中で酸欠になりそうなほど白熱したセッションでしたが、ありがたいことにスポンサー賞としてレトリバ賞をいただくことができ、とても良い思い出になりました。

興味深かった発表

普段の業務では、「LLMを活用してビジネス課題をいかに解決するか」という問いと同時に、「LLMの出力をどう評価するか」「そのための評価データをどう設計するか」といった問題にも日々向き合っています。今回は、こうしたLLMの評価・品質保証・安全性というテーマを軸に、特に業務課題と関連の深かった4件の発表を取り上げます。

チュートリアル3:信頼できるAIへのソフトウェア工学からのアプローチ:「品質」技術の動向と課題

発表内容

本チュートリアルでは、ソフトウェア工学の観点から「信頼できるAI」の品質保証技術について解説されました。

まず、品質は「複数の特性から構成され、様々なニーズや要求を満たすこと」と定義されると説明されていました。また、品質には、対象システム自体に対して測るもの(例: レイテンシなど)と、実際にシステムを利用する段階で計測可能なもの(例: 顧客満足度など)の2種類が存在するとのことでしたした。そのうえで、価値やリスクはシステム全体で評価されるべきであり、AI部品ごとに適切に評価することの重要性が強調されていました。

AIの品質保証に関するガイドラインとしては、AIQMやQA4AIなどが紹介されました。これらのガイドラインでは、「AIパフォーマンス」「リスク回避性」「公平性」といった機械学習に特有の品質や、それを評価するための「被覆性(事例パターンが網羅的に含まれているか)」や「均一性(実際の母集団の分布に近いか)」などのデータセットにおける品質の重要性も整理されていました。

一方で、LLMの普及に伴い、入出力が非定型になってタスクの境界が曖昧になっています。また、正解が一意に決めづらくなったことで、評価・改善の難易度と工数が増大しているという現場課題も指摘されていました。LLMの手軽さからシステム開発自体は進めやすくなった反面、活動の重心は「開発」から「評価・改善」へと移行しています。しかし、「開発」と違って「評価・改善」では、工数換算をする意識が低くなりがちです。そのため、評価・改善の継続的サイクルを定着させることが困難だという課題が挙げられていました。

また、モデル評価の文脈としてソフトウェア工学における「自動テスト生成」の手法が紹介されました。代表的なものの一つが、テスト生成を最適化問題に帰着させてメタヒューリスティックに解く Search-Based Testing(探索的テスト) です。たとえば自動運転の分野では、この手法を用いることで事故が起きやすい弱点領域を探索したり、モデルの性能限界の境界を可視化したりすることが可能になっています。

最後に、言語モデルが今後ロボットや自動運転など物理世界にも応用されていく中で、よりリスクベースの評価が必要になるという展望が示されました。

感想

「開発」から「評価・改善」にエンジニアの工数の主なタスクが移り変わっているというところも、たしかになと思わずうなずいてしまいました。今後は「モデル開発」よりも、どう評価するか、どうデータセットを作るのかにML/AIエンジニアの重心が移るのかもしれません。

また、Search-Based Testingは初めて聞いたのですが、LLM審査のコンテキストに当てはめると、微妙な偽陽性・偽陰性を生む「境界線にある言い回し」を自動探索し、モデルやプロンプトの弱点を事前に洗い出す、といった使い方ができそうだと感じました。

[B2-1] chakoshi Fine: 多層防御に基づくLLM向けガードレールの設計と実装および評価

発表内容

本研究は、生成AIの安全な業務利用のためのガードレール構築に関するものです。前年のNLP2025で発表された chakoshi の発展系にあたります。

chakoshi では単一モデルに複数の役割を担わせていたため、あるリスクの検知精度を伸ばそうとすると別の精度が低下しやすいという構造的な制約が課題でした。本研究ではこの課題に対し、リスクごとに特化した5つの独立した防御機構を段階的かつ選択的に適用する多層アーキテクチャ chakoshi Fine を提案しています。複数のコンポーネントに分割したパイプライン構造にすることで、単一モデルでの全体最適化を避け、各ポリシーが専門性を高めつつ相互に弱点を補完する設計になっています。この結果、既存の商用ガードレールサービスと比較して高い検知精度を達成していました。

さらに、擬似業務タスクを通じて実際の業務を想定した有用性評価も行われています。ガードレール導入の有無が人間のタスク正答率や平均所要時間に統計的な差を与えなかったという結果が示されており、過剰検知によるユーザー体験の悪化や業務効率の低下を防ぎつつ、パスワード漏洩のような不正な入出力に対しては、98%の確率で遮断できていました。

感想

ガードレールを利用する際は、どうしても使用感が気になります。本研究が、検知精度だけでなく処理速度や「ユーザー体験を損なわないか」という点まで踏み込んで評価してくれているのは、実務側としてありがたいです。また、4B程度の軽量なLLMでもガードレールのスコープによっては、ある程度検知精度が担保できるという点も個人的には発見でした。

[Q4-3] LegalRikai: Open Benchmark - 法務ドメインの日本語ベンチマーク

発表内容

本研究は、実際の法務業務のワークフローを模した、法務ドメインにおける新たな日本語ベンチマーク LegalRikai を提案しています。

このデータセットは、弁護士の監修のもとで人手による精緻なアノテーションが行われており、高コストではあるものの高品質な内容となっています。法令改正の要約や指示に基づく契約書編集など、実際の法務業務を模した4つの複雑なタスクから構成されており、法務文書特有の長文インプットに対して構造化された出力を求める設計になっています。

評価においては、単一の指標ではなく、指示の遵守度・契約書全体の構造の一貫性・不要な変更の有無など、実務に即した複数の観点から評価する尺度が採用されています。正解データの作成から評価に至るまで専門家が深く関与しているため、データ数は各タスク25件と少数ながら厳選された内容です。さらに、評価者間の一致度(Cohen の κ スコア)を計測することで、アノテーションの妥当性やガイドラインの信頼性を担保しており、LLMの法務実務における実力を正確に測るための堅牢な基盤を提供しています。データセットは公開されており、論文内のリンクから参照可能です。

感想

「専門ドメインのベンチマークをどう設計するか」という観点で非常に参考になる研究でした。特に、評価観点を実務の複数軸に分解している設計や、少数でも質を担保するためにアノテーターの一致度を計測している点は、評価データを整備する際にも応用できそうです。「データ数は少なくても、専門家による厳密な設計で品質を担保する」というアプローチは、社内の評価データ構築においても積極的に取り入れたい考え方です。

[B8-13] 医療系対話AIにおける評価基準の策定と自動評価手法の比較検証

発表内容

本研究は、日本の医療事情に即した独自の評価データセットを構築し、医療系対話AIにおける「LLM-as-a-Judge」を用いた3つの自動評価手法を比較検証したものです。具体的には以下の3手法が比較されました。

  • 総合評点方式:詳細なガイドラインに基づき1〜10点でスコア化
  • 総合評点方式(簡易版):評価の観点のみを提示
  • 項目別評価方式(チェックリスト形式):具体的な評価項目に対してTrue/False判定を行い加重スコア化

実験の結果、モデル間の全体的な性能差を識別する能力においては、意外にも詳細な指示を与えない「総合評点方式(簡易版)」が最も優れていることが分かりました。一方で、個別の会話に対する評価の「一貫性」や、医学的に危険な回答を確実に除外するといった「説明可能性・安全性」の観点では、「項目別評価方式」が最も優れていることが示されています。目的(モデル全体の性能比較か、個別回答の厳密な品質保証か)に応じて適切な評価アプローチを使い分ける重要性が裏付けられた研究です。

感想

「簡易版のほうがモデル間の性能差を検出しやすい」という結果は、直感に反していて面白かったです。評価指標によっては、どの形式の評価にするかを実施前に比較しておくといいのかもしれません。

「項目別評価のルーブリック設計には専門家のコストがかかる」という点は、スポンサーブースで他社のエンジニアと話していたときにも、全く同じ悩みとして挙がっていました。「評価の精度を上げたいが、設計コストをどこまでかけられるか」というトレードオフは、ドメインを問わず共通の課題なのだと改めて実感しました。スモールスタートする場合は「まず簡易版で全体傾向を把握し、問題が疑われる領域だけ項目別で深掘りする」という使い分けが現実的かもしれません。

おわりに

今回取り上げた4つの発表は、主に評価、評価データ、そして安全性に関するものでした。LLMの能力が飛躍的に向上した今、「人間の期待通りに生成できているのか」「安全にLLMを利用できているのか」という問いへの関心はますます高まっており、研究も着実に進んでいる印象です。

NLP2026では今回紹介しきれなかった魅力的な研究も数多くあり、この領域の裾野の広がりを実感しました。タイミーを安心・安全なプラットフォームとして維持するためのLLM活用について、多くの示唆を持ち帰ることができた大会でした。

We’re hiring!

現在、タイミーでは、データサイエンスやエンジニアリングの分野で、共に成長し、革新を推し進めてくれる新たなチームメンバーを積極的に探しています!

product-recruit.timee.co.jp

また、気軽な雰囲気でのカジュアル面談も随時行っておりますので、ぜひお気軽にエントリーしてください。↓

hrmos.co

hrmos.co

hrmos.co