見出し画像

[生成AI] 星占いAPIを自作する (前編)星占いAPIデータを自動作成する

割引あり

近年、自然言語処理の分野で著しい進歩を遂げている生成AIは、私たちの生活に大きな影響を与えつつあります。ChatGPTやClaude、Geminiといった代表的な生成AIは、人間のような自然な対話を可能にし、様々なタスクを効率的に処理することができます。

この記事では、これらの生成AIを活用して、ユニークな星占いAPIを作成する方法を紹介します。記事は前後編に分かれており、前編では生成AIを使って星占いのデータを自動作成する手順を詳しく解説し、後編ではAWS LambdaとDynamoDBを用いてAPIとして公開する方法を説明します。

生成AIの力を借りることで、大量の星占いデータを効率的に作成し、それをAPIとして提供することができます。これにより、アプリケーションやWebサイトに簡単に星占いの機能を追加することが可能になります。

本記事を通じて、生成AIとクラウドサービスを組み合わせた、革新的なAPIの作成方法を学んでいきましょう。さらに、自作星占いAPIの利点について理解を深めることで、同種のAPIサービスを提供するためのヒントを得ることができるでしょう。

記事概要

本記事では、生成AIとAWS Lambdaを組み合わせて、独自の星占いAPIを作成する方法を解説します。記事は大きく3つのパートに分かれています。

第1部では、APIの基本概念と設計方針について説明します。星占いAPIの実装に必要な知識を身につけることができるでしょう。

第2部では、OpenAI API、Anthropic API、Google AI APIのAPIキーの作成方法と、それらを使用して星占いデータを自動生成するNode.jsスクリプトの作成手順を詳しく解説します。これにより、大量の星占いデータを効率的に作成することができます。

第3部では、生成された星占いデータの品質を確保するための検証方法について説明します。検証用のPythonスクリプトの作成方法と、検証結果の考察について学ぶことができます。

本記事を通して、生成AIとクラウドサービスを活用した独自のAPIの作成方法を習得し、質の高い星占いサービスを提供するためのヒントを得ることができるでしょう。

免責事項

本記事で提供するプログラムコードや手順は、あくまで参考例です。開発環境やAWSのバージョンの違いにより、記事通りに動作しない可能性があります。特に、AWSのサービスは頻繁にアップデートされるため、UIの変更や設定方法の変更などにより、記事の内容と異なる部分が出てくる可能性があります。本記事は、2023年5月時点の情報に基づいて作成されています。

また、本記事で提供するプログラムを実行した結果、発生した損害や問題について、著者は一切の責任を負いません。AWSの利用料金などは、読者ご自身の責任で管理してください。特に、DynamoDBやAWS Lambdaは、使用量に応じて課金されるサービスです。APIの呼び出し回数やデータ転送量によっては、高額な料金が発生する可能性がありますので、ご注意ください。

本記事で作成するAPIは、あくまでサンプルコードです。実際のサービスで使用する場合は、セキュリティ面や性能面でさらなる改善が必要です。特に、APIキーによる認証は、本格的なサービスで使用するには十分ではありません。必要に応じて、より強固な認証方式を検討してください。

AWSのアカウントやアクセスキーの管理は、読者ご自身の責任で行ってください。アクセスキーを紛失したり、第三者に漏洩したりすることがないよう、十分にご注意ください。

以上の点を予めご了承の上、本記事をご活用ください。本記事が、読者の皆様のAPI開発の一助となれば幸いです。


第1部 星占いAPIの設計

近年、星占いを初め、さまざまな占いに関する情報を提供するWebサービスやアプリケーションが増えています。これらのサービスの多くは、星占いのデータを外部から取得するためにAPIを利用しています。しかし、既存の星占いAPIは有料であることが多く、運用コストが高くつくという問題があります。

