AI・機械学習

Claude APIをPythonで使う方法|初心者でも作れるAIチャットボット開発チュートリアル

「AIチャットボットって自分で作れるの?なんか難しそう…」

そんなふうに思っているみなさん、実はPythonの基礎さえわかれば、驚くほど簡単に作れます。今回は、Anthropicが提供するClaude APIをPythonから呼び出して、自分だけのAIチャットボットアプリを一緒に作っていきましょう!🎉

「Claude APIのPythonでの使い方がよくわからない」「AIチャットボットを自作してみたいけど何から始めればいい?」という疑問を、このチュートリアル1本で一気に解決できるかもしれません!

この記事で学べること・対象読者

AI chatbot python
AI chatbot python / Photo by Matheus Bertelli via Pexels

📌 対象読者:プログラミング初〜中級者(Pythonの基本構文がなんとなくわかる方)

✅ この記事を読むとわかること:

  • Claude APIの概要とできること
  • APIキーの取得〜環境構築の手順
  • PythonからClaude APIを呼び出す基本コード
  • 会話履歴を保持するチャットボットの作り方
  • 実用的なチャットボットアプリへの発展方法

ざっくりとした流れがつかめるはずなので、ぜひ最後まで読んでみてください😊

Claude APIとは?まず3行で理解しよう

Claude APIは、Anthropicが開発したAI言語モデル「Claude」をプログラムから呼び出せるインターフェースです。

イメージとしては、「賢いAIアシスタントに、Pythonコードから直接話しかけられる仕組み」と思えばOKです。

📌 Claudeの特徴をざっくりまとめると:

  • 🧠 高い日本語対応力:自然な日本語でのやり取りが得意
  • 📄 長文処理が得意:大量のテキストを一度に処理できる
  • 🔒 安全性重視の設計:Anthropicの安全性研究に基づいた設計
  • 💡 コード生成・解析も対応:プログラミング支援にも使える

現在利用できるモデルには claude-opus-4-5claude-sonnet-4-5claude-haiku-4-5 などがあり、速度・性能・コストのバランスで選べます。チュートリアルではコストを抑えながら試せる claude-haiku-4-5 を中心に使っていきます。

STEP 1:APIキーを取得しよう

まず最初に、Claude APIを使うためのAPIキーを取得します。これがないとAPIを叩けないので、一番最初に準備しておきましょう。

APIキー取得の手順

  1. Anthropicの公式サイト(anthropic.com)にアクセス
  2. 「Get API access」からアカウントを作成(Googleアカウント連携も可)
  3. ダッシュボードの「API Keys」セクションへ移動
  4. 「Create Key」をクリックしてAPIキーを生成
  5. 表示されたキーを必ずコピーして安全な場所に保存(再表示できません!)

⚠️ APIキーは絶対にGitHubなどに公開しないでください。第三者に使われてしまうリスクがあります。

STEP 2:環境構築をしよう

APIキーが手に入ったら、Python環境を整えましょう。仮想環境を使うと後々管理が楽になるのでおすすめです。

# 仮想環境を作成して有効化
python -m venv claude_env

# Mac/Linuxの場合
source claude_env/bin/activate

# Windowsの場合
claude_env\Scripts\activate

# AnthropicのPythonライブラリをインストール
pip install anthropic

# 環境変数管理用のライブラリもインストールしておく
pip install python-dotenv

次に、APIキーを安全に管理するために`.env`ファイルを作成します。

# .env ファイルに記述(プロジェクトのルートディレクトリに作成)
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxxxxxxxxxxxxx

ポイントをまとめるとこんな感じです:

  • ✅ APIキーはソースコードに直接書かず、.envファイルで管理
  • .gitignore に `.env` を追記してGitで管理しない
  • ✅ 仮想環境を使うことでライブラリのバージョン管理がしやすくなる

STEP 3:はじめてのClaude API呼び出し

環境が整ったら、さっそくPythonからClaude APIを呼び出してみましょう!まずは一番シンプルなコードから始めます。

import anthropic
from dotenv import load_dotenv
import os

# .envファイルから環境変数を読み込む
load_dotenv()

# Anthropicクライアントを初期化(APIキーは自動で環境変数から読み込まれる)
client = anthropic.Anthropic()

# Claudeにメッセージを送る
message = client.messages.create(
    model="claude-haiku-4-5",   # 使用するモデルを指定
    max_tokens=1024,              # 返答の最大トークン数
    messages=[
        {
            "role": "user",
            "content": "Pythonとはどんなプログラミング言語ですか?3行で教えてください。"
        }
    ]
)

# 返答を表示
print(message.content[0].text)

これを実行すると、Claudeからの回答がターミナルに表示されます。たったこれだけ!😊

ここが重要です:

  • messagesリストに会話内容を渡す形式がClaude APIの基本スタイル
  • roleには "user"(ユーザー)と "assistant"(Claude)の2種類がある
  • max_tokensは返答の長さ上限(大きくするほど長い返答が可能になるが料金も上がる)

