Hi everyone,
I’m experimenting with AI agents that answer questions about local service businesses and help users find the right service based on natural language.
One challenge I’m running into is service normalization. Different businesses often describe the same service in different ways.
For example:
- Pressure washing vs. power washing
- Tree pruning vs. tree trimming
- Estate cleanout vs. house cleanout
- Debris hauling vs. junk removal
Right now I’m considering:
- A predefined service taxonomy
- Embeddings for semantic matching
- Metadata filters (location, category, business type)
- RAG for retrieving business-specific information
For those who have built similar systems:
- Do you normalize service names before indexing?
- How do you handle synonyms without creating duplicate matches?
- Would you rely more on embeddings, a taxonomy, or a hybrid approach?
I’d love to hear what has worked well in production.
Great problem. I’ve hit the same thing building local service agents.
Short answer: hybrid, not embeddings only.
1. Do you normalize before indexing?
Yes. I map every business listing to a canonical service_id (e.g. junk_removal, pressure_washing) and keep the original label too. Search and filter on the canonical ID; use the raw text for display and fallback recall.
2. How do you handle synonyms without duplicates?
Alias list per service ID. “Power washing” and “pressure washing” both map to pressure_washing. Each business gets tagged once per service, so you don’t get duplicate hits from different wording.
3. Taxonomy vs embeddings?
Taxonomy: what service the user actually wants (most important)
Metadata filters: location, category, etc.
Embeddings: fuzzy recall when wording is messy
RAG: business specific details (pricing, hours, policies) after you’ve narrowed candidates
Embeddings alone aren’t enough. They’ll miss obvious synonyms and sometimes blur related services (tree trimming vs tree removal).
What I’d actually build:
Parse the query → canonical service ID + location → metadata filter → vector search as fallback → RAG on the shortlist.
Biggest win for me was logging queries that didn’t map cleanly. That’s how the synonym list grows.
Happy to share a schema if helpful.