ChatGPTに負けないために大切なこと

ChatGPT、人気ですよね。
そして、こんなに賢いAIが現れたら人間の仕事はなくなるような気がしてしまいます。
そこで、ChatGPTに負けないためにどうしたらいいか考えてみます。
※ChatGPTに負けない必要があるのか、というのはまた別の話。

原理、原則を知る

ChatGPTは膨大な知識をもっています。これを人間が対抗するのは無理です。そこで、論理などの原理、原則を知ることで知識量を補っていきます。
たとえば「カラスは暗いところで見づらい」「タイヤは暗いところで見づらい」「黒いコートは・・・」のように暗いところで見づらいものについて多くの情報を覚えておくのではなくて、「黒いものは暗いところで見づらい」という原則をしっていれば「カラスは黒い、ということは暗いところで見づらい」「タイヤは黒い、ということは・・・」「黒いコートは・・・」のように類推することができるようになります。
さらにこれを「AはBであり、BはCならばAはCである」というように意味を抜いて考えるようにできると、さまざまなものに応用できます。

論理や原理というものは、いろいろな物事に見出せる共通原則を抜き出したものなので、知っておくと多くの知識をもっているのと同じような状況をつくれます。
たとえばいま多くのプログラミング言語がありますが、「プログラミング言語とは何か」のような共通原則を知っておくと、文法などを全部勉強しなくても「こういう方針の言語だからこういう機能があるはず」「これはこういう機能だからこうやって使うはず」のように予測しながら使うことができます。

そうやって、原理や原則をしって知識を補うことで、ChatGPTに負けないようにできるかもしれません。

最新情報を知る

ChatGPTには膨大な情報がありますが、実は最新情報に弱いです。
「たしかにChatGPTは2021年9月までの情報しかもってないかもしれないけど、今後はリアルタイムにニュースを取り込んでいくのでは?」
となるかもしれません。
けれども、そもそもChatGPTが情報のよりどころにしているインターネットに最新情報が少ないのです。
たしかに「新しく何々ができた」「こういう事件が起きた」という情報はたくさん流れてきます。けれど、ではその新しくできた何々はその後どうなったか、起きた事件は結局どうなったのかという情報がネットに流れることはどんどん減っていきます。

ChatGPTは基本的にはネットの情報の多数決のような形で文章をつくっていきます。そうすると、多数の古い情報が優先されて新しい情報が埋もれるということが起きがちです。そもそも新しいことは誰もネットに書いていなかったりもします。 たとえば、ネットを見ると「Javaをインストールするときは環境変数PATHを設定する必要がある」という情報がよくみつかりますが、2020年9月リリースのJava 15からOracle JDKインストーラもPATHを設定するようになっています。けれどもPATHの設定が不要になったという情報はなかなか流れませんね。わざわざブログなどにも書かないと思います。なんなら2022年公開のYouTube動画でもPATHの設定が必要と解説していますね。

このように、ネットでは最新情報は埋もれがちだったり、そもそもネットに文書化されてなかったりで、そこを拠り所として学習するChatGPTは最新情報に弱いということになります。
そこで、自分の強みにする分野では最新の情報をちゃんとチェックしていくことでChatGPTに負けないようにできるかもしれません。

専門情報を得ておく

ChatGPTは幅広い情報をもっていて、いろいろな専門分野にも詳しいです。けれどもよく見ると「よくある解説」の範囲を出ていなかったりします。また、局所的な情報に弱く、さしさわりのない説明しか出ないことも多いです。
たとえば鈴鹿サーキットの特徴を尋ねると次のようになります。

長いストレートとテクニカルなコーナーが特徴といいますが、富士のほうがストレートは長いし、サーキットならテクニカルなコーナーはだいたいあります。スピードとドライビングテクニックはどんなサーキットでも求められるし、グランドスタンドからの観戦が良いのも当然ですね。