そこで本記事では、生成AIを活用して独自の星占いAPIを作成する方法を紹介します。自作のAPIを利用することで、運用コストを大幅に削減できるだけでなく、データの品質をコントロールし、ユーザーのニーズに合わせたきめ細やかなサービスを提供することができます。

APIを設計する上で、最初に理解しておくべきことはAPIの基本概念です。APIとは、Application Programming Interfaceの略で、異なるソフトウェアやシステム間でデータをやり取りするための仕組みを指します。APIを利用することで、開発者は自分のアプリケーションに他のサービスの機能を簡単に組み込むことができます。

星占いAPIを設計する際には、以下の点を考慮する必要があります:

  1. リクエストとレスポンスのフォーマット(JSON、XML等)

  2. エンドポイントの設計(URLの構造、HTTPメソッド)

  3. 認証と認可の方法(APIキー、OAuth等)

  4. エラーハンドリングとステータスコード

  5. ドキュメンテーション(APIの使用方法、パラメータの説明等)

これらの要素を適切に設計することで、利用しやすく、安全で信頼性の高いAPIを作成することができます。次のセクションでは、各要素について詳しく説明していきます。

リクエストとレスポンスの設計

星占いAPIでは、リクエストとレスポンスのフォーマットを決める必要があります。リクエストは、ユーザー側からAPIサーバーに問い合わせる形式のことです。レスポンスは、APIサーバーからユーザーに返却されるデータ形式のことです。本APIでは、リクエストはURLクエリパラメータを使用し、レスポンスはJSON形式で返却することとします。

リクエストは、以下の形式でURLクエリパラメータを送信します。URLクエリパラメータは、「https://xxx.yyy」のドメインの後に「?」記号で追加の情報を付加することができます。

?user_id=123&zodiac_sign_id=1&event_date=2024-05-01

このリクエストは、ユーザーID(123)が、zodiac_sign_id=1(牡牛座)の2024-05-01の日付の占い結果を問い合わせています。

  • user_id:ユーザーID

  • zodiac_sign_id:星座ID(1から12の整数)

  • event_date:占う日付(YYYY-MM-DD形式)

レスポンスは、以下のJSON形式で返却します。返却されたデータをパースすることで、星占いの結果を取得することができます。

{
  "statusCode": 200, 
  "body": "[{\"work_luck\":1,\"general_luck\":1,\"todays_fortune\":\"今日の運勢は〇〇です。\",\"event_date\":\"2024-05-01\",\"financial_luck\":2,\"love_luck\":2,\"id\":1,\"zodiac_sign_id\":\"1\"}]" 
}

このレスポンスは、先ほどのリクエストに対して返却された占い結果を含んでいます。 JSONのキーは次の意味を持っています。

  • statusCode:HTTPステータスコード(200は成功を示す)

  • body:星占いの結果を含むJSON文字列

    • work_luck:仕事運(1から5の整数)

    • general_luck:全体運(1から5の整数)

    • todays_fortune:今日の運勢(200文字程度のテキスト)

    • event_date:占う日付(YYYY-MM-DD形式)

    • financial_luck:金運(1から5の整数)

    • love_luck:恋愛運(1から5の整数)

    • id:データベースの星占いID

    • zodiac_sign_id:星座ID(1から12の整数)

このようなフォーマットを採用することで、APIの利用者は必要な情報を簡単に取得することができます。次のセクションでは、エンドポイントの設計について説明します。

リクエストとレスポンスのフォーマットを決めたら、次はエンドポイントの設計について考えましょう。

エンドポイントの設計

エンドポイントは、APIにアクセスするためのURLです。適切なエンドポイントを設計することで、APIの利用者は必要な情報に簡単にアクセスできます。星占いAPIのエンドポイントは、以下のような構造にします。

https://api.example.com/default/horoscope
  • https:通信プロトコル(HTTPSを使用して安全な通信を行う)

  • api.example.com:APIのドメイン名

  • /default:API Gatewayのデフォルトパスをそのまま使用する

  • /horoscope:リソース名(星占いを表す)

