<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Joshua Junsu Kim | Engineering Subjectivity: An AI Engineer's Log]]></title><description><![CDATA[Engineering Subjectivity. Documenting my journey of building AI agents that connect fragmented personal records into meaningful human context using Knowledge Gr]]></description><link>https://junsukim.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>Joshua Junsu Kim | Engineering Subjectivity: An AI Engineer&apos;s Log</title><link>https://junsukim.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 05:50:46 GMT</lastBuildDate><atom:link href="https://junsukim.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[The Euclidean Sinkhole: Why Local Dense Vector RAG Fails at Personal Knowledge Sensemaking]]></title><description><![CDATA[Tags: RAG, Vector Database, LLM, GraphRAG, Python, System Architecture


TL;DR
When building Retrieval-Augmented Generation (RAG) systems over personal knowledge archives (like Obsidian vaults or deve]]></description><link>https://junsukim.hashnode.dev/the-euclidean-sinkhole-why-local-dense-vector-rag-fails-at-personal-knowledge-sensemaking</link><guid isPermaLink="true">https://junsukim.hashnode.dev/the-euclidean-sinkhole-why-local-dense-vector-rag-fails-at-personal-knowledge-sensemaking</guid><category><![CDATA[RAG ]]></category><category><![CDATA[vector database]]></category><category><![CDATA[llm]]></category><category><![CDATA[graphrag]]></category><category><![CDATA[Python]]></category><category><![CDATA[System Architecture]]></category><dc:creator><![CDATA[Joshua Junsu Kim]]></dc:creator><pubDate>Mon, 06 Jul 2026 11:59:51 GMT</pubDate><content:encoded><![CDATA[<ul>
<li><strong>Tags</strong>: <code>RAG</code>, <code>Vector Database</code>, <code>LLM</code>, <code>GraphRAG</code>, <code>Python</code>, <code>System Architecture</code></li>
</ul>
<hr />
<h3>TL;DR</h3>
<p>When building Retrieval-Augmented Generation (RAG) systems over personal knowledge archives (like Obsidian vaults or developer diaries), privacy is paramount—ruling out cloud APIs like OpenAI or Claude. To solve this, I built a privacy-preserving local RAG baseline (<code>personal-knowledge-rag-agent</code>) using 4-bit quantized Llama-3, Korean SRoBERTa embeddings, and Facebook's <code>faiss-cpu</code>.</p>
<p>However, deploying this dense vector pipeline exposed the theoretical ceiling of flat Euclidean spaces: <strong>The Euclidean Sinkhole</strong>. In this article, I provide a code-level breakdown of why standard Top-$k$ vector retrieval fails at <strong>context fragmentation</strong>, <strong>multi-hop relational reasoning</strong>, and <strong>macro-level global sensemaking</strong>—and why these empirical failures serve as the exact architectural justification for modern GraphRAG and Graph Neural Networks (GNNs).</p>
<hr />
<h3>1. The Engineering Goal: A Privacy-Preserving Local RAG Baseline</h3>
<p>Personal knowledge vaults contain a developer's most unfiltered cognitive trails: architectural brainstorming, career reflections, project failure notes, and evolving philosophical principles. Sending this proprietary data to external cloud LLM endpoints introduces unacceptable privacy risks and intellectual property leakage.</p>
<p>To build a secure, offline-first cognitive assistant, I engineered an open-source local RAG pipeline in my repository <a href="https://github.com/croooquix/personal-knowledge-rag-agent"><code>personal-knowledge-rag-agent</code></a>.</p>
<h4>The Local System Architecture</h4>
<p>Instead of relying on heavy framework wrappers like LangChain or LlamaIndex, the pipeline is built from scratch using pure PyTorch, Hugging Face Transformers, and FAISS:</p>
<ul>
<li><p><strong>LLM Engine</strong>: 4-bit NF4 quantized Korean Llama-3 (<code>MLP-KTLim/llama-3-Korean-Bllossom-8B</code>) served locally via <code>bitsandbytes</code> and <code>accelerate</code>.</p>
</li>
<li><p><strong>Embedding Model</strong>: Multilingual sentence transformers (<code>jhgan/ko-sroberta-multitask</code> and <code>paraphrase-multilingual-MiniLM-L12-v2</code>).</p>
</li>
<li><p><strong>Vector Store</strong>: In-memory and on-disk exact L2 Euclidean distance indexing via <code>faiss.IndexFlatL2</code>.</p>
</li>
<li><p><strong>Ingestion Pipeline</strong>: Custom regex markdown cleaning (<code>clean_markdown</code>) and token-window slicing via OpenAI's <code>cl100k_base</code> tokenizer (<code>chunk_by_token</code>).</p>
</li>
</ul>
<pre><code class="language-python">import faiss
import torch
from sentence_transformers import SentenceTransformer

