Previous Page | Next Page

東京都がAIを使って、業務アプリを開発・共有するらしい

 東京都、内製AIプラットフォーム「A1」本格運用開始 職員がノーコードで業務アプリ開発・共有


 今に始まったわけではないが、IT系の新しい技術が出てくると、まるで冷やし中華のように「○○始めました」という記事が出てきます。もちろん当人たちは真剣(?)にやっているかと思いますが、ただ流行りを追っかけているだけとうことであれば資源(この場合税金)の無駄遣いになります。


 ということで、いち東京都民として、税金の無駄遣いにならないか検証するために、覚書ということでメモします。一年後ぐらいに検証できればと思います。

2026-04-15 | コメント:0件

次世代のプログラミング言語とは?

AIによって、プログラマーが淘汰されようかという今になって「次世代のプログラミング言語とは何を言っているのか?」と返されそうですが、今とあるプロジェクトをやっておりまして(具体的なことは控えます)、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は入力をそのまま返すだけではないか」


という批判にも、ある程度対応できます。


もう少し踏み込んだイメージとしては、


  • 人間は「満たすべき条件」(述語)を定義する
  • AIはその実装(述語の本体)を生成する

という形です。


ここでいう「述語」は論理型言語の用語で、「関数」に近い概念です。


処理手順ではなく「満たすべき条件」を中心に表現することで、結果の妥当性を人間が確認しやすくなります。




■ 現実的な課題


とはいえ、このような構想は「言うは簡単で実現は難しい」ものです。第5世代コンピュータプロジェクト自体が頓挫した経緯もあり、AIを使えば当時の問題は解決できるのか?という問いは依然として残ります。

具体的には、


・人間に読みやすいと言ってもPrologはコンピュータよりの言語である。
・宣言的といっても、それだけですべてが上手くいくわけではない。Prolog自体が流行っていない。
・現実案としては、コメントがAIに対する補足(プロンプト)になるが、そうすると自然言語が残ることになる。


というジレンマがあります。特に「宣言的プログラミング」とは当時一瞬流行ったパラダイムになりますが、純粋さを追求すると却ってコードを分かりにくくする側面があります。またAIの出力は手続き的にもなりえます。このあたりの折り合いをどうつけるのかというのが課題かと思います。

このような「純粋な理論」と「現実の泥臭さ」の板挟みを解決するために、私は一つのアプローチをとっています。例えば、ADPは、Prologをベースにマルチパラダイムを追求しています。つまり純粋な宣言的なパラダイムを捨てて、手続き的にも書けるようにしています。このあたりの落としどころが現実的ではあるかと思います。




■ 最後に


もっとも、私自身も30年ほど前にこうしたアイデアの断片を考えたことがあります。


さらにいうと、ADPの機能として次世代言語に必要な要件を備えることができれば、ADPそのものが次世代言語になり得るのではないか、とも思っています。


夢は広がりますが、まずは時間を見つけて少しずつ形にしていきたいところです。


2026-04-06 | コメント:0件

What Is a Next-Generation Programming Language?

■ 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



■ The Idea of a Next-Generation Language


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.




■ Expected Criticism


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.




■ So What’s the Benefit?


The key point is the value of having a shared language across humans, AI, and computers.


Why not just use natural language?


  • It introduces inconsistency and ambiguity
  • It is not directly executable by machines

A next-generation language would instead aim to:


  • Eliminate ambiguity
  • Be directly translatable into executable form

And compared to traditional programming languages, the key difference would be:


  • It maintains a level of abstraction that humans can understand



■ Not Actually a New Idea


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.




■ The Declarative Approach


Languages like Prolog are often described as declarative.


That means:


  • Focus on what should be done
  • Leave how to do it to the execution system

Interestingly, modern AI-assisted coding follows a similar pattern:
humans specify what they want, and AI handles how to implement it.




■ A Possible Answer to the Criticism


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:


  • Humans define conditions—what must be satisfied (predicates)
  • AI generates the implementation (the body of those predicates)

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.




■ Practical Challenges


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:


  • Even if we aim for human readability, Prolog is still closer to a machine-oriented language
  • Declarative approaches alone do not solve everything—Prolog itself never became mainstream
  • In practice, comments may act as prompts for AI, which means natural language still remains in the system

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.




■ Final Thoughts


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.

2026-04-05 | コメント:0件

llama.cppの開発&最適化、環境構築

老兵は死なず、AIと踊る


 私のAI体験、2026年2月の活動、ということで、我がAIマシン(Core i9-10980XE,メモリ256GB+GeForce GTX1080Ti、GeForce RTX3070)にllama.cppの環境構築を行ったので、そのメモになります。


(事前セットアップ)


  • OSのセットアップ、各種ドライバーをインストール
  • Cuda toolkitをインストール
    インストールされているグラフィックボードのバージョンに合ったバージョンをインストールする。
    例)GeForce GTX1080Ti用のCuda toolkitは、12.8.0になる。
  • Visual Studioをインストール
    Visual Studio 2022 community Editionをインストール
  • Gitもインストールしておく

llama.cppをダウンロード&ビルド


  • https://github.com/ggml-org/llama.cppのページにあるQuick startのBuild from source by cloning this repository - check out our build guideを参照
  • ダウンロードは
    git clone https://github.com/ggml-org/llama.cpp cd llama.cpp
    で行う。
  • ビルドのコンフィグレーションを行う
    cmake -B build -DGGML_CUDA=ON -DCMAKE_CXX_FLAGS="/utf-8 /EHsc" -DCMAKE_C_FLAGS="/utf-8" -DLLAMA_BUILD_BORINGSSL=ON -DLLAMA_BUILD_LIBRESSL=ON -DCMAKE_CUDA_ARCHITECTURES="61;86"
    最後の、DCMAKE_CUDA_ARCHITECTURESの61が1080Ti、86が3070用の設定になる。
  • ビルドを行う
    cmake --build build --config Release
  • コードページに関するワーニングがでるが無視しても動作した。一部のツールは文字化けするかもしれません。

