Use case · Mixed
AI product categorization with Jev: category, attributes and tags from a listing
One listing in, every tag your catalogue needs out: category, main use, audience and yes-or-no attributes, each with a probability that says which tags to check.
Run this example
5 questions · no key neededThe problem
Catalogue tags are filled in by suppliers who skip half of them, or by an LLM that writes tags outside your taxonomy. Either way faceted search and collection pages end up wrong, and nobody can tell which tags to trust.
How Jev handles it
Send the title, description and a price band as the state, and ask one Choice per taxonomy facet plus one Noul per attribute. The options are your taxonomy, so every answer is one of your values, and the confidence shows which tags a merchandiser should look at.
state = f"TITLE: {p.title}\nDESCRIPTION: {p.description}\nPRICE BAND: {price_band(p.price)}"
response = client.system_one(
model="jev-latest",
state=state,
questions={
"category": Choice(
instructions="Which category does this product belong in?",
criteria={
"footwear": "Shoes, boots and sandals",
"apparel": "Clothing",
"bags": "Bags and backpacks",
"equipment": "Tents, poles and other gear",
"accessories": "Socks, hats, gloves and small items",
},
),
"activity": Choice(
instructions="Which activity is it mainly made for?",
criteria={
"hiking": "Hiking and trail walking",
"running": "Running",
"everyday": "Everyday and casual wear",
"climbing": "Climbing and mountaineering",
"travel": "Travel",
},
),
"audience": Choice(
instructions="Who is the product marketed to?",
criteria={"women": "Women", "men": "Men", "unisex": "Not tied to a gender", "kids": "Children"},
),
"waterproof": Noul(
instructions="Is the product waterproof?",
criteria=NoulCriteria(true="Waterproof", false="Not waterproof, or not stated"),
),
"sustainability_claim": Noul(
instructions="Does the listing make a specific sustainability claim, "
"such as recycled or certified materials?",
criteria=NoulCriteria(true="Makes a specific claim", false="No specific claim"),
),
},
)
a = response.answers
facets = {k: a[k].choice for k in ("category", "activity", "audience") if a[k].confidence >= 0.8}
attributes = {k: a[k].noul >= 0.5 for k in ("waterproof", "sustainability_claim")}State sent the example loaded in Run this example above, as it first appears.
Answers returned
- Latency (median of 3)
- 604.8ms
- Minus network floor (259.9ms)
- ≈345ms
- Input tokens
- 706
- Cost
- $0.00002965
Category and activity are clear; the audience is not stated, so that answer should be less sure.
Designing a taxonomy for AI product categorization
One Choice per facet, with your taxonomy values as the options. Five categories and five activities were enough for the measured hiking shoe, which went to footwear and hiking at 1.00 each. A deep taxonomy needs two stages, department first and then a second Choice inside it: a Choice takes at most 255 options, and similar options blur well before that.
Use the confidence to decide what a person reviews. The listing never says who the shoe is for; Jev chose "not tied to a gender" with 0.94 of the probability and a confidence of 0.92, the least certain of the five answers. Facets a listing does not state are where both the supplier data and the model should be checked.
Attributes are Nouls because they are independent: a product can be waterproof and recycled at once. The measured listing scored 0.97 on waterproof and 0.96 on a specific sustainability claim, since it names a recycled mesh upper.
What to put in the state
Title, description and a price band cover most facets. Turn the price into a band in code, as the sample does ("mid, USD 90 to 150"), so no facet depends on arithmetic.
Do not paste the whole product page. Reviews, shipping text and related products add tokens and can pull a facet toward something the product is not.
What one decision costs
Catalogues are re-tagged in bulk, so price the backfill. First line: the measured listing, five questions. Second: 2,000 new listings a month. Third: re-tagging a 250,000-item catalogue once after a taxonomy change.
# the measured listing, five questions 706 tokens × $0.042 / 1M = $0.0000297 # 2,000 new listings a month 2,000 × 706 = 1,412,000 tokens × $0.042 / 1M = $0.0593 # re-tagging a 250,000-item catalogue once 250,000 × 706 = 176,500,000 tokens × $0.042 / 1M = $7.41
Every facet shares the one listing, so a sixth question costs a few tokens rather than another call: ask for every facet at once.
When not to use Jev for this
- The attribute is already a field in the supplier feed. Map the field; do not ask a model to re-read it.
- You need new tags invented. Jev picks among the options you give; discovering a taxonomy is a clustering or LLM task first.
- The answer is in the photo. Jev reads text; colour, pattern or style from an image needs an image model.
- The facet is a number, such as weight, size or capacity. Parse it in code.
Where it fits in your stack
AI product categorization runs when a listing is created or edited: the import job sends the listing, writes the facets above the confidence threshold to the catalogue, and queues the rest for a merchandiser.
An LLM can write the product description; Jev then tags what was written, which keeps the copy and the facets consistent.
Notes from the field
- Your taxonomy values are the options; the model cannot invent one.
- Low-confidence facets are the review queue, not an error.
- Ask every facet in one call: the listing is read once.
Common questions
Can AI categorize products into my own taxonomy?
Yes. The options are your taxonomy values, so every answer is one of them. On the measured listing Jev put a hiking shoe in footwear and hiking at 1.00; facets the listing does not state, like the audience, came back less sure.
How many categories can it choose between?
Up to 255 options in one question, but accuracy falls well before that when options are similar. For a deep taxonomy, choose the department first and ask again inside it.
Is this an AI product tagging tool?
It is the tagging step: one call per listing returns every facet and attribute you ask about. The example at the top of this page runs on a listing you can edit.