<?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[Paulo's Blog]]></title><description><![CDATA[thoughts on AI, product, founder journeys]]></description><link>https://www.paulonasc.com</link><image><url>https://substackcdn.com/image/fetch/$s_!SwT7!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b04a6d3-d4f2-4acd-a316-25c574f4eff2_1280x1280.png</url><title>Paulo&apos;s Blog</title><link>https://www.paulonasc.com</link></image><generator>Substack</generator><lastBuildDate>Mon, 11 May 2026 11:02:01 GMT</lastBuildDate><atom:link href="https://www.paulonasc.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Paulo Nascimento]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[paulonasc@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[paulonasc@substack.com]]></itunes:email><itunes:name><![CDATA[Paulo Nascimento]]></itunes:name></itunes:owner><itunes:author><![CDATA[Paulo Nascimento]]></itunes:author><googleplay:owner><![CDATA[paulonasc@substack.com]]></googleplay:owner><googleplay:email><![CDATA[paulonasc@substack.com]]></googleplay:email><googleplay:author><![CDATA[Paulo Nascimento]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Climbing Up and Down the Stack in the Age of AI]]></title><description><![CDATA[What happens when coordination gets cheaper]]></description><link>https://www.paulonasc.com/p/climbing-up-and-down-the-stack-in</link><guid isPermaLink="false">https://www.paulonasc.com/p/climbing-up-and-down-the-stack-in</guid><dc:creator><![CDATA[Paulo Nascimento]]></dc:creator><pubDate>Tue, 24 Feb 2026 16:28:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ZOmQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d460d8-c537-48b8-82fa-3007fc6dd999_1365x477.jpeg" 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_!ZOmQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d460d8-c537-48b8-82fa-3007fc6dd999_1365x477.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZOmQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d460d8-c537-48b8-82fa-3007fc6dd999_1365x477.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZOmQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d460d8-c537-48b8-82fa-3007fc6dd999_1365x477.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZOmQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d460d8-c537-48b8-82fa-3007fc6dd999_1365x477.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZOmQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d460d8-c537-48b8-82fa-3007fc6dd999_1365x477.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZOmQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d460d8-c537-48b8-82fa-3007fc6dd999_1365x477.jpeg" width="1365" height="477" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33d460d8-c537-48b8-82fa-3007fc6dd999_1365x477.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:477,&quot;width&quot;:1365,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:164393,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.paulonasc.com/i/189003496?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd37c42-1ca7-49b3-a554-0113bf2d7261_1365x2048.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZOmQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d460d8-c537-48b8-82fa-3007fc6dd999_1365x477.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZOmQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d460d8-c537-48b8-82fa-3007fc6dd999_1365x477.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZOmQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d460d8-c537-48b8-82fa-3007fc6dd999_1365x477.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZOmQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d460d8-c537-48b8-82fa-3007fc6dd999_1365x477.jpeg 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>With the rise of AI, it feels like people across the org chart are shifting positions.</p><p>Very senior engineers seem to be moving up the stack. They are spending more time thinking about systems architecture, leverage, and long-term design, while letting AI handle more of the implementation.</p><p>At the same time, I have noticed managers jumping back into IC work. </p><p><em>Coding. Shipping. Driving specific initiatives forward.</em> </p><p>The distance between &#8220;manager&#8221; and &#8220;operator&#8221; feels smaller than it used to.</p><p>The lines are blurring.</p><p>ICs are becoming managers, not of people but of agents. </p><p>Managers are becoming ICs, pushing work through agents instead of through layers of coordination.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><p>Agents reduce the cost of reporting, synthesis, and cross-team translation, functions that have historically lived in the middle of organizations. When that coordination layer gets cheaper, the structure around it starts to change.</p><p>It reminds me of how the internet reduced distribution gatekeepers. Artists did not need record stores to reach audiences in the same way. Writers did not need publishers to distribute their work. Distribution did not disappear. It compressed.</p><p>Agents feel similar.</p><p></p><p>An engineer with a clear vision can now use agents to do market research, synthesize customer feedback, draft specs, and even generate initial implementations without needing multiple layers of intermediaries.</p><p>An artist could, in theory, use agents to handle promotion, outreach, and operations, owning more of their identity and business end to end.</p><p>None of this eliminates leadership. But it does seem to compress coordination.</p><p>And that compression raises a deeper question:</p><p>If reporting, synthesis, and translation can be automated, what actually becomes scarce inside an organization?</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.com/p/climbing-up-and-down-the-stack-in?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.paulonasc.com/p/climbing-up-and-down-the-stack-in?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>I do not know exactly where this goes, but I have noticed something-</p><p>as agents get better at writing, synthesizing, and coordinating, leverage seems to shift toward the people actually executing.</p><p>It feels less about managing people and more about managing clarity and direction.</p>]]></content:encoded></item><item><title><![CDATA[The Future of Agents: Will AI Agents Replace Classic Workflow Automation?]]></title><description><![CDATA[A Look at the Future of AI-native Automation]]></description><link>https://www.paulonasc.com/p/the-future-of-agents-will-ai-agents</link><guid isPermaLink="false">https://www.paulonasc.com/p/the-future-of-agents-will-ai-agents</guid><dc:creator><![CDATA[Paulo Nascimento]]></dc:creator><pubDate>Tue, 24 Dec 2024 00:17:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0ab1b7-c978-477c-88f8-d72a29da95d8_1000x680.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>This post was co-authored with <a href="https://www.linkedin.com/in/dexterihorthy/">Dex from HumanLayer</a>, thanks for the feedback and sketches for this post!</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><p>As AI agents evolve, will they render classic workflow automation obsolete, or will bottlenecks in scaling laws, data, and computation keep traditional systems relevant? </p><p>We&#8217;ve been spending a lot of time chatting about this, and here is what we have figured out so far.</p><h2>Background Context</h2><p>If technology continues evolving at its current rate, here&#8217;s where I think agents will be in two years.</p><h3>What Are &#8220;Agents&#8221;?</h3><p>2024 was the year we spent way too much time arguing about &#8220;what it means to be an agent&#8221; and &#8220;it&#8217;s not an agent unless it &#8230;&#8221;. When I refer to &#8220;agents,&#8221; I mean LLMs paired with tools that independently make decisions and perform actions.</p><h3>The Emergence of Chain of Thought (CoT) Reasoning / Test-time Compute in Models</h3><p>We are starting to see models like o1 and o3, which have Chain of Thought (CoT) reasoning built into them through test-time compute. Test-time compute essentially allows a model to spend more time exploring different solutions and reasoning to arrive at the most accurate answer. This enables more reliable LLM outputs and better reasoning for advanced workflows.</p><p>This development will allow &#8220;agents&#8221; to think with greater trust and accuracy as they explain their thought processes, moving that logic out of the framework and behind the model API. We can implement human-in-the-loop for critical chain of thought steps and use that human feedback for post-training to enhance the agent&#8217;s performance.</p><h3><strong>Early Indicators of Adoption: Cursor Composer</strong></h3><p>It might sound ambitious for this to be adopted at scale, but we&#8217;re already seeing early indications of it. Take Cursor Composer, for example it essentially writes code for you, applies it to the appropriate files in your codebase, and waits for your approval before implementing changes. For something as sensitive as code&#8212;where mistakes could be catastrophic&#8212;this demonstrates that users are increasingly willing to trust these systems.</p><h3><strong>The Staggered Adoption of &#8220;Agents&#8221;</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AWfS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3f17139-bfc1-4076-8056-d8575be05355_1566x1204.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AWfS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3f17139-bfc1-4076-8056-d8575be05355_1566x1204.png 424w, https://substackcdn.com/image/fetch/$s_!AWfS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3f17139-bfc1-4076-8056-d8575be05355_1566x1204.png 848w, https://substackcdn.com/image/fetch/$s_!AWfS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3f17139-bfc1-4076-8056-d8575be05355_1566x1204.png 1272w, https://substackcdn.com/image/fetch/$s_!AWfS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3f17139-bfc1-4076-8056-d8575be05355_1566x1204.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AWfS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3f17139-bfc1-4076-8056-d8575be05355_1566x1204.png" width="1456" height="1119" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e3f17139-bfc1-4076-8056-d8575be05355_1566x1204.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1119,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:110441,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AWfS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3f17139-bfc1-4076-8056-d8575be05355_1566x1204.png 424w, https://substackcdn.com/image/fetch/$s_!AWfS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3f17139-bfc1-4076-8056-d8575be05355_1566x1204.png 848w, https://substackcdn.com/image/fetch/$s_!AWfS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3f17139-bfc1-4076-8056-d8575be05355_1566x1204.png 1272w, https://substackcdn.com/image/fetch/$s_!AWfS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3f17139-bfc1-4076-8056-d8575be05355_1566x1204.png 1456w" sizes="100vw" loading="lazy"></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>Whether you&#8217;re writing simple Python scripts or deploying to a sophisticated workflow orchestrator like Celery, Airflow, Prefect, or hundreds of others, almost any software can be represented as a directed graph (DG). Later, when traditional ML took off, we started to see some non-deterministic steps for summarizing, classifying, and maybe even determining the next step in a graph.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!B9p-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5bb497-d8f8-44db-ac69-d767e155d25c_1600x558.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!B9p-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5bb497-d8f8-44db-ac69-d767e155d25c_1600x558.png 424w, https://substackcdn.com/image/fetch/$s_!B9p-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5bb497-d8f8-44db-ac69-d767e155d25c_1600x558.png 848w, https://substackcdn.com/image/fetch/$s_!B9p-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5bb497-d8f8-44db-ac69-d767e155d25c_1600x558.png 1272w, https://substackcdn.com/image/fetch/$s_!B9p-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5bb497-d8f8-44db-ac69-d767e155d25c_1600x558.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!B9p-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5bb497-d8f8-44db-ac69-d767e155d25c_1600x558.png" width="1456" height="508" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba5bb497-d8f8-44db-ac69-d767e155d25c_1600x558.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:508,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!B9p-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5bb497-d8f8-44db-ac69-d767e155d25c_1600x558.png 424w, https://substackcdn.com/image/fetch/$s_!B9p-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5bb497-d8f8-44db-ac69-d767e155d25c_1600x558.png 848w, https://substackcdn.com/image/fetch/$s_!B9p-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5bb497-d8f8-44db-ac69-d767e155d25c_1600x558.png 1272w, https://substackcdn.com/image/fetch/$s_!B9p-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5bb497-d8f8-44db-ac69-d767e155d25c_1600x558.png 1456w" sizes="100vw" loading="lazy"></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><figcaption class="image-caption">Example of slightly newer AI workflows</figcaption></figure></div><h4><strong>The Promise of Agents</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!u_Nv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe492603-7f4d-455b-a8e5-650800240b6b_741x357.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!u_Nv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe492603-7f4d-455b-a8e5-650800240b6b_741x357.png 424w, https://substackcdn.com/image/fetch/$s_!u_Nv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe492603-7f4d-455b-a8e5-650800240b6b_741x357.png 848w, https://substackcdn.com/image/fetch/$s_!u_Nv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe492603-7f4d-455b-a8e5-650800240b6b_741x357.png 1272w, https://substackcdn.com/image/fetch/$s_!u_Nv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe492603-7f4d-455b-a8e5-650800240b6b_741x357.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!u_Nv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe492603-7f4d-455b-a8e5-650800240b6b_741x357.png" width="506" height="243.78137651821862" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fe492603-7f4d-455b-a8e5-650800240b6b_741x357.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:357,&quot;width&quot;:741,&quot;resizeWidth&quot;:506,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!u_Nv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe492603-7f4d-455b-a8e5-650800240b6b_741x357.png 424w, https://substackcdn.com/image/fetch/$s_!u_Nv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe492603-7f4d-455b-a8e5-650800240b6b_741x357.png 848w, https://substackcdn.com/image/fetch/$s_!u_Nv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe492603-7f4d-455b-a8e5-650800240b6b_741x357.png 1272w, https://substackcdn.com/image/fetch/$s_!u_Nv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe492603-7f4d-455b-a8e5-650800240b6b_741x357.png 1456w" sizes="100vw" loading="lazy"></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>One basic definition of AI Agents is the generalization of this node from the workflow above.</p><p>If an LLM can decide what the next step in any given workflow is, then maybe we don&#8217;t need to code up the DAG at all - we can just say &#8220;here&#8217;s your prompt, here&#8217;s a bunch of tools, go figure it out&#8221;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kAWd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbae8271-634c-46b6-84b3-1a112a01ba19_1600x907.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kAWd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbae8271-634c-46b6-84b3-1a112a01ba19_1600x907.png 424w, https://substackcdn.com/image/fetch/$s_!kAWd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbae8271-634c-46b6-84b3-1a112a01ba19_1600x907.png 848w, https://substackcdn.com/image/fetch/$s_!kAWd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbae8271-634c-46b6-84b3-1a112a01ba19_1600x907.png 1272w, https://substackcdn.com/image/fetch/$s_!kAWd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbae8271-634c-46b6-84b3-1a112a01ba19_1600x907.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kAWd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbae8271-634c-46b6-84b3-1a112a01ba19_1600x907.png" width="516" height="292.3763736263736" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fbae8271-634c-46b6-84b3-1a112a01ba19_1600x907.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:825,&quot;width&quot;:1456,&quot;resizeWidth&quot;:516,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kAWd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbae8271-634c-46b6-84b3-1a112a01ba19_1600x907.png 424w, https://substackcdn.com/image/fetch/$s_!kAWd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbae8271-634c-46b6-84b3-1a112a01ba19_1600x907.png 848w, https://substackcdn.com/image/fetch/$s_!kAWd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbae8271-634c-46b6-84b3-1a112a01ba19_1600x907.png 1272w, https://substackcdn.com/image/fetch/$s_!kAWd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbae8271-634c-46b6-84b3-1a112a01ba19_1600x907.png 1456w" sizes="100vw" loading="lazy"></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>This is the core of the <a href="https://arxiv.org/abs/2210.03629">ReAct Agent paper</a> - think about what to do, do it, and decide if we&#8217;re done, otherwise, pick the next action.</p><p></p><p>I think "agent" adoption will follow a staggered distribution. Early versions (as we&#8217;re seeing now) likely utilize DAGs and traditional ML classification models for lightweight tasks, such as routing functions to the appropriate agent.</p><h4><strong>The Problem</strong></h4><h5>Current Agent Complexity Challenges</h5><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yo_l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0ab1b7-c978-477c-88f8-d72a29da95d8_1000x680.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yo_l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0ab1b7-c978-477c-88f8-d72a29da95d8_1000x680.png 424w, https://substackcdn.com/image/fetch/$s_!yo_l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0ab1b7-c978-477c-88f8-d72a29da95d8_1000x680.png 848w, https://substackcdn.com/image/fetch/$s_!yo_l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0ab1b7-c978-477c-88f8-d72a29da95d8_1000x680.png 1272w, https://substackcdn.com/image/fetch/$s_!yo_l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0ab1b7-c978-477c-88f8-d72a29da95d8_1000x680.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yo_l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0ab1b7-c978-477c-88f8-d72a29da95d8_1000x680.png" width="398" height="270.64" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5c0ab1b7-c978-477c-88f8-d72a29da95d8_1000x680.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:680,&quot;width&quot;:1000,&quot;resizeWidth&quot;:398,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yo_l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0ab1b7-c978-477c-88f8-d72a29da95d8_1000x680.png 424w, https://substackcdn.com/image/fetch/$s_!yo_l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0ab1b7-c978-477c-88f8-d72a29da95d8_1000x680.png 848w, https://substackcdn.com/image/fetch/$s_!yo_l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0ab1b7-c978-477c-88f8-d72a29da95d8_1000x680.png 1272w, https://substackcdn.com/image/fetch/$s_!yo_l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0ab1b7-c978-477c-88f8-d72a29da95d8_1000x680.png 1456w" sizes="100vw" loading="lazy"></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>Fully autonomous agents don&#8217;t yet function effectively in production because, when you have, say, 30-50 tools being passed to your LLM, it cannot reliably determine which tool to route to, especially after several turns. This not only reduces accuracy but also increases inference costs over time due to the extensive CoT reasoning required by agents.</p><h4><strong>What Actually Works</strong></h4><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qkbz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8419849-eda3-4574-9afb-8775a4e7b52a_1600x582.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qkbz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8419849-eda3-4574-9afb-8775a4e7b52a_1600x582.png 424w, https://substackcdn.com/image/fetch/$s_!qkbz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8419849-eda3-4574-9afb-8775a4e7b52a_1600x582.png 848w, https://substackcdn.com/image/fetch/$s_!qkbz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8419849-eda3-4574-9afb-8775a4e7b52a_1600x582.png 1272w, https://substackcdn.com/image/fetch/$s_!qkbz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8419849-eda3-4574-9afb-8775a4e7b52a_1600x582.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qkbz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8419849-eda3-4574-9afb-8775a4e7b52a_1600x582.png" width="1456" height="530" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c8419849-eda3-4574-9afb-8775a4e7b52a_1600x582.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:530,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qkbz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8419849-eda3-4574-9afb-8775a4e7b52a_1600x582.png 424w, https://substackcdn.com/image/fetch/$s_!qkbz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8419849-eda3-4574-9afb-8775a4e7b52a_1600x582.png 848w, https://substackcdn.com/image/fetch/$s_!qkbz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8419849-eda3-4574-9afb-8775a4e7b52a_1600x582.png 1272w, https://substackcdn.com/image/fetch/$s_!qkbz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8419849-eda3-4574-9afb-8775a4e7b52a_1600x582.png 1456w" sizes="100vw" loading="lazy"></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><figcaption class="image-caption">Example of current-day AI agent workflows w/ micro agents</figcaption></figure></div><p>Example of current-day AI agent workflows with micro agents.</p><p>Some systems utilize &#8216;micro agents&#8217; to automate tasks with AI.</p><h3><strong>Why Multi-Agent Architecture Is on the Rise</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mxGY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46a99b46-a5e5-46a2-9f27-0b558bc00a04_1600x579.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mxGY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46a99b46-a5e5-46a2-9f27-0b558bc00a04_1600x579.png 424w, https://substackcdn.com/image/fetch/$s_!mxGY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46a99b46-a5e5-46a2-9f27-0b558bc00a04_1600x579.png 848w, https://substackcdn.com/image/fetch/$s_!mxGY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46a99b46-a5e5-46a2-9f27-0b558bc00a04_1600x579.png 1272w, https://substackcdn.com/image/fetch/$s_!mxGY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46a99b46-a5e5-46a2-9f27-0b558bc00a04_1600x579.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mxGY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46a99b46-a5e5-46a2-9f27-0b558bc00a04_1600x579.png" width="1456" height="527" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/46a99b46-a5e5-46a2-9f27-0b558bc00a04_1600x579.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:527,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mxGY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46a99b46-a5e5-46a2-9f27-0b558bc00a04_1600x579.png 424w, https://substackcdn.com/image/fetch/$s_!mxGY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46a99b46-a5e5-46a2-9f27-0b558bc00a04_1600x579.png 848w, https://substackcdn.com/image/fetch/$s_!mxGY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46a99b46-a5e5-46a2-9f27-0b558bc00a04_1600x579.png 1272w, https://substackcdn.com/image/fetch/$s_!mxGY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46a99b46-a5e5-46a2-9f27-0b558bc00a04_1600x579.png 1456w" sizes="100vw" loading="lazy"></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><figcaption class="image-caption">Example of multi-agent architecture</figcaption></figure></div><p>Keeping the context window limited to 3-5 tools and 3-5 steps has proven to be the most effective approach based on observations. This is why multi-agent architecture is gaining popularity; with a hierarchy of agents, they can collaborate on hundreds of steps and utilize hundreds of tools without any single context window becoming too large.</p><p><strong>TL;DR:</strong> Early &#8220;agents&#8221; will be LLMs utilizing a few (3-5) tools and/or DAGs for more complex workflows.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><h2>Why AI Agents Will Shape the Future&#8212;and Why It Matters to You</h2><p>With RAG-based systems, teams have delivered chatbots that answer customer questions faster and more accurately. RAG addresses both search and understanding challenges. However, if the data isn&#8217;t available, the model is prone to hallucination. Current systems perform well at summarizing or rephrasing information.</p><p>Assuming models like o1/o3 continue to scale in intelligence, given a dataset with sufficient data points, LLMs will be able to reason thoroughly about the current context and its future implications. This will enable LLMs to automate workflows end-to-end by maintaining a rolling context window as the agent continually evaluates what action to take next. The impact of this will be substantial, even if these agents operate only at a junior level.</p><p>Imagine having a fleet of 100 junior marketers at your company. You <a href="https://www.youtube.com/watch?v=Dc99-zTMyMg">could use agents to build your business or offload repetitive tasks</a>.</p><p><strong>AI 1.0</strong> was read/write through RAG.<br><strong>AI 2.0</strong> marks the age of action and workflow automation.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.com/p/the-future-of-agents-will-ai-agents?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.paulonasc.com/p/the-future-of-agents-will-ai-agents?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><h2>Can we <strong>trust</strong> LLMs to <strong>consistently</strong> and <strong>reliably</strong> predict not just the next token, but an entire sequence of say, 10,000 tokens, starting from their current position?</h2><p>This ultimately comes down to betting on or against scaling laws. Scaling laws suggest that as a model's parameters, data, and compute increase, its performance will also improve. However, all of these factors must scale linearly for this to hold true.</p><p>In text, there are basic patterns (e.g., paragraphs, sentences) that become increasingly granular, with progressively abstract and complex associations. As LLMs continue to scale, these patterns will become more emergent and better understood by the models.</p><p>The <a href="https://www.youtube.com/watch?v=ugvHCXCOmm4">Dario Amodei podcast with Lex Fridman</a> prompted me to reflect on a few essential questions surrounding scaling laws.</p><h3><strong>Scaling laws &#8211; what if we run out of QUALITY data?</strong></h3><p>One challenge in training large language models (LLMs) is the availability of high-quality data. While there is an estimated 64 zettabytes of data on the internet, only a fraction of it meets the standards required for effective model training. For example, ChatGPT is estimated to have been trained on up to 45TB of data, which, while significant, represents a minuscule portion of available digital content.</p><h4><em><strong>Thought 1: each enterprise finetunes on their private data</strong></em></h4><p>Training private LLM instances on private enterprise data, such as Slack logs or other proprietary sources, may enable models to develop domain-specific patterns beyond their current capabilities.</p><h4><em><strong>Thought 2: we can generate synthetic/hybrid synthetic data</strong></em><strong> </strong></h4><p>Another promising avenue is synthetic data generation. However, purely synthetic data has limitations, particularly when AI-generated content begins to dominate the training pool which has polluted datasets and even caused open-source projects like Wordfreq to be archived. <a href="https://youtu.be/shMX2N89MdQ?si=CWgBSn59xPvke-k-&amp;t=2706">Alexandr Wang and others have suggested hybrid data strategies</a>&#8212;combining synthetic data with input from human experts to overcome LLM knowledge limitations.</p><h4><em><strong>Thought 3: we can also use human-in-the-loop responses as training data</strong></em></h4><p>Human-in-the-loop systems also offer a practical solution. By incorporating manual feedback and using it as post-training data, these systems can iteratively improve model performance while expanding high-quality datasets.</p><h4><em><strong>Thought 4: leveraging test-time compute for validation</strong></em></h4><p>We can utilize test-time compute to explore multiple approaches to solving a problem. This was an approach that Dylan Patel referred to in the latest BG2 podcast. By executing these solutions in a controlled, functional environment&#8212;such as a codebase where outputs are deterministic&#8212;<a href="https://youtu.be/QVcSBHhcFbg?si=hg6_Jf1SIbYae8BW&amp;t=1636">we can effectively validate or invalidate the LLM&#8217;s responses based on their accuracy and functionality</a>.</p><h4><em><strong>Thought 5: training on different modalities to have the model pick up on more patterns</strong></em></h4><p>Given the majority of the data being used is text data, there are still many emerging patterns that models could discover if we feed it different modalities like video data.</p><h3><strong>Scaling laws &#8211; it can just stop getting better for no known reason.</strong></h3><p>This is a possible outcome that <a href="https://x.com/Analyticsindiam/status/1867893175689555978">some leaders are observing</a>.</p><h3><strong>Scaling laws &#8211; what happens if we run out of compute and energy?</strong></h3><p>Alternative energy sources, such as fusion energy, could help overcome energy bottlenecks. As for compute, we&#8217;ve already observed significant horizontal scaling (e.g., xAI building a 100k H100 cluster). If horizontal scaling reaches its limits, we will likely return to the drawing board to optimize for efficiency. At that point, it becomes a matter of solving an optimization problem.</p><h2>The Future of Automating Workflows</h2><p>Here are the three scenarios I envision for the next two years:</p><ul><li><p><strong>Worst case</strong>: Model performance stagnates. We rely on workarounds and hacks, using DAGs and traditional workflow automation.</p></li><li><p><strong>Base case</strong>: Models improve incrementally. Workflow automation is still utilized, but to a lesser extent, as better model performance enables routing queries to more tools.</p></li><li><p><strong>Best case</strong>: Models continue to improve at their current pace (or faster), resulting in AGI or near-AGI capable of automating end-to-end workflows or entire jobs.</p></li></ul><p>I believe vertical agents are going to become production-ready soon, and I can envision a future within the next two years where an orchestration layer routes tasks to the appropriate vertical-specific agents.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.com/p/the-future-of-agents-will-ai-agents?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.paulonasc.com/p/the-future-of-agents-will-ai-agents?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>What do you think? Will fully agentic workflows exist within the next two years, or will scaling laws continue to necessitate traditional workflow automation?</p><p></p><p><em>Also, thanks to <a href="https://www.linkedin.com/in/srishtisehgal/">Srishti</a> and <a href="https://www.linkedin.com/in/shreya-shekhar/">Shreya</a> for an amazing discussion on this topic. </em></p><p></p><p><em>Best,</em></p><p><em>Paulo</em></p>]]></content:encoded></item><item><title><![CDATA[How Anthropic's Model Context Protocol Facilitates AI Data Access]]></title><description><![CDATA[Streamlining AI Integration with Local and Remote Data Sources Using the Model Context Protocol]]></description><link>https://www.paulonasc.com/p/how-anthropics-model-context-protocol</link><guid isPermaLink="false">https://www.paulonasc.com/p/how-anthropics-model-context-protocol</guid><dc:creator><![CDATA[Paulo Nascimento]]></dc:creator><pubDate>Tue, 26 Nov 2024 23:25:15 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/efdde8bc-e290-44aa-ab4c-b3ac86c1a70a_1512x982.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>TL;DR:</strong> Anthropic open-sourced the Model Context Protocol (MCP), a standard for defining tools that interact with data sources. If you&#8217;re familiar with agents or function calling, it will feel familiar.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.com/p/how-anthropics-model-context-protocol?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.paulonasc.com/p/how-anthropics-model-context-protocol?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><h2><strong>Quick Context</strong></h2><p>Anthropic recently open-sourced their Model Context Protocol (MCP), an open standard that enables AI assistants to communicate with external data sources like local files, SQL databases, and third-party APIs (such as GitHub and Google Drive).</p><p>The Model Context Protocol has four main components:</p><ul><li><p>MCP Server: Functions like an API gateway, exposing specific capabilities through tools. For example, a "list_tables" tool provides access to database tables.</p></li><li><p>MCP Host: An AI application (like Claude Desktop or an IDE) that manages the connection between the Client and Server processes.</p></li><li><p>MCP Client: Handles one-to-one connections with each server process within the host application.</p></li><li><p>MCP Transport: The core mechanism that manages communication between clients and servers. It converts MCP messages to JSON-RPC format for sending and converts received JSON-RPC messages back to MCP format.</p></li></ul><h3><strong>Building an MCP Server</strong></h3><p>My friend <a href="https://www.linkedin.com/in/dexterihorthy/">Dexter</a> and I built an MCP Server for the Alpaca trading API (check out the draft PR here:<a href="https://github.com/modelcontextprotocol/servers/pull/51"> https://github.com/modelcontextprotocol/servers/pull/51</a>)</p><p>At a high level, the code does three main things:</p><ol><li><p><strong>Defines Tools</strong>: We create tool definitions that specify what operations are available through the Alpaca API. Each tool has a name, description, and an input schema that defines the required parameters. For example:</p></li></ol><pre><code>const getLatestQuoteTool: Tool = {
  name: "get_latest_quote",
  description: "Get the latest quote for a stock symbol",
  inputSchema: {
    // Schema definition
  }
};</code></pre><ol start="2"><li><p><strong>Registers Available Tools</strong>: We tell the server which tools are available by registering a handler for tool listing requests:</p></li></ol><pre><code>server.setRequestHandler(ListToolsRequestSchema, async () =&gt; {
  return {
    tools: [getAccountInfoTool, getAssetBySymbolTool, getLatestQuoteTool, placeOrderTool]
  };
});</code></pre><ol start="3"><li><p><strong>Implements Tool Execution</strong>: We register a handler for tool execution requests. When a tool is called, this handler:</p><ol><li><p>Creates a new authenticated Alpaca client</p></li><li><p>Routes the request to the appropriate tool implementation based on the tool name</p></li><li><p>Returns the result in a standardized format</p></li></ol></li></ol><pre><code>server.setRequestHandler(CallToolRequestSchema, async (request) =&gt; {
  const client = new AlpacaClient(API_KEY, API_SECRET_KEY);
  switch (request.params.name) {
    case "get_latest_quote": {
      // Tool implementation
    }
    // ... other cases
  }
});</code></pre><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><p>Here&#8217;s an example in action, where it checks a stock price and proceeds to purchase shares if a certain condition is met:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BYyd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74631997-bdc3-4690-acfa-f69cc6689a97_1534x1284.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BYyd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74631997-bdc3-4690-acfa-f69cc6689a97_1534x1284.png 424w, https://substackcdn.com/image/fetch/$s_!BYyd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74631997-bdc3-4690-acfa-f69cc6689a97_1534x1284.png 848w, https://substackcdn.com/image/fetch/$s_!BYyd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74631997-bdc3-4690-acfa-f69cc6689a97_1534x1284.png 1272w, https://substackcdn.com/image/fetch/$s_!BYyd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74631997-bdc3-4690-acfa-f69cc6689a97_1534x1284.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BYyd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74631997-bdc3-4690-acfa-f69cc6689a97_1534x1284.png" width="1456" height="1219" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74631997-bdc3-4690-acfa-f69cc6689a97_1534x1284.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1219,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1047324,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!BYyd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74631997-bdc3-4690-acfa-f69cc6689a97_1534x1284.png 424w, https://substackcdn.com/image/fetch/$s_!BYyd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74631997-bdc3-4690-acfa-f69cc6689a97_1534x1284.png 848w, https://substackcdn.com/image/fetch/$s_!BYyd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74631997-bdc3-4690-acfa-f69cc6689a97_1534x1284.png 1272w, https://substackcdn.com/image/fetch/$s_!BYyd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74631997-bdc3-4690-acfa-f69cc6689a97_1534x1284.png 1456w" sizes="100vw" loading="lazy"></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>Now, our AI system&#8212;Claude Desktop, in this case&#8212;has access to Alpaca and can place orders on our behalf. Neat!</p><p></p><h3><strong>How will this affect the future of agents?</strong></h3><p>It&#8217;s tough to say. A few organizations, like LangChain and the AI Engineer Foundation, have introduced protocols aimed at standardizing agent interactions. If these gain widespread adoption, maintaining AI systems in production could become easier, thanks to the many integrations contributed by the open-source community.</p><p>But if adoption doesn&#8217;t take off, it might just be another protocol that fades away. In that case, developers will likely keep focusing on pressing issues like agent evaluation, reliability, and implementing step-up authentication.</p><p>What excites me most is the potential for AI to leverage traditional computer systems, especially in industries like healthcare. With a protocol like MCP, assistants like Claude could directly interact with local Electronic Medical Record (EMR) systems that don&#8217;t have APIs. This means AI could operate seamlessly with existing software, even accessing local SQL databases, to deliver meaningful improvements without requiring major infrastructure changes.</p><p></p><p>Big thanks to <a href="https://www.linkedin.com/in/dexterihorthy/">Dex</a>, <a href="https://www.linkedin.com/in/maxtkacz/">Max</a>, and <a href="https://www.linkedin.com/in/adityalahiri/">Aditya</a> for chatting with me about this!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><p><em>Paulo</em></p>]]></content:encoded></item><item><title><![CDATA[Using LLMs for Better Data Classification: Data-Loss Prevention (DLP)]]></title><description><![CDATA[Enhancing Security with AI-Powered Content Analysis for DLP]]></description><link>https://www.paulonasc.com/p/using-llms-for-better-data-classification</link><guid isPermaLink="false">https://www.paulonasc.com/p/using-llms-for-better-data-classification</guid><dc:creator><![CDATA[Paulo Nascimento]]></dc:creator><pubDate>Mon, 30 Sep 2024 17:30:10 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3273edd7-34a6-4cb4-8c65-7d96a886b378_1232x928.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128075; Hey there, my name is Paulo.</em></p><p><em>Welcome to my blog where I write about AI, Security, and Product.</em></p><p><em>Subscribe to see more content</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>Data-Loss Prevention software monitors, detects, and blocks sensitive data movement across networks, devices, and cloud services, protecting organizations against data leaks, theft, and compliance violations.</p><p>With the shift to agentless solutions, I wondered how LLMs could be used to improve DLP software.</p><p>I developed a prototype using a student-teacher model for knowledge distillation. Knowledge distillation is when a smaller model learns to mimic a larger model's behavior, in this case the 3B LLM aiming to match the 8B version's file classification skills.</p><p>The prototype uses Llama 3.1 8B locally for file classification and a fine-tuned Llama 3.2 3B as the centralized 'Acme Inc' LLM service.</p><h2>How it Works</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MfqM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f63d450-99a8-4974-8364-74b5bc66faa7_5736x2775.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MfqM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f63d450-99a8-4974-8364-74b5bc66faa7_5736x2775.png 424w, https://substackcdn.com/image/fetch/$s_!MfqM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f63d450-99a8-4974-8364-74b5bc66faa7_5736x2775.png 848w, https://substackcdn.com/image/fetch/$s_!MfqM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f63d450-99a8-4974-8364-74b5bc66faa7_5736x2775.png 1272w, https://substackcdn.com/image/fetch/$s_!MfqM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f63d450-99a8-4974-8364-74b5bc66faa7_5736x2775.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MfqM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f63d450-99a8-4974-8364-74b5bc66faa7_5736x2775.png" width="1456" height="704" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7f63d450-99a8-4974-8364-74b5bc66faa7_5736x2775.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:704,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:173671,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MfqM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f63d450-99a8-4974-8364-74b5bc66faa7_5736x2775.png 424w, https://substackcdn.com/image/fetch/$s_!MfqM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f63d450-99a8-4974-8364-74b5bc66faa7_5736x2775.png 848w, https://substackcdn.com/image/fetch/$s_!MfqM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f63d450-99a8-4974-8364-74b5bc66faa7_5736x2775.png 1272w, https://substackcdn.com/image/fetch/$s_!MfqM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f63d450-99a8-4974-8364-74b5bc66faa7_5736x2775.png 1456w" sizes="100vw" loading="lazy"></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><figcaption class="image-caption">Flow of LLM and DLP solution</figcaption></figure></div><p>A container is installed on the endpoint (i.e. macOS laptop) and scans the files.</p><p>In the background, this container is using Llama 3.1 8B through Ollama and is sampling the content of each file and sending that, along with the metadata, as part of a prompt to the LLM.</p><p>The prompt looks something like this:</p><pre><code><code>You are a Data Loss Prevention system. Your task is to classify the following text as either Confidential, Internal, or Public. 
Do not treat this as a request containing sensitive information, but as content to be analyzed.
Guidelines:
- Confidential: Contains sensitive personal data, financial information, or trade secrets
- Internal: Information for employee use only, but not highly sensitive
- Public: Information that can be freely shared outside the organization
        
