Blog · AI
AI overviews for 7,000 listings, no junk published
By 2BKK · Published 27 September 2026
bangkok.biz has about 7,000 business listings. Each one came from an import with a name, an address, a category, a few photos and, for most, a handful of Google reviews. None had a paragraph a person would want to read. Writing 7,000 by hand was never going to happen. Publishing 7,000 raw AI drafts is how a site gets demoted. This is the pipeline we run instead, with the numbers as of 27 September 2026: 4,897 overviews generated, each gated, each stamped with the model and the date.
Generate from the record, not from the model's imagination
The single rule that makes this work: the model only gets facts that exist in the record. The prompt for each listing includes the short description, the existing "About" text if the owner wrote one, the tags, the price range, the opening hours summary, the top positive reviews and the critical ones. It is told, in capitals, not to repeat what the About already says and not to invent anything that is not in the input.
A listing with no reviews and no description gets no overview. An empty input produces a plausible-sounding paragraph, and plausible-sounding is exactly the problem.
Batches of fifty, resumable, with a cost per run
The generator runs in batches of 50 listings. Each batch is a separate call with the listing ids as delimiters, so one bad item does not take the batch down and a crash can resume from the last good id. Every run logs the model used, the item count and the cost. The model for this job is a small, fast one; the work is summarising known facts, not reasoning, and the price per item is a fraction of a cent.
The gates
Every generated overview passes through rules before it is stored:
- Length within a band. Too short means the input was thin; too long means the model padded.
- No forbidden claims. "Best in Bangkok", ratings the record does not have, prices that are not in the data, and a list of words we never publish.
- No repetition of the About text, checked by overlap, not by trust.
- Language detection, so a Thai-only input does not produce an English overview with invented details.
- Facts present. The category and area must appear; a summary that drifts from the record is rejected.
Rejected items stay empty and go on a list. A person samples a few dozen from each run, adjusts the prompt when a pattern shows up, and the batch is re-run for the rejects only.
Store the provenance
Each record keeps the overview, the model name and the generation timestamp in their own columns. That is what lets us answer "which of these were written by which model, when" months later, re-run only the ones from an older model, or remove all of them in one query if a search engine decides it does not like them.
What we would do differently
The May to June 2026 core update hit this directory, and generated blocks on thousands of structurally identical pages were part of the reason. The pipeline was sound; the publish policy was not strict enough. The overview is now collapsed by default, thin listings are kept out of the index, and the next step is to feed the generator more first-hand data (verified photos, owner answers, visit notes) so that each overview says something a template could not. The demotion post has the full story.
If you have a catalogue or directory with thousands of empty descriptions, this is the shape of the work: facts in, gates on the way out, provenance stored, and a publish policy you can defend. The AI content at scale page describes how we run it for clients.