Andrew Borowicz, team minsky, Texas A&M Datathon, November 7-8, 2026. H-E-B product attribute challenge.
The short version
Databricks served the language model my agent asks when it is not sure of an answer. Everything else in the agent is rules it learns itself. I used Databricks Free Edition and the Qwen3-Next 80B serving endpoint the organizers allowed, signed in through the Databricks CLI, and called it through the Python SDK. On the final hold-out run the agent made 211 calls for 415 products and the hold-out score went from about 0.88 with rules alone to 0.9021.
What I built on it
- A thin adapter.
tools/llm_models.pywrapsWorkspaceClient.serving_endpoints.querywith temperature 0, a 300-token cap, and three retries with back-off. No tokens or keys in code; the CLI profile holds the login. - Ask only when unsure. The agent's rules give every answer a score. When the gap between the top two values is under 0.6, the agent sends that product's unsure attributes to Qwen with four similar labeled products from its memory and the rules' own guess as a hint. A valid allowed value replaces the guess; anything else keeps it.
- Fold-by-fold measurement. Every setting was measured on five practice folds before it touched the hold-out: margins 0.2, 0.4, 0.6 and 1.0; zero, four and eight memory examples; a think-first prompt; a "state the convention first" prompt; Qwen's corrections distilled back into the rules; Gemma 3 12B as a tiebreaker.
What the numbers said
- Rules alone, five folds: 0.8878. With Qwen on unsure answers at margin 0.6 and four memory examples: 0.9095.
- Asking Qwen about every answer was worse than not asking at all: 0.8818 to 0.8633 on fold 0. The model beats the rules where the rules are unsure and loses where they are confident.
- Memory examples in the prompt added 0.0071 on the same folds, higher on all five. Eight examples scored lower than four.
- Distilling Qwen's corrections into the rules lost, even with a perfect corrector (0.8818 to 0.8726), because every training product is already labeled.
- Final hold-out run: 211 calls, 285 of 1,421 answers asked, 132 changed, 314,079 input tokens, 4,536 output tokens, 291 seconds, 0 failed calls. Q 0.9021 with the organizer's scorer.
What I learned about the platform
- The free endpoint throttles above about three concurrent jobs. My five-fold runs went three at a time.
- Temperature 0 is not bit-reproducible on the served model. Re-running the final setup changed 5 real answers out of 1,421 and moved Q by 0.0001. I treat anything under 0.002 on five folds as noise.
- A reply cut off at the token cap can look like an answer. For two runs my parser accepted the fragment. I fixed it to treat a cut-off reply as a failed call and re-ran the final setup: 0 truncations, 0.9020 vs 0.9021.
- Claude Sonnet 4.5 is on the organizers' allowed list but was not offered on my workspace, so Qwen did everything. Llama 3.1 8B was allowed and I did not need it.
Where to look
tools/llm_models.py (the adapter), src/agent.py (when to ask, how a reply is merged), src/llm_assist.py (the prompt and the reply parser), submission/README.md ("The model review of unsure answers"), and submission/holdout-run-4/run_manifest.json (every call and token counted).
Code and write-up: GitLab mlmodels/tamu-2026-teams/team-minsky, branch main (start at SUBMISSION.md and docs/DATABRICKS.md).
Built With
- claude-code
- databricks
- gitlab
- python
- qwen