[Mac M2 Pro 12CPU, Sonoma 14.3.1, clang++ 15.0.0]
対応LLM:gpt-4, gpt-4-vision, claude-3
claude-3でも画像のエンコードデータを送れるようにしました。JSONの形式がgpt-4と異なるため、かなり手を入れました。
画像のあるなしに関係なくclaude-3の方がレスポンスに時間が掛かります。
if (model.find("gpt") != string::npos){
// gpt-4
requestData = "{\"model\":\"" + model + "\", \"messages\":[{\"role\":\"system\",\"content\":\"" + systemStr + "\"},{\"role\":\"user\",\"content\":\"" + question + "\"}], \"temperature\":0.0}";
} else {
if (urls == ""){
// claude-3 画像なし
requestData = "{\"model\":\"" + model + "\", \"messages\":[{\"role\":\"user\",\"content\":\"" + systemStr + question + "\"}], \"temperature\":0.0, \"max_tokens\":4096}";
} else {
// claude-3 画像あり
string requestData_1 = "{\"model\":\"" + model + "\", \"messages\":[{\"role\":\"user\",\"content\":[{\"type\":\"text\",\"text\":\"" + systemStr + question + "\"},";
vector<string> urlList = splitString(urls, '\n');
cout << "urlListの要素数: " << to_string(urlList.size()) << endl;
std::stringstream imageStream;
for (size_t i = 0; i < urlList.size(); ++i) {
// ローカル画像はBase64形式にエンコードする
if (urlList[i].find("https:") != string::npos){
cout << "claude3への画像URL送信には未対応" << endl;
return "";
} else {
string base64_image = file_to_base64(urlList[i]);
string file_extension = get_file_extension(urlList[i]);
string url = "\"media_type\":\"image/" + file_extension + "\",\"type\":\"base64\", \"data\": \"" + base64_image + "\"";
imageStream << "{\"type\": \"image\", \"source\": {" << url << "}}";
}
if (i < urlList.size() - 1) {
imageStream << ",";
}
}
std::string requestData_2 = imageStream.str() + "]}], \"max_tokens\": 4096,\"temperature\": 0.0}";
cout << "requestData_2: \n" << requestData_2.c_str() << endl;
requestData = requestData_1 + requestData_2;
}
}
※ file_to_base64関数他については前回の記事参照