# Initialize exact Euclidean distance flat index
dim = 384
index = faiss.IndexFlatL2(dim)

# Encode text chunks and add to local FAISS index
model = SentenceTransformer('jhgan/ko-sroberta-multitask')
embeddings = model.encode(chunks, convert_to_numpy=True)
index.add(embeddings)

# Query time: Single-step geometric nearest neighbor search
query_vec = model.encode([user_query], convert_to_numpy=True)
distances, indices = index.search(query_vec, k=10)
</code></pre>
<p>While this architecture executed flawlessly for simple fact-retrieval (<em>"What terminal command did I use to fix bug X on May 12?"</em>), it suffered catastrophic retrieval degradation when tasked with deeper cognitive sensemaking.</p>
<hr />
<h3>2. Collision with Reality: The Four Bottlenecks of Flat Vector Spaces</h3>
<p>When querying an extensive personal vault over time, I empirically collided with what I call <strong>The Euclidean Sinkhole</strong>—a structural breakdown where flat vector spaces fail to capture relational semantics. This degradation stems from four foundational mathematical limitations:</p>
<pre><code class="language-mermaid">graph TD
    A[Flat Euclidean Vector Space: FAISS IndexFlatL2]
    
    A --&gt;|Slicing by Token Count| B[&lt;b&gt;1. Context Fragmentation&lt;/b&gt;&lt;br&gt;Severed discourse narrative &amp; broken coreference]
    A --&gt;|Geometric Inner Product| C[&lt;b&gt;2. Multi-Hop Blindness&lt;/b&gt;&lt;br&gt;Inability to traverse associative paths A -&gt; B -&gt; C]
    A --&gt;|Localized Top-k Ranking| D[&lt;b&gt;3. Global Synthesis Failure&lt;/b&gt;&lt;br&gt;Cannot answer macro-level thematic evolution]
    A --&gt;|Static Vector Distances| E[&lt;b&gt;4. Semantic Sinkholes&lt;/b&gt;&lt;br&gt;Vocabulary mismatch &amp; subjective ontology drift]
</code></pre>
<h4>A. The Chunking Trap &amp; Context Fragmentation</h4>
<p>To fit text into transformer embedding windows, standard RAG slices documents into fixed 256- or 512-token chunks:</p>
<pre><code class="language-python">def chunk_by_token(text, tokenizer, chunk_size=256):
    tokens = tokenizer.encode(text)
    return [tokenizer.decode(tokens[i:i+chunk_size]) for i in range(0, len(tokens), chunk_size)]
