These two sequence numbers help avoid looping and stale routes in the route discovery process. They act as a time-reference (using it for a lack of b identifier for the originator of RREQ and the intended receiver (destination) of the RREQ. Since they act as a time-reference for different nodes, there is no duplication!
The RREQ ID (let us seqA) identifies the originator of the RREQ packet (let us say nodeA). Other nodes that receive the RREQ can learn a route to the originator and mark that with seqA. Now, if these nodes were to receive any route update for nodeA, then they would compare the sequence number in that packet against seqA -- if it is lower, then they would discard it.
The destination sequence number (let us say seqB) helps identify the destination node for which we are sending the RREQ (let us say nodeB). It is possible that other nodes in the path may already have a route for nodeB along with an associated sequence number. If seqB is higher than the associated sequence number, then these intermediate devices would know that nodeA is looking for a newer route and would not reply to that.
Your closely is perhaps similar to an earlier question: AODV sequence numbers and loop prevention