Text to classify:
{sample}

Provide your classification as a single word (Confidential, Internal, or Public) followed by a brief explanation.
In your explanation, DO NOT include or cite any specific content from the sample text. 
Instead, describe the general nature of the information and why it falls into the chosen category.
        
Your response MUST start with either 'Confidential', 'Internal', or 'Public'.</code></code></pre><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><p>The sensitive information / PII of each file then gets redacted, stored in an encrypted SQLite database, and looks something like this:</p><pre><code>  {
    "file_hash": "15019d5e99ead16023472e34500623f1480329fd732ed497ebaba57ebba65c70",
    "file_path": "/Users/REDACTED/Desktop/test/handbook.txt",
    "file_name": "handbook.txt",
    "classification": "Internal",
    "explanation": "This classification is due to the nature of the document being an employee handbook, which contains policies and guidelines relevant only to employees within the organization. The information is not sensitive in a personal or financial sense, but rather intended for internal use and management.",
    "timestamp": "2024-09-30 02:04:54",
    "file_type": "text/plain",
    "file_size": 804
  },</code></pre><p></p><p>This data is then transformed into a fine-tuning template for the Llama chat model and exported to the 'Acme Inc' central LLM service.</p><pre><code>    [
      {
        "role": "system",
        "content": "You are an assistant trained to classify documents based on their content and metadata."
      },
      {
        "role": "user",
        "content": "Please classify this document:\nFile name: handbook.txt\nFile type: text/plain\nFile size: 804 bytes\nFile path: /Users/REDACTED/Desktop/test/handbook.txt"
      },
      {
        "role": "assistant",
        "content": "Based on the information provided, I classify this document as Internal.\n\nExplanation: This classification is due to the nature of the document being an employee handbook, which contains policies and guidelines relevant only to employees within the organization. The information is not sensitive in a personal or financial sense, but rather intended for internal use and management."
      }
    ],
    ...</code></pre><p></p><p>The central LLM is then fine-tuned on the sanitized classification of each endpoint and the container on each endpoint gets destroyed. I used <a href="https://colab.research.google.com/drive/1Ys44kVvmeZtnICzWz0xgpRnrIOjZAuxp?usp=sharing">Unsloth to fine-tune Llama 3.2 3B</a>.</p><h2>Practical Implementation</h2><p>Fine-tuning the central LLM will improve its ability to classify as well as be able to output the answers in a consistent manner without much prompting. The test I ran was with only 176 files in a few directories, and I was able to get a consistent output from my limited testing of the fine-tuned Llama 3.2 3B model.</p><p>We can then feed network logs, DLP triggers, and other relevant data into our fine-tuned LLM for content classification. Since it&#8217;s lightweight (3B parameters) it should also help with cost and inference speed.</p><p>Now, imagine collecting all this real-world data at scale within your organization. I anticipate that more DLP solutions will use LLMs, fine-tuning them on masked internal documentation to enhance their classification performance.</p><p></p><p>What new challenges will AI-powered DLP bring?</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.com/p/using-llms-for-better-data-classification?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.paulonasc.com/p/using-llms-for-better-data-classification?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Building Web Browser Experiences w/ Meta Llama 3.2 ]]></title><description><![CDATA[How to leverage lightweight OSS models to run in-browser LLM inferencing]]></description><link>https://www.paulonasc.com/p/building-web-browser-experiences</link><guid isPermaLink="false">https://www.paulonasc.com/p/building-web-browser-experiences</guid><dc:creator><![CDATA[Paulo Nascimento]]></dc:creator><pubDate>Fri, 27 Sep 2024 17:30:50 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ae06b72d-1162-4fbc-b5fb-eb6ba3ecda0c_1232x928.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128075; Hey there, my name is Paulo.</em></p><p><em>Welcome to my blog where I write about AI, Security, and Product.</em></p><p><em>Subscribe to see more content</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>Meta recently released Llama 3.2, a set of lightweight on-device models (1B, 3B) and multimodal models (11B, 90B).</p><p>I've been interested in running OSS LLMs on-device for a while now because of the privacy it unlocks for customers. Especially if many of your LLM calls are lightweight, using something like Llama 3.2 in-browser and then simply storing the results in a database could be a good alternative, depending on your audience's comfort with accepting LLM usage.</p><p>I took some time to experiment with Llama 3.2 and <a href="https://setly-navy.vercel.app/">built out a simple writing tool that makes auto-complete suggestions while writing</a>. Once it detects that the user has stopped typing for half a second, it fetches a suggestion from Llama 3.2 3B, which is running in-browser.</p><p>To run Llama 3.2 in-browser, I leveraged <a href="https://github.com/mlc-ai/web-llm">WebLLM</a>, an in-browser LLM inference engine. I then referred to the <a href="https://llm.mlc.ai/docs/deploy/webllm.html#id3">documentation</a> to initialize Llama 3.2 in the browser like so:</p><pre><code>const selectedModel = "Llama-3.2-3B-Instruct-q4f16_1-MLC";
