As a person that has trained interns, there are a few problems I see with your setup.

First and foremost, you can forget about an intern knowing anything. It's just safer that way. Assume they can't work notepad and start there. Remember they are there to learn. Expecting them to know something is, at least in my experience, unrealistic.

Second, your not compensating them. I don't mean pay. Unpaid internships are fine if the interns think they are getting something in return for their time. Usually this is "experience" and "education". Try to spend some time talking about what they are learning and why.

Think Karate Kid. Sure Mr. Miyagi seemed to be getting free work, and sure the karate kid got upset about it. Till Mr Miyagi showed him "Paint the fence" and "Wax the car" actually had value. You need to do the same. Show that your tasks are actually having value.

Assign the crap tasks. Interns usually complain that they get the low end, crap tasks. And it's true. And it's right for them to complain, and it's right for you to keep assigning the crap tasks. Think about tasks they can do, that are close to what they want to do, that will free up your time. Ask them to do a code review. Ask them to slog through 10,000 lines of code and look for undocumented methods, then to try and document them. Ask them to check down button placements and other crap tasks that are important, but not critical and free up your time. Now that doesn't mean they shouldn't have value. Remember "Paint the Fence". As they get better at the crap tasks extend their work load to have less crap tasks. The ones that are doing well, give more interesting tasks. And I mean at the start these may be some horrid tasks. Have them check the code for the proper amount of spacing. Or have them write a setup script for a new dev VM that works from start to finish. If you are focusing on git have them run git gc The important part here is use them to free time for your more valuable team members, but keep in mind "Paint the Fence" it needs to have some value later.

You need to make your interactions more educational. Spend 70% of the time with them teaching and 10% producing. That other 20% just loose. There are a lot of tools for this. But teach, teach, teach. Think of intern doctors. How many times have to seen an intern doctor do anything. More often then not they just stand there watching. Sometimes they may "try" something low level like stitching a cut. But they are never left on their own to do their main field. That surgical intern may spend 6 weeks watching and shaving parts before surgery. Programming interns are much the same.

Know what you can promise and when to promise it. Usually when we get a good intern in the mix there is some chance to bring them on-board permanently. Make that decision in the back end, then inform them. You can even work it like a PIP. In order for us to hire you, you need to get better in these areas. I am assigning you some project work in these areas. Are you interested?

Finally, notice a lost cause. No mater what you do, some interns are just gonna suck. If you can, drop them from the team. If you can't, then assign them to watching the mail box and bringing you anything that come in. When you started you should have asked what each intern wants to achieve. If you work with them in that direction 90% will have at least enough value to be worth teaching. Keep in mind that you may get some crazy answers. Work with it. Have an intern that wants to do Project management, and just wanted to see how developers work, awesome, assign them tasks that interact with project management. Have a intern that needed hours to get his credits and doesn't give a crap, fine, use him to do non-project tasks, like schedule meetings and take calls.