Skip to content

Demo content Everything on this site is sample data shipped with the template. Configure it or follow the launch guide (opens in a new tab).

Pilot · Lakeshore City Department of Public Health

Source code Featured

Syndromic surveillance signal triage assistant

Result in one line: Cut daily alert review from 90 to 30 minutes for two analysts

Reads the daily syndromic alert export, drafts a plain-language note for each signal, and ranks the ones an epidemiologist should open first.

Published June 18, 2026 Updated July 30, 2026 Verified August 4, 2026

Source code Documentation or write-up
Skills needed to set it up
Analyst or data scientist
Readiness
Needs customization Human review built in
Data it touches
De-identified data Internal, non-public data
Who sees the output
Internal staff
License
MIT
Cost to stand up
No new spend
Portable to other platforms
Partially — with rework
Use case category
Coding & brainstorming
Reviews it went through
Privacy review Security review or authority to operate Research ethics / IRBAI governance body
What do these mean?
Analyst or data scientist
Someone who works in Python, R or SQL.
Needs customization
Your team will need to adapt it before use.
Human review built in
A person checks the AI's output before it is used.
De-identified data
Personal identifiers removed before use.
Internal, non-public data
Non-public operational data without personal identifiers.
Internal staff
Used only inside the organization.
MIT
Permissive; reuse with attribution.
No new spend
Built with licences, staff and infrastructure the organization already had.
Partially — with rework
Some pieces are vendor-specific and would need swapping.
Coding & brainstorming
Writing or reviewing code, analysis, and idea generation.
Security review or authority to operate
A security assessment, ATO or equivalent sign-off.
AI governance body
An internal AI review board or committee signed off.

Problem

Every morning the surveillance team receives between 40 and 80 automated alerts from the syndromic system. Most are noise — a holiday effect, a facility that changed its coding, a weekend injury bump. A handful matter. Reading all of them by hand took two analysts about 90 minutes a day, and the reading happened before anyone had context on what had already been ruled out.

What we built

A scheduled Python job pulls the alert export each night. For every signal it assembles 14 days of visit history, the expected count from a simple seasonal baseline model, and the relevant syndrome definition. It then asks a language model to do three things: say in one sentence what changed, rate how strongly the data supports a real increase, and suggest the single most useful follow-up query.

The results land in a ranked queue that the on-duty analyst works through. Nothing is closed automatically. The analyst opens each signal, reads the draft note, edits it, and records the decision — which is also how we collect training examples for the next round of prompt work.

How it works

The enrichment step is ordinary Python and SQL against our own warehouse. The model never sees record-level data; it receives a small table of counts, a baseline, and text from our syndrome definitions. Prompts and the evaluation notebook live in the repository so another team can see exactly what we asked for.

Signal strength is deliberately presented as a sorting hint, not a score. It changes the order of the queue and nothing else.

Results

Review time dropped from roughly 90 minutes to 30 across two analysts. Two clusters were opened a day earlier than they would have been under the old manual sweep. Agreement between the drafted strength rating and the analyst’s own judgement was 84% over the first eight weeks, which we consider good enough for sorting and nowhere near good enough for automation.

Lessons learned

The prompt is about 60 lines. The hard part was the enrichment — getting a clean baseline and a stable facility list took far longer than anything involving the model. Writing the evaluation before the pilot, rather than after, is what let us defend keeping it.

How to reuse

Start from the data you already export nightly. Replace the three loader functions with your own sources, then run the evaluation notebook against a month of historical alerts before letting anyone rely on the ranking. We are happy to share the syndrome mapping tables on request.

About

Area of work
  • Epidemiology & surveillance
  • Data & informatics
Review status
Reviewed & approved

How it's built

How AI is involved
AI is part of the solution
Types of AI
  • Generative text (LLM)
  • Classification & NLP
  • Prediction & forecasting
AI tools & models
  • Claude (API)
  • Python
  • LangChain
Where it runs
  • Microsoft Azure
  • On-premises

Sharing & licensing

Portability notes
The triage code and prompts are portable Python. The alert export reader is written against our ESSENCE extract format and the deployment scripts assume Azure Functions.

What it took

Cost to keep running
Under $10k/yr
How it was bought
  • No procurement needed
  • In-kind or academic partnership
Who it affects
The model ranks signals, so a systematic miss in one part of the city becomes a slower public health response there. We compare precision and recall by reporting facility and by ZIP-code tercile every month, and the two safety-net hospitals are held to the same recall floor as the academic centers. Nothing is auto-dismissed: an epidemiologist sees every signal regardless of rank.

Data & access

No PII/PHI in the shared material
Yes
Data sources
  • Syndromic surveillance alert export
  • Facility visit counts
  • Syndrome definitions
Data-governance caveats
The alert export is de-identified at source; the repository ships synthetic sample data only. Reusing teams should confirm their own syndromic vendor's export format and data-use terms.