Featured image of post プロンプトの新旧どちらが良いか、二週間決まらない。同じ代表例を同じ基準で測る【Eval Harness】

プロンプトの新旧どちらが良いか、二週間決まらない。同じ代表例を同じ基準で測る【Eval Harness】

商品説明を生成する指示書の2版のどちらが良いかで、社内の意見が割れたまま二週間。感覚ではなく、決定的なチェックと LLM-as-Judge を重ねた評価ハーネスで、同じ代表例を同じ基準で測り直す(Eval Harness)。

Featured image of post 処理量が3倍なら費用も3倍。全件を最上位モデルに通すのをやめ、確信度で振り分ける【Model Cascade】

処理量が3倍なら費用も3倍。全件を最上位モデルに通すのをやめ、確信度で振り分ける【Model Cascade】

文書の仕分けを全件、最上位モデルに通していて、処理量が3倍になれば費用もそのまま3倍になる。まず安いモデルで前捌きし、確信度が低いものだけを上位モデルへ回す(Model Cascade)。Python の標準ライブラリだけで実装して確かめます。

Featured image of post セール初日だけ費用が跳ねた。同時に届いた同じ質問を、AIへの1回の問い合わせに束ねる【Request Coalescing】

セール初日だけ費用が跳ねた。同時に届いた同じ質問を、AIへの1回の問い合わせに束ねる【Request Coalescing】

セールは好評だったのに、初日だけ AI の費用が跳ね上がった。表記ゆれを含む同じ質問が同時に何十組も届き、それぞれ別々に問い合わせていた。質問を正規化し、同時に届いた同じ問い合わせを1本に束ねる(Request Coalescing)。

Featured image of post AIの従量課金が予告なく尽き、要約が4日止まった。消費を計って警告と上限で止める【Budget Guard】

AIの従量課金が予告なく尽き、要約が4日止まった。消費を計って警告と上限で止める【Budget Guard】

従量課金の AI 処理が、原資が尽きて予告なく止まり、4日間、20件ほどを手で回すことになった。消費を計って積算し、警告と上限の二段で明示的に止める(Budget Guard)。Python の標準ライブラリだけで実装して確かめます。

Featured image of post 形式チェックは通るのに、社内限定の符丁が顧客へのメールに混ざった。送る前に検める【Output Guardrail】

形式チェックは通るのに、社内限定の符丁が顧客へのメールに混ざった。送る前に検める【Output Guardrail】

AI が下書きした顧客向けメールに、社内限定の符丁が混ざったまま送信された。形式の検査は通っていた。送り出す前に検査関数のパイプラインで語彙を検め、Cleared と Blocked を Python の match 文で受け取る(Output Guardrail)。

Featured image of post 要約が空欄のまま「処理済み」で流れていた。成功に見える失敗を例外に変える【Exception Translation】

要約が空欄のまま「処理済み」で流れていた。成功に見える失敗を例外に変える【Exception Translation】

LLM API は 200 OK のまま、空・打ち切り・拒否を返すことがある。例外が上がらないので、要約が空欄のまま処理済みとして流れていた。契約を満たさない応答を独自例外に変換し、raise ... from e で原因をたどれるようにする(Exception Translation)。

Featured image of post LLMの返答が毎回違い、「これは障害か」に答えられない。揺れてよい範囲を先に決める【Output Contract】

LLMの返答が毎回違い、「これは障害か」に答えられない。揺れてよい範囲を先に決める【Output Contract】

同じ問い合わせに毎回違う文章が返り、上長に「これは障害ですか」と訊かれても答えられない。揺れを止める代わりに、揺れてよい範囲と許さない範囲を出力の契約として先に決め、異常だと判定できるようにする(Output Contract)。Python の標準ライブラリだけで確かめます。

Featured image of post 3つの処理の正しい呼び出し順を、書いた人しか知らない。順番ごと窓口に閉じ込める【Facade】

3つの処理の正しい呼び出し順を、書いた人しか知らない。順番ごと窓口に閉じ込める【Facade】

土壌診断・灌漑・施肥の3つのモジュールは、正しい順で呼ばないと過湿の土に肥料を入れてしまう。その順序を知る窓口を1つ用意し、呼ぶ側が順番を覚えなくて済む Facade を Rust で実装します。

連載 コード庭師 (第11話 / 全12話)
Featured image of post コピペした手順の順番が入れ替わり、古い値で判定していた。骨格を1か所に固定する【Template Method】

コピペした手順の順番が入れ替わり、古い値で判定していた。骨格を1か所に固定する【Template Method】

品種ごとにコピーした手順関数は、いつの間にか呼び出し順が入れ替わり、前回の日照の値で収穫を判定してしまう。トレイトのデフォルトメソッドで手順の骨格を固定し、品種ごとの差分だけを実装させる Template Method を Rust で実装します。

連載 コード庭師 (第10話 / 全12話)
Featured image of post 通知先を1つ増やすたび、検知コードに呼び出しを書き足している。通知を登録制にする【Observer】

通知先を1つ増やすたび、検知コードに呼び出しを書き足している。通知を登録制にする【Observer】

検知処理の最後に通知関数を直接並べていると、知らせる相手が増えるたびに検知側を書き換えることになる。通知先を登録制にして、検知する側が相手を知らなくて済む Observer を Rust で実装します。

連載 コード庭師 (第9話 / 全12話)
Featured image of post 「元に戻す」を推定値の逆操作で書いたら、元の値に戻らない。変更前の状態を保存する【Memento】

「元に戻す」を推定値の逆操作で書いたら、元の値に戻らない。変更前の状態を保存する【Memento】

削除した要素を記憶の推定値で挿し戻す逆操作では、元の長さや角度に戻らず、戻すたびに全体のバランスが悪くなる。変更前の状態そのものを、中身を外へ漏らさずに預けておく Memento を Rust で実装します。

連載 コード庭師 (第8話 / 全12話)
Featured image of post bool 3つで「休眠中なのに開花中」が記録される。状態を enum 1つにする【State】

bool 3つで「休眠中なのに開花中」が記録される。状態を enum 1つにする【State】

生育段階を bool フラグ3つで持つと、ありえない組み合わせが生まれ、直しても呼び忘れた経路からまた出てくる。enum と match で状態を1つに決め、不正な組み合わせを型で作れなくする State を Rust で実装します。

連載 コード庭師 (第7話 / 全12話)
Featured image of post 単体と集まりで関数が別々で、中間の単位を足せない。同じトレイトで再帰的に扱う【Composite】

単体と集まりで関数が別々で、中間の単位を足せない。同じトレイトで再帰的に扱う【Composite】

株1つ用と花壇まるごと用で関数を分けていると、寄せ植え鉢のような「まとまりの中のまとまり」を入れる余地が無い。単体も集まりも同じトレイトで再帰的に扱う Composite を Rust で実装します。

連載 コード庭師 (第6話 / 全12話)