All posts

The model understood the shopper. The catalogue did not.

A shopper asked naturally for a product, the model understood, but the catalogue never opened because an intent gate missed the phrasing. We changed the routing rule rather than the model, because natural-language support has to include everything around the LLM too.

September 25, 20265 min readSaytu team

Understood, Not Searched

On this page

A shopper asked for a Dandadan shirt in perfectly ordinary language.

The assistant understood the request well enough to answer correctly. But no product cards appeared underneath the reply.

That made the failure look like a small presentation problem. It was not. The catalogue had never been properly opened for the request in the first place.

The interesting part was where the failure happened. It was not inside the language model. It happened in the layer before the model could use the catalogue: a product-intent gate that decided whether this message deserved a product search.

The model understood the shopper. The surrounding system did not.

Conversational interfaces still have non-conversational machinery behind them

A chat interface changes how people ask for products. In a traditional search box, people learn to compress what they want into keywords. They remove polite wording, shorten sentences and try to guess which terms the search engine will recognise.

A shop assistant invites the opposite behaviour. People write complete requests. That creates a subtle engineering problem. The language model may be capable of understanding those requests, while the rules that decide what tools and data it gets to use are still looking for a much smaller vocabulary.

That was our bug. The original shopper message was in Thai: "ขอเสื้อ dandadan หน่อย", roughly "Could I see a Dandadan shirt?"

Nothing about the shopping intent was unclear to a person. The model could handle it too. But our product gate did not recognise the wording as a signal to open the catalogue.

The request fell through to a weaker search path instead. The reply could still sound correct. The product experience could not.

A better prompt would not have fixed it

This distinction matters because failures around AI systems are often diagnosed at the model layer first. The natural reaction is to adjust the prompt, add an example, change the model or give it a stronger instruction about product discovery.

None of those changes would have fixed this case. By the time the model was composing the reply, the earlier routing decision had already determined what product information it would receive.

The model cannot reason over a catalogue that the application never gives it. That made the fix much smaller than changing the AI and much more important than it looked: the gate needed to recognise another real way a shopper asks to see a product.

The obvious change was to recognise the Thai word "ขอ" as a product-intent signal in this context. Matching those characters everywhere would have been wrong.

The same opening appears inside other common words. "ของ" is an ordinary word. "ขอบคุณ" means thank you. "ขอโทษ" means sorry.

A loose rule would therefore turn normal conversation into catalogue searches. A shopper saying thank you could accidentally trigger another product lookup.

So we did not simply add a substring. The rule was narrowed so the request form could open product search while those other words stayed outside it.

The useful lesson was not the specific Thai expression. It was that intent detection has to model the boundary of an action, not merely collect more keywords.

"Show me this product" and "thank you" should not become the same event because they happen to share characters.

The text answer was not enough

One reason this problem survived is that the assistant could still return something that looked reasonable. That creates a dangerous definition of success for an AI shopping product.

If evaluation looks only at the generated text, the turn can appear correct. The model understood the request. Its sentence made sense. There was no crash and no visible error.

But a shopper was asking a store for a product. The job was not only to produce a sensible sentence. The system also had to perform the product-discovery action implied by that sentence.

When the product cards failed to appear, the conversation and the commerce layer disagreed about what had just happened. A conversational shop assistant has to get both right.

Natural-language support includes everything around the model

This bug changed how we think about language support. It is easy to ask whether the model understands a shopper's language. That is only one layer of the system.

Intent gates make language decisions. Search-query builders make language decisions. Product-selection rules make language decisions. Every one of those layers can narrow what the model is able to do, even when the model itself understood the original message perfectly.

That means multilingual behaviour can fail in places that never call a model at all. The interface still looks like AI. The failure still feels like the AI misunderstood. But the actual problem may be an ordinary conditional sitting between the shopper and the catalogue.

The shopper should not have to learn our search syntax

The most important part of the fix was deciding who should adapt. We could have treated the original request as unusual and expected the shopper to phrase it differently. A shorter query or a more obvious product keyword could have opened the right path.

That would defeat the point of a conversational interface. The original request was already clear.

People should not have to discover which form of "show me this" happens to satisfy an internal gate. They should not need to remove politeness or rewrite a natural request into search-engine syntax before a shop assistant can reach the shelf.

So we changed the gate. That is a small implementation detail with a larger product consequence. Natural language is not supported merely because the model can parse it. It is supported when the whole path from the shopper's words to the store's data preserves what those words meant.

In this case, the model had understood the request from the start. We had simply failed to let it into the catalogue.

Keep reading

All posts