結論:Claude APIは「考える機能」をPythonに足す最速の方法
先に結論から書きます。
Claude APIをPythonと組み合わせると、「テキストを読んで判断する」「状況に応じて回答を変える」「長文を要約する」といった、従来の正規表現や条件分岐では実装しにくかった処理を数十行で実現できます。
この記事は「Claude APIを使ってみたいが、何に使えばいいかわからない」という人に向けて、実際に副業・個人開発で使えるコードパターンを10個解説します。
パターン1:シンプルなテキスト生成
最も基本的な使い方。ブログ記事・メール文章・コード解説など。
def generate_text(prompt: str, max_tokens: int = 1000) -> str:
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=max_tokens,
messages=[{"role": "user", "content": prompt}]
)
return response.content[0].text
# 使用例
text = generate_text("Python初心者向けにfor文を100字で説明してください")
print(text)
副業での使い所: ブログ記事の下書き・メールテンプレートの大量生成・商品説明文の作成
パターン2:システムプロンプトでキャラクター固定
特定の役割・口調・知識範囲を固定して応答させる。
def create_assistant(system_prompt: str):
def chat(user_message: str) -> str:
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=500,
system=system_prompt,
messages=[{"role": "user", "content": user_message}]
)
return response.content[0].text
return chat
# 経理アドバイザーとして回答
accounting_bot = create_assistant("""
あなたは個人事業主の経理・確定申告を専門とするアドバイザーです。
以下の制約で回答してください:
- 税務リスクのある回答は避け、税理士への相談を促す
- 答えが不明な場合は「不明です」と正直に伝える
- 回答は200字以内で簡潔に
""")
print(accounting_bot("交通費はいくらまで経費にできますか?"))
副業での使い所: 特定ジャンルのチャットボット構築・問い合わせ自動応答
パターン3:マルチターン会話(会話履歴を持つ)
会話の文脈を保持して、前の発言を参照した回答をさせる。
class Conversation:
def __init__(self, system: str = ""):
self.messages = []
self.system = system
def chat(self, user_message: str) -> str:
self.messages.append({"role": "user", "content": user_message})
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1000,
system=self.system,
messages=self.messages
)
assistant_message = response.content[0].text
self.messages.append({"role": "assistant", "content": assistant_message})
return assistant_message
# 使用例
conv = Conversation(system="あなたはPythonの先生です。")
print(conv.chat("リスト内包表記を教えてください"))
print(conv.chat("さっき教えてくれたやつで辞書を作るにはどうすればいいですか?"))
# → 前の会話を踏まえた回答が返る
副業での使い所: チュートリアルボット・インタラクティブなQ&Aシステム
パターン4:JSON出力(構造化データの抽出)
テキストからデータを抽出して辞書・リストとして扱う。
import json
def extract_structured_data(text: str, schema_description: str) -> dict:
prompt = f"""
以下のテキストから情報を抽出してJSONで返してください。
スキーマ: {schema_description}
テキスト: {text}
JSONのみを返し、説明文は不要です。
"""
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=500,
messages=[{"role": "user", "content": prompt}]
)
return json.loads(response.content[0].text)
# 使用例: 求人票からデータ抽出
job_text = "Webエンジニア募集。Python/Django経験3年以上。年収600〜900万円。渋谷勤務。"
schema = '{"title": "職種名", "skills": ["スキルリスト"], "salary_min": 最低年収, "salary_max": 最高年収, "location": "勤務地"}'
result = extract_structured_data(job_text, schema)
print(result)
# → {"title": "Webエンジニア", "skills": ["Python", "Django"], "salary_min": 600, ...}
副業での使い所: 求人・商品・レビューのスクレイピング後の構造化・PDF/メールからのデータ抽出
パターン5:長文の要約(チャンクに分割して処理)
Claude APIのコンテキスト長を超える長文を分割して要約する。
def summarize_long_text(text: str, chunk_size: int = 3000) -> str:
# 長文をチャンクに分割
chunks = [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)]
# 各チャンクを要約
summaries = []
for i, chunk in enumerate(chunks):
summary = generate_text(f"以下のテキストを200字で要約してください:\n{chunk}")
summaries.append(summary)
# 要約を統合
combined = "\n".join(summaries)
final_summary = generate_text(f"以下の複数の要約を1つにまとめて400字以内で整理してください:\n{combined}")
return final_summary
# 長いPDFテキストや記事に使用
with open("long_document.txt", "r") as f:
content = f.read()
print(summarize_long_text(content))
副業での使い所: 議事録要約・長文レポートの要約・PDF書類のサマリー生成
パターン6:感情分析・分類
テキストを特定のカテゴリに分類する。
def classify_sentiment(text: str) -> str:
prompt = f"""
以下のレビューの感情を分類してください。
レビュー: {text}
以下のいずれか1つのみを返してください:
positive / negative / neutral
"""
return generate_text(prompt, max_tokens=10).strip().lower()
def classify_topic(text: str, categories: list) -> str:
categories_str = " / ".join(categories)
prompt = f"""
以下のテキストを最も適切なカテゴリに分類してください。
テキスト: {text}
カテゴリ: {categories_str}
カテゴリ名のみを返してください。
"""
return generate_text(prompt, max_tokens=20).strip()
# 使用例
reviews = ["最高の商品でした!", "期待外れで返品したい", "普通でした"]
for review in reviews:
print(f"{review} → {classify_sentiment(review)}")
副業での使い所: 問い合わせの自動振り分け・SNSコメントのモニタリング・フィードバック分類
パターン7:ストリーミング出力
長い回答をリアルタイムで表示する(UXが大幅に向上する)。
def stream_response(prompt: str):
with client.messages.stream(
model="claude-sonnet-4-6",
max_tokens=1000,
messages=[{"role": "user", "content": prompt}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
print() # 改行
# Webアプリでのストリーミング(Flask + SSE)
from flask import Flask, Response, stream_with_context
app = Flask(__name__)
@app.route("/stream")
def stream():
def generate():
with client.messages.stream(
model="claude-sonnet-4-6",
max_tokens=1000,
messages=[{"role": "user", "content": "Pythonの歴史を教えてください"}]
) as stream:
for text in stream.text_stream:
yield f"data: {text}\n\n"
return Response(stream_with_context(generate()), mimetype="text/event-stream")
副業での使い所: チャットアプリのUI改善・長文生成ツールのユーザー体験向上
パターン8:画像入力(ビジョン機能)
画像ファイルを読み取ってテキストで回答させる。
import base64
def analyze_image(image_path: str, question: str) -> str:
with open(image_path, "rb") as f:
image_data = base64.standard_b64encode(f.read()).decode("utf-8")
ext = image_path.split(".")[-1].lower()
media_type = f"image/{ext}" if ext != "jpg" else "image/jpeg"
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=500,
messages=[{
"role": "user",
"content": [
{"type": "image", "source": {"type": "base64", "media_type": media_type, "data": image_data}},
{"type": "text", "text": question}
]
}]
)
return response.content[0].text
# 使用例
result = analyze_image("receipt.jpg", "この領収書の合計金額と店名を教えてください")
print(result)
副業での使い所: 領収書OCR・商品画像の説明文生成・スクリーンショットのバグ分析
パターン9:バッチ処理(大量データの並列処理)
複数のプロンプトを効率よく処理する。
import asyncio
import anthropic
async def process_batch(prompts: list[str]) -> list[str]:
async_client = anthropic.AsyncAnthropic()
async def process_one(prompt):
response = await async_client.messages.create(
model="claude-sonnet-4-6",
max_tokens=200,
messages=[{"role": "user", "content": prompt}]
)
return response.content[0].text
tasks = [process_one(p) for p in prompts]
return await asyncio.gather(*tasks)
# 商品説明文を100件並列生成
product_names = ["ワイヤレスイヤホン", "電動歯ブラシ", "スマートウォッチ"]
prompts = [f"{name}のECサイト用説明文を100字で書いてください" for name in product_names]
results = asyncio.run(process_batch(prompts))
for name, result in zip(product_names, results):
print(f"=== {name} ===\n{result}\n")
副業での使い所: 大量の商品説明文生成・SNS投稿の量産・レポートの自動生成
パターン10:ツール呼び出し(function calling)
Claudeに関数を定義して、必要に応じて呼び出させる。
import json
def get_weather(city: str) -> dict:
# 実際には天気APIを呼ぶ
return {"city": city, "temp": 22, "condition": "晴れ"}
tools = [{
"name": "get_weather",
"description": "指定した都市の現在の天気を取得します",
"input_schema": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "都市名(例: 東京、大阪)"}
},
"required": ["city"]
}
}]
def chat_with_tools(user_message: str) -> str:
messages = [{"role": "user", "content": user_message}]
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=500,
tools=tools,
messages=messages
)
# ツール呼び出しが必要な場合
if response.stop_reason == "tool_use":
tool_use = next(b for b in response.content if b.type == "tool_use")
tool_result = get_weather(**tool_use.input) # 実際の関数を実行
# 結果をClaudeに返す
messages.append({"role": "assistant", "content": response.content})
messages.append({
"role": "user",
"content": [{"type": "tool_result", "tool_use_id": tool_use.id, "content": json.dumps(tool_result)}]
})
final_response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=500,
tools=tools,
messages=messages
)
return final_response.content[0].text
return response.content[0].text
print(chat_with_tools("今日の東京の天気を教えて"))
副業での使い所: AI+外部API連携システム・インテリジェントな情報検索ツール
APIコストの目安
Claude Sonnet 4.6(執筆時点):
- 入力: $3/1Mトークン
- 出力: $15/1Mトークン
1,000文字の入力 + 500文字の出力 ≈ 約0.07円/リクエスト
副業ツール・個人開発レベルであれば月数百円〜数千円で十分運用できます。
まとめ
| パターン | 難易度 | 副業での使い所 |
|---|---|---|
| 1. シンプル生成 | ★☆☆ | ブログ・メール文章 |
| 2. システムプロンプト | ★☆☆ | チャットボット |
| 3. マルチターン | ★★☆ | 問い合わせ対応 |
| 4. JSON抽出 | ★★☆ | データスクレイピング |
| 5. 長文要約 | ★★☆ | 議事録・レポート |
| 6. 分類 | ★☆☆ | 問い合わせ振り分け |
| 7. ストリーミング | ★★☆ | チャットUI改善 |
| 8. 画像入力 | ★★☆ | 領収書・商品画像 |
| 9. バッチ処理 | ★★★ | 大量コンテンツ生成 |
| 10. ツール呼び出し | ★★★ | AI+外部API連携 |
Claude APIは「Pythonで考える機能を実装する」最速の方法です。まずパターン1〜4をマスターすれば、ほとんどの副業ユースケースはカバーできます。
関連ツールを見る
この記事で紹介したツール・サービスをまとめてチェック。
![]()