このエンドポイントに対して、HTTPのGETメソッドでリクエストを送信することで、星占いの結果を取得できます。リクエストの例は以下の通りです。

GET https://api.example.com/default/horoscope?user_id=123&zodiac_sign_id=1&event_date=2024-05-01

GET https://api.example.com/default/horoscope?user_id=123&zodiac_sign_id=1&event_date=2024-05-01

  • user_id:ユーザーID(必須)

  • zodiac_sign_id:星座ID(必須)

  • event_date:占う日付(必須)

エンドポイントに必須パラメータが含まれていない場合や、パラメータの値が無効な場合は、適切なHTTPステータスコード(400 Bad Request)とエラーメッセージを返却するようにします。

また、APIのバージョンアップに伴って、エンドポイントのURLを変更する必要がある場合は、古いバージョンのエンドポイントを一定期間維持し、利用者に新しいバージョンへの移行を促すようにします。

適切なエンドポイントを設計することで、APIの利用者は直感的に必要な情報にアクセスできるようになります。次のセクションでは、認証と認可の方法について説明します。

認証と認可の設計

APIのセキュリティを確保するために、認証と認可の仕組みを適切に設計する必要があります。認証は、APIにアクセスするユーザーが正当な利用者であることを確認するプロセスです。認可は、認証されたユーザーが適切な権限を持っていることを確認し、リソースへのアクセスを制御するプロセスです。

星占いAPIでは、以下の認証と認可の方法を採用します。

  1. APIキーによる認証

    • 利用者はAPIキーを取得し、リクエストヘッダーに含めることで認証を行います。

    • APIキーは、APIの利用者を一意に識別するための文字列です。

    • APIキーは、利用者が自分のアカウントから生成し、管理します。

    • APIサーバーは、リクエストヘッダーに含まれるAPIキーを検証し、正当な利用者からのリクエストであることを確認します。

  2. ユーザーIDによる認可

    • 利用者は、リクエストパラメータに自分のユーザーIDを含めます。

    • APIサーバーは、ユーザーIDに基づいて、利用者が適切な権限を持っていることを確認します。

    • 例えば、利用者は自分の星占い結果のみにアクセスできるようにします。

以下は、APIキーとユーザーIDを使用した認証と認可の例です。

GET https://api.example.com/default/horoscope \
?user_id=123&zodiac_sign_id=1&event_date=2024-05-01 \
Headers: X-API-Key: abcdefghijklmnopqrstuvwxyz
  • X-API-Key:APIキー(リクエストヘッダーに含める)

  • user_id:ユーザーID(リクエストパラメータに含める)

APIサーバーは、以下の手順で認証と認可を行います。

  1. リクエストヘッダーからAPIキーを取得し、データベースに登録されているAPIキーと照合する。

  2. APIキーが正当であれば、リクエストパラメータからユーザーIDを取得する。

  3. ユーザーIDに基づいて、利用者が適切な権限を持っていることを確認する。

  4. 認証と認可が成功した場合は、リクエストされたリソースにアクセスし、レスポンスを返却する。

適切な認証と認可の仕組みを設計することで、APIのセキュリティを確保し、利用者のデータを保護することができます。次のセクションでは、エラーハンドリングとステータスコードについて説明します。

エラーハンドリングとステータスコード

APIを設計する際、適切なエラーハンドリングとステータスコードを使用することが重要です。エラーハンドリングにより、APIの利用者はエラーの原因を特定し、適切な対処を行うことができます。ステータスコードは、リクエストの処理結果を示す標準的な方法であり、APIの利用者は一貫性のある方法でエラーを処理できます。

星占いAPIでは、以下のようなエラーハンドリングとステータスコードを使用します。

正常応答(200 OK)

