[M1 Mac, Monterey 12.6.3, clang 13.0.0, FLTK 1.3.8, ChatGPT Plus, NO IDE]
ChatGPT APIでは質問と回答をJSON形式データに追加していき、stringとして送信します。ソースコードなどを送受信しても問題がないよう質問と回答内のダブルクォートや改行文字をエスケープするようにしています。
roleをsystemにして”あなたは熟練のプログラマです”などとキャラ付けも可能です。
色々とややこしすぎて疲れました。ここまで出来たら後はのんびり進めていきます。
#include <ChatGPT.h>
using json = nlohmann::json;
extern json jsonData;
int count;
string requestData;
// Utility function to write response data to a string
size_t writeCallback(char* buf, size_t size, size_t nmemb, void* up) {
// Append the response data to the string
((string*)up)->append((char*)buf, size * nmemb);
return size * nmemb;
}
// json chatWithOpenAI(const string& question) {
json chatWithOpenAI(string question) {
// Set up the request parameters
string url = "https://api.openai.com/v1/chat/completions";
const char* apiKey;
apiKey = getenv("CHATGPT_API_KEY");
if (apiKey == NULL) {
// appファイルは環境変数を取得できない
apiKey = "APIキー";
}
cout << "apiKey: " << apiKey << endl;
string authHeader = "Authorization: Bearer " + string(apiKey);
curl_slist* headers = {};
headers = curl_slist_append(headers, authHeader.c_str());
headers = curl_slist_append(headers, "Content-Type: application/json");
size_t pos = 0;
while ((pos = question.find('"', pos)) != string::npos) {
question.replace(pos, 1, "\\\"");
pos += 2;
}
pos = 0;
while ((pos = question.find('\n', pos)) != string::npos) {
question.replace(pos, 1, "\\n");
pos += 2;
}
if (count == 0){
requestData = R"({"model":"gpt-3.5-turbo", "messages":[{"role":"user","content":")" + question + R"("}], "temperature":0.0})";
cout << "requestData: " << requestData << endl;
count++;
} else {
question = R"({"role":"user","content":")" + question + R"("})";
json questionJson = json::parse(question);
jsonData["messages"].push_back(questionJson);
requestData = jsonData.dump();
cout << "2回目以降質問追加 jsonData: " << requestData << endl;
}
string responseData = "";
// Set up a curl session
CURL* curl = curl_easy_init();
if (curl) {
// Set the request options
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestData.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &responseData);
// Send the request
CURLcode res = curl_easy_perform(curl);
if (res != CURLE_OK) {
cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << endl;
}
// Clean up
curl_easy_cleanup(curl);
} else {
cerr << "curl_easy_init() failed" << endl;
}
// Parse the response data and extract the chat response
json responseJson = json::parse(responseData);
return responseJson;
}
回答追加後jsonData: {"messages":[
{"content":"ChatGPTとは","role":"user"},
{"content":"ChatGPTは、人工知能による自然言語処理技術を用いたチャットボットです。
ユーザーがChatGPTに質問や会話をすると、ChatGPTは自然な言葉で返答を行います。
ChatGPTは、様々なトピックに関する知識を持っており、ユーザーが何を求めているかを理解し、
適切な回答を提供することができます。ChatGPTは、オンラインカウンセリングやカスタマーサポート、
教育などの分野で活用されています。","role":"assistant"},
{"content":"どのように模倣するのですか","role":"user"},
{"content":"ChatGPTは、自然言語処理技術を用いて、人間が話す言葉を理解し、
それに適切な返答を生成することができます。ChatGPTは、大量のテキストデータを学習し、
その中からパターンを抽出して、自然な言葉での返答を生成することができます。
ChatGPTは、深層学習アルゴリズムを使用して、自己学習を行い、より正確な返答を生成するように改善されます。
ChatGPTは、人間の言語を模倣するために、自然言語処理技術と機械学習技術を組み合わせて使用しています。","role":"assistant"},
{"content":"どのようなプログラムですか","role":"user"},
{"content":"ChatGPTは、自然言語処理技術を用いたチャットボットのプログラムです。
ChatGPTは、Pythonプログラミング言語を使用して開発されており、深層学習ライブラリであるPyTorchを
使用しています。
ChatGPTは、大量のテキストデータを学習するために、トランスフォーマーと呼ばれる
ニューラルネットワークモデルを使用しています。ChatGPTは、オープンソースであり、
誰でも自由に使用することができます。
ChatGPTは、自然言語処理技術を用いたチャットボットのプログラムとして、オンラインカウンセリングや
カスタマーサポート、教育などの分野で活用されています。","role":"assistant"}],
"model":"gpt-3.5-turbo","temperature":0.0}