STEP 4:会話履歴を保持するチャットボットを作ろう

シンプルな呼び出しができたら、次は会話の文脈を覚えてくれるチャットボットを作りましょう。

Claude APIは「ステートレス」、つまりAPIを呼び出すたびに会話の記憶がリセットされます。イメージとしては、電話をかけるたびに相手の記憶が消えてしまう感じですね。

これを解決するには、会話履歴を自分でリストに保存して、毎回APIに渡すという方法を使います。

import anthropic
from dotenv import load_dotenv

load_dotenv()

client = anthropic.Anthropic()

def chat_with_claude():
    """会話履歴を保持するチャットボット関数"""
    
    # 会話履歴を保存するリスト
    conversation_history = []
    
    # システムプロンプト(Claudeのキャラクター設定)
    system_prompt = "あなたはフレンドリーで親切なAIアシスタントです。日本語で丁寧に回答してください。"
    
    print("🤖 AIチャットボット起動!(終了するには 'quit' と入力)")
    print("-" * 50)
    
    while True:
        # ユーザーの入力を受け取る
        user_input = input("あなた: ").strip()
        
        # 終了コマンドの確認
        if user_input.lower() in ["quit", "exit", "終了"]:
            print("またね!👋")
            break
        
        # 空白入力はスキップ
        if not user_input:
            continue
        
        # 会話履歴にユーザーの発言を追加
        conversation_history.append({
            "role": "user",
            "content": user_input
        })
        
        # Claude APIに会話履歴ごと送信
        response = client.messages.create(
            model="claude-haiku-4-5",
            max_tokens=1024,
            system=system_prompt,       # システムプロンプトを設定
            messages=conversation_history  # これまでの会話をすべて渡す
        )
        
        # Claudeの返答を取得
        assistant_message = response.content[0].text
        
        # 会話履歴にClaudeの返答を追加(次回の呼び出し時に使う)
        conversation_history.append({
            "role": "assistant",
            "content": assistant_message
        })
        
        # 返答を表示
        print(f"Claude: {assistant_message}")
        print("-" * 50)

# チャットボットを起動
if __name__ == "__main__":
    chat_with_claude()

ポイントをまとめるとこんな感じです:

  • 🗂️ conversation_historyリストに会話のやり取りを順番に追加していく
  • 🔄 APIを呼び出すたびに会話履歴ごとmessagesに渡すことで文脈を維持
  • ⚙️ systemパラメータでClaudeのキャラクターや振る舞いを設定できる

STEP 5:システムプロンプトでキャラクターをカスタマイズしよう


チャットボットの面白いところは、システムプロンプトを変えるだけで全く別のキャラクターを作れるところです。

たとえば、こんなシステムプロンプトを試してみましょう:

# 例1:プログラミング専門のメンターボット
system_prompt_mentor = """
あなたは初心者向けのプログラミングメンターです。
以下のルールを守って回答してください:
- 専門用語には必ずわかりやすい説明を添える
- コード例を使って具体的に説明する
- 「なぜそうなるのか」を大切にして説明する
- 励ますような温かいトーンで話す
"""

# 例2:料理レシピアドバイザーボット
system_prompt_chef = """
あなたはプロの料理アドバイザーです。
ユーザーが持っている食材を聞いて、
それで作れる料理のレシピを提案してください。
栄養バランスも考慮したアドバイスを心がけてください。
"""

# 例3:英語学習サポートボット
system_prompt_english = """
あなたは英語学習のサポーターです。
ユーザーが日本語で話しかけたら英語に翻訳して、
文法のポイントも一緒に解説してください。
間違いは優しく指摘し、正しい表現を提案してください。
"""

print("どのボットを使いますか?")
print("1: プログラミングメンター")
print("2: 料理レシピアドバイザー")
print("3: 英語学習サポーター")

choice = input("番号を入力: ")

# 選択に応じてシステムプロンプトを切り替える
prompts = {
    "1": system_prompt_mentor,
    "2": system_prompt_chef,
    "3": system_prompt_english
}

selected_prompt = prompts.get(choice, system_prompt_mentor)
print(f"✅ ボットを起動しました!")

システムプロンプトを変えるだけで、プログラミングメンターにも、料理の先生にも、英語コーチにもなれるんですよね。これが自作AIチャットボットの楽しいところです😄

STEP 6:実用的なチャットボットアプリに仕上げよう

最後に、これまでの内容を組み合わせて少し実用的なチャットボットアプリに仕上げましょう。会話ログの保存機能も追加します。

import anthropic
from dotenv import load_dotenv
from datetime import datetime
import json
import os

load_dotenv()

client = anthropic.Anthropic()