動作確認


  • llama-serverの実行
    llama-server -hf unsloth/Qwen3-VL-235B-A22B-Thinking-GGUF:Q5_K_M -ngl 0 -b 512 --flash-attn on --host 0.0.0.0 --port 8080

    ファイアーオールが警告が出たらポートを解放する
  • クライアントからアクセス
    http://(llamaのマシンのIP):8080/でアクセス


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


Visual Studioからの起動&コンパイル


  •  llama.cppをダウンロードした場所にbuildフォルダが作成される。このフォルダをカレントディレクトリとしてVisual Studio(devenv.exe)を起動する。
    下記の要領でショートカットを作っておくと良い

    リンク先:"C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\devenv.exe" llama.cpp.sln (デフォルトインストール)
    作業フォルダ:C:\llama.cpp\build (llama.cppをc:\llama.cppにダウンロードしたと仮定)

    「詳細設定ボタン」→「管理者として実行」にチェックを入れる(プロファイル時に必要)。

  • デバックモードとリーリースモードで、リコンパイルを行ってみる。



VTuneのインストール&動作確認


  • VTuneをインストール
    使っているCPUに対応したバージョンのVTuneをインストールする。
  • VTuneは、最新バージョンしかダウンロードできない。2026年2月現在の最新バージョン2025.8.1.7では、Ice Lake以降のCPUしか対応していない。Core i9-10980XEは、Cascade lake(1世代前)なので対応していない。ので、事前にダウンロードしているもの(2023)を利用する。
  • 2022では、Windows11 25H2の環境ではインストールに失敗した(厳密にいうと2024のインストール&アンインストール後に行ったのでそのせいでインストールに失敗した可能性もある)。
  • 2024では、正常にプロファイルが取れなかった。
  • インストール時のオプションで、Visual Studioのツールにチェックが入っていることを確認すること。
  • 先に2024をインストールするとアンインストールしても一部ファイルが残っており、2023をインストールしてもショートカットが2024側を指すので起動しない。
    C:\Program Files (x86)\Intel\oneAPI\vtune
    以下のフォルダをチェックすること。
  • 出来れば、古いバージョンから試して不用意にバージョンをあげない方がよい。
  • VTuneの起動
    インストールが終了すると、Visual Studioのメニューにアイコンがでるのでプロファイルを行える。
  • ソースコードを見るには、プロジェクトの設定でデバッグ情報を出力するようにすれば良いが、デバッグモードで行った方が面倒が少ない。この場合、コードが最適かされないのでパフォーマンスが下がるが、概ね、半分ぐらいの速度になる。あまり遅くなっていない。そもそも手動で最適化を行うのでコンパイラの最適化は止めても大丈夫かと思う。手動の最適化が終わった後に最終的にONにすればよい。




目的の箇所にたどり着けたのでよいが、途中、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ビットとかにすればこの部分の処理をカットすることが出来るのでかなり早くなるかと思うが、メモリはこれ以上は積めないので最適化を頑張ろうかと思う。


老兵は死なず、AIと踊る

2026-02-18 | コメント:0件

なぜ日本のITが弱いのか?(もう一つの理由 Part1)

- ITに関わる日本人は英語が残念なことが多い -


老兵は死なず、AIと踊る


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で試すことにより、一部のエンジニアのいちゃもんなのか、正しい指摘なのかを確認できる時代になりました。


日本のITエンジニアの英語力


 普通のブログ記事なら「IPAさんやってしまいましたね!」と言って終わりでしょうが、いくら何でも「試験問題」ということでそれなりに注意して作成はしているでしょう。実際に多くのITエンジニアは私のような混乱は起こさないかと思います。つまりこのあたりが我々ITエンジニアの英語力の限界と考えた方がよいです。つまり、「AIにレビューさせろ」Part1の正しさをIPAさんが身をもって証明していたとも言えます。
 ということで私は、日本語でプログラムを組めるようにしたいと改めて思いましたので、ADPは日本語で名称を記述できるようにしたいです。
 「変数名を日本語で・・・」を読んだ硬派なITエンジニアは「変数名は英語だ!」と主張するかもしれません。そんなあなたにはTOEICや英検の受験をお勧めします。おそらく適切な英語名の命名に必要な英語力は、TOEICで730点、英検準1級以上かと思います。100歩譲って、TOEICの平均点560(英検2級程度)であれば、なんとか命名が出来るかもしれません(私の主観では足りないかと思いますが)。もし受験していない人は受験することをお勧めします。おそらくショックな点数(例えば300点)とかになるかもしれませんが、普通のITエンジニアの英語力はそんなものです。


やはりAIレビューが必要


 この問題は令和5年(3年前)になりますが、今ならコード全体をChatGPTに掛けられます。下記のとおり、divideFlagについてダメ出ししてもらえるので、今後は試験問題をAIに掛けたいです。ただしローカルAIでレビューしないと思わぬところで問題が漏洩する可能性があります。
ちなみに、コードにある i,jのような1文字変数は『ダメ』という記事も見かけますが、「AIにレビューさせろ」Part0(初心者の方へ)で指摘しているとおり現実としてよく使います。また、ChatGPTはダメ出ししていません。つまり、1文字変数は普通に使うと考えた方がよいでしょう。
さらに、divideFlagのように混乱を助長するような命名を行うのであれば、むしろ f のような1文字の名称の方がましだと思いますが、それはまた別の話ということで


老兵は死なず、AIと踊る

2026-01-13 | コメント:0件
Previous Page | Next Page