そんな感じで、ちょっと詳細になると途端に苦手になるのがChatGPTです。つまり、みんながよくブログに書きそうなことはよく知っているけどあまりブログに書かれてないことは知らないという感じになっています。 ということで、自分の専門分野に関してはちゃんと知っておく、そして、なにかそういった専門分野をもっておくというのがChatGPTに負けないために大事かもしれません。

まとめ

結局のところこれは、Google検索がでてきてネットに情報がなんでも載るようになったときに言われてきたことと変わらないです。
ネットの特徴がChatGPTの特徴でもあるからです。
ということで、原理・原則をつかんでおいて最新情報を更新するという、いままでも大切だったことがこれからも大切ということになると思います。

ギターのスケールを確認できるツールを作ってみた

ギターの練習をするときに、スケールとかコードのポジションを確認するのがめんどくさく、あと指板全域にわたってポジションを知りたくてもなかなか求めるものがなかったりしたので、作ってみました。
https://kishida.github.io/guitarscale/

この怪しいギター画像もStable Diffusionが生成してます。

キーやスケールを選ぶとポジションが表示されます。

コードも表示できます。

Advancedにチェックを入れると、スケールやコードの種類が増えます。ブルーススケールではブルーノートを青く表示します。

Noteのチェックを入れると度数で表示します。

7弦や8弦、あとDrop DとDADGADに対応しています。

今回はTypeScriptで書いてますが、やっぱ型があるのは いいですね。

GPTでテキストからJavaコードを生成する

昨日のエントリでは歌詞と画像を生成したのだけど、歌詞を生成する部分のプロンプトを変えて、エンジンにCodexを使うとコードを生成できます。

GPTを呼び出す部分はこんな感じ

String prompt = "//Java\n" +
        text.getText().trim().lines()
                .map("// %s%n"::formatted)
                .collect(Collectors.joining());
CompletionRequest completionRequest = CompletionRequest.builder()
        .model("code-davinci-002") // or code-cushman-001
        .prompt(prompt)
        .echo(false)
        .temperature(0.3)
        .user("testing")
        .maxTokens(500)
        .build();

プロンプトは// Javaで始まるコメントになるようにしています。そしてモデルにcode-davinci-002を使っています。

あと、生成に時間がかかってデフォルトのままではタイムアウトするので、タイムアウト無制限にしています。

OpenAiService service = new OpenAiService(TOKEN, Duration.ZERO);

これだけでコードを生成してくれるようになりますが、コードを生成してくれるプロンプトを作るのが難しいです。英語でプロンプトを書いてますが、日本語にすると画面のつくりかたを日本語で説明する感じになったりします。

単純なアルゴリズムの指定であれば、比較的楽

生成コードはHTMLエンコードされていたりするので、対応が必要です。あと、最後に</code>がついてそれ以降に説明がついてくるので切り捨てる必要もあると思います。

コードの全体はこんな感じ

package naoki.openai;

import com.theokanning.openai.OpenAiService;
import com.theokanning.openai.completion.CompletionRequest;
import com.theokanning.openai.completion.CompletionResult;
import java.awt.BorderLayout;
import java.time.Duration;
import java.util.stream.Collectors;
import javax.swing.*;

public class GenerateCode {
    public static void main(String[] args) {

        var f = new JFrame("コード生成");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        var p = new JPanel();
        var text = new JTextArea(4, 60);
        p.add(new JScrollPane(text));
        var button = new JButton("生成");
        p.add(button);
        f.add(p, BorderLayout.NORTH);
        var output = new JTextArea();
        f.add(new JScrollPane(output));
        f.setSize(800, 600);
        f.setVisible(true);
        
        OpenAiService service = new OpenAiService("your token", Duration.ZERO);

        button.addActionListener(al -> {
            String prompt = "//Java\n" +
                    text.getText().trim().lines()
                            .map("// %s%n"::formatted)
                            .collect(Collectors.joining());
            CompletionRequest completionRequest = CompletionRequest.builder()
                    .model("code-davinci-002") // or code-cushman-001
                    .prompt(prompt)
                    .echo(false)
                    .temperature(0.3)
                    .user("testing")
                    .maxTokens(500)
                    .build();

            CompletionResult result = service.createCompletion(completionRequest);
            var code = result.getChoices().get(0).getText()
                    .replace("&gt;", ">").replace("&lt;", "<");
            output.setText(code);
        });
    }
}

