0
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?

Claudeエージェントを「業務テンプレート」として配布する実装メモ — Agent Skill構成と中小企業PoCのハマりどころ

0
Posted at

「うちの経理、月次の数字をまとめるだけで3日かかってるんです」。先月、ある中堅製造業のCFO補佐の方からこう聞いた時、思わずメモを取った。彼の手元には Excel が 7 ファイル、メールに添付された PDF が 12 通、それと社内 SharePoint のリンクが 4 本。月次決算のたびに同じ抽出を、同じ手順で、別の人が、別のフォーマットで繰り返している。

その帰りの電車で Impress Watch の記事を見た。Anthropic が 2026-05-05、金融機関向けに Claude のエージェントテンプレートを 10 種類公開したという話だ(出典: Impress Watch)。ピッチ作成、バリュエーション・レビュー、月次決算 — まさにあの CFO 補佐の方が手作業でやっていたやつだ。

中堅企業の事務所でAIエージェントによる業務テンプレートを検討するイメージ

金融向けの話ではあるが、構造そのものは中小企業の PoC にそのまま転用できる。今回はその転用を進める中で組んだ「Agent Skill 構成」と、ドキュメントには書かれていないハマりどころを残しておく。次に同じ問題に当たる人が 30 分でも早く帰れるように。

そもそも「テンプレートとして配布する」とはどういうことか

Anthropic が出したのはエージェント本体ではなく、エージェントのだ。タスクの目的、参照すべきデータ、出力フォーマット、評価軸 — これらをひと塊にして、現場の担当者が自分のデータを差し込めば動くようにする。社内に AI に詳しい人がいなくても、テンプレートを選んで運用に乗せられる。これが鍵だ。

筆者は最初、これを「プロンプトテンプレート」だと早合点していた。実際にやってみると違った。プロンプトはあくまで一部で、本質はもっと地味な部分にある。具体的には次の 4 点だ。

  1. 業務定義(何を、どの粒度で、どこまでやるか)

  2. 参照リソース(どのファイル・DB・API を見るか、見ないか)

  3. 出力契約(列名・単位・並び順まで含めた厳格な型)

  4. 失敗時の振る舞い(分からない時に黙るか、聞き返すか)

この 4 点を Agent Skill という単位で梱包する。Claude Agent SDK でいうところの skill 定義に近い概念で、1 つの skill = 1 つの業務テンプレートとして扱う。

PoC で組んだ構成

製造業の月次決算補助という限定スコープで、3 週間の PoC を回した。社員 80 名規模、経理 2 名、決算は月初 5 営業日で締めるのが目標だが、実態は 7〜8 日かかっている。

構成図は頭の中ではこんな感じだ。

┌─────────────────────────────────────────┐
│  社内ファイル(Excel/PDF/SharePoint)    │
└──────────────┬──────────────────────────┘
               │
        ┌──────▼──────┐
        │  Skill Loader │  ← .skill.yaml を読む
        └──────┬──────┘
               │
        ┌──────▼──────┐
        │  Claude Agent │  ← claude-sonnet-4-6
        └──────┬──────┘
               │
        ┌──────▼──────┐
        │  Output 検証  │  ← Pydantic で型チェック
        └─────────────┘

ポイントは Skill Loader を Claude Agent から分離したことだ。最初は 1 ファイルにまとめていたが、テンプレートを 3 つ目に増やした時点で破綻した。経理担当者が自分でテンプレートを書き換えたいというニーズがあって、コードと業務定義は分けたほうが運用が楽だったからだ。

Skill 定義の最小例

「月次仕訳サマリ生成」という skill の定義を、PoC で実際に使った形に近づけて書く。社内固有の項目はダミー化してある。

name: monthly_journal_summary
description: |
  月次の仕訳データから、勘定科目別の集計と前月比をまとめる。
  異常値(前月比 ±30% 超)はフラグを立てる。判断は人間に残す。
inputs:

name: journal_csv
type: file
format: csv
required: true
schema:

date: string (YYYY-MM-DD)
account: string
debit: number
credit: number



outputs:
format: json
schema:
summary:
- account: string
current_month: number
previous_month: number
variance_pct: number
flag: enum [normal, high_variance, missing_prev]
notes: string
guardrails:

数値は四捨五入せず、入力の有効桁数を保持する
前月データが欠損している勘定科目は flag=missing_prev で出力
推測で穴埋めはしない
出力以外の説明文は notes に 200 字以内でまとめる

guardrails の 3 番目「推測で穴埋めはしない」が地味に効く。Claude は良くも悪くも「埋めようとする」傾向があって、特に数値が欠損していると平均値で補完しようとすることがある。経理データでこれをやると即座に信頼を失うので、明示的に禁じる。

Python 側の最小実装

Skill Loader と Agent 呼び出しの骨格はこのくらい単純で済む。エラー処理は最小限にしてあるが、PoC ではこれで動いた。

import yaml
from pathlib import Path
from anthropic import Anthropic
from pydantic import BaseModel, ValidationError