</code></pre>
<p><strong>The Flaw</strong>: Token slicing is semantically blind. If an Obsidian note discusses a critical project decision where the premise is established in Chunk #1 and the conclusion/lesson is recorded in Chunk #2, slicing forcibly severs the causal thread. Once inserted into <code>faiss.IndexFlatL2</code>, Chunk #1 has <strong>zero structural or relational connection</strong> to Chunk #2. The narrative coherence of the document is destroyed.</p>
<h4>B. Multi-Hop Relational Blindness</h4>
<p>Consider a typical cognitive query: <em>"Why did I decide to pivot my engineering focus toward Graph Neural Networks after my internship?"</em> Answering this requires traversing an associative multi-hop chain across separate notes:</p>
<ul>
<li><p><strong>Note A (Internship Log)</strong>: <em>"At FractalFn, CEO Kim emphasized that flat vector retrieval hits a hard recall limit in sparse recommendation domains."</em></p>
</li>
<li><p><strong>Note B (Study Journal)</strong>: <em>"To solve the recall limit Kim mentioned, I started diving deep into Knowledge Graph Attention Networks (KGAT)."</em></p>
</li>
</ul>
<p><strong>The Flaw</strong>: In a flat Euclidean space, retrieval evaluates pairwise geometric distance (\(\vec{q} \cdot \vec{d}_i\)). Because Note A and Note B share almost no overlapping surface vocabulary with the query string, their individual cosine similarity scores fall below the Top-$k$ threshold. Flat vector search cannot perform <strong>spreading activation</strong> or relational path traversal (\(Query \to CEO\ Kim \to Recall\ Limit \to KGAT\)).</p>
<h4>C. Global Sensemaking Failure</h4>
<p>When asked macro-level questions like <em>"How has my philosophy on software architecture evolved over the last 3 years?"</em>, standard Top-$k$ RAG completely collapses.</p>
<p><strong>The Flaw</strong>: Top-$k$ retrieval is designed for localized needle-in-a-haystack lookups. When asked a macro-question, FAISS simply returns 10 disjointed chunks containing the words "philosophy" or "architecture." It lacks the algorithmic machinery to perform <strong>query-focused summarization</strong> across 100+ historical notes.</p>
<h4>D. Vocabulary Mismatch &amp; Semantic Sinkholes</h4>
<p>Over a multi-year personal archive, a developer's internal vocabulary evolves. An early note might use the shorthand <em>"MLP"</em> to mean <em>Multilayer Perceptron</em>, while a later note uses <em>"MLP"</em> to refer to a specific <em>Korean LLM research group</em>. In a static Euclidean vector space, these identical strings collapse into the exact same geometric neighborhood, creating a <strong>semantic sinkhole</strong> that pollutes search results with irrelevant context.</p>
<hr />
<h3>3. Rigorous Algorithmic Diagnosis: Code vs. GraphRAG Theory</h3>
<p>I read the paper <a href="https://arxiv.org/abs/2506.05690">“When to use Graphs in RAG: A Comprehensive Analysis for Graph Retrieval‑Augmented Generation”</a>.</p>
<table>
<thead>
<tr>
<th>Dimension</th>
<th>My Baseline (<code>personal-knowledge-rag-agent</code>)</th>
<th>RAPTOR (Tree Hierarchy)</th>
<th>Microsoft GraphRAG (Community Hierarchy)</th>
<th>HippoRAG / HippoRAG2 (Associative Memory)</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Primary Data Structure</strong></td>
<td><strong>Flat Array &amp; Dict</strong> (<code>faiss.IndexFlatL2</code>, Python <code>dict</code>).</td>
<td><strong>Multi-Resolution Tree</strong> (Leaf chunks + Abstractive root summaries).</td>
<td><strong>Entity-Relation KG</strong> + Claims + Leiden Community Hierarchy.</td>
<td><strong>OpenIE Knowledge Graph (Triples)</strong> + Bipartite Passage Matrix.</td>
</tr>
<tr>
<td><strong>Indexing Algorithm</strong></td>
<td>Token-window slicing (\(\to\)) SBERT embedding (\(\to\)) FAISS L2 insertion.</td>
<td>GMM Soft Clustering on embeddings (\(\to\)) Recursive LLM Summarization.</td>
<td>LLM Entity/Relation Prompting (\(\to\)) Leiden Community Detection.</td>
<td>OpenIE $(u, r, v)$ Triple Extraction (\(\to\)) Bipartite Passage Linking.</td>
</tr>
<tr>
<td><strong>Query Retrieval Mechanism</strong></td>
<td><strong>Single-Step Exact Top-$k$</strong> distance ranking (<code>index.search</code>).</td>
<td><strong>Collapsed Tree Retrieval</strong> across all hierarchical layers simultaneously.</td>
<td><strong>Map-Reduce Synthesis</strong> over hierarchical community reports.</td>
<td><strong>Personalized PageRank (PPR)</strong> spreading activation from query seed nodes.</td>
</tr>
<tr>
<td><strong>Multi-Hop Reasoning</strong></td>
<td>❌ <strong>None</strong>. Limited strictly to direct pairwise vector similarity.</td>
<td>❌ <strong>None</strong> (Relies on hierarchical clustering rather than relational paths).</td>
<td>✅ <strong>Yes</strong>, via community clustering and graph neighborhood traversal.</td>
<td>✅ <strong>Yes</strong>, instantaneous mathematical spreading across multi-hop KG paths.</td>
</tr>
<tr>
<td><strong>Global Sensemaking</strong></td>
<td>❌ <strong>None</strong>. Returns fragmented local chunks; fails on corpus synthesis.</td>
<td>✅ <strong>Yes</strong>, via high-level root/intermediate summary nodes.</td>
<td>✅ <strong>Yes</strong>, explicitly designed for macro-synthesis via Map-Reduce.</td>
<td>❌ <strong>No</strong> (Optimized for multi-hop passage retrieval rather than macro-summarization).</td>
</tr>
</tbody></table>
<p>This comparative matrix reveals a profound engineering truth: <strong>My code was not flawed; it was simply operating at the exact theoretical boundary where Top-$k$ Chunk RAG ends and GraphRAG begins.</strong></p>
<hr />
<h3>4. The Engineering Pivot: Returning to First Principles (Data Structures &amp; Graph Algorithms)</h3>
<p>Empirically colliding with the Euclidean Sinkhole proved that <strong>text is not a collection of independent geometric points; it is an interconnected network of concepts, entities, and causal relationships.</strong></p>
<p>I had reached the hard limits of superficial library-level coding and basic heuristics. I made a deliberate decision to pause feature development and immerse myself in rigorous Data Structures and Algorithms (DSA)—specifically focusing on graph theory, adjacency matrices, tree traversals, and topological network algorithms.</p>
<h3>5. Entering the Math Lab &amp; The National Museum Challenge</h3>
<p>When the new semester began, my deepened obsession with graph topologies led me to join a Mathematics Department Research Lab.</p>
<p>Right as I was diving deep into academic graph theory and network structures in the lab, our research group was tasked with a real-world challenge: building a personalized artifact recommendation system for the National Museum of Korea (국립중앙박물관).</p>
<p>I will take you inside my lab notebooks and research experiments. I will share how we tackled an extreme collaborative filtering sparsity problem by combining my foundational graph studies with Knowledge Graph Attention Networks (KGAT), RotatE embeddings, and Graph Neural Network (GNN) message passing in PyTorch.</p>
<p>👉 <strong>Check out the local RAG baseline implementation here</strong>: <a href="https://github.com/croooquix/personal-knowledge-rag-agent">GitHub - croooquix/personal-knowledge-rag-agent</a></p>
<hr />
<p><em>If you are navigating the transition from Dense Vector RAG to Graph Neural Networks or building local-first AI architectures, let's connect on</em> <a href="https://www.linkedin.com/in/croooquis/"><em>LinkedIn</em></a> <em>or explore my repositories on</em> <a href="https://github.com/croooquix"><em>GitHub</em></a><em>!</em></p>
]]></content:encoded></item><item><title><![CDATA[Spectral Graph Embeddings & Bipartite Bridging: Controlling Data Sparsity Without LLM Semantic Drift]]></title><description><![CDATA[Tags: Machine Learning, NLP, Graph Theory, Linear Algebra, Python, Data Science


TL;DR
In specialized or small-scale text domains (like personal knowledge vaults or domain-specific Korean corpora), t]]></description><link>https://junsukim.hashnode.dev/spectral-graph-embeddings-bipartite-bridging-controlling-data-sparsity-without-llm-semantic-drift</link><guid isPermaLink="true">https://junsukim.hashnode.dev/spectral-graph-embeddings-bipartite-bridging-controlling-data-sparsity-without-llm-semantic-drift</guid><category><![CDATA[Machine Learning]]></category><category><![CDATA[nlp]]></category><category><![CDATA[graph theory]]></category><category><![CDATA[linear algebra ]]></category><category><![CDATA[Python]]></category><category><![CDATA[Data Science]]></category><dc:creator><![CDATA[Joshua Junsu Kim]]></dc:creator><pubDate>Mon, 06 Jul 2026 11:28:30 GMT</pubDate><content:encoded><![CDATA[<ul>
<li><strong>Tags</strong>: <code>Machine Learning</code>, <code>NLP</code>, <code>Graph Theory</code>, <code>Linear Algebra</code>, <code>Python</code>, <code>Data Science</code></li>
</ul>
<hr />
<h3>TL;DR</h3>
<p>In specialized or small-scale text domains (like personal knowledge vaults or domain-specific Korean corpora), traditional word co-occurrence matrices suffer from extreme sparsity (&gt;99% zero values). When dealing with Out-of-Vocabulary (OOV) terms, many modern engineers reflexively reach for black-box Large Language Models (LLMs). However, relying on external LLMs introduces <strong>semantic drift</strong>, overwriting idiosyncratic domain subjectivity with generic web-scale averages.</p>
<p>In this article, I demonstrate why classical <strong>Positive Pointwise Mutual Information (PPMI)</strong> and <strong>Truncated Singular Value Decomposition (SVD)</strong> are mathematically identical to <strong>Spectral Graph Embedding</strong> over weighted lexical adjacency matrices. Furthermore, I share an open-source architecture (<code>Bridging-word-embedding-korean</code>) that solves extreme OOV sparsity by constructing a <strong>Bipartite Bridge Graph</strong> using 2-hop indirect search—preserving 100% of domain subjectivity without a single neural parameter.</p>
<hr />
<h3>1. The Bottleneck: Why Small Corpora Break Standard Embeddings</h3>
<p>When building natural language processing pipelines over small, specialized datasets—such as personal Obsidian vaults, legal archives, or domain-specific Korean literature—engineers immediately collide with the <strong>curse of dimensionality and data sparsity</strong>.</p>
<p>In a symmetric sliding window of size $W$, the lexical co-occurrence matrix \(X \in \mathbb{R}^{V \times V}\) captures how often word $i$ appears alongside word $j$. In web-scale training sets (like Common Crawl or Wikipedia), this matrix is dense enough to train parametric models like Word2Vec or FastText. However, in small or specialized domain corpora:</p>
<ol>
<li><p><strong>Hyper-Sparsity</strong>: Over 99% of the entries in $X$ are exactly zero.</p>
</li>
<li><p><strong>High Statistical Variance</strong>: Raw co-occurrence counts are heavily skewed by high-frequency hub words (grammatical particles, conjunctions, and general nouns), masking true semantic relationships.</p>
</li>
<li><p><strong>The OOV Trap</strong>: When a query contains a domain-specific term absent from the vocabulary (\(q \notin \mathcal{V}_{\text{main}}\)), standard vector lookup fails completely.</p>
</li>
</ol>
<p>If you attempt to solve OOV sparsity by prompting an external LLM (e.g., GPT-4) to rephrase or embed the query, you encounter <strong>Semantic Drift</strong>. For example, in a personal engineering vault, the term <em>"Apple"</em> might exclusively refer to UI/UX design philosophy or hardware architecture. An external LLM, biased by global training distributions, will inevitably drag the semantic representation toward fruit or general stock market context, destroying the user's subjective ontology.</p>
<hr />
<h3>2. The Mathematical Insight: Matrix Factorization IS Graph Embedding</h3>
<p>To overcome sparsity while strictly preserving domain subjectivity, we must step back from black-box neural networks and examine the linear-algebraic foundation of lexical spaces.</p>
<p>In graph theory, a word co-occurrence matrix $X$ is not merely a table of counts; <strong>it is the exact Weighted Adjacency Matrix of an undirected lexical graph \(G = (\mathcal{V}, \mathcal{E})\)</strong>, where vertices \(\mathcal{V}\) are vocabulary terms and edge weights \(X_{i,j}\) represent co-occurrence frequency.</p>
<h4>A. PPMI as Modularity Normalization</h4>
<p>Raw adjacency weights are biased toward high-degree hub nodes. To normalize this graph, we compute <strong>Positive Pointwise Mutual Information (PPMI)</strong>:</p>
<p>$$\text{PMI}(w_i, w_j) = \ln \left( \frac{P(w_i, w_j)}{P(w_i) \cdot P(w_j)} \right) = \ln \left( \frac{X_{i,j} \cdot N}{\sum_k X_{i,k} \cdot \sum_k X_{k,j}} \right)$$</p>
<p>$$\text{PPMI}(w_i, w_j) = \max(\text{PMI}(w_i, w_j), 0)$$</p>
<p>In network science, this transformation is analogous to computing modularity matrices on graph edges—measuring how much more frequently two vertices connect than expected by random chance under a null independence model.</p>
<h4>B. Truncated SVD as Spectral Graph Representation Learning</h4>
<p>Once we have the normalized graph adjacency matrix \(M \in \mathbb{R}^{V \times V}\), we apply <strong>Truncated Singular Value Decomposition (SVD)</strong> to factorize \(M \approx U \Sigma V^T\) into rank \(k=200\):</p>
<pre><code class="language-python">from scipy import sparse
from sklearn.decomposition import TruncatedSVD
from sklearn.preprocessing import normalize

