1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LLMを使った開発を3ヶ月続けて、運用で残したもの・やめたもの

1
Posted at

はじめに

開発の工程でLLMを使い始めて3ヶ月たったので、運用として残したもの、やめたもの、まだ試しているものを一覧にしました。各行に、そうした理由と、続いているかをどう確かめているか(コマンドと頻度)を付けています。

経緯や感想はZennに書いたので、こちらには一覧と確認方法だけを置きます。表を見て、気になった行の説明だけ拾ってもらえれば十分です。

ここでいう運用は、要件定義、ドキュメント、コードレビューの工程でLLMを続けて使うことを指します。LLMを組み込んだプロダクトの監視や評価(いわゆるLLMOps)の話ではありません。

環境

  • 対象:社内の少数のプロジェクト、2026年秋からの約3ヶ月
  • 集計スクリプト:Python 3.14.6 で動作確認(標準ライブラリのみ)

一覧

区分 項目 理由 確認方法 頻度
残した API定義・テーブル定義とコードのズレをCIで検出する 機械的に照合できる情報だから check_doc_drift.py のジョブが通っているか PRごと
残した 要件定義書の初稿をLLMで作り、機械で検査してから人が通しで読む 初稿は速いが、読む工程を飛ばすと整った間違いが次に流れる check_requirements_doc.py と、人が見る3項目 初稿ごと
残した PRのAIレビューを一次チェックに使う 命名、書式、よくあるパターンは拾える 指摘を採るかどうかを、人のレビュアーが決めているか PRごと
残した ヒアリングで「例外的な運用はありますか」を必ず聞く 暗黙の業務ルールはLLMへの入力に入ってこない ヒアリングメモにこの質問の回答欄があるか ヒアリングごと
残した READMEや設計意図の修正案もLLMに下書きさせ、理由は人が書き足す 変更には気づくが、なぜ変えたかまでは書けない 「理由」を人が書いてから採用しているか PRごと
残した 要求同士の矛盾や、サービスをまたぐ影響は、LLMが書いたものを人が最後に確かめる 渡した文書や差分の外にある前提は、ツールを変えても見てくれなかった 1.2の3項目を人が確認したか 初稿ごと、PRごと
やめた 工程の単位で、LLMに任せる範囲を決める 同じ工程の中に、効く情報と効かない情報が混ざっていた 下の判断表に置き換えた -
試している 作成時間と差し戻し回数を記録する 3ヶ月回しても、効果を数字で示せなかった summarize_metrics.py で集計 記録は1本ごと、集計は月1回

1. 残したもの

1.1 ドキュメントとコードのズレ検出

API定義とテーブル定義は、コードやマイグレーションから「正」を取り出せるので、ズレの判定まで機械でできます。仕組みは以前の記事に書きました。

続けている理由のひとつは、担当者が替わったときの確認の仕方が変わったことです。API定義とテーブル定義は信じてよく、文脈が要る部分だけ前任者に聞けば済むようになりました。

1.2 要件定義書の初稿と、人が見る3項目

初稿はLLMで数分で出ます。用語のゆれ、「要確認」と書かれた箇所、削除や承認など権限に関わる行は、スクリプトで一覧にします(検査スクリプトの記事)。そのあと人が通しで読みます。人が見るのは、機械では判断できない次の3つです。

  • 例外的な運用(繁忙期は承認を一部省略する、など)が書かれているか
  • 要求同士が矛盾していないか(ある画面では管理者のみ削除できるのに、別の画面では担当者も削除できる、など)
  • ほかのサービスやシステムへの影響が書かれているか

初稿の文章が整っているぶん、抜けに気づきにくくなります。3項目を決めておくのは、そのためです。

1.3 AIレビューの一次チェック

命名や書式、よくある危ない書き方はAIに先に指摘させ、業務ルールが絡む判断は人が見ます。分け方の詳細はこちらの記事に書きました。

1.4 ヒアリングの質問

これはLLMとは関係のない、昔からある対策です。それでも残しているのは、LLMに渡す情報に含まれていないルールは、初稿にも出てこないからです。

1.5 READMEの修正案と、矛盾の確認

READMEのセットアップ手順に変数が増えたことには、LLMも気づきます。ただ、なぜ増えたのかは書けません。そのため下書きはLLMに任せ、理由の一文は人が書き足してから採用しています。

要求同士の矛盾や、サービスをまたぐ影響も同じ扱いです。ある程度は自動で見つけられると期待していましたが、渡した文書やPRの差分の外にある前提までは見てくれませんでした。LLMに書かせることは続けていて、最後に確かめるのは人です。1.2のスクリプトも、権限に関わる行を並べるところまでで、矛盾かどうかは人が決めます。

