Pilot · Lakeshore City Department of Public Health
Source code FeaturedSyndromic 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
- 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.
- Adapted from
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.