# M is the sparse PPMI coordinate matrix (scipy.sparse.csr_matrix)
svd = TruncatedSVD(n_components=200, n_iter=7, random_state=42)
U = svd.fit_transform(M)

# L2 Row-Normalization onto the unit hypersphere
embeddings = normalize(U, axis=1)
</code></pre>
<p>Why is this step so critical? In graph theory, eigenvalue decomposition of a Graph Laplacian embeds vertices into a low-dimensional Euclidean space that preserves topological neighborhood structure. <strong>Truncated SVD on the PPMI adjacency matrix is mathematically identical to Spectral Graph Embedding.</strong></p>
<p>By discarding lower singular values associated with random noise, Truncated SVD acts as an optimal low-rank regularizer. It mathematically imputes latent semantic relationships between words that never explicitly appeared together in the same window—capturing 2nd-order and 3rd-order paths in the co-occurrence graph (\(u \to k \to v\)). This closed-form linear-algebraic pipeline deterministicly solves co-occurrence sparsity without requiring neural backpropagation.</p>
<hr />
<h3>3. The Architecture: Bipartite Graph Bridging for OOV Terms</h3>
<p>What happens when an Out-of-Vocabulary query $q$ occurs? To avoid LLM semantic drift, I engineered a <strong>Bipartite Bridge Graph</strong> architecture in my open-source repository <a href="https://github.com/croooquix/Bridging-word-embedding-korean"><code>Bridging-word-embedding-korean</code></a>.</p>
<p>Instead of replacing the internal vector space, the system loads an external open-domain graph (\(G_{\text{ext}}\), e.g., Korean FastText crawl vectors) alongside the subjective internal graph (\(G_{\text{main}}\)) and establishes a controlled bridging protocol:</p>
<pre><code class="language-mermaid">graph LR
    subgraph External Graph Space [G_ext: FastText Open-Domain]
        Q[OOV Query: q] --&gt;|1-Hop NN| W1[Neighbor w1]
        W1 --&gt;|2-Hop NN&lt;br&gt;Penalty x0.8| W2[Neighbor w2]
    end
    
    subgraph Internal Subjective Vault [G_main: Personal Corpus]
        W1 -.-&gt;|Direct Intersection| V1[Proxy Word in Vault]
        W2 -.-&gt;|Indirect Intersection| V2[2-Hop Proxy in Vault]
    end
