Is there are nice way to prove the primitive element theorem without using field extensions?

The primitive element theorem says that if $x$ and $y$ are algebraic over $F$ and $y$ is separable over $F$, then there exists a $z \in F(x,y)$ such that $F(x,y) = F(z)$. In the case where $F$ is infinite, $z$ can be expressed in the form $x + {\lambda}y$ with $\lambda \in F$. In fact, almost any $\lambda$ will do. There are only a finite number of exceptions. These exceptions are $\frac{\alpha_i - x}{y - \beta_j}$ where $\alpha_i$ and $\beta_j$ range over the (other) roots of the minimal polynomials of $x$ and $y$ respectively.

But in order to talk about $\alpha_i$ and $\beta_j$ we need to build a field extension where the minimal polynomials of $x$ and $y$ split. This is the step I'm hoping to avoid.

Perhaps we can build a polynomial in $F[x]$ whose roots are $\frac{\alpha_{i_1} - \alpha_{i_2}}{\beta_{j_1} - \beta_{j_2}}$ and simply avoid picking $\lambda$s which are roots of this polynomial, and then use whatever properties this polynomials has to prove that this works.

Or maybe there is another completely different way of proving the primitive element theorem while avoiding building field extensions.

I found a nice proof that $x$ is separable over $F$ if and only if every $y \in F(x)$ is separable over $F$ that avoids building field extensions. It uses derivations instead. Now I'm hoping to do the same with the primitive element theorem.

Edit: I'll try to give some motivation. Adding roots of polynomials to fields in constructive mathematics is more difficult than in classical mathematics (because irreducibility is undecidable). It only works for countable fields, and then you have no guarantee that the original field will be a decidable subset of the new field. Yes, it can be done, but it seems like a pain. There is another way too using double negation translations, but it also seems like a pain. Instead I'd rather avoid the whole issue of *building* splitting fields, if I can, and it seems tantalizingly close to possible. After all, the only reason splitting fields are used here is to build a finite set of elements *in the base field* to avoid.