<?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" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[vandriichuk’s Substack]]></title><description><![CDATA[My personal Substack]]></description><link>https://substack.vandriichuk.com</link><image><url>https://substackcdn.com/image/fetch/$s_!cbfq!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F107ea15a-a7bd-425d-8f8e-01d83d4fe6b5_144x144.png</url><title>vandriichuk’s Substack</title><link>https://substack.vandriichuk.com</link></image><generator>Substack</generator><lastBuildDate>Sat, 09 May 2026 13:39:05 GMT</lastBuildDate><atom:link href="https://substack.vandriichuk.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[vandriichuk]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[vandriichuk@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[vandriichuk@substack.com]]></itunes:email><itunes:name><![CDATA[vandriichuk]]></itunes:name></itunes:owner><itunes:author><![CDATA[vandriichuk]]></itunes:author><googleplay:owner><![CDATA[vandriichuk@substack.com]]></googleplay:owner><googleplay:email><![CDATA[vandriichuk@substack.com]]></googleplay:email><googleplay:author><![CDATA[vandriichuk]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[From Twilio Webhooks to LiveKit Agents: How a Client's Insistence Led to a Better Architecture]]></title><description><![CDATA["You were right. What do we do next?" How a client insisted on the wrong architecture &#8212; and why letting him was the right call]]></description><link>https://substack.vandriichuk.com/p/from-twilio-webhooks-to-livekit-agents</link><guid isPermaLink="false">https://substack.vandriichuk.com/p/from-twilio-webhooks-to-livekit-agents</guid><dc:creator><![CDATA[vandriichuk]]></dc:creator><pubDate>Thu, 26 Mar 2026 09:03:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!dw49!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc844e75-dfd6-46ae-a771-5a24b50c41a4_2752x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dw49!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc844e75-dfd6-46ae-a771-5a24b50c41a4_2752x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dw49!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc844e75-dfd6-46ae-a771-5a24b50c41a4_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!dw49!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc844e75-dfd6-46ae-a771-5a24b50c41a4_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!dw49!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc844e75-dfd6-46ae-a771-5a24b50c41a4_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!dw49!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc844e75-dfd6-46ae-a771-5a24b50c41a4_2752x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dw49!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc844e75-dfd6-46ae-a771-5a24b50c41a4_2752x1536.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dc844e75-dfd6-46ae-a771-5a24b50c41a4_2752x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8391836,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://substack.vandriichuk.com/i/192184797?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc844e75-dfd6-46ae-a771-5a24b50c41a4_2752x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dw49!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc844e75-dfd6-46ae-a771-5a24b50c41a4_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!dw49!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc844e75-dfd6-46ae-a771-5a24b50c41a4_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!dw49!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc844e75-dfd6-46ae-a771-5a24b50c41a4_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!dw49!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc844e75-dfd6-46ae-a771-5a24b50c41a4_2752x1536.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>There are calls you remember.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://substack.vandriichuk.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">vandriichuk&#8217;s Substack is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>This was one of them.</p><p>A few weeks ago, a client called and said the sentence I&#8217;d been expecting since the project started: &#8220;You were right. What do we do next?&#8221;</p><p>To explain why that mattered, I need to start from the beginning.</p><h3>How it started</h3><p>The client came with a specific ask: build a phone ordering AI for a pizza restaurant in New Jersey. Forty to sixty calls every evening. The owner was answering the phone himself instead of running the kitchen. Orders were getting lost during peak hours.</p><p>The technical spec was clear: Twilio Voice API, webhooks, Node.js. Standard stack. He&#8217;d seen similar setups before and knew what he wanted.</p><p>I had experience with this type of system. I told him upfront: webhook architecture introduces 1.5 to 2 seconds of latency per conversational turn. In a chat interface, that&#8217;s manageable. On a phone call, it feels like a dropped line. I recommended a streaming approach instead.</p><p>He listened and said: I understand your reasoning, but I want to see it for myself. Build it the way I&#8217;m asking.</p><h3>The first version: exactly what he asked for</h3><p>I could have pushed back harder. Instead I made a different call: if he needs to see it to believe it, let him see it. That&#8217;s more honest than winning an argument by authority.</p><p>I built the webhook pipeline exactly to spec. Twilio captures the call, sends audio to our server, Deepgram transcribes it, GPT generates a response, Amazon Polly converts it back to speech, TwiML returns it to the customer. Six services in sequence.</p><p>We ran the test calls. Here&#8217;s what a typical exchange looked like:</p><p><em>&#8220;I&#8217;d like two cheese pizzas.&#8221;</em></p><p><em>[1.9 seconds of silence]</em></p><p><em>&#8220;Great, two cheese pizzas. Anything else?&#8221;</em></p><p><em>&#8220;Yeah, and also&#8212;&#8221; [system cuts off mid-sentence]</em></p><p><em>[2.1 seconds of silence]</em></p><p><em>&#8220;I&#8217;m sorry, I didn&#8217;t catch that. Could you repeat?&#8221;</em></p><p>Pass rate: 68%. One in three orders had errors.</p><p>I sent him the call recordings and the numbers. No commentary.</p><h3>&#8220;You were right. What do we do next?&#8221;</h3><p>That&#8217;s the call I&#8217;ll remember.</p><p>Not because I&#8217;d been right. Because of what it changed. From that point on, the client stopped issuing technical directives and started asking questions. We started working like actual partners.</p><p>I suggested trying the OpenAI Realtime API &#8212; a bidirectional WebSocket that handles speech recognition, language model, and voice synthesis in a single streaming pipeline. No sequential processing. Natural barge-in support. The kind of UX that actually feels like a conversation.</p><p>The quality was immediately better. 96.6% order completion rate, zero barge-in issues, calls thirty seconds shorter. He listened to the test recordings and was happy.</p><p>Then I looked at the bill. $0.82 per call.</p><p>At fifty calls a day, that&#8217;s $1,230 a month &#8212; more expensive than hiring a part-time employee. His target was $0.08 to $0.12 per call.</p><p>I called him again. &#8220;Quality is great. Cost is seven to ten times your budget. Give me more time &#8212; I want to try a third approach.&#8221;</p><p>This time he said simply: &#8220;Okay. Do what you think is right.&#8221;</p><h3>The third version: what actually works</h3><p>The insight was straightforward: the Realtime API sells convenience &#8212; one pipeline, one API key. You&#8217;re paying for the integration, not the raw compute. If you unbundle the pipeline and pick the best provider for each component separately, you can get the same quality for significantly less.</p><p>I rebuilt the system on LiveKit: Deepgram for speech recognition with custom keyterms boosting the restaurant&#8217;s specific menu vocabulary, GPT-5.4-mini for the language model (not a reasoning model &#8212; voice AI needs speed, not deliberation), Cartesia for speech synthesis with low latency and emotion control.</p><p>The most important architectural decision: take flow control away from the LLM entirely.</p><p>Earlier versions let the model manage the conversation. Even with careful prompting, it would occasionally skip confirmation steps, ask for the customer&#8217;s name before confirming the order, or once add an item to the cart that didn&#8217;t exist on the menu. A prompt is an instruction. It&#8217;s not a contract.</p><p>The production system uses a deterministic phase machine for flow control &#8212; a pure function that takes the current order state and returns the current phase and what transitions are allowed. The model&#8217;s job is limited to one thing: understand what the customer said and call the right tool. Everything else is handled by code that&#8217;s testable and predictable.</p><p>Result: $0.096 per call. 100% order completion on the latest test rounds. Calls averaging 55 seconds instead of over two minutes.</p><h3>What I took away from this</h3><p>Sometimes the best way to move a client forward is to let them arrive at the conclusion themselves. Not because you need the satisfaction of being right &#8212; but because the experience changes something that an argument can&#8217;t.</p><p>After that first version, the client became an ally. We stopped spending energy on disagreement and put it into the work instead.</p><p>It cost a few weeks and three complete architecture rewrites. But it ended with a system in production, a client who trusts the process, and a working relationship that&#8217;s genuinely collaborative.</p><p>I&#8217;ve documented the full technical architecture &#8212; cost breakdown, component selection rationale, the phase machine design &#8212; in my guide to building AI systems in production. If you&#8217;re working on something similar, it&#8217;s here: <a href="https://gazolinpro.gumroad.com/l/ai_in_production_the_real_guide_rus_full?_gl=1*1quv151*_ga*MTA1NDA0MTE0OC4xNzQ3NDkzNDI4*_ga_6LJN6D94N6*czE3NzQ1MTM3NTMkbzcwOSRnMSR0MTc3NDUxNTU1NSRqNjAkbDAkaDA.">[Gumroad]</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://substack.vandriichuk.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">vandriichuk&#8217;s Substack is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The Evolution of Data Ingestion in AWS Bedrock Knowledge Base]]></title><description><![CDATA[How I sped up indexing, removed blocking, and made the UX sane]]></description><link>https://substack.vandriichuk.com/p/the-evolution-of-data-ingestion-in</link><guid isPermaLink="false">https://substack.vandriichuk.com/p/the-evolution-of-data-ingestion-in</guid><dc:creator><![CDATA[vandriichuk]]></dc:creator><pubDate>Tue, 18 Nov 2025 13:22:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xYNA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f63378e-8546-4d12-9f2b-689e18ef2477_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xYNA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f63378e-8546-4d12-9f2b-689e18ef2477_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xYNA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f63378e-8546-4d12-9f2b-689e18ef2477_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!xYNA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f63378e-8546-4d12-9f2b-689e18ef2477_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!xYNA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f63378e-8546-4d12-9f2b-689e18ef2477_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!xYNA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f63378e-8546-4d12-9f2b-689e18ef2477_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xYNA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f63378e-8546-4d12-9f2b-689e18ef2477_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f63378e-8546-4d12-9f2b-689e18ef2477_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2225832,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://substack.vandriichuk.com/i/179244871?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f63378e-8546-4d12-9f2b-689e18ef2477_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xYNA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f63378e-8546-4d12-9f2b-689e18ef2477_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!xYNA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f63378e-8546-4d12-9f2b-689e18ef2477_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!xYNA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f63378e-8546-4d12-9f2b-689e18ef2477_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!xYNA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f63378e-8546-4d12-9f2b-689e18ef2477_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Let me start with why we decided to use AWS Bedrock Knowledge Base in the first place. Our original plan was to upload documents directly to Bedrock and work with them as-is. But there was a hard limit we couldn&#8217;t ignore: Bedrock does not accept files larger than 5 MB.</p><p>Our client needed to upload documents up to 50 MB. Splitting or recompressing them would only create more complexity. The cleaner solution was to use the Knowledge Base as a place to store and index large documents, and then let Bedrock work with the resulting chunks.</p><p>Once we made that shift, the main challenge became speed and stability of indexing. That led us to rethink the entire ingestion flow.</p><div><hr></div><h2>The old way: StartIngestionJob</h2><h3>Blocking behavior, full-bucket rescans, and a clunky UX</h3><p>The old flow looked simple but was far from efficient:</p><ol><li><p>Upload a file to S3.</p></li><li><p>Run StartIngestionJob.</p></li><li><p>The job rescans the entire bucket.</p></li><li><p>The KB stays blocked until the job finishes.</p></li></ol><p>The issues were obvious:</p><ul><li><p>The whole KB gets blocked during indexing.</p></li><li><p>The entire bucket is scanned even if you add just one new file.</p></li><li><p>Users have to wait 3&#8211;5 minutes.</p></li><li><p>No visibility into the status of individual files.</p></li><li><p>Documents get reindexed even if nothing changed.</p></li></ul><p>Fine for a prototype, painful for a real product.</p><div><hr></div><h2>The new way: IngestKnowledgeBaseDocuments</h2><h3>Fast, granular, non-blocking indexing</h3><p>Switching to IngestKnowledgeBaseDocuments changed everything. Now:</p><ol><li><p>Upload the file to S3.</p></li><li><p>Send it directly for indexing.</p></li><li><p>The KB stays available.</p></li><li><p>Only that specific file is indexed.</p></li></ol><p>The benefits are immediate:</p><ul><li><p>Multiple files can be indexed in parallel.</p></li><li><p>Indexing starts instantly, without waiting for a job.</p></li><li><p>The user can keep working.</p></li><li><p>Each file has its own status.</p></li><li><p>No full-bucket rescans.</p></li></ul><p>The system went from &#8220;heavy and slow&#8221; to something much closer to real-time.</p><div><hr></div><h2>Custom metadata: the backbone of multi-tenancy</h2><p>To support multiple users on a single KB index, each document gets a metadata block:</p><pre><code><code>{
  userId: &#8220;user-email@example.com&#8221;,
  fileName: &#8220;report.pdf&#8221;,
  fileHash: &#8220;sha256-hash&#8221;,
  uploadedAt: &#8220;2024-01-15T10:30:00Z&#8221;,
  fileSize: 5242880,
  contentType: &#8220;application/pdf&#8221;
}
</code></code></pre><p>This solves several problems at once:</p><ul><li><p>Every user sees only their own documents.</p></li><li><p>Filtering with userId + fileName keeps results precise.</p></li><li><p>We track who uploaded what and when.</p></li><li><p>fileHash prevents duplicate indexing.</p></li><li><p>Search becomes more relevant.</p></li></ul><p>Example filter:</p><pre><code><code>const filter = {
  andAll: [
    { equals: { key: &#8220;userId&#8221;, value: { stringValue: &#8220;user@example.com&#8221; } } },
    { equals: { key: &#8220;fileName&#8221;, value: { stringValue: &#8220;contract.pdf&#8221; } } }
  ]
};
</code></code></pre><div><hr></div><h2>Tricks that improved speed and UX</h2><h3>A. Batching: up to 10 documents per request</h3><pre><code><code>const batches = chunk(files, 10);
for (const batch of batches) {
  await ingestDocumentsBatch(batch);
}
</code></code></pre><p>Fewer API calls, faster throughput, AWS limits respected.</p><div><hr></div><h3>B. Caching file status</h3><p>Avoids reindexing a document if it&#8217;s already indexed:</p><pre><code><code>const cache = new Map&lt;fileHash, {
  s3Key: string,
  indexed: boolean,
  checkedAt: timestamp
}&gt;();
</code></code></pre><p>TTL is one hour. Hash-based, so renaming files doesn&#8217;t matter.</p><div><hr></div><h3>C. Asynchronous status polling</h3><p>The user doesn&#8217;t wait:</p><pre><code><code>waitForDocumentsIndexed(s3Uris, timeout: 60000)
  .then(results =&gt; updateCache(results))
  .catch(err =&gt; scheduleRetry());
</code></code></pre><p>Polling every 2&#8211;3 seconds.</p><div><hr></div><h3>D. Retry with backoff</h3><p>Smooths out rate limit spikes:</p><pre><code><code>async function retryWithBackoff(fn, maxRetries = 3) {
  for (let i = 0; i &lt; maxRetries; i++) {
    try {
      return await fn();
    } catch (err) {
      if (err.statusCode === 429) {
        const delay = Math.pow(2, i) * 1000 + random(0, 1000);
        await sleep(delay);
      } else throw err;
    }
  }
}
</code></code></pre><div><hr></div><h3>E. Cache cleanup</h3><p>Keeps the cache lean:</p><pre><code><code>cleanExpiredCache() {
  const now = Date.now();
  for (const [hash, entry] of cache.entries()) {
    if (now - entry.checkedAt &gt; CACHE_TTL) {
      cache.delete(hash);
    }
  }
}
</code></code></pre><div><hr></div><h2>Full workflow: from upload to model response</h2><ol><li><p>The user uploads a PDF.</p></li><li><p>The file goes to S3.</p></li><li><p>We call IngestKnowledgeBaseDocuments.</p></li><li><p>KB starts indexing.</p></li><li><p>The user sees a &#8220;file is being processed&#8221; message.</p></li><li><p>Background polling checks status.</p></li><li><p>Once indexing is done, we update the cache.</p></li><li><p>For the next query, KB returns only the relevant chunks.</p></li><li><p>The model generates the final answer.</p></li></ol><p>Fast, predictable, no blocking.</p><div><hr></div><h2>Results after the migration</h2><h3>Before (StartIngestionJob)</h3><ul><li><p>3&#8211;5 minutes to index a single file.</p></li><li><p>KB completely blocked.</p></li><li><p>No user isolation.</p></li><li><p>Only job-level status.</p></li></ul><h3>After (IngestKnowledgeBaseDocuments)</h3><ul><li><p>30&#8211;60 seconds per file.</p></li><li><p>KB remains responsive.</p></li><li><p>Full multi-tenant metadata separation.</p></li><li><p>File-level status.</p></li><li><p>Batching up to 10 files.</p></li><li><p>Cache removes redundant work.</p></li></ul><p>Roughly a 5x speed improvement.</p><div><hr></div><h2>What comes next</h2><ul><li><p>Indexing metrics: latency, failures, distribution.</p></li><li><p>Webhooks for &#8220;file indexed&#8221; events.</p></li><li><p>Document versioning via metadata.</p></li><li><p>More filtering options: by size, date, type.</p></li><li><p>Predictive indexing for frequently used files.</p></li></ul><div><hr></div><h2>Key takeaways</h2><ol><li><p>The KB solves Bedrock&#8217;s file-size limit and handles documents up to 50 MB.</p></li><li><p>Direct ingestion removes blocking and boosts speed significantly.</p></li><li><p>Metadata enables true multi-tenant behavior.</p></li><li><p>Batching, caching, and async polling keep the UX smooth.</p></li><li><p>Backoff logic keeps the system stable during heavy load.</p></li></ol><p>If you rely on Bedrock KB, switching to direct ingestion will make the whole system feel lighter and more responsive.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://substack.vandriichuk.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://substack.vandriichuk.com/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[From Naive RAG to Knowledge Graphs: Building Verifiable and Trustworthy AI Assistants]]></title><description><![CDATA[This technical deep dive explores the evolution of RAG, examining the limitations of traditional approaches and charting a path forward with knowledge graphs, focusing on LightRAG.]]></description><link>https://substack.vandriichuk.com/p/from-naive-rag-to-knowledge-graphs</link><guid isPermaLink="false">https://substack.vandriichuk.com/p/from-naive-rag-to-knowledge-graphs</guid><dc:creator><![CDATA[vandriichuk]]></dc:creator><pubDate>Wed, 22 Oct 2025 19:48:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!pufk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5de943-f6bd-4ab5-a823-0ed6a0e14aca_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pufk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5de943-f6bd-4ab5-a823-0ed6a0e14aca_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pufk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5de943-f6bd-4ab5-a823-0ed6a0e14aca_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!pufk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5de943-f6bd-4ab5-a823-0ed6a0e14aca_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!pufk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5de943-f6bd-4ab5-a823-0ed6a0e14aca_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!pufk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5de943-f6bd-4ab5-a823-0ed6a0e14aca_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pufk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5de943-f6bd-4ab5-a823-0ed6a0e14aca_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a5de943-f6bd-4ab5-a823-0ed6a0e14aca_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1496210,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://substack.vandriichuk.com/i/176862654?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5de943-f6bd-4ab5-a823-0ed6a0e14aca_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pufk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5de943-f6bd-4ab5-a823-0ed6a0e14aca_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!pufk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5de943-f6bd-4ab5-a823-0ed6a0e14aca_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!pufk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5de943-f6bd-4ab5-a823-0ed6a0e14aca_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!pufk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5de943-f6bd-4ab5-a823-0ed6a0e14aca_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In the ever-evolving landscape of artificial intelligence, we&#8217;re witnessing a paradigm shift from simple prompt engineering to the more sophisticated discipline of <strong>context engineering</strong>. It&#8217;s no longer enough to craft the perfect query; the real challenge lies in furnishing Large Language Models (LLMs) with the right, verifiable information to generate trustworthy answers. This technical deep dive explores the evolution of Retrieval-Augmented Generation (RAG), examining the limitations of traditional approaches and charting a path forward with knowledge graphs, focusing on pioneering frameworks like Microsoft&#8217;s GraphRAG and its more agile counterpart, LightRAG.</p><h2><strong>Classic RAG: A Powerful, Yet Flawed, Solution</strong></h2><p>Retrieval-Augmented Generation (RAG) has become a standard technique for extending the capabilities of LLMs beyond their static training data, allowing them to access private or up-to-the-minute information. The process is relatively straightforward: when a user asks a question, the RAG system first retrieves relevant snippets of information from a knowledge base and then feeds these snippets, along with the original query, to an LLM to generate an answer.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://substack.vandriichuk.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">vandriichuk&#8217;s Substack is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><strong>How Traditional RAG Works:</strong></p><ol><li><p><strong>Indexing:</strong> Documents are broken down into smaller pieces (chunks).</p></li><li><p><strong>Embedding:</strong> Each chunk is converted into a numerical vector (embedding) that represents its semantic meaning.</p></li><li><p><strong>Storing:</strong> These vectors are stored in a vector database.</p></li><li><p><strong>Retrieval:</strong> The user&#8217;s query is also converted into a vector, and the database is searched for the most similar document chunk vectors.</p></li><li><p><strong>Augmentation &amp; Generation:</strong> The retrieved chunks are added to the context of the user&#8217;s prompt, and the LLM generates an answer based on this augmented information.</p></li></ol><p>Despite its effectiveness in simple scenarios, this &#8220;naive&#8221; approach to RAG has significant drawbacks that become apparent as the complexity and scale of the knowledge base grow.</p><p><strong>The Problems with Classic RAG:</strong></p><ul><li><p><strong>Semantic Drift and Name Collisions:</strong> Vector search can retrieve semantically similar but contextually incorrect chunks. A query about &#8220;Project Alpha&#8221; might pull information about a client with the same name, leading to irrelevant results.</p></li><li><p><strong>Context Leakage and Security Vulnerabilities:</strong> A poorly configured RAG can inadvertently include sensitive information, like personal data or financial details, in its response. Furthermore, bad actors can exploit techniques like &#8220;prompt injection&#8221; by embedding malicious instructions within source documents.</p></li><li><p><strong>Lack of Relational Understanding:</strong> Naive RAG cannot grasp the complex relationships between pieces of information scattered across different documents. It fails to connect the dots between an employee going on vacation, their temporary replacement, and a project they were managing.</p></li><li><p><strong>Contradictory Information:</strong> If the retrieved chunks contain conflicting information, the LLM can become confused, leading to hallucinations or inaccurate answers.</p></li></ul><h2><strong>Enter Knowledge Graphs: Bringing Structure to Context</strong></h2><p>To overcome these limitations, the industry is turning to knowledge graphs. A knowledge graph is essentially a structured representation of information, where entities (people, projects, documents) are nodes, and the relationships between them are edges. Instead of treating information as isolated text snippets, knowledge graphs capture the intricate web of connections, enabling a deeper, more contextual understanding.</p><p><strong>Advantages of Knowledge Graphs in RAG:</strong></p><ul><li><p><strong>Improved Accuracy and Relevance:</strong> By querying the graph, a system can retrieve not just individual entities but also their related entities and relationships, providing a more comprehensive and relevant context for the LLM.</p></li><li><p><strong>Verifiability and Explainability:</strong> Answers generated using knowledge graphs can be traced back to the source entities and relationships in the graph, allowing users to verify the source of the information and understand how the system arrived at its conclusion.</p></li><li><p><strong>Reduced Hallucinations:</strong> By feeding the LLM structured and validated information, knowledge graphs significantly reduce the likelihood of the model &#8220;making up&#8221; facts.</p></li></ul><h2><strong>Microsoft&#8217;s GraphRAG: A Powerful but Costly Pioneer</strong></h2><p>One of the first major attempts to merge knowledge graphs with RAG is Microsoft&#8217;s GraphRAG framework. This comprehensive pipeline uses an LLM to automatically extract entities and relationships from unstructured text to build a knowledge graph.It then uses hierarchical clustering to group related entities into &#8220;communities&#8221; and generates summaries for each cluster at various levels of abstraction.</p><p><strong>How GraphRAG Works:</strong></p><ol><li><p><strong>Indexing:</strong> An LLM analyzes source documents to extract entities and relationships, creating a knowledge graph.</p></li><li><p><strong>Clustering:</strong> Community detection algorithms group closely related entities.</p></li><li><p><strong>Summarization:</strong> The LLM generates descriptive summaries for each community.</p></li><li><p><strong>Retrieval:</strong> When a query is made, the system searches for relevant communities via their summaries and then drills down into the graph for detailed context.</p></li><li><p><strong>Generation:</strong> The LLM uses the retrieved information to generate a comprehensive answer.</p></li></ol><p>While incredibly powerful and capable of answering complex, multi-hop questions, GraphRAG has a significant drawback: high cost. The indexing process, particularly the summarization of clusters, requires a massive number of API calls to powerful LLMs, making it computationally expensive and resource-intensive.</p><h2><strong>LightRAG: The Agile and Cost-Effective Alternative</strong></h2><p>In response to the complexity and cost of GraphRAG, researchers at the University of Hong Kong developed LightRAG, a lightweight framework that retains the benefits of the graph-based approach while dramatically reducing the computational overhead.</p><p>LightRAG simplifies the architecture by jettisoning the multi-level hierarchical clustering and summarization in favor of an elegant, dual-level retrieval system.</p><p><strong>The LightRAG Architecture:</strong></p><ol><li><p><strong>Keyword Extraction:</strong> When a query is received, an LLM extracts two types of keywords:</p><ul><li><p><strong>Local Keys:</strong> Specific entities mentioned in the query (e.g., &#8220;employee Petrov&#8221;).</p></li><li><p><strong>Global Keys:</strong> Broader concepts and themes (e.g., &#8220;financial optimization&#8221;).</p></li></ul></li><li><p><strong>Parallel Search:</strong></p><ul><li><p>Local keys are used to search for specific nodes in the knowledge graph.</p></li><li><p>Global keys are used to search for broader, conceptual relationships.</p></li></ul></li><li><p><strong>Context Expansion:</strong> Instead of just returning the retrieved entities, LightRAG queries their &#8220;neighborhood&#8221; within the graph, pulling all their immediate neighbors and connections. This creates a compact yet highly meaning-dense subgraph that serves as the context.</p></li><li><p><strong>Incremental Updates:</strong> Unlike GraphRAG, which requires a full graph rebuild when new data is added, LightRAG supports incremental updates, making it far more efficient for dynamic knowledge bases.</p></li></ol><p>This approach drastically cuts down on the required API calls, making LightRAG hundreds of times cheaper than GraphRAG while, on some metrics, delivering even better answer quality.</p><h2><strong>Practical Considerations and Future Directions</strong></h2><p>The move to graph-based RAG systems is not a silver bullet. The success of any of these systems is heavily dependent on the quality of the input data. Organizations must invest in standardizing terminology, defining clear relationships, and establishing naming conventions for entities.</p><p><strong>Key Takeaways:</strong></p><ul><li><p><strong>Naive RAG:</strong> Fast and cheap, ideal for simple Q&amp;A bots and document search, but falls short on complex queries.</p></li><li><p><strong>Microsoft GraphRAG:</strong> Extremely powerful for deep analysis of complex datasets, but its cost and complexity make it overkill for most applications.</p></li><li><p><strong>LightRAG:</strong> Offers a balanced approach, combining the power of knowledge graphs with efficiency and cost-effectiveness, making it a promising solution for a wide range of tasks.</p></li></ul><p>As we move toward more sophisticated and autonomous AI agents, the need for reliable, verifiable, and context-aware systems will only grow. Graph-based RAG frameworks like LightRAG represent a significant step forward in building AI assistants we can trust with real-world business challenges, paving the way for a future where AI-generated answers are not just eloquent, but provably true.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://substack.vandriichuk.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">vandriichuk&#8217;s Substack is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Navigating the AI Hype: A Realistic Roadmap for Aspiring LLM Specialists]]></title><description><![CDATA[The AI revolution is in full swing, promising a future transformed by intelligent machines.]]></description><link>https://substack.vandriichuk.com/p/navigating-the-ai-hype-a-realistic</link><guid isPermaLink="false">https://substack.vandriichuk.com/p/navigating-the-ai-hype-a-realistic</guid><dc:creator><![CDATA[vandriichuk]]></dc:creator><pubDate>Fri, 22 Aug 2025 19:38:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FzhV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb692ae4a-7083-462d-b922-1214b9c9a2e5_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FzhV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb692ae4a-7083-462d-b922-1214b9c9a2e5_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FzhV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb692ae4a-7083-462d-b922-1214b9c9a2e5_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!FzhV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb692ae4a-7083-462d-b922-1214b9c9a2e5_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!FzhV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb692ae4a-7083-462d-b922-1214b9c9a2e5_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!FzhV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb692ae4a-7083-462d-b922-1214b9c9a2e5_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FzhV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb692ae4a-7083-462d-b922-1214b9c9a2e5_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b692ae4a-7083-462d-b922-1214b9c9a2e5_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1998654,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://vandriichuk.substack.com/i/171685408?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb692ae4a-7083-462d-b922-1214b9c9a2e5_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!FzhV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb692ae4a-7083-462d-b922-1214b9c9a2e5_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!FzhV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb692ae4a-7083-462d-b922-1214b9c9a2e5_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!FzhV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb692ae4a-7083-462d-b922-1214b9c9a2e5_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!FzhV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb692ae4a-7083-462d-b922-1214b9c9a2e5_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The AI revolution is in full swing, promising a future transformed by intelligent machines. Every day, headlines tout new breakthroughs, and job boards overflow with &#8220;AI Specialist&#8221; roles. Yet, amidst this whirlwind of excitement and opportunity, a crucial question arises for aspiring professionals: how do you cut through the deafening hype to build a truly valuable, sustainable career in Large Language Models (LLMs)? If you&#8217;re ready to look beyond the buzzwords and commit to the real work, this guide is your starting point.</p><p>The world is buzzing with AI. From news headlines to job boards, &#8220;Artificial Intelligence&#8221; and &#8220;Large Language Models&#8221; (LLMs) are the phrases on everyone&#8217;s lips. The opportunities seem boundless, and the allure of being at the forefront of this technological revolution is undeniable. With this surge in interest, we&#8217;ve also seen a rise in discussions around &#8220;vibe-driven coding&#8221; &#8211; the notion that a positive attitude and a surface-level understanding might be enough to break into the field</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://substack.vandriichuk.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">vandriichuk&#8217;s Substack is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Let&#8217;s be clear: while enthusiasm is fantastic, building a serious career as an LLM specialist requires far more than just good vibes. It demands dedication, a deep understanding of complex concepts, and a structured approach to learning and skill development. It&#8217;s not a leisurely stroll in the park; it&#8217;s a challenging climb, often feeling like a journey through the &#8220;seven circles of development hell.&#8221;</p><p>But for those who are truly passionate, for those who see beyond the immediate hype and are ready to commit to mastering the intricacies of LLMs, the rewards &#8211; both intellectual and professional &#8211; are immense. The demand for skilled LLM practitioners, engineers, and researchers who can build, deploy, and innovate with these powerful models is only growing.</p><h2><strong>Introducing the LLM Specialist Roadmap</strong></h2><p>Recognizing the need for a clear path through this often-daunting landscape, I&#8217;ve put together a comprehensive <strong><a href="https://vandriichuk.com/llm_roadmap.html">LLM Specialist Roadmap</a></strong>.</p><p>This isn&#8217;t a promise of overnight expertise. Instead, it&#8217;s a structured, phased guide designed to take you from the foundational basics to advanced, expert-level skills. It outlines:</p><ul><li><p><strong>Key Stages of Development:</strong> From Junior Practitioner to LLM Expert/Researcher.</p></li><li><p><strong>Essential Tools &amp; Technologies:</strong> Covering everything from Python and Git to specialized frameworks like PyTorch, TensorFlow, and Hugging Face.</p></li><li><p><strong>Critical Skills:</strong> Detailing the progression of necessary competencies, including prompt engineering, RAG systems, fine-tuning, model optimization, and cutting-edge research areas.</p></li><li><p><strong>Core Theoretical Knowledge:</strong> Emphasizing the importance of understanding linear algebra, neural networks, transformer architecture, and more.</p></li><li><p><strong>Practical Projects:</strong> Suggesting hands-on projects to solidify your learning at each stage.</p></li></ul><p>Think of it as your (brutally honest) guide through the inferno of LLM development. It&#8217;s designed to equip you with the knowledge and practical experience needed to not just &#8220;vibe&#8221; with AI, but to truly <em>build</em> and <em>innovate</em> with it.</p><h2><strong>Why a Roadmap? Why Now?</strong></h2><p>In a field evolving as rapidly as AI, having a structured learning path is crucial. It helps cut through the noise, focus on what truly matters, and build a solid foundation upon which to grow. This roadmap is for those who:</p><ul><li><p>Are serious about a career in LLM development.</p></li><li><p>Understand that real expertise requires effort and persistence.</p></li><li><p>Are looking for a clear, actionable plan to guide their learning journey.</p></li></ul><p>As I often say (perhaps paraphrasing a very tired developer), <em>&#8220;If the path is easy, you&#8217;re probably going the wrong way. True peaks require a climb.&#8221;</em> This roadmap is designed to help you navigate that climb, one challenging but rewarding step at a time.</p><h2><strong>Your Journey Starts Here</strong></h2><p>If you&#8217;re ready to move beyond the surface-level buzz and dive deep into the world of Large Language Models, I invite you to explore the <strong><a href="https://vandriichuk.com/llm_roadmap.html">LLM Specialist Roadmap</a></strong>.</p><p>It won&#8217;t be easy. It will demand your full attention and dedication. But if you&#8217;re up for the challenge, the path to becoming a sought-after LLM specialist is laid out for you.</p><p>(And if, after perusing the roadmap, you decide that perhaps tiger taming or professional napping is a more suitable career path, no judgment here. I warned you! &#128521;)</p><p><strong>Key elements in this draft:</strong></p><ul><li><p><strong>Addresses the Hype:</strong> Acknowledges the current AI buzz and the &#8220;vibe coding&#8221; phenomenon.</p></li><li><p><strong>Sets Realistic Expectations:</strong> Emphasizes the difficulty and dedication required.</p></li><li><p><strong>Introduces the Solution:</strong> Clearly presents your roadmap as the structured path.</p></li><li><p><strong>Highlights Roadmap Benefits:</strong> Explains what the roadmap covers and why it&#8217;s valuable.</p></li><li><p><strong>Motivational (with a touch of humor):</strong> Uses the &#8220;seven circles of hell&#8221; and &#8220;tired developer&#8221; analogies.</p></li><li><p><strong>Clear Call to Action:</strong> Directs readers to your roadmap.</p></li><li><p><strong>Maintains Your Voice:</strong> Incorporates the ironic and honest tone we&#8217;ve been using.</p></li><li><p><strong>SEO-friendly elements:</strong> Uses keywords like &#8220;LLM Specialist,&#8221; &#8220;AI Hype,&#8221; &#8220;Roadmap,&#8221; etc.</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://substack.vandriichuk.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">vandriichuk&#8217;s Substack is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>