These days, most Copilot authors skip Topics and Classic orchestration in favor of Actions and Generative AI orchestration when building Agents in Copilot Studio. It's gotten to the point where many people – even some at Microsoft – will tell you that Topics are a thing of the past. With GenAI automatically identifying and extracting entities from user responses, you may wonder why we should still care about Multi-Entity extraction, a topic related to Topics (no pun intended). But to paraphrase Mark Twain's famous quote, "the reports of Topics' death in Copilot Studio are greatly exaggerated."

While it's true that using Actions – coupled with proper Descriptions and Instructions – will replace what we would do with Topics as recently as the summer of 2024, there will still be times when you will need to create a Topic with Questions and Answers, and you will need to extract entities from the users' Answers.

A poorly composed question and/or a lack of proper understanding of Entities in Copilot Studio can result in an Agent that will ask too many questions, sometimes even asking things that have been answered already. This creates a subpar experience for the user, and you're also burning through messages which drive up the cost of your Agent.

Conversely, a well-designed Agent can intelligently understand a user's response when it contains the answer to more than one question – sometimes a question that hasn't even been asked yet – and skip unneeded questions. This is what you'd call multi-entity extraction.

The Situation:

Let's assume you have a question like “What’s your name?” and a second question like “Where do you live?” If the user’s response to the first question was “I am Tina and I live in Brussels”, a poorly designed Agent would still insist on asking “Where do you live?” instead of intelligently identifying / extracting the second entity and skipping past it.

How can you skip past the second question and save the user from frustration and keep message costs low? (Remember: Copilot Studio capacity is counted in messages. Depending on your plan, you either have 25,000 messages a month included with your paid license, or you pay $0.01 per message. Some responses can cost more than one message)

Here is a detailed explanation with five different scenarios and the outcomes. I think you will find this useful.

As I noted earlier, assume you have two questions in a topic. The first question asks “What’s your name?” and the second question asks “Where do you live?” (see screenshot below)

In the Properties for the second question, under Question Behavior, you have set Skip Behavior to “Allow question to be skipped” (see screenshot below).

Scenario 1:

  • You use a prebuilt entity like "Person's Name" to identify the user response for the first question, and prebuilt entity like "City" to identify the user response to the second question
  • The user responds "I’m Tina and I live in Brussels" to the first question
  • Copilot Studio will intelligently extract Tina as the name, and Brussels as the City and skip the second question, jumping to whatever the next step is after question 2. (see first screenshot above as evidence of this behavior)

Scenario 2:

  • You use the "User’s Entire Response" prebuilt entity to identify the response to the first question "What is your name?", and prebuilt entity like "City" to identify the user response to the second question
  • The user response “I’m Tina and I live in Brussels”.
  • Copilot Studio incorrectly thinks the entire utterance “I’m Tina and I live in Brussels” is the name of the user.
  • It never extracts Tina or Brussels as name and city, and will insist on asking the second question about where you live

Scenario 3:

  • Question 1 uses prebuilt entity "Person's name" but Question 2 uses the prebuilt entity "User's entire response"
  • The user’s response to Question 1 is "I'm Mike and I live in Aberdeen"
  • Copilot Studio will extract Mike as your name, but won't extract Aberdeen as your city.
  • It will insist on asking the second question about where you live.

Scenario 4:

  • Question 1 uses prebuilt entity "Person's name" and Question 2 uses Custom Closed List Entity with 4 possible city choices.
  • User’s response to question 1 includes their name and a city that's one of the 4 possible city choices,
  • Copilot Studio will intelligently extract the name, and the City and skip the second question, jumping to whatever the next step is after question 2.

Scenario 5:

  • Question 1 uses a Custom Closed List Entity with 4 possible choices for Name and Question 2 uses a prebuilt entity like “City”.
  • User’s response to question 1 uses one of the 4 choices for name, and also lists a city
  • Copilot Studio will intelligently extract the name, and the City and skip the second question, jumping to whatever the next step is after question 2.

Basically, the main driver behind when a second question is skipped has to do with the "User's Entire response" prebuilt entity. This entity type has no intelligent extraction unlike other prebuilt entities and custom entities.

Everyone knows we should work smarter, not harder. Even AI Agents benefit from that mindset!