毎日書いている定型文が、キーワードを渡すだけで約 10 秒で書き上がるようになりました。
やったことは、普段使っている AI アシスタントに Anthropic の Claude API キーを登録し、 文書作成ボットを 2 つ作らせただけです。依頼してから動くまで約 15 分でした。 しかも、自分が書いてきたプロンプトが、そのまま再利用できる部品になりました。 この記事では、定型文を爆速にした構成と、作ってみて分かった役割分担の考え方を書きます。
使っている環境:チームで動くエージェント
使っているのは Grok Bot というチャット型の AI アシスタントです。 特徴は 2 つあります。
- 自分専用の Linux マシンを持っている。スクリプトを置いたり、ファイルを作ったりが、チャット越しにできる
- 複数のボットがチームで動く。用途ごとにボットを分け、ボット同士で仕事を渡せる
チームの中には、ほかのボットを設計して作る「ボットを作るボット」もいます。 今回の主役はこのボットです。
手順 1:API キーを、チャットに貼らずに登録する
最初に Claude の API キーを登録しました。 ここで良かったのは、キーをチャット欄に貼らないことです。 専用の入力欄から保存され、マシン上では環境変数として渡されます。 会話の履歴にキーが残らないので、あとでログを見返したり共有したりするときに気を使わずに済みます。
保存後に接続テストを走らせ、Opus / Sonnet / Haiku などのモデルが呼べることを確認しました。
手順 2:「ボットを作るボット」に、命令書を渡す
次に、ボットを作るボットに文書作成ボットを 2 つ頼みました。
- 文書作成ボット A:毎日書く定型文書を、入力メモから書き起こす
- 文書作成ボット B:キーワードから所見と今後の方針をまとめる
依頼の中身は、私がふだん AI に貼り付けて使っていた「命令書」プロンプトそのものです。 役割、要件(字数・文体・入れる項目)、出力例が書いてあるもので、手を加えずに渡しました。 あわせて、出力のルールも伝えています。
- 個人名は伏せる(イニシャルなど記号にする)
- 入力にないことは書かない
- 字数の目安を守る
手順 3:本文生成だけ、Claude Sonnet 5.5 に任せる
ボットの中身は、全部をエージェントに書かせるのではなく、 本文の生成だけを Claude Sonnet 5.5 に投げる構成にしました。 間に挟んだのは、標準ライブラリだけで書いた短い Python スクリプトです。
- 命令書を
system.txtに置く - 入力メモを標準入力で渡す
- スクリプトが Messages API を呼び、本文だけを標準出力に返す
汎用化するとこんな形です(パスや命令書の中身は例に置き換えています)。
#!/usr/bin/env python3
"""命令書(system.txt)と入力メモ(標準入力)から、本文を Claude で書く。
使い方: python3 write.py < memo.txt
"""
import json, os, pathlib, sys, urllib.request
HERE = pathlib.Path(__file__).parent
MODEL = "claude-sonnet-5-5"
system = (HERE / "system.txt").read_text()
memo = sys.stdin.read().strip()
body = {
"model": MODEL,
"max_tokens": 1500,
"system": system,
"messages": [{"role": "user", "content": memo}],
}
req = urllib.request.Request(
"https://api.anthropic.com/v1/messages",
data=json.dumps(body).encode(),
headers={
"x-api-key": os.environ["ANTHROPIC_API_KEY"], # キーは環境変数から
"anthropic-version": "2023-06-01",
"content-type": "application/json",
},
)
try:
res = json.load(urllib.request.urlopen(req, timeout=120))
except Exception as e:
print(f"API error: {e}", file=sys.stderr)
sys.exit(1) # 呼び出し側(ボット)がフォールバックに切り替える
print("".join(c.get("text", "") for c in res["content"] if c.get("type") == "text"))
system.txt には、たとえばこんな命令書が入ります。
あなたは文章作成のプロです。入力メモをもとに、以下の要件で本文を書いてください。
- 300 字程度、常体
- 入力にない事実は書かない
- 人名はイニシャルのまま扱う
ボット側の流れは次のとおりです。
- ユーザーからキーワードやメモを受け取る
- スクリプトを呼んで本文を受け取る
- 出力がルールに沿っているかを確認してから返す(名前が伏せてあるか、入力にないことを足していないか、字数)
- API がエラーを返したときは、ボット自身が本文を書くフォールバックに切り替える
キーワードを渡すと、数百字の文章が約 10 秒で返ってきます。 チャットで依頼してから 2 つのボットが動くまで、約 15 分でした。
気づき 1:段取りはエージェント、文章は得意なモデル
いちばん大きかったのは、役割分担ができると分かったことです。
| エージェントに任せる | 文章生成モデルに任せる |
|---|---|
| ユーザーとの対話、入力の聞き返し | 命令書どおりの本文を書く |
| スクリプトの呼び出しと失敗時の対応 | |
| 出力がルールに沿うかの確認 |
一つのモデルに全部やらせようとすると、「対話は得意だが文体が好みと違う」
「文章はいいが段取りが苦手」といった妥協が生まれがちです。
呼び出し口を一本挟むだけで、それぞれ得意なものを組み合わせられます。
モデルを替えたくなったら、MODEL の一行を書き換えるだけです。
気づき 2:自分のプロンプトが、そのまま部品になる
これまで命令書は、使うたびにチャットへ貼り付けるものでした。
今回は system.txt に置いた時点で、ボットの部品として固定されました。
誰が使っても同じ命令書で書かれるので、品質のばらつきも減ります。
これは私が仕事でやっている「人の業務を、再利用できる AI スキルに変える」ことの、 いちばん小さな実例でもあります。 業務の型化工場で書いた「型」を、自分の手元で一つ作った形です。
気づき 3:外部 API に送る前提で、情報を設計する
本文生成を外部の API に任せる以上、入力メモは外に出ていきます。 そこで、個人情報は最初から渡さない設計にしました。
- 名前は入力の段階からイニシャルなどの記号にする
- ボットが返す前に、出力に個人名が入っていないかを確認する
- 「入力にないことを作らない」をルールにして、推測で埋めさせない
便利さより先に、何を外に出してよいかを決めておく。 業務に AI を入れるときに毎回やっていることを、自分の道具でも同じようにやりました。
まとめ
- API キーはチャットに貼らず、環境変数として渡す
- 段取りはエージェント、文章生成は得意なモデルに分ける
- 命令書をファイルに置けば、プロンプトがそのまま部品になる
- 外部に送る情報は、作る前に決めておく
定型文に毎日かけていた時間は、キーワードを打つ時間だけになりました。 「AI に何を書かせるか」より、「どこで分けて、どうつなぐか」。 小さく試せるので、手元の命令書が一つあれば、まず一本つないでみるのがおすすめです。