class ChatBot:
    """会話履歴の保存・読み込み機能付きチャットボット"""
    
    def __init__(self, bot_name="Claude", system_prompt=None):
        self.bot_name = bot_name
        self.conversation_history = []
        self.system_prompt = system_prompt or "あなたは親切で知識豊富なAIアシスタントです。"
        self.session_start = datetime.now().strftime("%Y%m%d_%H%M%S")
    
    def send_message(self, user_input):
        """メッセージを送信してClaudeの返答を受け取る"""
        
        # 会話履歴にユーザーの発言を追加
        self.conversation_history.append({
            "role": "user",
            "content": user_input
        })
        
        # API呼び出し
        response = client.messages.create(
            model="claude-haiku-4-5",
            max_tokens=2048,
            system=self.system_prompt,
            messages=self.conversation_history
        )
        
        assistant_message = response.content[0].text
        
        # 会話履歴にClaudeの返答を追加
        self.conversation_history.append({
            "role": "assistant",
            "content": assistant_message
        })
        
        return assistant_message
    
    def save_log(self):
        """会話ログをJSONファイルに保存する"""
        log_data = {
            "session": self.session_start,
            "bot_name": self.bot_name,
            "conversation": self.conversation_history
        }
        
        # logsフォルダがなければ作成
        os.makedirs("logs", exist_ok=True)
        
        filename = f"logs/chat_{self.session_start}.json"
        with open(filename, "w", encoding="utf-8") as f:
            json.dump(log_data, f, ensure_ascii=False, indent=2)
        
        print(f"💾 会話ログを保存しました: {filename}")
    
    def run(self):
        """チャットボットを起動する"""
        print(f"🤖 {self.bot_name} 起動!('quit'で終了、'save'でログ保存)")
        print("=" * 50)
        
        while True:
            user_input = input("あなた: ").strip()
            
            if user_input.lower() in ["quit", "exit", "終了"]:
                self.save_log()  # 終了時に自動でログ保存
                print("またね!👋")
                break
            
            if user_input.lower() == "save":
                self.save_log()
                continue
            
            if not user_input:
                continue
            
            # Claudeからの返答を取得・表示
            response = self.send_message(user_input)
            print(f"{self.bot_name}: {response}")
            print("-" * 50)

# アプリを起動
if __name__ == "__main__":
    bot = ChatBot(
        bot_name="マイAIアシスタント",
        system_prompt="あなたは親切で知識豊富なAIアシスタントです。日本語で分かりやすく答えてください。"
    )
    bot.run()

ここが重要です:

  • 📦 クラス化することでコードの管理・再利用がしやすくなる
  • 💾 会話ログをJSONで保存することで、後から会話内容を確認できる
  • 🎛️ bot_namesystem_promptを引数にすることで、異なる設定のボットを簡単に作れる

料金・トークンについて知っておこう


Claude APIは使った量(トークン数)に応じて課金される従量制です。トークンとは、AIがテキストを処理する際の単位で、日本語1文字は大体1〜2トークンに相当します。

📊 モデル別の特徴(2025年時点):

  • claude-haiku-4-5:最速・最安値。シンプルな質問応答に最適
  • ⚖️ claude-sonnet-4-5:速度と性能のバランスが良い。多くの用途に対応
  • 🧠 claude-opus-4-5:最高性能。複雑な推論や高度な分析に

まずはHaikuで試して、必要に応じてモデルをアップグレードするアプローチがおすすめです。Anthropicのダッシュボードで使用量・コストをリアルタイムで確認できるので、最初は上限を設定しておくと安心ですよ。

よくあるエラーと対処法

初めてAPIを使うと、こんなエラーに出くわすことがあります。確認をしておきましょう。

  • 🔴 AuthenticationError:APIキーが間違っている、または環境変数が読み込まれていない → `.env`ファイルのパスとキーの内容を確認
  • 🔴 RateLimitError:短時間にリクエストを送りすぎた → 少し時間をおいてから再試行。ループ処理には`time.sleep()`を挟む
  • 🔴 InvalidRequestError:パラメータの形式が間違っている → `messages`リストの形式(role・contentの構造)を確認
  • 🟡 返答が途中で切れる:`max_tokens`が小さすぎる → 値を増やして調整

まとめ

今回はClaude APIをPythonで使ってAIチャットボットを自作する方法を、環境構築から実用的なアプリ完成までステップごとに解説しました。

ポイントを振り返ると:

  • ✅ Claude APIはPythonのライブラリ一発でインストール可能
  • ✅ 会話履歴はリストで管理して毎回APIに渡すことで文脈を維持できる
  • ✅ システムプロンプトを変えるだけで多彩なボットが作れる
  • ✅ クラス化するとコードが整理されて発展させやすい

「むずかしそう」が「できそう」に変わってきましたか?😊 ここで作ったチャットボットをベースに、WebアプリにしてみたりLINEと連携させてみたりと、可能性はどんどん広がります。

ぜひ自分だけのオリジナルAIチャットボットを作って試してみてください!一緒に学んでいきましょう🚀

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

もしも

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

AIコーディングの現場活用法を学ぶ一冊

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です