OpenAIのGPTとDALL·Eでテーマから歌詞と画像を生成する

やっぱ自分でもさわってみんとあかんということで、OpenAIを使ったプログラムを書いてみました。
とりあえず、テキストと画像を生成します。

JavaAPI使ってみます。中身はRetrofit。
https://github.com/TheoKanning/openai-java

MavenやGradleでこんな感じの依存を設定します。

<dependency>
    <groupId>com.theokanning.openai-gpt3-java</groupId>
    <artifactId>client</artifactId>
    <version>0.9.0</version>
</dependency>

まずはOpenAiServiceのオブジェクトをとってきます。OpenAIのサイトでアカウントを作ってトークンつくってください。
https://openai.com/api/

OpenAiService service = new OpenAiService(TOKEN);

Free Trialで$18分つかえるようになっています。これ作るのに試すだけで$0.25=30円使っているので、本格的なアプリを作ろうと思うと結構かかりそうな気配

ChatGPTのようなことをしたければ、createCompletionを使います。

CompletionRequest completionRequest = CompletionRequest.builder()
        .model("text-babbage-001")
        .prompt("次のテーマで歌詞を作って。\n" + prompt)
        .temperature(0.9)
        .echo(false)
        .user("testing")
        .maxTokens(500)
        .build();
CompletionResult result = service.createCompletion(completionRequest);

モデルにはtext-babbage-001のほかtext-ada-001text-curie-001text-davinci-003が指定できます。abc順にどんどん賢く、高くなっていきます。adaが一番安く、davinciが一番賢くて高い。開発時にはadaを使って本番ではdavinciやcurieを使うみたいな使い分けが必要そうです。
プロンプトには、生成する事柄の例を指定します。ここでは「次のテーマで歌詞を作って。」としてますが、もっと丁寧に設定すれば生成結果もまともになる気がします。

画像生成はcreateImageで。

CreateImageRequest req = CreateImageRequest.builder()
        .prompt(prompt)
        .n(1)
        .responseFormat("b64_json") // or b64_json, url
        .size("512x512")
        .build();
ImageResult imageResult = service.createImage(req);

サイズは512x512の他に256x2561024x1024が選べます。フォーマットとしてurlを選べば、画像のURLが送られてくるので、Webアプリではそっちでいいかもしれません。

動作はこんな感じ。実際はレスポンスに8秒くらい待ちます。

ソースコード全体はこんな感じ。

package naoki.openai;

import com.theokanning.openai.OpenAiService;
import com.theokanning.openai.completion.CompletionRequest;
import com.theokanning.openai.completion.CompletionResult;
import com.theokanning.openai.image.CreateImageRequest;
import com.theokanning.openai.image.ImageResult;
import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.util.Base64;
import javax.swing.*;

public class Mavenproject1openai {
    static final String TOKEN = "your openai token";
    public static void main(String[] args) {
        Image def = new BufferedImage(512, 512, BufferedImage.TYPE_INT_RGB);
        var f = new JFrame("歌詞と画像を生成");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        var label = new JLabel(new ImageIcon(def));
        f.add(BorderLayout.EAST,label);
        var resultText = new JTextArea();
        f.add(resultText);
        var top = new JPanel();
        var promptText = new JTextField(50);
        top.add(promptText);
        var button = new JButton("生成");
        top.add(button);
        f.add(BorderLayout.NORTH, top);
        f.setSize(1000, 600);
        f.setVisible(true);
        
        OpenAiService service = new OpenAiService(TOKEN);

        button.addActionListener(al -> {
            System.out.println("\nCreating completion...");
            String prompt = promptText.getText();
            
            CompletionRequest completionRequest = CompletionRequest.builder()
                    .model("text-babbage-001")
                    .prompt("次のテーマで歌詞を作って。\n" + prompt)
                    .temperature(0.9)
                    .echo(false)
                    .user("testing")
                    .maxTokens(500)
                    .build();
            CompletionResult result = service.createCompletion(completionRequest);
            resultText.setText(result.getChoices().get(0).getText());

            CreateImageRequest req = CreateImageRequest.builder()
                    .prompt(prompt)
                    .n(1)
                    .responseFormat("b64_json") // or b64_json, url
                    .size("512x512")
                    .build();
            ImageResult imageResult = service.createImage(req);
            byte[] data = Base64.getDecoder().decode(imageResult.getData().get(0).getB64Json());     
            label.setIcon(new ImageIcon(data));
        });
        
    }
}