{
  "statusCode": 200,
  "body": "[{\"work_luck\":1,\"general_luck\":1,\"todays_fortune\":\"今日の運勢は〇〇です。\",\"event_date\":\"2024-05-01\",\"financial_luck\":2,\"love_luck\":2,\"id\":1,\"zodiac_sign_id\":\"1\"}]" 
}
  • リクエストが成功し、星占いデータが正常に返却された場合に使用します。

  • レスポンスボディには、星占いデータがJSON形式で含まれます。

不正なリクエスト(400 Bad Request)

{
  "statusCode": 400,
  "error": "Invalid request",
  "message": "Missing required parameter: user_id"
}
  • リクエストパラメータが不足している場合や、パラメータの値が無効な場合に使用します。

  • レスポンスボディには、エラーの詳細を説明するメッセージがJSON形式で含まれます。

認証エラー(401 Unauthorized)

{
  "statusCode": 401,
  "error": "Authentication failed",
  "message": "Invalid API Key"
}
  • 認証に失敗した場合に使用します。

  • レスポンスボディには、認証エラーの詳細を説明するメッセージがJSON形式で含まれます。

権限エラー(403 Forbidden)

{
  "statusCode": 403,
  "error": "Forbidden",
  "message": "User with ID xxxx does not have permission to access this resource."
}
  • 認証されたユーザーが、アクセス権限を持っていないリソースにアクセスしようとした場合に使用します。

  • レスポンスボディには、権限エラーの詳細を説明するメッセージがJSON形式で含まれます。メッセージには、アクセスが拒否されたユーザーのIDを含めます。

リソースが見つからない(404 Not Found)

{
  "statusCode": 404,
  "error": "Resource not found",
  "message": "No horoscope data found for the specified date"
}
  • 指定されたリソースが存在しない場合に使用します。

  • レスポンスボディには、リソースが見つからないことを示すメッセージがJSON形式で含まれます。

サーバーエラー(500 Internal Server Error)

{
  "statusCode": 500,
  "error": "Internal server error",
  "message": "An unexpected error occurred"
}
  • APIサーバー内で予期しないエラーが発生した場合に使用します。

  • レスポンスボディには、サーバーエラーの詳細を説明するメッセージがJSON形式で含まれます。

エラーハンドリングとステータスコードを適切に使用することで、APIの利用者はエラーの原因を特定し、適切な対処を行うことができます。また、一貫性のあるエラー処理により、APIの利用者は効率的にエラーを処理できます。

APIの設計者は、想定されるエラーシナリオを洗い出し、適切なエラーハンドリングとステータスコードを設定する必要があります。また、エラーメッセージは分かりやすく、具体的である必要があります。

エラーハンドリングとステータスコードを適切に設計したら、次はAPIの利用者がAPIを正しく使用できるようにドキュメンテーションを整備しましょう。

ドキュメンテーションの整備

ドキュメンテーションは、APIの利用者がAPIを正しく使用するために必要な情報を提供するものです。適切なドキュメンテーションがあれば、利用者はAPIの機能を理解し、効率的に使用することができます。

星占いAPIのドキュメンテーションには、以下の内容を含めます。キュメンテーションの構成は以下の通りです。

  1. APIの概要

    • APIの目的と提供する機能の概要を説明します。

    • 認証方法や利用制限についても触れます。

  2. エンドポイントの説明

    • APIのエンドポイントのURLと、各エンドポイントで提供される機能を説明します。

    • エンドポイントのHTTPメソッド(GET, POST, PUT, DELETEなど)についても説明します。

  3. リクエストパラメータの説明

    • 各エンドポイントで使用するリクエストパラメータの詳細を説明します。

    • パラメータ名、データ型、必須/オプション、デフォルト値、有効な値の範囲などを記載します。

  4. レスポンスの説明

    • 各エンドポイントから返却されるレスポンスの構造を説明します。

    • レスポンスのデータ型、フィールド名、フィールドの説明などを記載します。

    • エラーレスポンスの構造についても説明します。

  5. リクエスト/レスポンスの例

    • 各エンドポイントのリクエストとレスポンスの具体的な例を提供します。

    • 利用者はこれらの例を参考にして、APIの使用方法を理解することができます。

  6. 認証方法の説明

    • APIの認証方法について詳細に説明します。

    • 認証に必要なパラメータや、認証トークンの取得方法などを記載します。

  7. エラーコードの説明

    • APIが返却するエラーコードの一覧と、各エラーコードの説明を提供します。

    • エラーコードに対応するエラーメッセージの例も記載します。

  8. SDKとサンプルコードの提供

    • APIを使用するためのSDK(ソフトウェア開発キット)やサンプルコードを提供します。

    • 利用者はこれらのリソースを活用して、APIを効率的に使用することができます。

