Here's a simple idea: By rephrasing the query, you obtain two questions. One is for cat-related content, and the other is to list animals other than cats. Then, perform a set difference on the retrieved results to get the content you want. Of course, I'm also very interested in how to further optimize this process! :)
If high precision is required, I would suggest introducing an LLM for filtering, rather than reranking (lol), because rerankers also have the embedding issues you mentioned.