
Client project · Atlas Digital
Circular Action Alliance
LLM checks on self-reported packaging data
- Role
- Lead Analyst
- Team
- 7 · Atlas Digital
- Timeline
- Feb – Apr 2026
- Ran on
- 89 producers
- LLM pipelines
- OpenAI API
- Structured outputs
- Data validation
Overview
Under Extended Producer Responsibility (EPR) laws, companies report the packaging they sell into a state so they can pay for its recycling. Circular Action Alliance (CAA) collects that data, but producers report it themselves. As Lead Analyst on a 7-person Atlas Digital team, I helped build a pipeline that rebuilds each producer’s packaging from public sources so CAA can compare it with what was reported.
- InputProducer list89 producers in our run; CAA works with 2,000+Step 1Discover productsLLM + search find private labels (Costco → Kirkland Signature), then product pages
- Step 2 · my partInfer packaging
- Classify: GPT-5 mini with a strict JSON schema, at most 3 packaging types per product
- Baseline: fuzzy-matched against ~6,500 rows producers had already reported, so every answer can be checked
- Step 3 · my partBuild a bill of materialsEach packaging type becomes components and materials:
- PET bottlePET bodyPP capBOPP film label
- Step 4Map to CAA categoriesA crosswalk lines components up with reporting in California, Oregon and ColoradoOutputCompare with reportsCAA sees where a producer's report and the public evidence disagree
What I tried that didn’t work
- Scraping Google results. Our midpoint version (SerpAPI, Selenium, BeautifulSoup) hit rate limits, didn’t scale, and couldn’t show where the LLM’s answers came from. Switching to Tavily search made every answer traceable to a source.
- Letting the LLM name packaging freely. Labels came back vague (“recyclable plastic”) or described the wrong thing, like a pump. Good and bad examples in the prompt gave consistent packaging types.
- One discovery strategy for everyone. Discovery assumed every producer was a retailer with a private label. That fit only 25 of the 89; the rest were brand owners, B2B manufacturers and distributors.
A tradeoff I made, and why
A library that grows itself, at the cost of some control. When a packaging type has no match, the LLM writes a standard name, aliases and a generic bill of materials under a strict schema, and the entry is saved for reuse. Each new type costs one LLM call. The library reached 12 types this way, like “steelbook” → tinplate steel shell, steel hinge, plastic disc tray.
The risk is that a wrong entry gets reused everywhere. When the team merged the final pipeline, they kept my format names and alias matching but swapped the LLM fallback for a fixed 30-type vocabulary with human review. For compliance data, that was the right call: a reviewed list is easier to defend to a regulator.
What I learned
- An LLM’s answer is only useful if you can trace it. The switch to traceable search mattered more than any prompt change.
- Structured outputs beat clever prompts. A strict schema and a cap of 3 types removed a whole class of messy answers.
- Check your assumptions against the whole dataset early. Our discovery design fit only 25 of 89 producers, and we found out late.
- Compliance work raises the bar for automation. In regulated data, being explainable matters as much as being fast.