OptiX doesn’t provide any features for animation aside from motion blur. The easiest thing to do is what you suspect - allow each character to be instanced as a separate copy.
Do you have targets or a budget for how much memory you can use, how many characters and animations you want to support, or how fast it needs to run? My general advice might be to at least try out evaluating separate instances before trying something trickier, unless you’re certain that it won’t fit in your budget.
I can imagine a couple of (probably obvious) general ideas that might help you, depending on what tradeoffs you can make-
If you have more characters than you have total animation frames, and if you have enough memory space, then you could pre-bake the animated pose for each frame into a separate GASes, and use the corresponding GAS each frame instead of evaluating your character rig. This would be very compute efficient, but is still memory inefficient.
If you have multiple characters animating at the same pose, you could evaluate the pose once, build a single GAS for that subset of characters, and instance it in your IAS. So basically, track all the groups of characters that are playing the same animation and share computation and GAS memory between them.