IntroductionHi all,
In this thread, I'd like to suggest something to everyone working on AI here on AIDreams. Also I'd like your feedback on this, so I can make it fit your needs.
It is both a software architecture, and a way of working together. Let's start with the software architecture.
Software architectureIt's a social networking service for software components. I can't say it better.
It revolves around the principle of followers. When ComponentA chooses to follow ComponentB, ComponentB's output is sent to ComponentA's input ASAP. If ComponentA follows 20 other components, its input will receive a mix of outputs from these 20 components.
If you're the developer of ComponentC, you cannot choose which (already existing) component will follow yours. You can only choose which components your new ComponentC will follow, and what will be its output.
In other words, it's a
data market. When you sell things, you can't force customers to buy your products, all you can do is create the best product you can, and hope customers will buy it. It's the same here: you choose where you take your input from, and you make your output available to the system. One day, another component will follow yours, and so on.
A way of working togetherNow, let's look at the "way of working together" side of it.
If we work long enough in this direction, we'll have one single system, able to do a lot of things, instead of a lot of independant systems able to do... what they're meant to.
I'm not saying that making it big is enough to reach AGI. I'm just saying that size matters. Now, the bigger the slower, but computers are getting faster everyday, so I believe we should not worry too much about this.
A component's interfaceA typical piece of software has 1 input (stdin) and 2 outputs (stdout, stderr). This is old design.
A software component should have 4 ports:
DATA IN: data the component works on (stdin)
DATA OUT: data it puts on the market (stdout)
DASHBOARD: input to decide what to do (stdin)
EVENT LOG: log of the component's activity (stdout, stderr)
There are 2 new things here:
- We split input in 2, one for deciding what to do (DASHBOARD), one for what we work on (DATA IN)
- We don't log only errors, we also log what has been done successfully, whatever we do
Example:
DATA IN
a broken car
|
DASHBOARD | EVENT LOG
A car needs to -------+--------> I successfully
be repaired | repaired a car
|
V
DATA OUT
a repaired car
A component can choose to connect its 2 inputs to any port of any other component. It can be connected to another component's outputs, to work in chain, and also to another component's inputs, to "spy" it (receive what it receives).
Connecting to another component's DASHBOARD allows understanding
why (or when) a component does things. Connecting to another component's EVENT LOG allows understanding
how a component does things.
CommmunicationThere are 2 ways for a component to communicate:
- through its standard IO, stdin stdout stderr
- through sockets (TCP)
A component gives orders to the system (send this message, give me a list of components, connect me to this port of this component) and receives messages from the system (here is a message from this port of this component, here is a list of components, you're currently connected to this and this...)
The language used for giving orders and receiving messages is currently under development (it works already). It is a stack-based concatenative language, that allows tacit programming by function composition, and featuring usual data types: strings, numbers, ordered lists, associative arrays.
Drivers and inner nodesA component doesn't have to speak the system's language. Incoming and outgoing messages can be translated by drivers, which are written in Javascript by the component's developer, and delivered with the component. Drivers can make things easier if you develop something with, say, Prolog.
Also, it is possible to develop inner nodes in the system's concatenative language. Inner nodes have the same capabilities as regular components. They can be created by regular components.
A component's purposeA component can have any purpose. It is a regular software, that should be useful to the user. You can have components to play music MP3, to read e-mails, calculate things, chat, surf the web, ...etc, whatever.
The only thing special about a component is that it is also part of something bigger.
ConclusionI'm posting this sketch here because I believe AGI is not a one-man job, and because I would love your thoughts on this. So please, whoever you are, don't stay silent!
EDIT: typos