Inspiration
New Yorkers file 317,000 complaints a month with 311. The city also has 1,384 open jobs. Nobody connects the two. What if the answer to "rats on my block" was not a ticket, but the job that fixes it?
What it does
Tell it what is wrong on your block, typed or spoken. It answers with:
- how many neighbors reported the same thing in the last 30 days, by borough
- which agency owns it, and how the city usually closes the case (real 311 resolution text)
- the open city job that would let you fix it yourself, with the posted salary
- what people already in that civil service title really earn, from payroll data
- a first month on the job, drafted only from the posting's own duties
Stop complaining, start fixing.
How we built it
Three NYC Open Data sets live in Elasticsearch Serverless: city job postings (semantic_text embedded by Mistral through an inference endpoint), 30-day 311 complaint aggregates with top resolution texts, and FY2025 citywide payroll grouped by title. A Mistral Large 4 agent uses function calling over four Python tools: hybrid word-plus-meaning job search, aggregations, complaint lookup and real pay. Mistral structured output built the join key between 311 agency names and job posting agency names. Voxtral transcribes spoken complaints. A small Mistral model gates off-topic input before any search runs.
Challenges
- Meaning search alone ranked "Staff Writer" above developers for "write code for the city". Hybrid search fixed it.
- Elastic scored nonsense input almost the same as a real complaint, so an LLM intent gate does the validation, not the score.
- Mistral Large 4 reasons by default; turning reasoning off cut answers from 58 seconds to 9.
- Payroll loaded only annual titles at first. Carpenters are paid per day. Reloaded with every pay basis.
- Dates in the jobs feed arrive as "05-DEC-2026".
What we learned
RAG is retrieve then generate, and retrieval needs words and meaning together. Elastic finds, Mistral decides and explains, Python is the phone line between them.
What's next
A hybrid retriever with reciprocal rank fusion, Elastic Agent Builder over the same indices, and Voxtral text-to-speech for the answer.
Built With
- elastic-cloud-serverless
- elasticsearch
- mistral-ai
- mistral-embed
- mistral-large-4
- nyc-open-data
- python
- socrata-api
- voxtral
Log in or sign up for Devpost to join the conversation.