SourceBuddyでJavaクラスを動的生成する

Javaバイトコードを操作するツールとしてはASMやJavassistがありますが、SourceBuddyはコンパイルバイトコード生成を行うツールです。
バイトコード操作を行いたい場合、既存バイトコードの変更を行う必要はなくて、実行時に新規クラスを生成できれば十分ということが多いように思います。SourceBuddyはそういう場合に使いやすいツールです。
ということで、Hello worldレベルで少し試してみました。
https://github.com/sourcebuddy/sourcebuddy

といっても、ソースコードを用意してコンパイルするだけなので、使い方はそんなに難しくありません。

まずはMavenなりGradleなりで依存を追加します。READMEには<version>2.2.0-SNAPSHOTを指定していますが、みつからなかったので2.1.0にしています。

<dependency>
    <groupId>com.javax0.sourcebuddy</groupId>
    <artifactId>SourceBuddy</artifactId>
    <version>2.1.0</version>
</dependency>

まず、これは普通のコードとして基になるインタフェースを用意します。

public interface Printer {
    void print();
}

そしてそのインタフェースをimplementsするクラスのソースコードを文字列で用意します。今回はこのコードをSourceBuddyでコンパイル、利用します。

var source = """
             package example;
             public class MyPrinter implements Main.Printer {
                @Override
                public void print() {
                    System.out.println("Hello!");
                }
             }
             """;

そしてコンパイルします。といっても、com.javax0.sourcebuddy.Compilerのstaticメソッドcompileソースコード文字列を与えるだけですね。

Class<?> clazz = Compiler.compile(source);

あとは通常のリフレクションのコードとして、コンストラクタを取得、インスタンス生成を行います。

Printer pt = (Printer) clazz.getConstructor().newInstance();

そうしてメソッドを呼び出すと、コンパイルしたコードが実行されることがわかります。

 pt.print();

ソースコード全体はこんな感じです。

package example;

import com.javax0.sourcebuddy.Compiler;
import java.lang.reflect.InvocationTargetException;

public class Main {

    public interface Printer {
        void print();
    }
    
    public static void main(String[] args) throws 
            ClassNotFoundException, // compileに必要
            Compiler.CompileException,
            NoSuchMethodException,  // getConstructorに必要
            InstantiationException, // newInstanceに必要
            IllegalAccessException, 
            IllegalArgumentException, 
            InvocationTargetException { 
        var start = System.currentTimeMillis();
        var source = """
                     package example;
                     public class MyPrinter implements Main.Printer {
                        @Override
                        public void print() {
                            System.out.println("Hello!");
                        }
                     }
                     """;
        Class<?> clazz = Compiler.compile(source);
        System.out.println(System.currentTimeMillis() - start);
        Printer pt = (Printer) clazz.getConstructor().newInstance();
        pt.print();
    }
}

SourceBuddy自体は検査例外は多く定義されてませんが、リフレクションで多くの検査例外の扱いが必要になります。 あと、compile()で結構時間がかかるので処理時間をとっています。手元の環境で450msかかっています。単発処理なのでなんどか実行すると初期化やJITの分で速くなる可能性はありますが、それでも450msというのは結構な時間がかかっています。

まあ、ソースコード生成はAPIの呼び出し方よりも生成するソースコードとか実行タイミングとかが難しいので、いろいろと試すのがいいんだと思います。