2. やめたもの:工程で線を引くこと

最初は「要件定義はLLM、レビューは人」のように工程で分けようとしていました。3つの工程を並べてみると、うまくいったのはどれも構造が決まっていて照合できる情報で、うまくいかなかったのは文脈が要る情報でした。今は工程に関係なく、次の表で決めています。

情報の性質 例 LLMにやらせる範囲
構造が決まっていて、機械的に照合できる API定義、テーブル定義、表記ゆれ 判定まで任せる
文脈がないと判断できない 業務ルールの背景、手順の理由、設計の意図 下書きまで。最後の判断は人

迷ったときは「正しいかどうかを、コードや定義と突き合わせて機械で確かめられるか」だけを考えます。この基準にしてから、新しい使い方を試すかどうかを決めるのが速くなりました。

文脈が要る側でも、LLMに書かせること自体はやめていません。やめたのは、工程の名前で任せる・任せないを決めることです。

3. 試しているもの:計測

3ヶ月回したのに、導入前と比べられる記録を取っていませんでした。試しながら形を変えるつもりで、計測を後回しにしたためです。形を変えるたびに、比べる基準も消えていきました。

次の3ヶ月は、2つだけ記録します。

  • 要件定義書1本の作成時間(初稿から、レビューに出すまで)
  • 差し戻し回数(作成者に戻した回数。指摘の件数ではありません)

LLMを使わなかった案件も同じ形で記録し、比べられるようにします。記録はCSVに1本1行です。

llm_metrics.csv
date,doc,llm,draft_minutes,returns
2027-01-08,REQ-01,yes,95,2
2027-01-15,REQ-02,no,240,1
2027-01-22,REQ-03,yes,120,3
2027-02-03,REQ-04,yes,80,1
2027-02-19,REQ-05,no,180,2

この値は説明用の架空のデータです。集計は次のスクリプトで行います。

summarize_metrics.py
"""要件定義書ごとの記録(CSV)を、LLMを使ったかどうかで分けて集計する"""
import csv
import sys
from statistics import median


def main(path: str) -> None:
    groups: dict[str, list[dict]] = {"yes": [], "no": []}
    with open(path, newline="", encoding="utf-8") as f:
        for row in csv.DictReader(f):
            key = row["llm"].strip().lower()
            if key not in groups:
                sys.exit(f"llm列は yes か no にしてください: {row['doc']}")
            groups[key].append(row)

    print("LLM  件数  作成時間の中央値(分)  差し戻しの中央値(回)")
    for key, rows in groups.items():
        if not rows:
            print(f"{key:<4} 0     -                     -")
            continue
        minutes = median(int(r["draft_minutes"]) for r in rows)
        returns = median(int(r["returns"]) for r in rows)
        print(f"{key:<4} {len(rows):<5} {minutes:<21} {returns}")


if __name__ == "__main__":
    if len(sys.argv) != 2:
        sys.exit("使い方: python3 summarize_metrics.py llm_metrics.csv")
    main(sys.argv[1])
$ python3 summarize_metrics.py llm_metrics.csv
LLM  件数  作成時間の中央値(分)  差し戻しの中央値(回)
yes  3     95                    2
no   2     210.0                 1.5

平均ではなく中央値にしたのは、1本だけ極端に時間がかかった案件があると、平均がそれに引っぱられるからです。それでも件数が少ないうちは、中央値も1本で大きく動きます。数字を見て判断するのは、少なくとも各10本くらい溜まってからにするつもりです。

限界

この一覧は、社内の少数のプロジェクトで3ヶ月回した結果です。チームの規模や案件の種類が違えば、残すものもやめるものも変わると思います。

「残した」は、効果が証明されたという意味ではありません。続けると判断した、という意味です。効果の数字はまだ1つもありません。

計測にも穴があります。LLMを使った案件と使わなかった案件で、要件の大きさはそろえられません。比べられるのは傾向までで、「何割速くなった」とは言えない前提で記録しています。

最後に

区分、項目、理由、確認方法、頻度の5列は、そのまま使えます。手元の運用でも一度埋めてみてください。「やめた」の行が1つもなければ、それ自体が見直すきっかけになると思います。

参考文献

この記事はZennにも掲載しています(一部加筆・修正):https://zenn.dev/vaonvn/articles/c7cb50a0aa0584

VAON Việt Nam のエンジニアチームで、要件定義とレガシー改修にLLMを使う実務を記録しています。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?