Skip to content

Commit

Permalink
AI update (v0.6.14) (#1176)
Browse files Browse the repository at this point in the history
  • Loading branch information
Reputeless authored Dec 31, 2023
1 parent bb2c27f commit 4d15e4b
Show file tree
Hide file tree
Showing 17 changed files with 1,360 additions and 677 deletions.
6 changes: 5 additions & 1 deletion Linux/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,11 @@ set(SIV3D_INTERNAL_SOURCES
../Siv3D/src/Siv3D/NinePatch/NinePatchDetail.cpp
../Siv3D/src/Siv3D/NinePatch/SivNinePatch.cpp
../Siv3D/src/Siv3D/None/SivNone.cpp
../Siv3D/src/Siv3D/OpenAI/SivOpenAI.cpp
../Siv3D/src/Siv3D/OpenAI/OpenAICommon.cpp
../Siv3D/src/Siv3D/OpenAI/SivOpenAIChat.cpp
../Siv3D/src/Siv3D/OpenAI/SivOpenAIEmbedding.cpp
../Siv3D/src/Siv3D/OpenAI/SivOpenAIImage.cpp
../Siv3D/src/Siv3D/OpenAI/SivOpenAISpeech.cpp
../Siv3D/src/Siv3D/OpenCV_Bridge/SivOpenCV_Bridge.cpp
../Siv3D/src/Siv3D/OrientedBox/SivOrientedBox.cpp
../Siv3D/src/Siv3D/OSCMessage/OSCMessageDetail.cpp
Expand Down
8 changes: 8 additions & 0 deletions Siv3D/include/Siv3D.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1856,6 +1856,14 @@
// OpenAI API | OpenAI API
# include <Siv3D/OpenAI.hpp>

# include <Siv3D/OpenAI/Chat.hpp>

# include <Siv3D/OpenAI/Image.hpp>

# include <Siv3D/OpenAI/Embedding.hpp>

# include <Siv3D/OpenAI/Speech.hpp>

//////////////////////////////////////////////////
//
// アドオン | Add-on
Expand Down
241 changes: 20 additions & 221 deletions Siv3D/include/Siv3D/OpenAI.hpp

Large diffs are not rendered by default.

154 changes: 154 additions & 0 deletions Siv3D/include/Siv3D/OpenAI/Chat.hpp
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);
}
}
}
76 changes: 76 additions & 0 deletions Siv3D/include/Siv3D/OpenAI/Embedding.hpp
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);
}
}
}
Loading

0 comments on commit 4d15e4b

Please sign in to comment.