Learn Embeddings by Building a Resume-to-Project Matcher A developer demonstrates how to build a resume-to-project matcher using cosine similarity on fixed embedding vectors, teaching the mechanics of vector normalization, scoring, and ranking. The example uses synthetic data to illustrate failure cases and emphasizes that embeddings should support discovery, not automated hiring decisions. The lesson is independent of the developer's contribution to the MonkeyCode project. Embedding demos often jump from text to a magical list of “similar” results. A tiny matcher makes the missing steps visible: normalize vectors, compute scores, rank candidates, and inspect failure cases. This example uses fixed vectors so it runs without an API key. python import numpy as np resume = np.array 0.8, 0.6, 0.1, 0.0 projects = { "accessible React dashboard": np.array 0.7, 0.7, 0.1, 0.0 , "Kubernetes cost monitor": np.array 0.1, 0.2, 0.8, 0.6 , "Python retrieval tutorial": np.array 0.4, 0.4, 0.5, 0.1 , } def unit vector : length = np.linalg.norm vector if length == 0: raise ValueError "zero vector has no cosine direction" return vector / length query = unit resume ranking = sorted name, float query @ unit vector for name, vector in projects.items , key=lambda item: item 1 , reverse=True, for name, score in ranking: print f"{score:.3f} {name}" Expected first result: 0.990 accessible React dashboard Cosine similarity measures direction, not truth, skill level, interest, availability, or fairness. The four coordinates above have no real semantic meaning; they make the math reproducible. In a real system, one embedding model creates all vectors, and you must record its exact name and version. Create 20 project descriptions and five synthetic resumes. Before running retrieval, label which projects are relevant and why. Then calculate recall at 3: how many labeled relevant projects appear in the first three results? Inspect misses for vocabulary, language, seniority, negation, and overemphasis on prestigious terms. Do not use demographic attributes. For hiring, embeddings should support discovery rather than make employment decisions; candidates need meaningful review and correction paths. Try removing normalization and observe how vector magnitude changes ranking. Add a zero vector to verify the explicit failure. Compare two model versions using the same labeled set rather than choosing the one with a nicer demo. The public MonkeyCode repository https://github.com/chaitin/MonkeyCode describes project requirements, AI tasks, and model management. Embedding-based discovery could be relevant around repositories or tasks, but this teaching example is not a MonkeyCode feature claim or integration. Disclosure: I contribute to the MonkeyCode project. The lesson and vectors are independent; product context is based on public documentation. Nearest-neighbor search is easy to run. The useful learning begins when you define what “relevant” means and measure the misses.