ChatGPTでわかる人間の思考、「意識」の実装方法

ChatGPTは完全ではないとはいえ人の脳みそのふるまいに似た動きをしているようにみえます。
そこで、覚えてるはずのことが思い出せなかったり、話しだすと思いがけない言葉がどんどんでてきたり、夢を思い出すことができなかったり、考えるときに言葉が必要だったりするような、人間の思考のふるまいをChatGPTの仕組みや動きから考えてみます。そしてついでに、「意識」や「クオリア」をChatGPTを使って実装するアイデアをまとめてみます。つまり汎用AI、強いAIです。

※ 断定的に書いていても、これは きしだがそう考えているというだけであって、ほどんどの場合は客観的な証拠や根拠はありません。ChatGPTの仕組みについても、おそらくそうであるという程度で、実際にそうであるとは限りません。「そう考えるとツジヅマがあう」という程度だと思ってください。
※ ChatGPTと書いてますが、多くの場合でその中心となるGPTのことを表していたりします。

思考には2段階ある

このブログエントリで、ChatGPTは人間の直感と同じような間違いをするということを書きました。

「思考には2段階ある」というのは、↑のブログエントリでも紹介したカーネマンとシステム1(速い思考)とシステム2(遅い思考)のことなので、ChatGPTによってわかったわけではないのだけど、システム1がChatGPTのようなふるまいになっていると考えることができます。

話すことで続きの言葉が出てくる

ChatGPTは「対話AI」と呼ばれています。こちらが何か言葉を投げると、返答が返ってくるAIという表現です。
けれども、ChatGPTの仕組みとして使われているGPTは、言葉を投げると返答が返るという仕組みではありません。GPTは「文章の続きにくる可能性の高い単語を出力する仕組み」です。 ChatGPTはそういうGPTの仕組みを使って、こちら側の入力の続きに来る可能性が高い単語を選びだして出力、そしてその出力まで含めた文章の続きに来る可能性が高い単語を選びだして出力という処理を繰り返して返答を生成することで「対話」を実現しています。

ChatGPTを使うと、単語ごとに出力される様子がわかります。「Transformer」のような英単語がまとめて出てくることから、単語ごとに出力されることがわかりますね。

ここでChatGPTは、そこまでの会話全体をGPTに入力しているはずです。そして、会話の続きになるような単語を選び出すことで、対話を実現しています。

人間も、言葉を話したり書いたりするときに、文章をまとめて思い浮かべるのではなくて、言葉を発することで続きが思い浮かんできます。
このブログも、書き始めたときには3つか4つのパターンをあげてみようと思ってただけで、完成形が思い浮かんでいたわけではありません。書くことによってどんどんと書くべきことが思い浮かんできます。
そして後半をだいぶ書き終えたあとにこの部分を書いていますが、想定以上に長く、そして書き始めたときには思ってもなかったことを書いています。
「考えたことは言葉にしておくべき」と思っているのだけど、それは言葉にすることで考えが発展することを何度も経験しているからです。

知識を引き出すにはキッカケが必要

ChatGPTは膨大な情報を記憶しています。けれども、どういう情報を持っているかの一覧を出すことはできません。単語の結びつきの強さのようなネットワークを保持しているだけなので、ChatGPTが保存されているディスクを解析してもどんな情報を保持しているかはわからないと思います。
ChatGPTから情報を引き出すには、言葉を投入する必要があります。そうすると、言葉の続きとしてもっともらしい情報がでてきます。

人間の記憶も多くの情報が保存されていますが、一覧を出すことはできません。引き出すにはキッカケが必要です。そして、そのキッカケになることが多いのが言葉です。
たとえば都道府県を全部挙げろといわれても何県かは出てこなかったりします。そしてたとえば大分県を自力で思い出せないという人でも、大分県を初めて聞いたということはなくて、温泉という関連情報は浮かんできたりします。つまり、情報自体は持っているということです。
ここで逆に、温泉というヒントがあれば大分県を思い出せたりします。山手線の駅を全部挙げるというような場合に、ランダムに出していくより、新宿のような思い出しやすい駅から、次は代々木、次は原宿、のようにして思い出していくと楽です。この場合のキッカケは、駅同士のつながり、より詳しくは電車に乗るときに駅で体験した次駅情報であったりします。