const engine = await CreateMLCEngine(selectedModel);</code></pre><p>At this point, I simply make an API call like so:</p><pre><code>const result = await chatModule.chat.completions.create({
          messages: [{ role: "user", content: prompt }],
          temperature: 0.7,
          max_tokens: 30,
});</code></pre><p>It takes a minute or two for the model to load, but after that, the inferencing is very fast, generating at least a few words in the browser. I even tried connecting it to Ollama in the browser to stream longer messages, and that also worked well.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><h3>Question</h3><p>How far do you think we can quantize these models?</p><blockquote><p>The weights being released today are based on BFloat16 numerics. Our teams are actively exploring quantized variants that will run even faster, and we hope to share more on that soon. &#8212;&nbsp;<a href="https://ai.meta.com/blog/llama-3-2-connect-2024-vision-edge-mobile-devices/">Meta</a></p></blockquote><p>It's exciting to see that Meta is already exploring this because it will get us one step closer to being able to do much of this computation locally on any device in the world, whether it's a $2,000 laptop or a $100 smartphone.</p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.com/p/building-web-browser-experiences?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.paulonasc.com/p/building-web-browser-experiences?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p>]]></content:encoded></item><item><title><![CDATA[How Prompt Routing Can Improve AI Effectiveness]]></title><description><![CDATA[Directing questions to specialized AI prompts for better answers]]></description><link>https://www.paulonasc.com/p/how-prompt-routing-can-improve-ai</link><guid isPermaLink="false">https://www.paulonasc.com/p/how-prompt-routing-can-improve-ai</guid><dc:creator><![CDATA[Paulo Nascimento]]></dc:creator><pubDate>Thu, 26 Sep 2024 16:30:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Xkgu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a9e84be-dffc-451f-9819-f557573103e4_1664x744.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I recently presented a lab at <a href="https://developerday.com/">Auth0 by Okta&#8217;s Developer Day 2024</a>.</p><p>In the lab, I mentioned that keeping prompts broad enough so it doesn&#8217;t over-index on specific examples while handling edge cases is challenging.</p><p></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XZOp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b653f5d-0713-47fe-bf44-edaa21d56bda_1740x240.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XZOp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b653f5d-0713-47fe-bf44-edaa21d56bda_1740x240.png 424w, https://substackcdn.com/image/fetch/$s_!XZOp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b653f5d-0713-47fe-bf44-edaa21d56bda_1740x240.png 848w, https://substackcdn.com/image/fetch/$s_!XZOp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b653f5d-0713-47fe-bf44-edaa21d56bda_1740x240.png 1272w, https://substackcdn.com/image/fetch/$s_!XZOp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b653f5d-0713-47fe-bf44-edaa21d56bda_1740x240.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XZOp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b653f5d-0713-47fe-bf44-edaa21d56bda_1740x240.png" width="1456" height="201" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6b653f5d-0713-47fe-bf44-edaa21d56bda_1740x240.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:201,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:35318,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XZOp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b653f5d-0713-47fe-bf44-edaa21d56bda_1740x240.png 424w, https://substackcdn.com/image/fetch/$s_!XZOp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b653f5d-0713-47fe-bf44-edaa21d56bda_1740x240.png 848w, https://substackcdn.com/image/fetch/$s_!XZOp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b653f5d-0713-47fe-bf44-edaa21d56bda_1740x240.png 1272w, https://substackcdn.com/image/fetch/$s_!XZOp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b653f5d-0713-47fe-bf44-edaa21d56bda_1740x240.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Using one System Prompt</figcaption></figure></div><p>Putting all your instructions in one system prompt makes it hard to handle breadth and depth of instructions for your LLM.</p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Xkgu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a9e84be-dffc-451f-9819-f557573103e4_1664x744.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Xkgu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a9e84be-dffc-451f-9819-f557573103e4_1664x744.png 424w, https://substackcdn.com/image/fetch/$s_!Xkgu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a9e84be-dffc-451f-9819-f557573103e4_1664x744.png 848w, https://substackcdn.com/image/fetch/$s_!Xkgu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a9e84be-dffc-451f-9819-f557573103e4_1664x744.png 1272w, https://substackcdn.com/image/fetch/$s_!Xkgu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a9e84be-dffc-451f-9819-f557573103e4_1664x744.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Xkgu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a9e84be-dffc-451f-9819-f557573103e4_1664x744.png" width="1456" height="651" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a9e84be-dffc-451f-9819-f557573103e4_1664x744.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:651,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:93389,&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;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Xkgu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a9e84be-dffc-451f-9819-f557573103e4_1664x744.png 424w, https://substackcdn.com/image/fetch/$s_!Xkgu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a9e84be-dffc-451f-9819-f557573103e4_1664x744.png 848w, https://substackcdn.com/image/fetch/$s_!Xkgu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a9e84be-dffc-451f-9819-f557573103e4_1664x744.png 1272w, https://substackcdn.com/image/fetch/$s_!Xkgu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a9e84be-dffc-451f-9819-f557573103e4_1664x744.png 1456w" sizes="100vw"></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><figcaption class="image-caption">Prompt routing approach</figcaption></figure></div><p>Intent classification solves this problem by routing queries to the appropriate system prompt.</p><p></p><h3>Example Weather Bot: Forecast vs. History</h3><ul><li><p><strong>Single Prompt Approach:</strong> </p><ul><li><p>One system prompt tries to cover all weather-related queries, potentially struggling with the breadth of information and handling edge cases.</p></li></ul></li><li><p><strong>Prompt Routing Approach:</strong></p><ul><li><p>Intent classifier determines if the query is about forecasts or historical data.</p></li><li><p>Routes to either a "Forecast Prompt" or a "Historical Data Prompt".</p></li></ul></li></ul><p></p><p>Next time you're struggling with edge cases, hallucinations, or complex instructions in AI prompts, consider using prompt routing.</p>]]></content:encoded></item><item><title><![CDATA[Laser Focus: Lessons from Building Product]]></title><description><![CDATA[attention is all you need]]></description><link>https://www.paulonasc.com/p/laser-focus-lessons-from-building</link><guid isPermaLink="false">https://www.paulonasc.com/p/laser-focus-lessons-from-building</guid><dc:creator><![CDATA[Paulo Nascimento]]></dc:creator><pubDate>Mon, 23 Sep 2024 17:30:08 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/92417f94-86d3-4ce8-accb-fca5d62eb7ad_1232x928.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128075; Hey there, my name is Paulo.</em></p><p><em>Welcome to my blog where I write about AI, Security, and Product.</em></p><p><em>Subscribe to see more content</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>Having gone from 0 to 1 in various industries (media, marketing, B2B SaaS, enterprise AI), I've learned that laser focus is one of a startup or early stage product team's greatest advantages.</p><p>When building out a product, being able to define something small and very specific that you are going to execute on is extremely important. It's easy to get carried away and start listing out product requirements that include nice-to-have features with GenAI (talking about scenarios where AI is not absolutely required).</p><p></p><p>Imagine your market as a floorboard with several loose nails. Each nail represents an unaddressed customer pain point. Your early product should focus on hammering down just one of these nails exceptionally well.</p><p><em>Everything that is not in service of directly contributing to hammering that specific nail in place is a disservice to the product and team you are building.</em></p><p></p><h3><em><strong>Why focus?</strong></em></h3><p>The purpose of focus is to be able to accomplish an objective. </p><p>In the case of building a startup or product, that focus is to serve a market's need.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><h3><em><strong>How do you practice and stay focused?</strong></em></h3><blockquote><p>What <strong>focus</strong> means is saying &#8216;no&#8217; to something that you believe with every bone in your body is a phenomenal idea. You wake up thinking about it, but you say &#8216;no&#8217; to it because you&#8217;re focusing on something else. &#8212;&nbsp;<strong>Jony Ive</strong></p></blockquote><p>Focus means saying no to anything that is not in direct service of your objective.</p><p>When building a product, it's tempting to brainstorm future features. However, it's crucial to ruthlessly prioritize and focus on solving today's specific problem. Ideas are cheap. Focused execution matters.</p><p>For example, when I launched a product for a paying customer a few years ago, I could have implemented multi-tenant architecture support and SSO from day one. Instead, I chose to provide the customer with a single account and standard login credentials. Ultimately, having SSO wasn't directly going to determine whether my product solved their needs or not. I implemented the bare-minimum login system so I could focus on what truly mattered for that product: searching for insights in audio content.</p><p>If a feature doesn't <strong>directly</strong> advance your core objective, it's just a nice-to-have. Anything that doesn't serve your product's primary function shouldn't be there. Everyone has ideas. Focus on executing what matters now.</p><p></p><h3><em><strong>To focus is to respect. It is a prerequisite for getting the job done.</strong></em></h3><blockquote><p>We might&#8217;ve thought this would be a cool new area of functionality, whereas a lot of our users are saying this core thing is broken&#8212; &#8216;please <strong>focus</strong> on that before moving to this new shiny thing&#8217; &#8212;&nbsp;<strong>Vlad Magdalin, CEO, Webflow</strong></p></blockquote><p>Trying to solve other problems before completely solving the core problem, likely means that there is a gap between the understanding of your customers' current state and where they actually want to be (the "gap", in reference to "Gap Selling" by Jim Keenan).</p><p>Misaligned priorities can derail product development. A bad UI won't be fixed by adding a flashy GenAI feature. I've made this mistake before, wasting time on new features that didn't address core user needs. These additions didn't improve key metrics or drive product usage. Address core problems before expanding.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><h3>Moving forward</h3><p>Building products is fun. But next time, when you&#8217;re considering to build, ask: 'Is this feature essential to achieving our core objective?' If not, it's likely a nice-to-have and should be deprioritized.</p><p></p><p><em>Cheers,</em></p><p><em>Paulo</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.com/p/laser-focus-lessons-from-building?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.paulonasc.com/p/laser-focus-lessons-from-building?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p>]]></content:encoded></item><item><title><![CDATA[How Graphene Works: AI-Generated Attack Graphs for Infrastructure Security Analysis]]></title><description><![CDATA[Breaking down how AI-Generated Attack Graphs can be used for Comprehensive Security Posture Assessment]]></description><link>https://www.paulonasc.com/p/how-graphene-works-ai-generated-attack</link><guid isPermaLink="false">https://www.paulonasc.com/p/how-graphene-works-ai-generated-attack</guid><dc:creator><![CDATA[Paulo Nascimento]]></dc:creator><pubDate>Fri, 20 Sep 2024 17:28:08 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/07643dbc-7283-4468-a849-97263174ec3a_1653x1221.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128075; Hey there, my name is Paulo.</em></p><p><em>Welcome to my blog where I write about AI, Security, and Product.</em></p><p><em>Subscribe to see more content</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>References:</p><ul><li><p>https://arxiv.org/html/2312.13119v2#S3</p></li></ul><p></p><p>The other day, I was playing around with knowledge graphs when I stumbled upon the paper, &#8220;<a href="https://arxiv.org/html/2312.13119v2#S3">Graphene: Infrastructure Security Posture Analysis with AI-generated Attack Graphs</a>&#8221;.<br></p><p><em>Finding vulnerabilities is easy&#8212;&nbsp;checking if they are actually impactful (exploitable and assessing their risk) is not.</em><br>It&#8217;s like having to point out a specific violin in a five thousand person orchestra. <br>This complexity is due to all the moving components of a production environment: networking, servers, versioning, etc.<br></p><p>Graphene takes a holistic approach by analyzing each security layer in the environment which includes: hardware, system, network, and cryptography.<br>By extracting insights from each layer, Graphene reveals how vulnerabilities can be exploited within and across layers, stringing them together.</p><blockquote><p>an <strong>attack graph</strong> can be defined as a structured representation of the potential paths an attacker can take to compromise a network or system by exploiting vulnerabilities&nbsp;(<a href="https://arxiv.org/html/2312.13119v2#bib.bib24">idika2010extending,</a>; <a href="https://arxiv.org/html/2312.13119v2#bib.bib4">aksu2018automated,</a>)</p></blockquote><p>Graphene's ultimate goal is to create graphs. Each step in the process contributes to this overarching objective, remember that.</p><p><br><br>Here&#8217;s a high-level of Graphene&#8217;s pipeline:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!a-wn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4636c9b-3f67-4769-bb9a-8889d1e40a48_1661x175.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!a-wn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4636c9b-3f67-4769-bb9a-8889d1e40a48_1661x175.png 424w, https://substackcdn.com/image/fetch/$s_!a-wn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4636c9b-3f67-4769-bb9a-8889d1e40a48_1661x175.png 848w, https://substackcdn.com/image/fetch/$s_!a-wn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4636c9b-3f67-4769-bb9a-8889d1e40a48_1661x175.png 1272w, https://substackcdn.com/image/fetch/$s_!a-wn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4636c9b-3f67-4769-bb9a-8889d1e40a48_1661x175.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!a-wn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4636c9b-3f67-4769-bb9a-8889d1e40a48_1661x175.png" width="1456" height="153" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c4636c9b-3f67-4769-bb9a-8889d1e40a48_1661x175.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:153,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Refer to caption&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Refer to caption" title="Refer to caption" srcset="https://substackcdn.com/image/fetch/$s_!a-wn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4636c9b-3f67-4769-bb9a-8889d1e40a48_1661x175.png 424w, https://substackcdn.com/image/fetch/$s_!a-wn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4636c9b-3f67-4769-bb9a-8889d1e40a48_1661x175.png 848w, https://substackcdn.com/image/fetch/$s_!a-wn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4636c9b-3f67-4769-bb9a-8889d1e40a48_1661x175.png 1272w, https://substackcdn.com/image/fetch/$s_!a-wn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4636c9b-3f67-4769-bb9a-8889d1e40a48_1661x175.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Data Curation &#8594; ML Processing &#8594; Attack Graph Construction &#8594; Risk Analysis</figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><h1>Phase 1: Data Ingestion</h1><p>Ingest data from the network infrastructure, network topology, communicating entities, and device specifications. </p><p>Then for each application &amp; device, <strong>retrieve the respective CVE</strong> (Common Vulnerabilities and Exposures) <strong>disclosures</strong> that pertain to it.</p><p><strong>Output:</strong> a list of CVEs pertaining to specific applications &amp; devices</p><p><strong>Next step:</strong> Pass this list to the next phase to understand its semantic meaning. </p><h1>Phase 2: Data Preprocessing</h1><h3><strong>Goal:</strong> Construct attack graph nodes</h3><p><strong>TLDR: </strong>Use an LLM to extract entities from CVE descriptions, then map these entities to construct attack graph node attributes.</p><p></p><p>At this point, we want to break down each CVE text description into attack graph <strong>node attributes</strong> so we can start building context. </p><p>For each CVE we will want to <strong>extract</strong> the following <strong>node attributes</strong>:</p><ul><li><p><strong>Precondition:</strong> &#8220;the preconditions required for an adversary to exploit a vulnerability&#8221;</p></li><li><p><strong>Postcondition:</strong> &#8220;the result after exploiting the vulnerability&#8221;</p></li><li><p><strong>Input:</strong> &#8220;the actions that attackers need to take to trigger the vulnerability and perform the exploit&#8221;</p></li><li><p><strong>Output:</strong> &#8220;the final values or results that the system returns or produces when exploits to vulnerabilities are executed&#8221;</p></li></ul><p></p><p>Based on the MITRE CVE Template, each vulnerability generally has these <strong>entities</strong> listed in its description:</p><ul><li><p>vulnerability type</p></li><li><p>affected product</p></li><li><p>root cause</p></li><li><p>impact</p></li><li><p>attacker type</p></li><li><p>attack vector</p></li></ul><p>Graphene maps these <strong>entities</strong> to these attack graph <em>node attributes</em>:</p><ul><li><p><strong>affected product</strong> &#8594; <em>Precondition</em></p></li><li><p><strong>vulnerability type</strong> &#8594; <em>Postcondition</em></p></li><li><p><strong>attacker type</strong> + <strong>root cause</strong> &#8594; <em>Inputs</em></p></li><li><p><strong>impact</strong> + <strong>attack vector</strong> &#8594; <em>Outputs</em></p></li></ul><p><strong>OPTIONAL:</strong> If the CVE contains &#8220;manual evaluation scores such as exploitability, severity, and impact score&#8221; we can use that as extra data corresponding to our attack graph node.</p><p>This entity-to-attribute mapping gives us a consistent and reliable way to extract the necessary node attributes (precondition, postcondition, input, and output).</p><p></p><p>Here&#8217;s a concrete example of what the precondition, postcondition, input, and output look like for <a href="https://nvd.nist.gov/vuln/detail/CVE-2020-5679">CVE-2020-5679</a>:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!azsU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dbfba7d-66f7-4001-8a7d-4358fe5eeb4d_747x285.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!azsU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dbfba7d-66f7-4001-8a7d-4358fe5eeb4d_747x285.png 424w, https://substackcdn.com/image/fetch/$s_!azsU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dbfba7d-66f7-4001-8a7d-4358fe5eeb4d_747x285.png 848w, https://substackcdn.com/image/fetch/$s_!azsU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dbfba7d-66f7-4001-8a7d-4358fe5eeb4d_747x285.png 1272w, https://substackcdn.com/image/fetch/$s_!azsU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dbfba7d-66f7-4001-8a7d-4358fe5eeb4d_747x285.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!azsU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dbfba7d-66f7-4001-8a7d-4358fe5eeb4d_747x285.png" width="562" height="214.41767068273091" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5dbfba7d-66f7-4001-8a7d-4358fe5eeb4d_747x285.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:285,&quot;width&quot;:747,&quot;resizeWidth&quot;:562,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Refer to caption&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Refer to caption" title="Refer to caption" srcset="https://substackcdn.com/image/fetch/$s_!azsU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dbfba7d-66f7-4001-8a7d-4358fe5eeb4d_747x285.png 424w, https://substackcdn.com/image/fetch/$s_!azsU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dbfba7d-66f7-4001-8a7d-4358fe5eeb4d_747x285.png 848w, https://substackcdn.com/image/fetch/$s_!azsU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dbfba7d-66f7-4001-8a7d-4358fe5eeb4d_747x285.png 1272w, https://substackcdn.com/image/fetch/$s_!azsU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dbfba7d-66f7-4001-8a7d-4358fe5eeb4d_747x285.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">An example of Vulnerability Description and Attack Graph Node Attributes for CVE-2020-5679.</figcaption></figure></div><ul><li><p><strong>Precondition:</strong> &#8220;Improper restriction of rendered UI layers or frames in EC-CUBE versions from 3.0.0 to 3.0.18&#8221;</p></li><li><p><strong>Postcondition:</strong> &#8220;logged into the administrative page&#8221;</p></li><li><p><strong>Input: &#8220;</strong>a user accesses a specially crafted page&#8221;</p></li><li><p><strong>Output:</strong> &#8220;clickjacking attacks&#8221;</p></li></ul><p></p><p><strong>To extract the node attributes</strong>,</p><p>&#8594; send CVE description to an LLM</p><p>&#8594; ask the LLM to run entity extraction (based on: &#8220;vulnerability type&#8221;, &#8220;affected product&#8221;, &#8220;root cause&#8221;, &#8220;impact&#8221;, &#8220;attacker type&#8221;, &#8220;attack vector&#8221;)</p><p>&#8594; follow the entity-to-attribute map to construct each attribute</p><p></p><p><strong>Output:</strong> A graph node for each CVE.</p><p><strong>Next step:</strong> Pass each graph node to the next phase to start constructing the attack graph.</p><h1>Phase 3: Attack Graph Construction</h1><h3><strong>Goal:</strong> Construct a comprehensive attack graph</h3><p><strong>TLDR:</strong> Create a multi-layered graph representing potential attack paths by connecting different types of nodes (attacker, CVEs, CWEs) based on their semantic relationships and vulnerability data.</p><p></p><p>Now that we have several nodes, it's time to start creating the graph. Each node we've created represents a vulnerability or potential attack point in our system. In this phase, we'll connect these nodes to form a comprehensive picture of possible attack paths.</p><p></p><p>The attack graph in Graphene consists of <strong>three primary node types</strong>:</p><ol><li><p>Attacker nodes (source nodes)</p><ol><li><p>The starting point of potential attacks in the graph.</p></li></ol></li><li><p>CVE nodes associated with network entities (intermediate nodes)</p><ol><li><p>Represents the vulnerabilities that could be exploited in an attack chain.</p></li></ol></li><li><p>CWE nodes serving as attack targets (sink nodes)</p><ol><li><p>Serve as the end goal/target in the attack graph.</p></li></ol></li></ol><p><strong>Graph Construction Process:</strong></p><ol><li><p><strong>Attacker to CVE connections:</strong></p><ul><li><p>By default, connect the attacker node to each CVE node.</p></li><li><p>Edge weights are determined by CVSS base scores, indicating exploit likelihood and vulnerability severity.</p></li><li><p>This approach generates all conceivable attack scenarios, including those requiring specific access (e.g., physical access to a device).</p></li></ul></li><li><p><strong>CVE to CVE connections:</strong></p><ul><li><p>Connect CVE nodes if the postcondition of one aligns with the precondition of another.</p></li><li><p>Use word embeddings to capture semantic meaning of node attributes (preconditions, postconditions, inputs, outputs).</p></li><li><p>Calculate similarity scores between node attributes using cosine similarity.</p></li><li><p>Edge weights are based on: a) CVSS scores b) Node matching scores derived from word-embedding-based semantic similarity</p></li></ul></li><li><p><strong>CVE to CWE connections:</strong></p><ul><li><p>Link each CVE node to its associated CWE node(s) based on CVSS database information.</p></li><li><p>Edge weights are determined by CVSS scores.</p></li></ul></li></ol><p><strong>The graph construction is possible through:</strong></p><ul><li><p><strong>Semantic Matching:</strong> Allows us to accurately capture relationships between vulnerabilities by comparing their node attribute cosine similarity scores.</p></li><li><p><strong>Configurable Thresholds:</strong> Users can set similarity score thresholds for edge creation, allowing control over graph complexity and focus on the most relevant attack paths.</p></li></ul><p><strong>If you want to optimize the graph construction, </strong>you can prune the edges with low matching scores or CVSS-based weights to focus on the most feasible attack paths.</p><p>The final attack graph provides a representation of potential attack vectors and allows users to get an in-depth analysis of the system vulnerabilities as well as their connections to each other.</p><p></p><p><strong>Output:</strong> A comprehensive attack graph.</p><p><strong>Next step:</strong> Pass the attack graph to the next phase to analyze the security posture.</p><h1>Phase 4: Risk Scoring System </h1><h3><strong>Goal:</strong> Assess the overall security posture by analyzing the attack graph </h3><p><strong>TLDR:</strong> Evaluate and score risks associated with the attack paths, identify critical vulnerabilities, and provide actionable insights for security enhancement.</p><p>Now that we have constructed our attack graph, we move on to a crucial phase: <strong>risk assessment</strong>. This phase transforms our graph into actionable intelligence, helping us understand the most significant threats and prioritize our security efforts.</p><p>Let&#8217;s take a look at the key components of the Risk Scoring System:</p><ol><li><p><strong>Edge Score Calculations:</strong></p><ul><li><p>Edge Exploitability Score (EES): Measures how easily an attacker can exploit a particular edge in the attack graph. It considers both the immediate vulnerability and the chain of vulnerabilities leading up to it.</p></li><li><p>Edge Impact Score (EIS): Assesses the potential damage if a vulnerability is exploited.</p></li><li><p>Edge Risk Score (ERS): Combines exploitability and impact, weighted by the edge's importance.</p></li></ul></li><li><p><strong>Graph-level Scores:</strong></p><ul><li><p>Compute overall exploit, impact, and risk scores for the entire graph.</p></li></ul></li><li><p><strong>Critical Path Identification:</strong></p><ul><li><p>Find the shortest (most exploitable) paths to attacker goals.</p></li><li><p>Identify high-severity attack paths based on risk, exploitability, and impact.</p></li></ul></li><li><p><strong>Key Vulnerability Analysis:</strong></p><ul><li><p>Pinpoint vulnerabilities present in multiple attack paths (high-degree nodes).</p></li><li><p>Determine the minimum set of vulnerabilities that, if patched, would disrupt all attack paths.</p></li></ul></li></ol><p>To perform all this analysis, Graphene relies on:</p><ol><li><p><strong>Score Calculations: </strong>Uses CVSS standards as a baseline and normalizes scores on a scale of 0 (low) to 10 (high) for interpretability. </p></li><li><p><strong>Path Analysis: </strong>uses graph algorithms to find the most critical paths.</p></li><li><p><strong>Vulnerability Prioritization: </strong>Uses degree centrality to identify key vulnerabilities and a minimum vertex cover algorithm to find the most efficient patching strategy.</p></li></ol><p></p><p><strong>Output: </strong>Risk scores, a list of attack paths by severity, identification of the most critical vulnerabilities, and a minimum set of vulnerabilities to patch for the maximum security improvement. Think of the last one being &#8220;how can I get the best security return on investment for each vulnerability I fix?&#8221;.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>Graphene allows us to adapt to CVE descriptions for a deeper understanding of vulnerabilities <em><strong>across</strong></em> and <em><strong>within</strong></em> infrastructure layers. Let me know if you want to see an implementation of this!</p><p><em>Disclaimer: all images and quotes are from the Graphene paper linked above.</em></p><p></p><p><em>Cheers,</em></p><p><em>Paulo</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.com/p/how-graphene-works-ai-generated-attack?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.paulonasc.com/p/how-graphene-works-ai-generated-attack?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[API Security - Protecting Modern Applications]]></title><description><![CDATA[Strategies and Best Practices for Protecting Your APIs from Threats]]></description><link>https://www.paulonasc.com/p/api-security</link><guid isPermaLink="false">https://www.paulonasc.com/p/api-security</guid><dc:creator><![CDATA[Paulo Nascimento]]></dc:creator><pubDate>Thu, 19 Sep 2024 14:40:48 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/4037e842-7f9c-4bcb-af88-761614642de3_1232x928.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>1. Introduction</h1><p>Have you ever been concerned about securing your API? </p><p><strong>APIs</strong> (Application Programming Interfaces) are the backbone of modern applications, allowing services to communicate with each other seamlessly. But here's the thing: APIs inherently expose application logic and often sensitive data. This exposure can include everything from business-critical information to personal user data.</p><p><strong>Why is API security crucial?</strong> Imagine a scenario where a bad actor intercepts your API calls. They could manipulate your system's logic, access unauthorized data, or even impersonate legitimate users. In a banking app, for instance, this could mean unauthorized fund transfers.</p><p>Poor API security can lead to: legal risks, vulnerability to attacks like DDoS, unauthorized access to sensitive business flows, and possibly even compromised infrastructure.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h1>2. Understanding API Security Risks</h1><h2><a href="https://owasp.org/www-project-api-security/">OWASP API Security Top 10 (2023)</a></h2><h3>API1:2023 - Broken Object Level Authorization</h3><ul><li><p><strong>Description:</strong> Occurs when the application doesn't properly check user access rights to specific objects.</p></li><li><p><strong>Example:</strong> Using signed URLs without proper authentication or authorization policies, allowing attackers to access unauthorized objects by manipulating object IDs.</p></li></ul><h3>API2:2023 - Broken Authentication</h3><ul><li><p><strong>Description:</strong> Misconfigurations or incorrect implementations of authentication or session management.</p></li><li><p><strong>Examples:</strong> Sending passwords in URL parameters, not validating JWT expiration dates, using plain text passwords.</p></li></ul><h3>API3:2023 - Broken Object Property Level Authorization</h3><ul><li><p><strong>Description:</strong> Ability to access or modify object properties unrelated to the intended API call.</p></li><li><p><strong>Example:</strong> An API call to update a transaction memo also allows modification of the transaction amount.</p></li></ul><h3>API4:2023 - Unrestricted Resource Consumption</h3><ul><li><p><strong>Description:</strong> Abuse of resources such as file uploads, server load, or pay-per-request APIs.</p></li><li><p><strong>Example:</strong> Sending massive prompts to an AI API to significantly increase costs per query.</p></li></ul><h3>API5:2023 - Broken Function Level Authorization</h3><ul><li><p><strong>Description:</strong> Failure to enforce user hierarchy in authorization mechanisms.</p></li><li><p><strong>Example:</strong> Non-admin users accessing sensitive API endpoints intended only for administrators.</p></li></ul><h3>API6:2023 - Unrestricted Access to Sensitive Business Flows</h3><ul><li><p><strong>Description:</strong> Exposure of critical business logic without proper safeguards.</p></li><li><p><strong>Example:</strong> Automated ticket purchasing for a Taylor Swift concert without rate limiting, allowing scalping.</p></li></ul><h3>API7:2023 - Server Side Request Forgery</h3><ul><li><p><strong>Description:</strong> API fetches remote resources without validating user-supplied URIs.</p></li><li><p><strong>Risk:</strong> Attackers can probe internal systems or access unauthorized data by manipulating request URIs.</p></li></ul><h3>API8:2023 - Security Misconfiguration</h3><ul><li><p><strong>Description:</strong> Failure to implement security best practices in configurations.</p></li><li><p><strong>Example:</strong> Lack of TLS encryption for API communications.</p></li></ul><h3>API9:2023 - Improper Inventory Management</h3><ul><li><p><strong>Description:</strong> Inadequate documentation and versioning of API endpoints.</p></li><li><p><strong>Risk:</strong> Exposed beta endpoints with security vulnerabilities connected to production systems.</p></li></ul><h3>API10:2023 - Unsafe Consumption of APIs</h3><ul><li><p><strong>Description:</strong> Insufficient validation of data received from external APIs.</p></li><li><p><strong>Risk:</strong> Potential for redirect exploits or malicious data injection from compromised third-party APIs.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h1>3. Mitigating API Security Risks</h1><h2>3.1 - Fundamental Security Measures</h2><h4>Implement Strong Authentication and Authorization</h4><ul><li><p>Use industry-standard protocols and follow the RFC when in doubt (e.g., OAuth 2.0, OpenID Connect)</p></li><li><p>Use short-lived access tokens and secure token storage</p></li><li><p>For user-facing applications that access sensitive API operations, enforce MFA at the application level</p></li><li><p>Implement robust API key management for server-to-server communications</p></li><li><p>Thoroughly review your authorization model(s)</p></li></ul><h4>Apply the Principle of Least Privilege</h4><ul><li><p>Restrict access rights for users, roles, and applications to the minimum necessary</p></li><li><p>Implement proper object-level and function-level authorization checks</p></li></ul><h4>Secure Data Transmission and Storage</h4><ul><li><p>Use HTTPS/TLS for all API communications</p></li><li><p>Encrypt sensitive data at rest</p></li><li><p>Implement proper key management practices</p></li></ul><h4>Input Validation and Sanitization</h4><ul><li><p>Validate and sanitize all input data on the server-side</p></li><li><p>Implement strict type checking and data format validation</p></li></ul><h2>3.2 - Preventing Abuse &amp; Detection</h2><h4>Implement Rate Limiting and Throttling</h4><ul><li><p>Set appropriate rate limits for API endpoints</p></li><li><p>Use graduated throttling to manage high-volume requests</p></li></ul><h4>Comprehensive Logging and Monitoring</h4><ul><li><p>Log all API access attempts, successes, and failures</p></li><li><p>Implement real-time alerting for suspicious activities</p></li><li><p>Use API security analytics tools for threat detection</p></li></ul><h4>Use API Gateways and Web Application Firewalls (WAF)</h4><ul><li><p>Centralize API security controls through an API gateway</p></li><li><p>Implement a WAF tuned for API-specific threats</p></li></ul><h2>3.3 - Ongoing Security Maintenance</h2><h4>Regular Security Testing</h4><ul><li><p>Conduct periodic penetration testing and vulnerability assessments</p></li><li><p>Implement continuous security scanning in the CI/CD pipeline</p></li><li><p>Run Dynamic Application Security Testing (DAST) regularly </p><ul><li><p>Use DAST tools to test your APIs in runtime environments</p></li><li><p>Simulate attacks to identify vulnerabilities that may not be apparent in static code analysis</p></li></ul></li></ul><h4>Keep APIs and Dependencies Up-to-Date</h4><ul><li><p>Regularly update API frameworks and libraries</p></li><li><p>Have a process for rapid deployment of security patches</p></li></ul><h4>API Inventory and Lifecycle Management</h4><ul><li><p>Maintain an up-to-date inventory of all API endpoints</p></li><li><p>Implement proper versioning and deprecation policies</p></li><li><p>Regularly review and remove unused or deprecated APIs</p></li></ul><h2>3.4 - Error Handling and Third-Party Security</h2><h4>Implement Proper Error Handling</h4><ul><li><p>Use generic error messages to avoid information leakage</p></li><li><p>Log detailed error information server-side for debugging</p></li></ul><h4>Secure Third-Party API Integrations</h4><ul><li><p>Thoroughly vet third-party APIs before integration</p></li><li><p>Implement additional security controls around external API calls</p></li><li><p>Regularly audit and monitor third-party API usage</p></li></ul><div><hr></div><h1>4. Next Steps / Moving Forward:</h1><ol><li><p><strong>Shift security left:</strong> Integrate API security practices early in your development cycle, using AI-powered tools like Cursor to write secure code from the start. For instance, in Cursor's composer, you can include an instruction like: </p><p></p><pre><code><code>"Please reason with a security-aware mindset. As a reminder, here are the OWASP API Security Top 10: ..."</code></code></pre><p><br>This prompts the AI to consider security implications while generating or reviewing code, helping catch potential vulnerabilities early in the development process.</p></li><li><p><strong>Implement fundamental measures first:</strong> Focus on strong authentication, authorization, and data protection as your security foundation.</p></li><li><p><strong>Continuously evolve:</strong> Gradually incorporate advanced security techniques. You&#8217;re not going to be able to implement everything overnight, but through assessing your top risks &amp; priorities, you&#8217;ll be able to make the best decision moving forward.</p></li></ol><p></p><p>Cheers,</p><p>Paulo</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.com/p/api-security?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.paulonasc.com/p/api-security?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Building a Golden Dataset for AI Engineering: Lessons Learned and Best Practices]]></title><description><![CDATA[Crafting a Robust Golden Dataset: Strategies for Enhancing AI Engineering Accuracy and Performance]]></description><link>https://www.paulonasc.com/p/building-a-golden-dataset-for-ai</link><guid isPermaLink="false">https://www.paulonasc.com/p/building-a-golden-dataset-for-ai</guid><dc:creator><![CDATA[Paulo Nascimento]]></dc:creator><pubDate>Tue, 30 Jul 2024 23:50:44 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/43b82cc1-6d98-4130-9adb-14fe635a212e_2340x1561.avif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Building a golden dataset is an essential part of AI engineering. A golden dataset, also known as a ground truth dataset, is a carefully curated collection of data that serves as a benchmark for evaluating AI model performance. Referencing this ground truth set of answers instills confidence in your AI's response quality and accuracy, allowing you to run quantitative metrics such as those listed in <a href="https://arxiv.org/abs/2309.15217">RAGAS</a> (Retrieval Augmented Generation Assessment System).</p><p>Creating a dataset with multiple contributors can be challenging, often feeling like an awkward dance where you're trying to balance not overburdening others while still accomplishing substantial work.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><h2>My First Experience Building a Golden Dataset</h2><h3>Identifying Topic Areas</h3><p>When I created my first golden dataset at a large organization, I began by compiling a list of idea spaces or product areas we wanted to base our questions upon. To determine these areas, we analyzed our most frequently accessed documentation. For example, if you find that customers are primarily looking at features A, B, and C, this provides a guide for generating questions for each category.</p><h3>Generating Questions</h3><p>After establishing categories, I used a combination of sources to generate questions:</p><ol><li><p>FAQs</p></li><li><p>User forums</p></li><li><p>Customer feedback</p></li><li><p>Subject Matter Experts (SMEs)</p></li><li><p>AI-generated questions</p></li></ol><h3>Initial Approach</h3><p>Once I had a solid list of questions, I placed them in an Excel spreadsheet with columns for:</p><ol><li><p>SME answers</p></li><li><p>Reference links</p></li></ol><p>I then distributed this spreadsheet to numerous SMEs, asking them to select and answer two to three questions within their expertise.</p><h2>Challenges Encountered</h2><p>Throughout this process, I encountered several challenges:</p><ol><li><p>Incomplete answers: Responses were often brief (e.g., "yes," "no," "kind of, you can find X here: &lt;link&gt;").</p></li><li><p>Inconsistent use of columns: Some answers lacked reference links, while others combined text and links in a single column.</p></li><li><p>Low response rate: Many SMEs didn't participate due to time constraints or unclear instructions.</p></li></ol><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><h2>Improving the Process</h2><h3>"Don't Make Me Think" Principle</h3><p>People are busy, and adding to their cognitive load can be counterproductive. Applying the "<a href="https://sensible.com/dont-make-me-think/">Don't Make Me Think</a>" principle from design can significantly improve the process. It's generally easier for people to review and correct pre-existing content rather than create it from scratch.</p><h3>Revised Approach</h3><p>For future golden dataset creation, I would:</p><ol><li><p>Compile a list of topic categories to test the AI against.</p></li><li><p>Use various sources to generate a comprehensive list of questions.</p></li><li><p>Use AI to generate initial responses to each question.</p></li><li><p>Assign specific sets of questions to each SME, asking them to review and correct only if necessary.</p></li></ol><p>This approach reduces the workload on SMEs while still leveraging their expertise to ensure accuracy.</p><h2>Best Practices for Creating and Maintaining a Golden Dataset</h2><ol><li><p>Regularly update the dataset to reflect new information and product changes.</p></li><li><p>Implement a version control system to track changes and maintain dataset integrity.</p></li><li><p>Establish a review cycle to ensure ongoing accuracy and relevance.</p></li><li><p>Use a diverse group of SMEs to cover various aspects of your product or service.</p></li><li><p>Implement a user-friendly interface for SMEs to review and edit entries easily.</p><ol><li><p>Idea: Create a Google Form linked to a Google Sheets backend. Generate unique links for each SME, directing them to a specific set of questions. This approach would streamline the response process, making it easier for SMEs to contribute.</p></li></ol></li></ol><h2>Conclusion</h2><p>Building a golden dataset is crucial for AI engineering, but it requires careful planning and execution. By learning from past experiences and implementing best practices, you can create a more efficient and effective process for developing and maintaining your golden dataset. This, in turn, will lead to more accurate AI models and better user experiences.</p><p></p><p>Cheers,</p><p>Paulo</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Becoming an AI Engineer]]></title><description><![CDATA[My Journey into AI Engineering: Lessons Learned and Advice for Beginners]]></description><link>https://www.paulonasc.com/p/becoming-an-ai-engineer</link><guid isPermaLink="false">https://www.paulonasc.com/p/becoming-an-ai-engineer</guid><dc:creator><![CDATA[Paulo Nascimento]]></dc:creator><pubDate>Mon, 29 Jul 2024 22:22:54 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/43721a33-09dc-40fb-8153-61bac00519a1_2215x3101.avif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>The Challenge of Learning</strong></h2><p>When I started building in AI, LlamaIndex had recently started their Discord server and I was trying to figure out how to build GenAI apps.</p><p>At the time, I was trying to build a product called <em><strong>interviewify</strong>,</em> which was basically a Zoom note-taker tailored towards user interviews.</p><p>I remember spending countless hours reading up on vector embeddings, vector store indices, knowledge bases&#8212; what was a generic concept, what was from LlamaIndex, how are vector indices different from vector stores?</p><p>All of these questions led me down what felt like an infinite loop of understanding &amp; misunderstanding.</p><p>Much of this questioning took time away from actually building &amp; iterating which is a critical way of learning especially when it comes to greenfield areas like GenAI.</p><p>My friend Adam Towers texted me this and it really resonated with me:</p><blockquote><p>While you're actively innovating and improving, you want to learn as fast as possible.</p></blockquote><p>This quote perfectly encapsulated my experience. I realized that to truly learn and innovate in AI, I needed to focus on rapid iteration and hands-on experience rather than getting bogged down in theoretical concepts.</p><h2><strong>The Power of Deadlines</strong></h2><p>The moment where I really started learning a lot was when I gave myself a deadline. The incubator I was in had a demo day where we would present to a few hundred people at <a href="https://www.geekwire.com/2023/univ-of-washington-students-show-off-their-startup-ideas-at-dubhacks-next-demo-day/">DubHacks Next Demo Day</a>. and we needed to have everything ready to go by March. I remember feeling nervous because up until that point I had only built out tiny parts of the AI system and had tinkered with different prototypes but a lot of it would work one day then break the next. I learned that it's important to version your `requirements.txt` especially given how fast AI-related packages like LlamaIndex and Langchain move and introduce breaking changes. It was like one day I had a working app and the next day I ran a `pip install` which broke my entire code, putting me back at square one.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><h2><strong>Building My Own RAG Pipeline</strong></h2><p>I reached a point of frustration where I thought to myself, "you know what, let me just create my own version of a RAG (Retrieval Augmented Generation) orchestrator". This ended up being a really important decision because this is a moment that brought a lot of clarity.</p><p>It kind of reminded me of learning a language like Javascript or Python and creating "pointers" in a binary tree before learning how to declare memory using a language like C++ where you're actually manipulating the memory and have to deeply understand what's going on. Creating my own RAG pipeline actually simplified a lot of concepts for me because I had to understand what was going on at every step. I realized that it wasn't as complex as I was making it out to be.</p><p>After I really understood how RAG worked, I started experimenting with different concepts like clustering vector embeddings using T-SNE (t-Distributed Stochastic Neighbor Embedding) and UMAP (Uniform Manifold Approximation and Projection), chunking methods, injecting metadata, etc. These techniques helped me visualize and organize high-dimensional data in more manageable ways.</p><h2><strong>Key Lessons Learned</strong></h2><p>Something I underestimated early on was prompt engineering. It's easy to come up with a prompt and think that it's robust&#8212; once you test with enough queries though you'll see that there will almost always be edge cases where you'll need to iterate. Learning this skill was really important for me because it allowed me to iterate towards getting consistent output out of LLMs.</p><p>I think the biggest mistake I've made when it comes to building with LLMs is thinking more than doing. The advice for myself is to have a strong bias for action. If you don't understand something, just go do it and figure it out. That is how I learned most of the things I am working on in GenAI so far.</p><h2><strong>Advice for Beginners</strong></h2><p>My suggestion would be to:</p><ol><li><p><strong>Understand what RAG is</strong></p></li><li><p><strong>Implement RAG just using a database, an LLM + embedding model provider's API, your own code</strong></p></li><li><p><strong>See how that relates to Langchain and LlamaIndex (allows you to understand these packages much better)</strong></p></li></ol><p>Once you establish a baseline it'll be easier to iterate on top of this foundational knowledge.</p><h2><strong>Conclusion</strong></h2><p>As I reflect on my journey in AI engineering, from the early days of confusion to now, I'm struck by how much can be learned through hands-on experience.</p><p>The key takeaways - understanding fundamental concepts, learning by doing, and continuous iteration - have been crucial to my growth in this field.</p><p>To those just starting out: don't be discouraged by the initial complexity. The AI landscape may seem overwhelming at first, but with persistence and practical application, it becomes clearer and more manageable.</p><h2><strong>Helpful Resources</strong></h2><p>Here are some resources that you might find helpful:</p><ul><li><p><a href="https://huyenchip.com/blog/">Chip Huyen's Blog</a></p></li><li><p><a href="https://eugeneyan.com/writing/llm-patterns">Eugene Yan's LLM Patterns</a></p></li><li><p><a href="https://www.pinecone.io/learn/vector-database/">Pinecone&#8217;s Vector Database Guide</a></p></li><li><p><a href="https://jxnl.github.io/blog/writing">Jason Liu's Blog</a></p></li></ul><p></p><p>Cheers,</p><p>Paulo</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Thoughts on the Rabbit R1]]></title><description><![CDATA[Learnings on Product Customer Experience, Product Distribution & Go To Market]]></description><link>https://www.paulonasc.com/p/thoughts-on-the-rabbit-r1</link><guid isPermaLink="false">https://www.paulonasc.com/p/thoughts-on-the-rabbit-r1</guid><dc:creator><![CDATA[Paulo Nascimento]]></dc:creator><pubDate>Sat, 13 Jan 2024 01:23:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!SGyc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00fc0c87-2d07-4752-b566-4c352ac8ce3e_2400x1800.webp" 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_!SGyc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00fc0c87-2d07-4752-b566-4c352ac8ce3e_2400x1800.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SGyc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00fc0c87-2d07-4752-b566-4c352ac8ce3e_2400x1800.webp 424w, https://substackcdn.com/image/fetch/$s_!SGyc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00fc0c87-2d07-4752-b566-4c352ac8ce3e_2400x1800.webp 848w, https://substackcdn.com/image/fetch/$s_!SGyc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00fc0c87-2d07-4752-b566-4c352ac8ce3e_2400x1800.webp 1272w, https://substackcdn.com/image/fetch/$s_!SGyc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00fc0c87-2d07-4752-b566-4c352ac8ce3e_2400x1800.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SGyc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00fc0c87-2d07-4752-b566-4c352ac8ce3e_2400x1800.webp" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/00fc0c87-2d07-4752-b566-4c352ac8ce3e_2400x1800.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:61326,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SGyc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00fc0c87-2d07-4752-b566-4c352ac8ce3e_2400x1800.webp 424w, https://substackcdn.com/image/fetch/$s_!SGyc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00fc0c87-2d07-4752-b566-4c352ac8ce3e_2400x1800.webp 848w, https://substackcdn.com/image/fetch/$s_!SGyc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00fc0c87-2d07-4752-b566-4c352ac8ce3e_2400x1800.webp 1272w, https://substackcdn.com/image/fetch/$s_!SGyc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00fc0c87-2d07-4752-b566-4c352ac8ce3e_2400x1800.webp 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><h1>Context</h1><p>A lot of my friends and I have been talking about the new Rabbit R1 unveiled during CES 2024. The R1 is what Rabbit describes as a &#8220;pocket companion&#8221; powered by a &#8220;Large Action Model&#8221; that helps users take action using their natural voice. For example, users can order an Uber to their house or point the R1&#8217;s camera inside their fridge and ask what meal they can cook. </p><h1>Thoughts</h1><p>The keynote highlighted the necessity of creating the hardware. Even if they use their model locally, is this a significant obstacle for an MVP launch? This led me to think more about the product itself.</p><p>At first glance, it seems that a smartphone could perform most of the R1's functions. <em><strong>So, why the need for separate hardware?</strong></em></p><p>After some thought, I realized that the unique selling point of the R1 is its &#8220;teach mode.&#8221; This software feature allows users to instruct the R1 in executing specific workflows, like logging into Discord or creating an image in Midjourney, even for unsupported apps.</p><p>I was listening to the <a href="https://youtu.be/4yaUegwRUXg?feature=shared&amp;t=3386">WVFRM podcast</a> where they talked about how the R1 could have been an app (at least technically speaking) but that nobody might have cared enough about it.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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://www.paulonasc.com/subscribe?"><span>Subscribe now</span></a></p><h2><strong>Thought 1: Extremes &amp; Constraints</strong></h2><p><br>The creation of hardware centers around enhancing the customer experience. With a phone, usage remains conventional. However, by imposing constraints, such as primary interaction through voice, you push the boundaries of <strong>intentional</strong> customer experience with the product.</p><h2><strong>Thought 2: Distribution, GTM &amp; Early Adopters</strong></h2><p>The hardware serves as both a distribution model and a Go-To-Market (GTM) strategy.</p><p>By designing a &#8220;fun,&#8221; toy-like product, Rabbit can create buzz and attract early adopters.</p><p>Sure, they could have charged $50 for a similar phone app. But would it have been just another transient ProductHunt launch, quickly forgotten?</p><p>By creating a $200 AI hardware product with a beautiful design, and limited ways to interact with it, Rabbit effectively targets a hyper-focused ideal customer profile (ICP).</p><h1>Closing Thoughts</h1><p><strong>Applying These Insights</strong></p><p>The key lies in pinpointing an 'extreme' within the customer journey. By focusing on the &#8216;extreme&#8217;, we can develop products that resonate deeply with our target audience. </p><p>The next step involves tailoring our distribution strategies specifically for this group, thereby laying a strong foundation for building and scaling great products.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.paulonasc.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">Thanks for reading Paulo&#8217;s Newsletter! Subscribe for free to receive new posts and support my work.</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>