[C++] 307 FLTK : ChatGPTアプリの製作 その34 md→json変換

[M1 Mac, Monterey 12.6.3, clang 13.0.0, FLTK 1.3.8, ChatGPT API(gpt-3.5-turbo), NO IDE]

iPadでChatGPTを使う場合は公式Webを使います。そこでのやりとりはWebラッパーでmdファイルとしてダウンロードします。

そのmdファイルを自製ChatGPTアプリでjsonファイルに変換できるよう開発を進めています。

最初はRustで製作されたWebラッパーを改変してjsonとしてダウンロードできるようにしようかとも考えたんですが、Rustで書くとJavaのヌルポ攻勢と同様の例外処理対応に追われるのが目に見えているので、やめておくことにしました。

取りあえずChatGPTに叩き台のコードを書いてもらいました。

ところでGPT-4のwaitlistに登録して2週間が経とうとしていますが、まだAPIで使えません。やはり重課金ユーザー優先ということでしょう。当方かなり使ったつもりでもまだ供与された18ドルに遠く及ばない2.8ドルです。

RWKVなど有望なLLMが話題に上がっていて、いよいよローカルChat Botの実現が見えてきました。今のところRTX3080位ないと厳しいらしく、どうするか考えています。

ただTwitterを見る限りキャッチアップしているのは画像生成AI界隈の方ばかりで、その分野に全く興味がない者としてそろそろ潮時とも思えます。プログラマ系の方々は水面下に潜った感がありますね。そりゃTwitterばかり見てたらコードもろくに書けません。

ChatGPTアプリ製作開始から26日経過し、平常モードに戻るタイミングかもしれません。

Q:
以下のコードをC++で書いて下さい。
mdファイルをjsonファイルに変換する。
1.mdファイル
不等号の行はrole:userのcontent
改行コードが2回続き、次の行はrole:assistantのcontent
2.jsonファイル
keyはmessages, model, temperatureの3つ。
modelのvalueはgpt-3.5-turbo
temperatureのvalueは0.0
jsonの例は以下の通り
{
“messages”: [
{
“content”: “”,
“role”: “system”
},
{
“content”: “FLTKのプログラムがFl_Buttonを自動クリックするコードを書いて下さい”,
“role”: “user”
},
{
“content”: “以下は、FLTKのプログラムでFl_Buttonを自動クリックするコードの例です。\n\nc++\n#include <FL/Fl.H>\n#include <FL/Fl_Window.H>\n#include <FL/Fl_Button.H>\n\nint main(int argc, char **argv) {\n Fl_Window *window = new Fl_Window(200, 200, \"Auto Click\");\n Fl_Button *button = new Fl_Button(50, 50, 100, 50, \"Click Me\");\n\n // 自動クリックする\n button->do_callback();\n\n window->end();\n window->show(argc, argv);\n return Fl::run();\n}\n\n\nこの例では、Fl_Buttonオブジェクトのdo_callback()メソッドを呼び出すことで、ボタンを自動的にクリックしています。このメソッドは、ボタンがクリックされたときに呼び出されるコールバック関数を実行します。”,
“role”: “assistant”
},
{
“content”: “これまでの質問回答の内容から15文字程度で日本語タイトルを考えて下さい。英単語が混ざってもかまいません。”,
“role”: “user”
},
{
“content”: “FLTKで自動クリックする方法”,
“role”: “assistant”
}
],
“model”: “gpt-3.5-turbo”,
“temperature”: 0.0
}

A:
以下がC++でのコード例になります。

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <nlohmann/json.hpp>

using json = nlohmann::json;

int main() {
    // mdファイルを読み込む
    std::ifstream ifs("1.md");
    std::string md((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());

    // mdファイルを改行コードで分割する
    std::vector<std::string> lines;
    std::string line;
    std::istringstream iss(md);
    while (std::getline(iss, line)) {
        lines.push_back(line);
    }

    // jsonオブジェクトを作成する
    json j;
    j["messages"] = json::array();
    j["model"] = "gpt-3.5-turbo";
    j["temperature"] = 0.0;

    // mdファイルの内容をjsonオブジェクトに追加する
    std::string role = "user";
    for (const auto& line : lines) {
        if (line.empty()) {
            role = "assistant";
            continue;
        }
        j["messages"].push_back({
            {"content", line},
            {"role", role}
        });
    }

    // jsonファイルに書き込む
    std::ofstream ofs("2.json");
    ofs << j.dump(4) << std::endl;

    return 0;
}

このコードでは、まずmdファイルを読み込み、改行コードで分割して各行を処理します。次に、jsonオブジェクトを作成し、mdファイルの内容をjsonオブジェクトに追加します。最後に、jsonファイルに書き込みます。