ドキュメンテーションは、APIの利用者にとって非常に重要な資料です。初心者向けの記事では、ドキュメンテーションの役割と必要性について説明し、利用者がAPIを正しく使用できるようにすることが大切です。また、ドキュメンテーションは常に最新の状態に保ち、APIの変更に合わせて更新することが求められます。

以上で、星占いAPIの設計の説明を終わります。次は、上記の方針に従って、APIを実装していきます。まず初めに、星占いAPIのデータを作成します。ここで活躍するのが、生成AIです。生成AIを活用することで、大量のデータを安価に作成できます。また、データの品質を自分で管理できるようになります。

第2部 星占いAPIのデータを作成

第2部では、星占いAPIのデータを生成AIを使って作成します。本記事で使用するのは、原稿執筆時点で最高性能を誇る「ChatGPT (OpenAI)」、「Claude (Anthropic)」、「Gemini (Google)」の3つの生成AIです。データ自動作成スクリプトをNode.jsで作成し、大量のデータを作成します。

初めに、ChatGPT APIを使用するために必要なOpenAI APIキーを作成する手順を説明します。

OpenAI APIキーの作成

OpenAI APIキーを作成するには、以下の手順を実行します。次に示す図は、OpenAIのウェブサイトで新しいAPIキーを作成している様子です。Nameとして、用途や分類を登録しておくと、APIキーの管理に役立ちます。

