@Alexandre Ibrahim I have built a basic RAG pipeline recently (n8n, not code) so I can at least walk through the theory even though I went the no-code route rather than raw code. The core steps are the same regardless of language/platform: 1. Chunk the source data — split your text (in your friend's case, LinkedIn profile content) into manageable pieces, not too big or you lose retrieval precision, not too small or you lose context. Common starting point is around 512 tokens with some overlap between chunks. 2. Embed each chunk — run it through an embedding model (OpenAI, Google Gemini, Cohere, etc.) which converts the text into a vector, a list of numbers representing its meaning, not just its literal words. This is the part that lets you match on semantic similarity instead of keyword matching. 3. Store in a vector database — Pinecone, Weaviate, Qdrant, or pgvector (a Postgres extension) if he wants to avoid a separate DB. This is where those vectors get stored, indexed for fast similarity search. 4. Query time — when someone searches, you embed the query the same way, then the vector DB returns the chunks whose vectors are closest (cosine similarity is common), meaning most similar in meaning, not exact text. 5. Optional generation step — if he wants an LLM to synthesize an answer instead of just returning raw matches, you'd feed the retrieved chunks into an LLM as context. For his specific use case (matching LinkedIn profiles to each other, not Q&A), steps 1-4 are really the whole thing, he probably doesn't need step 5 at all, since he's not generating text, just finding semantically similar profiles. In terms of language, Python is by far the most common for building this from scratch (LangChain or LlamaIndex are the usual frameworks people reach for), but it's genuinely just calling APIs for embedding + a vector DB SDK, so it's not deeply "hard code," more plumbing.