Intake AI · the part that actually hurts
New files arrive every month, and the format keeps changing. Until now there was one way through: a person reads every cell, works out what it means, and moves it into the system. Get it right and nobody notices. Get it wrong and nobody notices either — the wrong cell quietly becomes a medical record, and the next person to read it has no way of knowing it is wrong. And this is worth eight years of work because whether a person's health record can be picked up by whoever cares for them next depends entirely on every cell having been moved correctly. When the foundation is wrong, the cleverer the thing built on top, the more dangerous it gets. This page is about the engine in our platform that does this work — we call it Intake AI — how it works, and where we deliberately keep AI out of it.
Where it hurts
In the "other hospital" column, one cell holds a hospital name, a line break, and two letters. Those two letters are an abbreviated condition. One cell, two facts, one line break between them. Whoever moves the data has to know that the tail end is a condition and which diagnosis it maps to. Miss it, and this person's history is short by one item — and nobody will notice it is missing.
Elsewhere in the same sheet: a name and a chart number crammed into one cell. A blood pressure reading 120/2 — a diastolic of 2 is impossible, so it is a typo, but what it was meant to say is gone. One column is titled only "column 16". Another is labelled blood pressure and actually holds heart rate — move it by the label and this person's blood pressure becomes their pulse.
None of this is exceptional. This is the norm. Forms get filled in while people are busy, the column names were inherited from whoever had the job before, and the format changes every year. And moving a cell wrong throws no error. It sits in the record until the next time someone makes a decision based on it.
All of the above are rewritten for illustration. What we kept is the shape these cells really have, not any real person's data: the names, chart numbers, and institution names in real files never appear here, and never leave the institution's own server room.
And her actual job is not moving data. It is caring for people.
How it works
The hard part is not "get an AI to read the file." The hard part is reading it reliably, being able to explain why it read it that way, and not sending medical records to the cloud. So the order is deliberate:
Which row is the real header? Is a row a person, or one service visit? Are there sessions spread out sideways, or multiple sheets? A spreadsheet carries these facts natively — merged ranges, cell formats — so read them instead of approximating with statistics. No AI in this layer at all.
The key is not to trust the column name. Names lie, so we read the whole column's values alongside it: a column of 137/67 is blood pressure; 123/AC is a fasting glucose; V(114年) means it was done that year. On a typical file this layer resolves well over 90% of columns without touching AI.
A mapping a person once confirmed is remembered — and not just by column name, but by the combination of the name, the shape of its values, and what it was understood to mean. So the same station's roster next month, or a pharmacy's monthly file, skips the AI entirely from the second time on.
And they go in one batch, not one call per column. The model is the on-premise embedding model we trained ourselves, running on the institution's own machine — no network, no metering. It only fills in what the deterministic layer couldn't read, and it is not allowed to overwrite a confident result. If the model returns garbage, the pipeline falls back to the layer beneath it rather than failing the import.
And only about things that genuinely have no answer — a cell like 120/2, where the original value is gone. When we ask, we show the column's sample values and the system's own guess, rather than handing over a blank form to check from scratch. The answer is remembered, so we don't ask again.
We hold ourselves to one number: after a file comes in, how many columns still need a human. That number has to keep moving toward zero.
What we deliberately don't do
Sending every cell to a cloud model puts the bill on the institution and destroys the on-premise tier. So a file costs one batched model call, or zero when memory hits — never one per column.
If a blood pressure says 120/2, we flag it and keep the original. We do not helpfully "correct" it to 120/82. The system is allowed to guess wrong and be fixed; it is not allowed to quietly write a plausible-looking number into a medical record.
A column we genuinely decoded is shown with what it actually means. A column we only recognized the shape of says so: "I can see this is a set of coded columns, but I don't know what it's asking — confirm it, or give me a dictionary." A complete-looking screen is easier to build, and it makes people think it has already been checked.
The model that does the judging runs on the institution's own machine. Patient data doesn't have to leave the server room, and nobody has to sign a cross-border transfer agreement to have one cell read correctly.
How we know it didn't move things wrong
Because moving a cell wrong throws no error, the only way to know is to check every cell. These six are annual rosters and phone-visit tracking sheets from different stations, made by different people. We did not write them. We checked where the system sent each fact: of 1,088 records, 9 went to the wrong place.
We write up where those 9 went wrong. The cell described above — hospital name, line break, abbreviated condition — is one of them: the hospital name came out right, and the condition stayed stuck to it. Every time we change something we re-run all six, because fixing one way of sticking things together does not fix the next.
There is also data we refuse to import: phone-visit rows with no name, ID numbers whose format cannot be determined. Those get flagged for a person. We do not guess and we do not force them through. Better to have someone look twice than to let one wrong record in quietly.
1,088
records checked cell by cell across six real rosters
9
records sent to the wrong place — each one written up
90%+
of columns in a typical file read deterministically, no AI
On-site
the model that does the judging runs on the institution's own machine
Why this needs models of our own
Layer four has to read CV in an "other hospital" column, L-CT on a screening roster, 皮蛇 in a nursing note. We tried the best available Chinese models; they read almost none of it, because none of it exists in public training data. So we trained one, and opened it.
There is a second half to this, about sound. What gets said during an interview or a home visit also used to be retyped back at the office — and the older adult is speaking Taigi. That is the other kind of model.
Her actual job is not moving data. It is caring for people.
The most convincing thing is not our slides — it is the sheet you trust least. We can run the reading pass without importing anything, so you can see what it understood, what it would bring to a person, and what it honestly says it doesn't know.