図1 OpenAI APIキーの作成
  1. OpenAIのウェブサイト(https://openai.com/)にアクセスし、アカウントを作成またはログインします。

  2. ダッシュボードにアクセスし、「API keys」セクションに移動します。

  3. 「Create new secret key」ボタンをクリックして、新しいAPIキーを生成します。

  4. 生成されたAPIキーをコピーし、安全な場所に保存します。このキーは後で使用するので、忘れないようにしてください。

APIキーを作成したら、Node.jsスクリプトからChatGPT APIを呼び出すことができます。次に、Anthropic APIキーとGoogle AI APIキーの作成手順を説明します。

Anthropic APIキーの作成

Anthropic APIキーを作成するには、以下の手順を実行します。次の図は、Anthropicのウェブサイトで新しいAPIキーを作成している様子です。Nameとして、用途や分類を登録しておくと、APIキーの管理に役立ちます。

図2 Anthropic APIキーの作成
  1. Anthropicのウェブサイト(https://www.anthropic.com/)にアクセスし、アカウントを作成またはログインします。

  2. ダッシュボードにアクセスし、「API」セクションに移動します。

  3. 「Generate API Key」ボタンをクリックして、新しいAPIキーを生成します。

  4. 生成されたAPIキーをコピーし、安全な場所に保存します。

Google AI APIキーの作成

Google AI APIキーを作成するには、以下の手順を実行します。初回のAPIキー作成時には、新しいGCP(Google Cloud Platform)プロジェクトを作成する必要があります。2回目以降のAPIキー作成時には、次の図に示すように既存のプロジェクト「Generative Language Client」を選択してください。

図3 Google AI APIキー
  1. Google Cloud Platformのウェブサイト(https://console.cloud.google.com/)にアクセスし、アカウントを作成またはログインします。

  2. Googel AI Studioのウェブサイト(https://aistudio.google.com/)にアクセスして、左サイドバーから「Get API Key」セクションを選びます。

  3. 「Create API Key in new project」を選択します(初回のみ)。

  4. 生成されたAPIキーをコピーし、安全な場所に保存します。

  5. 2つ目以降のAPIキーを作成するときは、「Create API Key」から、プロジェクト名「Generative Language Client」を選んでください。現時点では、APIキーに識別のための名前をつけることはできないので、作成したキーの用途などを別途メモしておくことをおすすめします。

これで、3つの生成AIのAPIキーが作成されました。次のセクションでは、これらのAPIキーを使用して、星占いデータを自動生成するNode.jsスクリプトを作成する方法を説明します。

星占いAPIデータ作成スクリプトの作成

このセクションでは、星占いデータを自動生成するNode.jsスクリプトを作成します。このスクリプトは、「ChatGPT」「Claude」「Gemini」という3つの生成AIを切り替えて、星占いAPI用のデータを作成できます。

星占いAPIのレスポンスデータには、次の要素が含まれています。

  • id:データベースの星占いID

  • zodiac_sign_id:星座ID(1から12の整数)

  • event_date:占う日付(YYYY-MM-DD形式)

  • general_luck:全体運(1から5の整数)

  • work_luck:仕事運(1から5の整数)

  • love_luck:恋愛運(1から5の整数)

  • financial_luck:金運(1から5の整数)

  • todays_fortune:今日の運勢(200文字程度のテキスト)

星占いAPIのレスポンスデータに含まれる要素の中で、作成に一番手間がかかるのは「今日の運勢」のテキスト生成です。このテキストを生成するために、本スクリプトでは以下の手順を踏みます。

  1. 全体運をランダムに生成する(1から5の整数)

  2. 生成された全体運の値を元に、生成AIに与えるプロンプト(指示)を作成する

    • 例:全体運が3(普通の運勢)の場合、「全体運3の場合の今日の運勢を、200文字程度で生成してください。」というプロンプトを作成

  3. 作成したプロンプトを生成AIに与え、「今日の運勢」のテキストを生成する

    • 生成AIは与えられたプロンプトを元に、自然言語処理技術を用いて文脈に沿った自然な文章を生成

生成AIによるテキスト生成は、大量のテキストデータを学習することで実現されています。学習済みのモデルを用いることで、与えられたプロンプトに関連する自然な文章を生成することができます。

本スクリプトでは、ChatGPT、Claude、Geminiという3つの生成AIを切り替えて使用することで、どの生成AIが目的のテキスト生成に最も適しているかを検証します。これにより、高品質な「今日の運勢」テキストを効率的に生成することが可能になります。

では、スクリプトの作成を始めましょう。初めにプロジェクトを保存するディレクトリを作成します。ディレクトリの場所は任意ですが、本記事では、ユーザーディレクトリ直下に「LambdaFunctions」フォルダーを作成し、その下に「generateHoroscopes」フォルダーを作り、その中に全てのファイルを保存します。

次に、次のコマンドをコマンドライン(ターミナルなど)で実行して、Node.jsを使えるようにします。

$ cd ~/LambdaFunctions/generateHoroscopes
$ npm init -y

続いて、次のコマンドを実行して、必要なパッケージをまとめてインストールします。これらのパッケージは生成AIのAPIを簡単に扱えるようにしてくれます。

$ npm install openai @anthropic-ai/sdk @google/generative-ai dotenv csv-parser

以上で、パッケージのインストールが完了しました。「openai」「@anthropic-ai/sdk」「@google/generative-ai」「dotenv」の4つのパッケージは、星占いAPIデータ作成に使用します。「csv-parser」は、次の第3部で使用するので、ここでまとめてインストールしておきます。

次に、先ほど作成した環境変数(APIキー)をプロジェクトで使えるようにします。generateHoroscopesフォルダーの中に「.env」という名前のファイルを作成し、次のコードを記述します。

OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ANTHROPIC_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
GOOGLE_AI_API_KEY=AIxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

セキュリティの観点から、APIキーを公開の場で共有することは避けるべきです。APIキーは、個人またはチームで管理し、他人に漏れないように注意する必要があります。

このコードは、OpenAI、Anthropic、およびGoogle AI(Gemini)APIのAPIキーを設定するための.envファイルの例です。.envファイルは、プロジェクトで使用される環境変数を定義するためのテキストファイルです。

`OPENAI_API_KEY`、`ANTHROPIC_API_KEY`、`GOOGLE_AI_API_KEY`の各値は、先ほどのセクションで取得した実際のAPIキーに置き換えてください。これで各サービスのAPIを使用できるようになります。.envファイルの使い方は次の通りです。

  • .envファイルは機密情報をコードベースから分離するために使われます。

  • Node.jsでは、dotenvパッケージを使って環境変数を読み込んで、プロジェクト内で使用できます。

  • GitHubなどのバージョン管理システムを使っている場合は、APIキーの漏洩に注意しましょう。generateHoroscopesフォルダー内に「.gitignore」という名前のファイルを作成し、「.env」と記述することで、バージョン管理システムから除外することができます。

.envファイルの説明を終わります。次に、生成AIからテキストを取得するスクリプトを作成します。generateHoroscopesフォルダーの中に「getGenerativeAIText.js」という名前のファイルを作成し、次に示すコードを記述してください。

const OpenAI = require('openai'); // ここから(1)
const Anthropic = require('@anthropic-ai/sdk');
const { GoogleGenerativeAI } = require("@google/generative-ai");
const dotenv = require("dotenv");
dotenv.config(); // ここまで(1)

// OpenAI APIキーの設定 // ここから(2)
const openai = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY, // This is the default and can be omitted
});

// Anthropic APIキーの設定
const anthropic = new Anthropic({
  apiKey: process.env.ANTHROPIC_API_KEY, // This is the default and can be omitted
});

// Google AI APIキーの設定
const genAI = new GoogleGenerativeAI(process.env.GOOGLE_AI_API_KEY); // ここまで(2)

function delay(ms) { // (3)
  return new Promise(resolve => setTimeout(resolve, ms));
}

module.exports = {
  getChatGPTText: async function (systemPrompt, userPrompt, engine, temperature) { // ここから(4)
    // 待機時間(エラーにならないように値を設定)
    const waitTime = 1000;

    try {
      const messages = [{ role: 'system', content: systemPrompt }];
      messages.push({ role: 'user', content: userPrompt });

      const completion = await openai.chat.completions.create({
        model: engine,
        messages: messages,
        temperature: temperature, // ランダム性を設定(0 - 1)
        max_tokens: 1024,
      });
      const message = completion.choices[0].message;
      await delay(waitTime);

      return message.content.trim();
    } catch (error) {
      console.log('Error:', error);

      return '';
    }
  }, // ここまで(4)
  getClaudeText: async function (systemPrompt, userPrompt, engine, temperature) { // ここから(5)
    // 待機時間(エラーにならないように値を設定)
    const waitTime = 10000;

    try {
      const message = await anthropic.messages.create({
        max_tokens: 1024,
        system: systemPrompt,
        messages: [{ role: 'user', content: userPrompt }],
        temperature: temperature, // ランダム性を設定(0 - 1)
        model: engine,
      });
      await delay(waitTime);

      return message.content[0].text;
    } catch (error) {
      console.log('Error:', error);

      return '';
    }
  }, // ここまで(5)
  getGeminiText: async function (systemPrompt, userPrompt, engine, temperature) { // ここから(6)
    // 待機時間(エラーにならないように値を設定)
    const waitTime = 1000;

    try {
      // For text-only input, use the gemini-pro model
      const generationConfig = {
        temperature: temperature // ランダム性を設定(0 - 1)
      };
      const model = genAI.getGenerativeModel({model: engine, generationConfig});

      // チャット履歴でシステムプロンプトを認識させる
      // const chat = model.startChat({
      //   history: [
      //     {
      //       role: "user",
      //       parts: [{ text: systemPrompt }],
      //     },
      //     {
      //       role: "model",
      //       parts: [{ text: '理解しました'}],
      //     },
      //   ]
      // });
      //
      // const message = await chat.sendMessage(userPrompt);
      // // console.log('message:', message)
      // const response = await message.response;
      // // console.log('response:', response)
      // result = response.text();

      // システムプロンプトとユーザープロンプトを結合する
      const prompt = `${systemPrompt}:<>${userPrompt}<>`
      const message = await model.generateContent(prompt);
      const response = await message.response;
      await delay(waitTime);

      return response.text();
    } catch (error) {
      console.log('Error:', error);

      return ''; // ここまで(6)
    }
  }
}

このコードは、3つの異なるAIサービス(OpenAI、Anthropic、Google Generative AI)を利用して結果を生成するためのモジュールを示しています。それぞれのサービスに対して、プロンプトを使って応答を生成し、特定のタスクに利用できる結果を返すメソッドを提供しています。

(1)では、OpenAI、Anthropic、およびGoogle Generative AIのインポートとdotenvの設定を行っています。 dotenvパッケージを使用して、環境変数を.envファイルからロードし、OpenAI、Anthropic、およびGoogle Generative AIを含むライブラリをインポートします。以上で、生成AIのAPIを使用する準備が整います。

(2)では、APIクライアントの設定を行います。各APIクライアントが環境変数から取得したAPIキーを使用して初期化されます。これにより、特定のAIサービスにアクセスできるようになります。

(3)では、指定されたミリ秒数だけ実行を遅らせるdelay関数を定義しています。APIリクエストが連続して行われる場合、レートリミットを避けるために遅延が必要なことがあります。

レートリミットとは、RPM(Requests Per Minute = 1分間にリクエストできる回数)のことで、各サービスやユーザーのプランにより異なります。詳しくは、各サービスのレートリミットの項目を参照してください。

(4)では、OpenAI APIを使用して、指定されたプロンプトからテキスト生成結果を取得するメソッドを定義しています。システムプロンプトとユーザープロンプトを使ってOpenAIのAPIにリクエストを行います。公式サイトのAPIリファレンスを参照して、リクエストとレスポンスの形式を確認し、正確に扱うようにします。エラーハンドリングでは、エラー発生時に空文字('')を返しています。

(5)では、Anthropic APIを使用して、プロンプトから生成されたテキストを取得するメソッドを定義しています。Anthropic特有の方法でプロンプトをAPIに送信しています。OpenAIと同様に、リクエストとレスポンスを正確に扱い、エラー時に適切な処理を行うことが必要です。

(6)では、GoogleのGenerative AI(Gemini)を使用してプロンプトに基づくテキストを生成するメソッドを定義しています。Geminiは現時点でシステムプロンプトの仕組みをサポートしていません。そのため、システムプロンプトとユーザープロンプトを結合し、GoogleのAPIを使ってテキストを生成しています。

Geminiでシステムプロンプトを扱う別の方法としては、コメントアウトされているコードのように、チャット履歴としてシステムプロンプトを生成AIに認識させる方法があります。参考として、コードを残しましたので、興味のある方はテストしてみてください。

以上で、各生成AIからテキストを取得するコードの説明を終わります。次は、自動で星占いAPIのデータを取得するスクリプトを作成します。generateHoroscopesフォルダーの中に「generateHoroscopes」ファイルを作成し、次のコードを記述します。

ここから先は

15,784字 / 1画像

この記事が気に入ったらサポートをしてみませんか?