東京都、内製AIプラットフォーム「A1」本格運用開始 職員がノーコードで業務アプリ開発・共有
今に始まったわけではないが、IT系の新しい技術が出てくると、まるで冷やし中華のように「○○始めました」という記事が出てきます。もちろん当人たちは真剣(?)にやっているかと思いますが、ただ流行りを追っかけているだけとうことであれば資源(この場合税金)の無駄遣いになります。
ということで、いち東京都民として、税金の無駄遣いにならないか検証するために、覚書ということでメモします。一年後ぐらいに検証できればと思います。
AIによって、プログラマーが淘汰されようかという今になって「次世代のプログラミング言語とは何を言っているのか?」と返されそうですが、今とあるプロジェクトをやっておりまして(具体的なことは控えます)、AI時代に必要なプログラミング言語についてより意識するようになってきました。
今までのプログラミングとは「人間からコンピューターへの指示」ということでした。ではAI時代になると何が変わるのでしょうか。
現状、AIを使ったプログラミングは次のような形になります。
人間 → [自然言語(プロンプト)] → AI → [プログラム] → コンピュータ
これについてまず考えられるのは、次のような形です。
人間 → [次世代言語] → AI → [プログラム] → コンピュータ
つまり、人間とAIの間に共通言語を持てないか、という発想です。
さらにいうと、
人間 → [次世代言語] → AI → [次世代言語] → コンピュータ
ここまで踏み込めれば、AIが生成した内容も(原理的に)人間が確認可能になります。
つまり、問題が発生したときに「何が意図されていたのか」を追跡できるようになります。
ここで当然、次のような批判が出てきます。
人間 → [次世代言語] → AI
AI → [次世代言語] → コンピュータ
同じ言語を使うのであれば、AIは人間が入力した内容をそのまま返すだけではないか、というものです。
実際に、そういうことは起こり得るでしょう。
ポイントは、人間・AI・コンピュータの間で共通言語を持つこと自体にあります。
自然言語ではなく、このような言語を想定する理由は以下のとおりです。
一方で、従来のプログラミング言語との違いは、
にあると考えています。
このアイデアは一見すると突飛に見えるかもしれませんが、実は全く新しいものではありません。
第5世代コンピュータで目指されていた、論理型言語の思想に近いものです。
論理型言語の代表格であるPrologは、当時日本でも注目されました。
また、このブログでたびたび触れているADPも、Prologをベースとしています。
また、Grokに言わせるとLLMとPrologをつなぐアイデアは既に研究対象となっているようです。AIに聞けば多数出てくるようです。下記面白そうなもの2点をピックアップします。
・Arithmetic Reasoning with LLM: Prolog Generation & Execution
LLMが自然言語の算術問題からPrologの述語・ルールを生成し、Prologインタプリタで実行。CoT(Chain-of-Thought)より精度が大幅に向上した実験。
・LLM and Prolog: the logical alternative to chain-of-thought reasoning (Medium, 2025)
金融領域での実践例。LLMが自然言語からPrologルールを抽出し、シンボリック推論エンジンで処理。非常に読みやすい解説。
そりゃPrologを知っている人なら絶対に考えるよなという話ですね。
Prologのような言語は「宣言的」と呼ばれます。
つまり、
という考え方です。
現在のAIによるコーディングもこれに近く、人間が「何を作るのか」をプロンプトで与え、「どう作るか」はAIが担っています。
この役割分担を前提とすると、
「AIは入力をそのまま返すだけではないか」
という批判にも、ある程度対応できます。
もう少し踏み込んだイメージとしては、
という形です。
ここでいう「述語」は論理型言語の用語で、「関数」に近い概念です。
処理手順ではなく「満たすべき条件」を中心に表現することで、結果の妥当性を人間が確認しやすくなります。
とはいえ、このような構想は「言うは簡単で実現は難しい」ものです。第5世代コンピュータプロジェクト自体が頓挫した経緯もあり、AIを使えば当時の問題は解決できるのか?という問いは依然として残ります。
具体的には、
・人間に読みやすいと言ってもPrologはコンピュータよりの言語である。
・宣言的といっても、それだけですべてが上手くいくわけではない。Prolog自体が流行っていない。
・現実案としては、コメントがAIに対する補足(プロンプト)になるが、そうすると自然言語が残ることになる。
というジレンマがあります。特に「宣言的プログラミング」とは当時一瞬流行ったパラダイムになりますが、純粋さを追求すると却ってコードを分かりにくくする側面があります。またAIの出力は手続き的にもなりえます。このあたりの折り合いをどうつけるのかというのが課題かと思います。
このような「純粋な理論」と「現実の泥臭さ」の板挟みを解決するために、私は一つのアプローチをとっています。例えば、ADPは、Prologをベースにマルチパラダイムを追求しています。つまり純粋な宣言的なパラダイムを捨てて、手続き的にも書けるようにしています。このあたりの落としどころが現実的ではあるかと思います。
もっとも、私自身も30年ほど前にこうしたアイデアの断片を考えたことがあります。
さらにいうと、ADPの機能として次世代言語に必要な要件を備えることができれば、ADPそのものが次世代言語になり得るのではないか、とも思っています。
夢は広がりますが、まずは時間を見つけて少しずつ形にしていきたいところです。
■ The Structure of AI-Assisted Programming Today
Traditionally, programming languages have been a way for humans to instruct computers. So what changes in the AI era?
Today, AI-assisted programming typically looks like this:
Human → [Natural Language (Prompt)] → AI → [Program] → Computer
From here, one natural idea is:
Human → [Next-Generation Language] → AI → [Program] → Computer
In other words, can we introduce a shared language between humans and AI?
Taking this a step further:
Human → [Next-Generation Language] → AI → [Next-Generation Language] → Computer
If this were possible, then—even in principle—humans could verify what the AI produces.
When problems occur, we could trace and understand the original intent behind the system.
At this point, a natural criticism arises:
Human → [Next-Generation Language] → AI
AI → [Next-Generation Language] → Computer
If the same language is used on both sides, wouldn’t AI simply return what the human provided?
In fact, this can certainly happen.
The key point is the value of having a shared language across humans, AI, and computers.
Why not just use natural language?
A next-generation language would instead aim to:
And compared to traditional programming languages, the key difference would be:
This idea may sound radical, but it is not entirely new.
It is closely related to the concepts explored in logic programming languages during the Fifth Generation Computer era.
For example, Prolog—one of the most well-known logic programming languages—was once widely discussed in Japan.
The language I’ve mentioned occasionally in this blog, ADP, is also based on Prolog.
Languages like Prolog are often described as declarative.
That means:
Interestingly, modern AI-assisted coding follows a similar pattern:
humans specify what they want, and AI handles how to implement it.
If we properly recognize this division of roles, we can respond to the earlier criticism that “AI would just return the input as-is.”
A more concrete idea would be:
Here, a “predicate” is a concept from logic programming, somewhat similar to a function.
Instead of describing step-by-step procedures, we describe conditions to be satisfied.
This makes it easier for humans to verify whether the result is correct.
Of course, this kind of idea is much easier said than done.
The Fifth Generation Computer project itself failed, which raises the question:
Can AI solve the challenges that existed back then?
More concretely, several dilemmas remain:
This creates a fundamental tension.
Declarative programming was once a briefly popular paradigm, but pushing it too far can make systems impractical.
At the same time, AI-generated output can also be procedural.
How to balance these aspects remains an open challenge.
That said, I personally had fragments of this idea over 30 years ago.
And if the language I’m developing—ADP—can incorporate the necessary characteristics of such a next-generation language, it might itself become one.
It’s an ambitious thought, but for now, I’ll continue working on it little by little, whenever time allows.
私のAI体験、2026年2月の活動、ということで、我がAIマシン(Core i9-10980XE,メモリ256GB+GeForce GTX1080Ti、GeForce RTX3070)にllama.cppの環境構築を行ったので、そのメモになります。

