So, it seems adaptive cards actually support a filtered search experience. I don't know if there's a limit on the number of choices, but it seems it would be worthwhile to test this:

{
"type": "AdaptiveCard",
"body": [
{
"type": "Input.ChoiceSet",
"id": "choices",
"style": "filtered",
"choices": [
{
"title": "Option 1",
"value": "option1"
},
{
"title": "Option 2",
"value": "option2"
},
{
"title": "Option 3",
"value": "option3"
},
{
"title": "Option 4",
"value": "option4"
},
{
"title": "Option 5",
"value": "option5"
},
{
"title": "Option 6",
"value": "option6"
},
{
"title": "Option 7",
"value": "option7"
},
{
"title": "Option 8",
"value": "option8"
},
{
"title": "Option 9",
"value": "option9"
},
{
"title": "Option 10",
"value": "option10"
},
{
"title": "Option 11",
"value": "option11"
},
{
"title": "Option 12",
"value": "option12"
},
{
"title": "Option 13",
"value": "option13"
},
{
"title": "Option 14",
"value": "option14"
},
{
"title": "Option 15",
"value": "option15"
},
{
"title": "Option 16",
"value": "option16"
},
{
"title": "Option 17",
"value": "option17"
},
{
"title": "Option 18",
"value": "option18"
},
{
"title": "Option 19",
"value": "option19"
},
{
"title": "Option 20",
"value": "option20"
}
]
}
],
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.6"
}