見出し画像

自然言語とプログラミング:人工知能によるソフトウェア開発

私たちが普段使っている言葉は、明示的に示された意味の他に、暗示的にたくさんの情報を含んでいるケースがあります。この言葉の性質を少し考えていこうと思います。

一方で、私はソフトウェアエンジニアなのですが、普段プログラムを書くためのプログラミング言語を扱っています。プログラミング言語に対して、人とやり取りする時の日本語や英語は自然言語と呼ばれます。

この記事では、この自然言語とプログラミング言語のギャップについて、考察し、昨今話題のチャットAIによるプログラミングの意味について、考えていきたいと思います。

■2つの文の連結

人間の思考の主なフィールドは、言葉による思考です。頭の中で物事を考える時も、私たちは言葉に頼っています。言葉が無ければ明確な思考は難しくなります。

ここで、思考の一形態として、2つの文を連結するというケースを考えます。連結することにより、文の意味に変化があります。そこに、消失、維持、増幅のパターンがあります。

◇消失
「AはBの一種です」「BにはAは含まれません」
この2文は、独立していればそれぞれ意味を成しますが、1つの文章に連結すると、意味が失われます。矛盾しているからです。

◇維持
「AはBの一種です」「CはDの一種です」
この2文は、独立していても、連結した場合も、意味がそのまま維持されます。矛盾していませんし、内容に関連性もないためです。

◇増幅
「AはBの一種です」「BはEの性質をもちます」
この2文は、独立している時よりも、連結した方が意味が増幅されます。三段論法という言葉を聞いたことがあるかと思いますが、この2つの文章はまさにそれに当たります。この2つの文があれば、「AもEの性質を持つ」という明記されていない知識が増えます。

■増幅のパターン

増幅には、様々なパターンがあります。

先ほど挙げた三段論法は、推論です。与えられた情報を論理的に組み合わせて、与えられていない情報を獲得することです。論理が明確に働く状況であれば、獲得した情報は、暗黙ではありますが、確実な情報になります。

この他、推測、連想、補完などのパターンがあります。

推測は、論理がやや曖昧であったり、過去の経験則や確率など不確実性を含む、推論と言えます。一般に、その確度の度合いによって、推定、憶測、想像など、様々な言葉で表現されます。「A君がBさんを見つめていた」という情報から、「A君はBさんが好きだ」という推測をするようなものです。

連想は、明示されていないけれども関連する概念と結びつけることです。例えば「A君は大企業に勤めている」という情報から、「A君は優秀なのだ」「A君は豊かな生活を送っている」などと考えるのが連想です。連想も推論や推測から成立することが多いでしょう。

補完は、与えられた情報から、まだ与えられていない情報を取り出すことです。「りんごが2個ある」「A君が1個のりんごを1個食べた」という情報から、リンゴが残り1個であるという事は書かなくても、補完できます。補完も、推論や推測から成り立つことが多いと考えられます。

■増幅とプログラム

プログラムも言語ですが、人間の自然言語とプログラム言語の違いは、増幅の方法が異なるという点です。

まず、プログラムは、推測を行う事はできません。常に、確定的な情報しか扱う事はできません。

また、推論の中でも、コンピュータの鉄続き的な処理で扱えるような、ごく狭い範囲の推論しか行えません。プログラミング言語によって、推論の幅は多少拡張されますが、自然言語の持つ豊かな推論の能力には遠く及びません。

例えば、「A,B,Cの3人に、1人ずつ重複しないように、リンゴ、ミカン、ブドウのいずれか与える」「Aにはミカンを与える」「Bにはブドウを与える」という文章があれば、もうCにリンゴを与えるという文は無くても確定します。

しかし、プログラミング言語ではこれができません。「Aにはミカンを与える」「Bにはブドウを与える」「Cにはリンゴを与える」と書かなければなりません。

現在のプログラミング言語では、「A,B,Cの3人に、1人ずつ重複しないように、リンゴ、ミカン、ブドウのいずれか与える」というルールがシンプルに書けないのです。これを書こうと思うと、それなりに複雑なプログラムを書く必要が出てきます。それを書くぐらいなら、先ほどのようにA,B,Cにそれぞれ与える果物を3行分のプログラムで書いた方がリーズナブルです。

■ソフトウェア開発の難しさ

人間が思考に使っている自然言語と、コンピュータの動作に使われるプログラミン言語の、このギャップが、ソフトウェア開発を難しいものにしています。

人間の言葉で、要件や仕様を記述しなければ、私たちはその要件や仕様を理解することができません。そこには、自然言語の豊かな増幅の効果で、簡潔な文章でも多くの情報が含まれています。

それをプログラミング言語に変換していくことが、プログラミングになります。そこでは、自然言語で書かれた要求や仕様書から増幅により暗黙の情報を取り出し、その上で、明示された情報と暗黙の情報を組み合わせて、それをプログラムで扱いやすい形式に変換をする作業が必要になります。それが設計作業に相当します。

その設計作業ができたら、後はプログラムを書いていくことになります。この自然言語とプログラミングの橋渡しになる設計作業が、最もギャップの大きい部分の作業になり、高い自然言語読解力と、コンピュータで扱いやすいプログラム構造やデータ構造に対する深い理解、そして、コンピュータ上でプログラムが動作するイメージを頭の中で正確にシミュレートできる能力が求められます。

■チャットAIによるプログラミング

このギャップを埋めるために、手続き型のプログラミング言語だけでなく宣言型の言語が研究されたり、型推論に代表される推論機構を備えたプログラミング言語が開発されてきました。このような自然言語とのギャップを埋めるような技術を積み上げることで、ソフトウェア開発の困難性を少しずつ軽減できるのではないかと期待されていました。

しかしそこに、意外なところからブレークスルーが起きつつあります。大規模言語モデルによるチャットAIです。

チャットAIはプログラミングもできるという事が話題になっています。自然言語を扱える言語AIは、プログラミング言語とのギャップを埋めるという作業を行うことができるためです。まだまだ人間のエンジニアとの能力の差はありますが、将来的にはこの部分は強化され、チャットAIと要件と仕様を自然言語でやり取りすることが、ソフトウェア開発の主な作業になる事は間違いないでしょう。

■さいごに

自然言語とプログラミング言語のギャップについて、考えて見ました。元々、これから先は自然言語を扱えるチャットAIから派生したソフトウェア開発の在り方が主流になると直感していましたが、今回の考察で、その確信が深まりました。

また、ソフトウェア開発を効率化する視点からは、自然言語が持つメカニズムを掘り下げる事はあまり着目されなくなっていきそうです。チャットAIが進化すれば、人間がそこを理解する必要が無いためです。

しかし、ソフトウェア開発の観点を離れて、自然言語の持つ仕組みを掘り下げて考えることには、私個人としては興味があります。消失、維持、強化といった特性は、自然言語に限らず、生物のDNAや、生命の起源における有機物の化学進化にも、大きな関連があるように思えるためです。


サポートも大変ありがたいですし、コメントや引用、ツイッターでのリポストをいただくことでも、大変励みになります。よろしくおねがいします!