エンジニアになりたい人募集!X(旧Twitter)からフォローしたらリプライで質問常時OK!

【AI ブロガー開発】Claude API を使った記事生成機能の実装

この記事はで読むことができます。

はじめに

前回の記事では、AI ブロガー開発プロジェクトの概要と環境構築について解説しました。今回は、このプロジェクトの核心部分である、Claude API を使った記事生成機能の実装に踏み込んでいきます。

【AI ブロガー開発】プロジェクト概要と環境構築

この記事を通じて、以下のスキルと知識を習得することができます:

  1. Golang での HTTP クライアントの実装
  2. Claude API の利用方法
  3. 非同期処理と error handling
  4. 構造化されたコードの書き方

それでは、実装に入っていきましょう。

Claude API クライアントの実装

まず、Claude API とやり取りするためのクライアントを実装します。internal/claude/client.go ファイルを以下のように作成します:

go
package claude

import (
    "bytes"
    "encoding/json"
    "fmt"
    "net/http"
    "io/ioutil"
)

type Client struct {
    APIKey  string
    BaseURL string
}

type APIResponse struct {
    Completion string `json:"completion"`
    StopReason string `json:"stop_reason"`
    Model      string `json:"model"`
}

func NewClient(apiKey string) *Client {
    return &Client{
        APIKey:  apiKey,
        BaseURL: "https://api.anthropic.com/v1/complete",
    }
}

func (c *Client) GenerateContent(prompt string) (string, error) {
    requestBody, err := json.Marshal(map[string]interface{}{
        "model": "claude-v1",
        "prompt": prompt,
        "max_tokens_to_sample": 1000,
        "temperature": 0.7,
    })
    if err != nil {
        return "", err
    }

    req, err := http.NewRequest("POST", c.BaseURL, bytes.NewBuffer(requestBody))
    if err != nil {
        return "", err
    }

    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("X-API-Key", c.APIKey)

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        return "", err
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return "", err
    }

    if resp.StatusCode != http.StatusOK {
        return "", fmt.Errorf("API request failed with status code %d: %s", resp.StatusCode, string(body))
    }

    var apiResp APIResponse
    if err := json.Unmarshal(body, &apiResp); err != nil {
        return "", err
    }

    if apiResp.Completion == "" {
        return "", fmt.Errorf("no completion in API response")
    }

    return apiResp.Completion, nil
}

このコードでは、以下の主要な機能を実装しています:

  1. Claude API クライアントの構造体定義
  2. API レスポンスの構造体定義
  3. クライアントの初期化関数
  4. コンテンツ生成関数(HTTP リクエストの送信と応答の処理)

記事生成ロジックの実装

次に、記事生成のロジックを実装します。internal/content/generator.go ファイルを以下のように作成します:

go
package content

import (
    "fmt"
    "strings"

    "github.com/yourusername/ai-blogger-golang/internal/claude"
    "github.com/yourusername/ai-blogger-golang/internal/models"
)

type Generator struct {
    claudeClient *claude.Client
}

func NewGenerator(claudeClient *claude.Client) *Generator {
    return &Generator{
        claudeClient: claudeClient,
    }
}

func (g *Generator) GenerateArticle(keyword string) (*models.Article, error) {
    prompt := `以下の指示に従って、指定されたキーワードに関する記事を作成してください:

1. キーワード:%s


以上の指示に基づいて、%sに関する記事を作成してください。`

    formattedPrompt := fmt.Sprintf(prompt, keyword, keyword)

    content, err := g.claudeClient.GenerateContent(formattedPrompt)
    if err != nil {
        return nil, err
    }

    title := extractTitle(content)

    return &models.Article{
        Title:   title,
        Content: content,
        Keyword: keyword,
    }, nil
}

func extractTitle(content string) string {
    lines := strings.Split(content, "\n")
    for _, line := range lines {
        if strings.TrimSpace(line) != "" {
            return strings.TrimSpace(line)
        }
    }
    return "無題"
}

このコードでは、以下の主要な機能を実装しています:

  1. 記事生成器の構造体定義
  2. 記事生成関数(プロンプトの構築、Claude API の呼び出し、結果の処理)
  3. タイトル抽出関数

main.go の更新

最後に、cmd/main.go ファイルを更新して、これらの新しい機能を利用できるようにします:

go
package main

import (
    "fmt"
    "log"

    "github.com/yourusername/ai-blogger-golang/config"
    "github.com/yourusername/ai-blogger-golang/internal/claude"
    "github.com/yourusername/ai-blogger-golang/internal/content"
)

func main() {
    cfg, err := config.Load()
    if err != nil {
        log.Fatalf("Error loading config: %v", err)
    }

    claudeClient := claude.NewClient(cfg.ClaudeAPIKey)
    generator := content.NewGenerator(claudeClient)

    keyword := "人工知能" // この部分は後でユーザー入力に変更できます

    article, err := generator.GenerateArticle(keyword)
    if err != nil {
        log.Fatalf("Error generating article: %v", err)
    }

    fmt.Printf("Generated Article:\nTitle: %s\nContent: %s\n", article.Title, article.Content)
}

実行と動作確認

これで、基本的な実装は完了です。以下のコマンドでプログラムを実行し、動作を確認できます:

bash
go run cmd/main.go

正常に動作すれば、指定されたキーワードに基づいて生成された記事のタイトルと内容が表示されるはずです。

エラーハンドリングとログ記録

実際の運用では、エラーハンドリングとログ記録を適切に行うことが重要です。以下のような改善を検討してください:

  1. エラーの詳細をログに記録する
  2. リトライメカニズムの実装(API呼び出しが失敗した場合)
  3. タイムアウト設定の追加

例えば、internal/claude/client.goGenerateContent 関数に以下のようなログ記録を追加できます:

go
func (c *Client) GenerateContent(prompt string) (string, error) {
    // ... (既存のコード)

    if resp.StatusCode != http.StatusOK {
        log.Printf("API request failed with status code %d: %s", resp.StatusCode, string(body))
        return "", fmt.Errorf("API request failed with status code %d", resp.StatusCode)
    }

    // ... (残りのコード)
}

パフォーマンスの最適化

大量の記事を生成する場合、以下のような最適化を検討してください:

  1. ゴルーチンを使用した並行処理
  2. コネクションプーリングの実装
  3. キャッシュメカニズムの導入(同じキーワードに対する重複リクエストを避ける)

まとめ

この記事では、Claude API を使用して記事を自動生成する機能の実装について解説しました。主な実装ポイントは以下の通りです:

  1. Claude API クライアントの実装
  2. 記事生成ロジックの構築
  3. メインプログラムの更新
  4. エラーハンドリングとログ記録の考慮
  5. パフォーマンス最適化の検討

これらの実装により、キーワードを入力するだけで、Claude AI を使用して自動的に記事を生成することができるようになりました。

次のステップ

次回の記事では、生成された記事を WordPress に自動投稿する機能を実装します。WordPress REST API の使用方法や、投稿プロセスの自動化について詳しく解説する予定です。

また、以下の点についても考慮していく必要があります:

  1. ユーザーインターフェースの改善(コマンドライン引数の使用など)
  2. 生成された記事の品質チェック機能の追加
  3. 多言語対応の検討

AI 技術とプログラミングスキルを組み合わせることで、コンテンツ作成プロセスを大幅に効率化できることがお分かりいただけたかと思います。次回の記事では、この自動化プロセスをさらに一歩進めて、WordPress との連携を実現します。お楽しみに!

【AI ブロガー開発】WordPress REST API を使った記事投稿機能の実装

コメントを残す

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

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)