</code></pre>
<h4>The Iterative $k$-Expansion &amp; 2-Hop Algorithm</h4>
<ol>
<li><p><strong>Iterative Neighborhood Expansion</strong>: When $q \notin \mathcal{V}<em>{\text{main}}$, the system queries $G</em>{\text{ext}}$ for nearest neighbors $\text{NN}<em>{\text{ext}}(q)$, exponentially expanding search radius $k \in {10, 20, 40, 80, 160}$ until it finds intersection candidates present in $\mathcal{V}</em>{\text{main}}$.</p>
</li>
<li><p><strong>2-Hop Indirect Graph Search</strong>: If direct 1-hop intersection yields fewer than 5 candidates, the algorithm initiates a 2-hop traversal across the external graph adjacency matrix:</p>
<ul>
<li><p>Find \(w_1 \in \text{NN}_{\text{ext}}(q)\)</p>
</li>
<li><p>Find $w_2 \in \text{NN}<em>{\text{ext}}(w_1) \cap \mathcal{V}</em>{\text{main}}$</p>
</li>
<li><p>Apply a multiplicative distance decay penalty to reflect graph path attenuation: $$\text{score}(q, w_2) = \text{sim}<em>{\text{ext}}(q, w_1) \times \text{sim}</em>{\text{ext}}(w_1, w_2) \times 0.8$$</p>
</li>
</ul>
</li>
<li><p><strong>Human-in-the-Loop Proxy Mapping</strong>: The highest-scoring candidate proxy words ($w_{\text{proxy}} \in \mathcal{V}<em>{\text{main}}$) are presented to the user. Once confirmed, the bipartite mapping $(q \to w</em>{\text{proxy}})$ is persistently cached in <code>bridge_corpus.json</code>, and the system performs internal retrieval using the proxy vector.</p>
</li>
</ol>
<hr />
<h3>4. Why This Matters for Systems Engineering</h3>
<p>By recognizing that lexical matrices are weighted graph adjacency matrices, we unlock three major engineering advantages:</p>
<ul>
<li><p><strong>Zero Semantic Drift</strong>: Domain-specific subjectivity and idiosyncratic definitions remain 100% intact, insulated from web-scale LLM averages.</p>
</li>
<li><p><strong>Extreme Computational Efficiency</strong>: Truncated SVD and dot-product cosine similarity over L2-normalized 200-dimensional vectors execute in milliseconds on a single CPU core, requiring zero GPU VRAM or cloud API tokens.</p>
</li>
<li><p><strong>Full Mathematical Interpretability</strong>: Unlike black-box neural embeddings, every dimension and similarity score can be traced directly back to exact statistical co-occurrence paths in the underlying graph.</p>
</li>
</ul>
<h3>What’s Next in Part 2?</h3>
<p>While Spectral Graph Embeddings solve lexical level sparsity and OOV bridging, what happens when we scale up from word-level associations to document-level retrieval over entire note vaults?</p>
<p>In <strong>Part 2 of this series (<em>The Euclidean Sinkhole</em>)</strong>, I will break down why traditional Top-$k$ Dense Vector RAG pipelines—even when powered by quantized LLMs and FAISS indexing—hit a theoretical brick wall when tasked with multi-hop relational reasoning or global thematic synthesis across personal knowledge archives.</p>
<p>👉 <strong>Check out the full open-source implementation here</strong>: <a href="https://github.com/croooquix/Bridging-word-embedding-korean">GitHub - croooquix/Bridging-word-embedding-korean</a></p>
<hr />
<p><em>If you are working on graph representation learning, information retrieval, or RAG architectures, connect with me on</em> <a href="https://www.linkedin.com/in/croooquis/"><em>LinkedIn</em></a> <em>or follow my work on GitHub!</em></p>
]]></content:encoded></item></channel></rss>