モデルがQwen3-VL-235B-A22B-Thinking-GGUF:Q5_K_Mで、だいたい、1~2Token/sec、つまり1秒に1文字出力される。何かすると20分ぐらいかかるので、これを高速化できればうれしいという話。





目的の箇所にたどり着けたのでよいが、途中、Bottom-upタブの見方が良く分からないので学習する必要がある。
最も時間がかかっている個所が判明したが、
sumi = _mm256_add_epi32(sumi, _mm256_add_epi32(p16_0, p16_1));
どうも、AVX2のコードのようである。まずは、AVX512で動かすにようにして、最適化をかけるようにする。
パット見た感じなので確定的ではないですが、ボトルネックになっているコードは、モデルの重みデータを戻す処理のようである。このモデルデータは、重みが5ビットのものを使っているので内部で8ビットにしているようです。
llama.cppはAVX512を使うといっているがこのデータを戻すところはAVX2のままのようです。
考えてみれば当たり前といえば当たり前なのですが、なんとなく5ビットに圧縮したら展開するのに時間がかかるのではないかと思っていたら、その通りのようでした。この部分の処理時間は全体の約70%ぐらいを占めており、この部分を最適化することは期待がもてる。
もっとも、RAMを大量に積んで利用するモデルを8ビットとかにすればこの部分の処理をカットすることが出来るのでかなり早くなるかと思うが、メモリはこれ以上は積めないので最適化を頑張ろうかと思う。
- ITに関わる日本人は英語が残念なことが多い -
変数名は「AIにレビューさせろ」Part1で、「日本人の英語力は、ばらつきがあり変数名の命名に英語を使うときは危険度が増します。」と婉曲的に書きましたが、残念ながら少なくともITに関わる日本人の英語力はやはり残念なことが多いです。
これは、私自身の英語力も以前は残念だったといえますし、今は「残念でない」だけで、上手いか?と言われたら「人よりは」と謙遜してしまいます(一応プロなので)。
実は、プログラマになりたい人向けに、「基本情報技術者試験の科目B」をお勧めしたのですが、その問題文に「残念な英語」が混ざっており発見してしまいました。
令和5年度、基本情報技術者試験 科目Bの問1の
論理型: divideFlag
になります。この変数は回答に関わっており、あまりいい加減にしてほしくないのですが、何が問題かというと命名はこの際置いておいて、値(true/false)の持たせ方にあります。
if (divideFlag が true と等しい)
pnListの末尾 に iの値 を追加する
endif
とありますが、divideFlagを素直に読むと「割算フラグ」ということで、値がtrueの時はどういう意味かが曖昧になります。
コード上では「true = 割り切れていない」という意味ですが、多くの人は「true = 割り切れた」と受け取ってしまうでしょう。つまり誤解を与える使い方になっています。
ということでAIに掛けてみました。各AIの実行結果は以下のとおりですが、全AIが『意味があいまいになる。「割り切れた=trueと解釈しがち」』としています。
ChatGPTの結果
Geminiの結果
Copilotの結果
Grokの結果
ちなみに、ChatGPT,Gemini,Copilotは、「命名が良くない」とも指摘しています。
ChatGPTは下記のとおり1回鍛えたのでより突っ込んだ内容となっていますが、いずれにしても、divideFlagはダメということになります。
私自身は、『i ÷ j の余り が 0 と等しい』の条件の部分を無意識に『i ÷ j の余り が 0 と等しくない』が正解と考えてしまい、「答えが無いやん!」と一瞬混乱しました。
もっとも、恐らくほとんどの方が、「私がおかしい」と指摘するでしょう。この部分ですが、「割り切れたら後の追加は不要(false)」という意味(candidateFlagやisPrimeなど)であればまったく問題なく、アルゴリズムを適切に判断すると、 『i ÷ j の余り が 0 と等しくない』という認識がおかしいということになります。ということで『私がいちゃもんをつけている』と感じる人もいるでしょう。要は各人が持っている英語力ということになるのですが、今は、AIで試すことにより、一部のエンジニアのいちゃもんなのか、正しい指摘なのかを確認できる時代になりました。
普通のブログ記事なら「IPAさんやってしまいましたね!」と言って終わりでしょうが、いくら何でも「試験問題」ということでそれなりに注意して作成はしているでしょう。実際に多くのITエンジニアは私のような混乱は起こさないかと思います。つまりこのあたりが我々ITエンジニアの英語力の限界と考えた方がよいです。つまり、「AIにレビューさせろ」Part1の正しさをIPAさんが身をもって証明していたとも言えます。
ということで私は、日本語でプログラムを組めるようにしたいと改めて思いましたので、ADPは日本語で名称を記述できるようにしたいです。
「変数名を日本語で・・・」を読んだ硬派なITエンジニアは「変数名は英語だ!」と主張するかもしれません。そんなあなたにはTOEICや英検の受験をお勧めします。おそらく適切な英語名の命名に必要な英語力は、TOEICで730点、英検準1級以上かと思います。100歩譲って、TOEICの平均点560(英検2級程度)であれば、なんとか命名が出来るかもしれません(私の主観では足りないかと思いますが)。もし受験していない人は受験することをお勧めします。おそらくショックな点数(例えば300点)とかになるかもしれませんが、普通のITエンジニアの英語力はそんなものです。
この問題は令和5年(3年前)になりますが、今ならコード全体をChatGPTに掛けられます。下記のとおり、divideFlagについてダメ出ししてもらえるので、今後は試験問題をAIに掛けたいです。ただしローカルAIでレビューしないと思わぬところで問題が漏洩する可能性があります。
ちなみに、コードにある i,jのような1文字変数は『ダメ』という記事も見かけますが、「AIにレビューさせろ」Part0(初心者の方へ)で指摘しているとおり現実としてよく使います。また、ChatGPTはダメ出ししていません。つまり、1文字変数は普通に使うと考えた方がよいでしょう。
さらに、divideFlagのように混乱を助長するような命名を行うのであれば、むしろ f のような1文字の名称の方がましだと思いますが、それはまた別の話ということで