client = Anthropic(api_key="YOUR_API_KEY")
class SkillRunner:
def init(self, skill_path: Path):
self.skill = yaml.safe_load(skill_path.read_text(encoding="utf-8"))
def build_system_prompt(self) -> str:
    s = self.skill
    guards = "\n".join(f"- {g}" for g in s["guardrails"])
    return (
        f"あなたは業務テンプレート '{s['name']}' を実行するエージェントだ。\n"
        f"目的: {s['description']}\n"
        f"出力は次のJSONスキーマに厳密に従うこと:\n{s['outputs']['schema']}\n"
        f"守るべきルール:\n{guards}"
    )

def run(self, user_payload: str) -> dict:
    msg = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=4096,
        system=self.build_system_prompt(),
        messages=[{"role": "user", "content": user_payload}],
    )
    return self._parse(msg.content[0].text)

def _parse(self, raw: str) -> dict:
    import json
    start = raw.find("{")
    end = raw.rfind("}") + 1
    return json.loads(raw[start:end])

runner = SkillRunner(Path("skills/monthly_journal_summary.skill.yaml"))
result = runner.run(open("data/2026-04-journal.csv").read())
print(result)

ハマりどころ 1: JSON が壊れる

最初の数日、出力 JSON が 30% くらいの確率で壊れた。原因は、説明文をついでに添えてくる癖だ。{...} の前後に「以下が結果です」みたいな前置きが付いてくる。_parse{} の位置を切り出しているのはこのためだ。

本来なら Claude の tool use 機能で構造化出力を強制するのが正攻法だが、PoC の段階では実装の軽さを優先して文字列パースで逃げた。本番化する時はここを書き換える。

ハマりどころ 2: CSV のサイズと粒度

仕訳 CSV を丸ごと投げたら、月次で 1 万行を超えて、トークンが 4 万を超えた。動くには動くがコストが見合わない。これは PoC 2 週目に気づいた。対策として、Python 側で勘定科目ごとに事前集計してから渡すようにした。Claude にやらせるのは「集計後の数値の解釈と異常検知」だけで、純粋な集計演算は pandas で済ませる。

30% という数字は、最初は小さく見えた。でも 100 件の skill 実行のうち 30 件が失敗するということは、月次運用で経理担当者が手戻りを起こす回数が 30 回ということだ。これだと現場では使い物にならない。

ハマりどころ 3: 業務テンプレートの粒度

当初は「月次決算を全部やるエージェント」を作ろうとしていた。これが一番の失敗だった。スコープが大きすぎて、Skill 定義の guardrails が膨れ上がり、結果として全ての項目が中途半端になる。

2 週目から方針を変えて、1 つの Skill = 1 つの抽出か集計、というレベルまで分割した。最終的に PoC で残ったのは 5 つだ。

  • 仕訳サマリ生成(上記)

  • 勘定科目マスタとの突合

  • 前月比異常値の自然言語コメント生成

  • 会議向けハイライト 3 行要約

  • 監査向けの根拠リンク列の付与

厳密にはこれら以外にもサブ skill があったが、運用に耐えたのはこの 5 つだった。Anthropic が金融向けに 10 種類のテンプレートを公開したという数字も、たぶん偶然ではない。1 業務 1 テンプレートで分けていくと、それくらいの数になる。

動作確認のログ

実行時のログを 1 サンプルだけ残しておく(数値はダミー)。

$ python run_skill.py monthly_journal_summary data/2026-04-journal.csv
[skill] loaded: monthly_journal_summary
[input] rows=8421, accounts=47
[pre-agg] reduced to 47 rows for agent
[agent] claude-sonnet-4-6 / tokens in=2104 out=1387
[parse] OK
[output]
{
"summary": [
{"account": "売上高", "current_month": 84210000, "previous_month": 79180000, "variance_pct": 6.4, "flag": "normal"},
{"account": "接待交際費", "current_month": 1240000, "previous_month": 320000, "variance_pct": 287.5, "flag": "high_variance"},
...
],
"notes": "接待交際費が前月比+287%。展示会出展月のため一過性の可能性が高いが、経理での確認推奨。"
}

「+287%」のような跳ね方を、ただ数字として出すか、人間に向けて 1 行コメントを添えるかで、現場の受け取り方は大きく変わる。経理担当者の方が言っていた。「数字は自分で見れば分かる。でも『何を疑え』と言ってくれる人が、社内には少ないんだ」。これが正直、一番刺さった。

応用の方向

  • 製造業の品質月報(検査記録 → 異常傾向の言語化)

  • 物流の遅延レポート(配送ログ → 原因分類)

  • 小売の販促振り返り(POS データ → 商品ごとの仮説)

  • サービス業のクレーム要約(問い合わせ履歴 → 月次傾向)

共通するのは、データはすでに社内にあり、解釈が属人化していて、月次の作業として誰かが消耗している、という構図だ。Anthropic が金融向けで先に体系化したというだけで、業界依存性はそれほど高くない。

まとめ

業務テンプレートとして配布する、というのは、技術的には skill 定義を 1 ファイルに梱包しておくだけのことだ。難しいのはむしろ、業務の輪郭を「1 つの skill に収まるサイズ」まで切り出す側の作業で、ここはコードを書く時間より対話の時間のほうが長い。次は Claude Agent SDK の正式な skill 機能(tool use ベース)に書き換えて、JSON 破綻問題を構造化出力で潰すところまでやってみたい。

筆者は 5years+ で韓国・日本の中堅企業向けに Claude/LLM の業務応用を担当している。同じテーマで詰まっている方の参考になれば。

0
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
0
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?