{"slug": "how-to-sort-customer-reviews-into-complaints-praise-and-questions-with-a-local", "title": "How to sort customer reviews into complaints, praise and questions with a local AI model", "summary": "A developer demonstrated a workflow in the osFoundry desktop app for classifying customer reviews into complaints, praise and questions using a local 7B language model. In a walkthrough with a 312-review pottery shop export, the model labeled 87 reviews as complaints, and quality stats confirmed three distinct label values with no empty answers. The approach sends each review individually with a strict output-format prompt, saving results to a new dataset without altering the original.", "body_md": "A shop that has been selling for a while usually has a review export nobody has read to the end. The answer to \"what should we fix first?\" is in there, but finding it means reading every line and keeping a tally in your head. A language model can do the reading if you ask it a narrow question: for each review, is it a complaint, praise or a question? The steps below do that in the Datasets screen of the [osFoundry](https://osfoundry.io) desktop app, with a model running on the same computer. The screenshots use an example export of 312 reviews from a small pottery shop, made up for this walkthrough.\n\nMost shop back ends can export reviews as a CSV file. One review per line, with a header row, is all this needs; the example has three columns, `date`, `product` and `review`.\n\nIn the app, open Models, then Datasets, and click Upload in the top right. Pick the CSV file. Each line becomes a row of a new dataset named after the file, and a message confirms the row count: 312 rows in the example. The dataset is saved to the workspace's dataset library, which uses workspace credits, and is listed under My Datasets with Uploaded as its provider. Click it to open its panel on the right, which shows the number of rows and fields and the column names it found.\n\nIn the dataset's panel, click Run Model. A small form opens under the buttons.\n\nModel is the list of models the app can reach. Choosing one that runs on this computer keeps the model calls on this computer, and labelling is a small enough task for a 7B model.\n\nInput field is the column that gets sent. Set it to `review`. The other columns travel along untouched into the result.\n\nThe system prompt is your instruction. Be strict about the answer format, because whatever the model writes becomes the value in the new column:\n\n```\nLabel this customer review as complaint, praise or question. Output only the label.\n```\n\nEach review is sent on its own, with this instruction placed before it, so a long angry review can't colour the one after it.\n\nOutput field name is the name of the new column. The default is `prediction`; `label` reads better later. Click Run Inference. A counter shows how many reviews are done out of the total, and Stop ends the run early if the first answers look wrong.\n\nWhen it finishes, the answers are saved as a new dataset named after the old one plus the column, `reviews_label` here. The uploaded dataset is not changed, so a second run with a better prompt can sit next to the first.\n\nOpen the new dataset and click Show Quality Stats. For each column it shows the share of empty values, how many distinct values there are, and the average length.\n\nThe line to read is `label`. Three distinct values means every answer was one of the three words you gave. If it says five or six, the model sometimes wrote \"Complaint.\" with a capital and a full stop, or a whole sentence, and those rows won't be counted with the others. Tightening the instruction and running again fixes it more reliably than cleaning up by hand. Zero percent empty also matters: an empty label is a review the model didn't answer.\n\nClick View in Data Sources and open `reviews_label` from the list to see the labelled rows as a table. The table loads more rows as you scroll, so scroll to the end first; then type `complaint` in the search box above it and every matching row shows.\n\nIn the example, 87 of the 312 reviews are complaints, and reading just those takes a few minutes instead of an afternoon. Most of them describe the same thing: arrived chipped, a crack down the side, a lid in pieces, one thin layer of paper, no bubble wrap. A smaller group is about slow delivery, and a few about the glaze colour not matching the photos. The mugs themselves are fine; the packing is the thing to change first.\n\nThat last step is still yours. The model sorts the pile so the complaints are in one place; deciding which of them matter, and what to do about them, takes reading them.\n\nThe dataset tools are described on the page about [bringing your own datasets into osFoundry](https://osfoundry.io/platform/your-datasets), and the desktop app is a free download from the [osFoundry download page](https://osfoundry.io/download).", "url": "https://wpnews.pro/news/how-to-sort-customer-reviews-into-complaints-praise-and-questions-with-a-local", "canonical_source": "https://dev.to/bestaitool/how-to-sort-customer-reviews-into-complaints-praise-and-questions-with-a-local-ai-model-2en1", "published_at": "2026-11-09 06:50:55+00:00", "updated_at": "2026-11-09 06:52:11.951342+00:00", "lang": "en", "topics": ["ai-tools", "large-language-models", "ai-products"], "entities": ["osFoundry"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/how-to-sort-customer-reviews-into-complaints-praise-and-questions-with-a-local", "markdown": "https://wpnews.pro/news/how-to-sort-customer-reviews-into-complaints-praise-and-questions-with-a-local.md", "text": "https://wpnews.pro/news/how-to-sort-customer-reviews-into-complaints-praise-and-questions-with-a-local.txt", "jsonld": "https://wpnews.pro/news/how-to-sort-customer-reviews-into-complaints-praise-and-questions-with-a-local.jsonld"}}