このように、ChatGPTも人間も、情報を引き出すにはなんらかのきっかけが必要になっています。

夢を思い出せないのはキッカケがないから

夢はすぐに忘れてしまいますね。
でも、これは覚えていないわけではありません。夢は脈絡がなく現実のなにかとも結びついていないので、思い出す手がかりがないだけだと思います。

一度の経験でも記憶に影響を与えている

何かを覚えようと思うと、一度では覚えれませんね。電話番号を覚える場合、何度か繰り返して読んだり書いたりすることで覚えます。
でもじゃあ、「覚えてない」という1回目は記憶に残ってないんでしょうか?記憶に残ってないとしたら、2回目が1回目と違うのは何かということになります。なので、1回目にもなんなりかの情報が残っているはずです。単に、いろいろな結びつきがよわく思い出すためのキッカケになるものがないというものだと思います。

ChatGPTの基礎になっているのはニューラルネットワークという仕組みですが、ニューラルネットワークに情報を学習させるときも、情報を何度も投入していきます。
情報を投入すると、ニューラルネットワークのつながりの強さが少しずつ変わっていきます。これを何万回と繰り返す必要があるので、ニューラルネットワークの学習には協力なコンピュータが必要になります。

人間の場合に少し違うのは、意識することでつながりを強くさせることができることです。印象的な出来事は1回で覚えてしまいます。ニューラルネットワークでは「意識する」ということができないので、じわじわとした記憶を何万回繰り返していく必要があるわけですね。

逆に、何かを覚えようと思ったら、ネットワークのつながりを強くする仕組みを考えればいいということになります。そのひとつが、漠然と覚えるのではなくて何かと結びつけながら意識しながら覚えるというようなことです。 あと、それほど大事ではないことであれば、思い出せなくていいからとりあえず見ておいてなんらかの影響を残しておくという手もあります。ぼくは毎日100件以上のニュースを見てますが、その多くはだらっとスクロールさせて単に目に入れておくだけという感じになっています。

考えるために言葉が必要

記憶は多くの場合に言葉と結びついています。また考えるルールは言葉をベースにしていたり、ルールを呼び起こすために言葉が必要だったりすることも多いと思います。
そうすると、ChatGPT的に蓄えられている記憶から情報を呼び起こしたりルールをひっぱりだしたり適用したりするのに、言葉が必要になります。そのため、考えるというときには脳内で言葉を生成していくということになるのだと思います。
ちなみに、言葉を発せず脳内で言葉を生成していくだけでも記憶に影響があるようです。海外にいくと英語を使ってない割に英語がうまくなっていたという経験をした人も多いと思うのですが、それは「ここでなにかするときにはこのように英語でしゃべる」というようなシミュレーションの回数が多くなって英語を話したのと似たような効果が生まれるからという話がありますね。
あと、悪い出来事を繰り返し考えていると、それが強い記憶として残ってしまってトラウマになってしまうこともあるとか。上で書いたように、書きだしておくと次の思考に移れるので、悪い出来事をどこかに書き出しておくといいかもしれない。

ChatGPTの延長では人と同じように考えることは難しい

ChatGPTは、ありえそうな言葉をつないで文章を紡ぐ仕組みです。このとき、「ありえそう」という確率をより妥当なものになるようにデータを増やしたりニューラルネットワークを大きくしても、それっぽさがあがるだけで矛盾などがなくせるわけではありません。
入力文字列、つまりそこまでの会話履歴だけではなく、実世界の常識や物理ルール論理ルールなど、ほかの情報も加えてそれっぽさをあげて行く必要があります。 このような仕組みはGPTと別の系列として用意する必要があるので、単純にChatGPTの精度をあげていくという方向では人と同じように考えることはできないはずです。
また、この仕組みは、カーネマンのいう「熟考し、ゆっくりと実行する」というシステム2(遅い思考)になります。そしてこれが「意識」になるはずです。

