-
-
Notifications
You must be signed in to change notification settings - Fork 146
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
bb2c27f
commit 4d15e4b
Showing
17 changed files
with
1,360 additions
and
677 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
//----------------------------------------------- | ||
// | ||
// This file is part of the Siv3D Engine. | ||
// | ||
// Copyright (c) 2008-2023 Ryo Suzuki | ||
// Copyright (c) 2016-2023 OpenSiv3D Project | ||
// | ||
// Licensed under the MIT License. | ||
// | ||
//----------------------------------------------- | ||
|
||
# pragma once | ||
# include "../Common.hpp" | ||
# include "../String.hpp" | ||
# include "../Array.hpp" | ||
# include "../AsyncHTTPTask.hpp" | ||
|
||
namespace s3d | ||
{ | ||
namespace OpenAI | ||
{ | ||
namespace Chat | ||
{ | ||
namespace Model | ||
{ | ||
/// @brief GPT-3.5 4K | ||
/// @see https://platform.openai.com/docs/models/gpt-3-5 | ||
inline constexpr char32 GPT3_5_Turbo[] = U"gpt-3.5-turbo"; | ||
|
||
/// @brief GPT-3.5 16K | ||
/// @see https://platform.openai.com/docs/models/gpt-3-5 | ||
inline constexpr char32 GPT3_5_Turbo_16K[] = U"gpt-3.5-turbo-16k"; | ||
|
||
/// @brief GPT-3.5 16K (1106) | ||
/// @see https://platform.openai.com/docs/models/gpt-3-5 | ||
inline constexpr char32 GPT3_5_Turbo_16K_1106[] = U"gpt-3.5-turbo-1106"; | ||
|
||
/// @brief GPT-4 8K | ||
/// @see https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo | ||
inline constexpr char32 GPT4[] = U"gpt-4"; | ||
|
||
/// @brief GPT-4 32K | ||
/// @see https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo | ||
inline constexpr char32 GPT4_32K[] = U"gpt-4-32k"; | ||
|
||
/// @brief GPT-4 Turbo 128K (1106 Preview) | ||
/// @see https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo | ||
inline constexpr char32 GPT4_Turbo_128K_1106_Preview[] = U"gpt-4-1106-preview"; | ||
} | ||
|
||
/// @brief メッセージのロール | Message role | ||
enum class Role | ||
{ | ||
/// @brief システム | System | ||
System, | ||
|
||
/// @brief ユーザー | User | ||
User, | ||
|
||
/// @brief AI アシスタント | AI Assistant | ||
Assistant, | ||
}; | ||
|
||
/// @brief レスポンスのフォーマット | Response format | ||
enum class ResponseFormat | ||
{ | ||
/// @brief テキスト | Text | ||
Text, | ||
|
||
/// @brief JSON | JSON | ||
JSON, | ||
}; | ||
|
||
/// @brief チャット API に送信するリクエスト | Request to send to the Chat API | ||
struct Request | ||
{ | ||
/// @brief ランダム・創造性の度合いの最小値 | Minimum value of randomness and creativity | ||
static constexpr double MinTemperature = 0.0; | ||
|
||
/// @brief ランダム・創造性の度合いの最大値 | Maximum value of randomness and creativity | ||
static constexpr double MaxTemperature = 2.0; | ||
|
||
/// @brief ランダム・創造性の度合いのデフォルト値 | Default value of randomness and creativity | ||
static constexpr double DefaultTemperature = 1.0; | ||
|
||
/// @brief メッセージ(ロールとメッセージのペアの配列) | Array of message pairs (role and message) | ||
Array<std::pair<Role, String>> messages; | ||
|
||
/// @brief モデル | Model | ||
String model = Model::GPT3_5_Turbo_16K_1106; | ||
|
||
/// @brief レスポンスのフォーマット | Response format | ||
/// @remark `ResponseFormat::JSON` を指定した場合、メッセージには "JSON" という言葉を含める必要があります。 | If `ResponseFormat::JSON` is specified, the message must contain the word "JSON". | ||
ResponseFormat responseFormat = ResponseFormat::Text; | ||
|
||
/// @brief ランダム・創造性の度合い | Degree of randomness and creativity | ||
/// @remark `MinTemperature` 以上 `MaxTemperature` 以下の値 | A value between `MinTemperature` and `MaxTemperature` | ||
double temperature = DefaultTemperature; | ||
}; | ||
|
||
/// @brief ChatGPT にメッセージを送り、その返答メッセージを取得します。 | Sends a message to ChatGPT and retrieves the response message. | ||
/// @param apiKey OpenAI API キー | OpenAI API key | ||
/// @param message メッセージ | Message | ||
/// @param model 使用するモデル | The model to be used (default: Model::GPT3_5_Turbo_16K_1106) | ||
/// @return 返答メッセージ。取得に失敗した場合は空の文字列 | Response message. An empty string if the retrieval fails. | ||
/// @remark インターネットアクセスが必要です。 | Internet access is required. | ||
[[nodiscard]] | ||
String Complete(StringView apiKey, StringView message, StringView model = Model::GPT3_5_Turbo_16K_1106); | ||
|
||
/// @brief ChatGPT にメッセージを送り、その返答メッセージを取得します。 | Sends messages to ChatGPT and retrieves the response message. | ||
/// @param apiKey OpenAI API キー | OpenAI API key | ||
/// @param request リクエスト | Request | ||
/// @return 返答メッセージ。取得に失敗した場合は空の文字列 | Response message. An empty string if the retrieval fails. | ||
/// @remark インターネットアクセスが必要です。 | Internet access is required. | ||
[[nodiscard]] | ||
String Complete(StringView apiKey, const Request& request); | ||
|
||
/// @brief ChatGPT にメッセージを送り、その返答メッセージを取得します。 | Sends messages to ChatGPT and retrieves the response message. | ||
/// @param apiKey OpenAI API キー | OpenAI API key | ||
/// @param request リクエスト | Request | ||
/// @param error エラーメッセージの格納先。エラーが無い場合は空の文字列になる | Destination for the error message. Will be an empty string if no error occurs. | ||
/// @return 返答メッセージ。取得に失敗した場合は空の文字列 | Response message. An empty string if the retrieval fails. | ||
/// @remark インターネットアクセスが必要です。 | Internet access is required. | ||
[[nodiscard]] | ||
String Complete(StringView apiKey, const Request& request, String& error); | ||
|
||
/// @brief ChatGPT にメッセージを送り、レスポンス(JSON)を取得する非同期タスクを返します。 | Returns an asynchronous task for sending a message to ChatGPT and retrieving the response (JSON). | ||
/// @param apiKey OpenAI API キー | OpenAI API key | ||
/// @param message メッセージ | Message | ||
/// @param model 使用するモデル | The model to be used (default: Model::GPT3_5_Turbo_16K_1106) | ||
/// @return 非同期タスク | Asynchronous task | ||
/// @remark 戻り値の task が `(task.isReady() == true) && (task.getResponse().isOK() == true)` になれば結果を取得できます。 | The result can be retrieved if `(task.isReady() == true) && (task.getResponse().isOK() == true)`. | ||
/// @remark インターネットアクセスが必要です。 | Internet access is required. | ||
[[nodiscard]] | ||
AsyncHTTPTask CompleteAsync(StringView apiKey, StringView message, StringView model = Model::GPT3_5_Turbo_16K_1106); | ||
|
||
/// @brief ChatGPT にメッセージを送り、レスポンス(JSON)を取得する非同期タスクを返します。 | Returns an asynchronous task for sending messages to ChatGPT and retrieving the response (JSON). | ||
/// @param apiKey OpenAI API キー | OpenAI API key | ||
/// @param request リクエスト | Request | ||
/// @return 非同期タスク | Asynchronous task | ||
/// @remark 戻り値の task が `(task.isReady() == true) && (task.getResponse().isOK() == true)` になれば結果を取得できます。 | The result can be retrieved if `(task.isReady() == true) && (task.getResponse().isOK() == true)`. | ||
/// @remark インターネットアクセスが必要です。 | Internet access is required. | ||
[[nodiscard]] | ||
AsyncHTTPTask CompleteAsync(StringView apiKey, const Request& request); | ||
|
||
/// @brief ChatGPT のレスポンス(JSON)から、返答メッセージを抽出して返します。 | Extracts and returns the response message from the ChatGPT response (JSON). | ||
/// @param response JSON レスポンス | JSON response | ||
/// @return 返答メッセージ。抽出に失敗した場合は空の文字列 | Response message. An empty string if extraction fails. | ||
/// @remark 通常は `AsyncHTTPTask::getAsJSON()` の戻り値を渡します。 | Typically, pass the return value of `AsyncHTTPTask::getAsJSON()`. | ||
[[nodiscard]] | ||
String GetContent(const JSON& response); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
//----------------------------------------------- | ||
// | ||
// This file is part of the Siv3D Engine. | ||
// | ||
// Copyright (c) 2008-2023 Ryo Suzuki | ||
// Copyright (c) 2016-2023 OpenSiv3D Project | ||
// | ||
// Licensed under the MIT License. | ||
// | ||
//----------------------------------------------- | ||
|
||
# pragma once | ||
# include "../Common.hpp" | ||
# include "../String.hpp" | ||
# include "../Array.hpp" | ||
# include "../AsyncHTTPTask.hpp" | ||
|
||
namespace s3d | ||
{ | ||
class JSON; | ||
|
||
namespace OpenAI | ||
{ | ||
namespace Embedding | ||
{ | ||
namespace Model | ||
{ | ||
/// @brief 埋め込みモデル text-embedding-ada-002 | Embedding Model text-embedding-ada-002 | ||
/// @see https://platform.openai.com/docs/models/embeddings | ||
/// @remark Embeddings API 用のモデルです。 | This is a model for the Embeddings API. | ||
inline constexpr char32 EmbeddingAda002[] = U"text-embedding-ada-002"; | ||
} | ||
|
||
/// @brief 文章の埋め込みベクトルを返します。 | Returns the embedding vector of the text. | ||
/// @param apiKey OpenAI API キー | OpenAI API key | ||
/// @param text 文章 | Text | ||
/// @param model 使用するモデル | The model to be used (default: Model::EmbeddingAda002) | ||
/// @return 埋め込みベクトル。取得に失敗した場合空の配列 | Embedding vector. Empty array if the retrieval fails. | ||
/// @remark インターネットアクセスが必要です。 | Internet access is required. | ||
[[nodiscard]] | ||
Array<float> Create(StringView apiKey, StringView text, StringView model = Model::EmbeddingAda002); | ||
|
||
/// @brief 文章の埋め込みベクトルを返します。 | Returns the embedding vector of the text. | ||
/// @param apiKey OpenAI API キー | OpenAI API key | ||
/// @param text 文章 | Text | ||
/// @param error エラーメッセージの格納先。エラーが無い場合は空の文字列になる | Destination for the error message. Will be an empty string if no error occurs. | ||
/// @param model 使用するモデル | The model to be used (default: Model::EmbeddingAda002) | ||
/// @return 埋め込みベクトル。取得に失敗した場合空の配列 | Embedding vector. Empty array if the retrieval fails. | ||
/// @remark インターネットアクセスが必要です。 | Internet access is required. | ||
[[nodiscard]] | ||
Array<float> Create(StringView apiKey, StringView text, String& error, StringView model = Model::EmbeddingAda002); | ||
|
||
/// @brief 文章の埋め込みベクトルを含むレスポンス(JSON)を取得する非同期タスクを返します。 | Returns an asynchronous task that retrieves a response (JSON) containing the embedding vector of the text. | ||
/// @param apiKey OpenAI API キー | OpenAI API key | ||
/// @param text 文章 | Text | ||
/// @param model 使用するモデル | The model to be used (default: Model::EmbeddingAda002) | ||
/// @return 非同期タスク | Asynchronous task | ||
/// @remark インターネットアクセスが必要です。 | Internet access is required. | ||
[[nodiscard]] | ||
AsyncHTTPTask CreateAsync(StringView apiKey, StringView text, StringView model = Model::EmbeddingAda002); | ||
|
||
/// @brief レスポンス(JSON)から、文章の埋め込みベクトルを抽出して返します。 | Extracts and returns the embedding vector of the text from the response (JSON). | ||
/// @param response JSON レスポンス | JSON response | ||
/// @return 埋め込みベクトル。抽出に失敗した場合は空の文字列 | Embedding vector. Empty array if the extraction fails. | ||
[[nodiscard]] | ||
Array<float> GetVector(const JSON& response); | ||
|
||
/// @brief 2 つの埋め込みベクトルのコサイン類似度を返します。 | Returns the cosine similarity of two embedding vectors. | ||
/// @param a 一方の埋め込みベクトル(正規化済み) | One of the embedding vectors (normalized) | ||
/// @param b もう一方の埋め込みベクトル(正規化済み) | The other embedding vector (normalized) | ||
/// @return コサイン類似度 | Cosine similarity | ||
[[nodiscard]] | ||
float CosineSimilarity(const Array<float>& a, const Array<float>& b); | ||
} | ||
} | ||
} |
Oops, something went wrong.