意識ってなんだろう?どう実装しよう?

記憶がGPT上にあるとすると、「意識」もChatGPTを呼び出しているはずです。
意識もChatGPT的な仕組みを利用しているとしたら、利用できそうな仕組みとして次のようなものが考えられます。
まずランダムな入力をたくさん作りだして、そしてChatGPTに投入してかえってきた結果を付け加えて、ふたたびChatGPTに投入し、帰ってきた結果を付け加えていくというのを繰り返します。ChatGPTは複数の結果を返してくるのですが、帰ってきた結果についてすべての組み合わせを追加していきます。もちろん組み合わせ爆発がおきますが、ここでは気にしません。また、ChatGPTの結果だけではなくランダムな情報もある程度付け加えます。ChatGPTでは複数の結果それぞれにもっともらしさをあらわす確率がついてくるので、ありえそうなものを残していきます。強く考えるときには多数の選択を残して、ぼーっとしてるときは少数の選択を残すという感じで思考の強さをコントロールします。あと、ChatGPTと書いてますが実際に使うのはGPT部分になります。

そのときに、一番ありえそうなものを選びだす仕組み、もしくは、ありえそうとして選びだされた入力のことを意識と呼んでいるのかもしれません。これが「クオリア」である可能性もあります。結果として生み出された入力列が「思考」になるわけですね。また、気分によってそのもっともらしさの確率を少し操作できれば、それが自由意志ということにもなりそうです。

ChatGPTの仕組みや入力列の生成にランダムが使われるので、ラプラスの悪魔にも思考を予測することはできません。
そういった仕組みを用意すれば、ChatGPT的な仕組みが生成した結果の全体的な妥当性も判定できるような気がします。
ただし、ランダムな入力をたくさん作りだして結果を生成するということを、いまのコンピュータと同様の仕組みでひとつずつやっていると、人間3秒分の思考に3億年かかるとか、遅すぎて生命活動に使えません。そこで、量子的な仕組みを利用して、ランダムなたくさんの入力が重ね合わさった量子情報として扱えるようにすると、生活できる程度の実用的な時間で「考える」ことができるようになりそうです。

ここで、思考の過程は重ね合わされた情報の確率として保持されるので、複数の可能性を保ったまま思考がすすみます。実際に言葉を発するなどの物理行動に移す時に収束して、ひとつの思考が確定します。そうするとYesかNoか確定してなかったのに言葉を発した瞬間に確定するというようなふるまいが実現できます。
ということで、人間の知能をシミュレートするには、量子効果を利用した仕組みが必要なのではと思うのでした。

脳が量子効果を使っているという話をするならペンローズ先生

オススメマンガ2023、異世界じゃないやつ

オススメマンガない?って言われたのでまとめ
年末にまとめたもの異世界多めだったので、異世界じゃないやつ。ほのぼの順。語彙力すくなめ。下に行くほど殺伐としています。というか一番したが最大限殺伐としている。

お兄ちゃんはおしまい

お兄ちゃんがおしまいになってしまった話

カノジョも彼女

勢い系ラブコメ
勢いで二股をやっていくやつ。

僕の心のヤバいやつ

僕ヤバ!僕ヤバ!

2.5次元の誘惑

スポ根コスプレマンガ

瓜を破る

表紙どおり、瓜を破ることについて悩んでいく話

ヒマチの嬢王

田舎のキャバクラを盛り上げていくやつ

トリリオンゲーム

「1兆ドルゲーム」という名前のとおり、大金を稼いでいく話です。

終の退魔師

超常現象を解決していく系。
絵がめちゃうまいです。

VS EVILの続編なので、こちらから読んでもいいです。読まなくてもそこまで問題ないです。

鬼ゴロシ

人がいっぱい死ぬマンガ