<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://survibecoding.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://survibecoding.com/" rel="alternate" type="text/html" /><updated>2026-05-22T22:22:01-04:00</updated><id>https://survibecoding.com/feed.xml</id><title type="html">survibecoding</title><subtitle>Agentic engineering, AI-assisted development workflows, and practical ways to survive the AI shift as working engineers.</subtitle><author><name>Diego Jules</name></author><entry><title type="html">AI Primer and Basic Concepts</title><link href="https://survibecoding.com/ai/ai-primer-and-basic-concepts/" rel="alternate" type="text/html" title="AI Primer and Basic Concepts" /><published>2026-05-22T00:00:00-04:00</published><updated>2026-03-19T14:17:03-04:00</updated><id>https://survibecoding.com/ai/ai-primer-and-basic-concepts</id><content type="html" xml:base="https://survibecoding.com/ai/ai-primer-and-basic-concepts/"><![CDATA[<p><img src="/assets/images/posts/ai-primer/you-keep-using-that-word.gif" alt="Princess Bride You Keep Using That Word GIF" /></p>

<p>I’ve had a few conversations with coworkers and friends where the AI terms we being thrown around loosely and discussions quickly got confusing, grinding to a halt. That motivated me to create a sort of glossary of AI terms to help reduce equivocation and ensure we were all agreeing on the meaning for all of these words.
If you’ve been hearing terms like <em>LLMs</em>, <em>agents</em>, <em>tools</em>, and <em>MCP</em> thrown around and thinking “I kind of get it, but not really”… this is for you.</p>

<p>This post is meant to give the reader a <strong>clear understanding of the core AI concepts, and a basic, practical mental model</strong> of how AI apps and agents work.</p>

<p>I assume that you have a basic understanding of how computers work and what terms like API, SDK, and JSON mean.</p>

<h1 id="part-1-core-concepts">Part 1: Core Concepts</h1>

<p>Let’s start with the vocabulary, I’ll try to frame it in plain english and include links to other resources in case the reader wants to go deeper.</p>

<h2 id="models-and-llms">Models and LLMs</h2>

<p>At the base of everything is a <strong>model</strong>. You can think of it as a “brain”.</p>

<p>A <strong>Large Language Model (LLM)</strong> is just a model trained to:</p>

<blockquote>
  <p>predict the next token given context</p>
</blockquote>

<p>That sounds simple, but it’s enough to:</p>

<ul>
  <li>write code</li>
  <li>reason about problems</li>
  <li>decide when to use tools</li>
  <li>simulate planning</li>
</ul>

<p>Good starting resources:</p>

<ul>
  <li>Large Language Models explained briefly <a href="https://youtu.be/LPZh9BOjkQs">https://youtu.be/LPZh9BOjkQs</a></li>
  <li><a href="https://developers.openai.com/learn">https://developers.openai.com/learn</a></li>
  <li><a href="https://huggingface.co/learn/agents-course/unit0/introduction">https://huggingface.co/learn/agents-course/unit0/introduction</a></li>
</ul>

<h2 id="embeddings">Embeddings</h2>

<p>Embeddings are how models understand <em>meaning</em>; under the hood it’s all math.</p>

<p>They turn text into vectors:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"My name is Inigo Montoya..." -&gt; [0.12, -0.98, ...]
</code></pre></div></div>

<p>You can think of these vectors as coordinates to concepts in the model’s brain.
By comparing the vectors of two different inputs we can calculate their distance and measure how close these concepts are and how similar their meaning is.</p>

<p>This lets you:</p>

<ul>
  <li>search semantically, not just by keyword matching</li>
  <li>build RAG systems</li>
  <li>cluster similar data</li>
</ul>

<p>If you’ve ever built a detection rule and wished it was “fuzzy”, embeddings are how you get there.</p>

<p>Good intros:</p>

<ul>
  <li>Vector Search with LLMs <a href="https://www.youtube.com/watch?v=YDdKiQNw80c">https://www.youtube.com/watch?v=YDdKiQNw80c</a></li>
  <li><a href="https://platform.openai.com/docs/guides/embeddings">https://platform.openai.com/docs/guides/embeddings</a></li>
</ul>

<h2 id="prompt">Prompt</h2>

<p>Most people think of a prompt as the question you ask the chatbot. Yes, at a basic level, a prompt is just:</p>

<blockquote>
  <p>the input you send to the model</p>
</blockquote>

<p>But in practice, it’s more useful to think of it as:</p>

<blockquote>
  <p><strong>the control surface for the model’s behavior</strong></p>
</blockquote>

<h3 id="whats-actually-inside-a-prompt">What’s Actually Inside A Prompt?</h3>

<p>In modern systems, a “prompt” isn’t just one string. It’s usually composed of:</p>

<ul>
  <li><strong>System instructions</strong>: how the model should behave</li>
  <li><strong>User input</strong>: what the user is asking</li>
  <li><strong>Tool definitions</strong>: what tools the model is allowed to call</li>
  <li><strong>Context data</strong>: retrieved docs, memory, and prior steps</li>
</ul>

<p>So really:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Prompt = structured context sent to the model
</code></pre></div></div>

<h3 id="what-this-looks-like-in-practice">What This Looks Like In Practice</h3>

<p>Here’s a simplified but realistic example of what you might actually send to a model in an agent system:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"model"</span><span class="p">:</span><span class="w"> </span><span class="s2">"gpt-5"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"messages"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"system"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">"You are a security analysis assistant. Your job is to investigate authentication logs and identify suspicious activity. Prefer using tools when data is required. Do not make up log data. If unsure, ask for clarification."</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"user"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Look into failed login spikes for user 'jdoe' in the last 24 hours."</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">],</span><span class="w">
  </span><span class="nl">"tools"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"query_splunk"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Run a Splunk query against authentication logs"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"parameters"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"object"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"properties"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"query"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
            </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"string"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Splunk search query"</span><span class="w">
          </span><span class="p">}</span><span class="w">
        </span><span class="p">},</span><span class="w">
        </span><span class="nl">"required"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"query"</span><span class="p">]</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"get_user_profile"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Fetch user metadata such as role, location, and last login"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"parameters"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"object"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"properties"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"username"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
            </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"string"</span><span class="w">
          </span><span class="p">}</span><span class="w">
        </span><span class="p">},</span><span class="w">
        </span><span class="nl">"required"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"username"</span><span class="p">]</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<h3 id="what-happens-next">What Happens Next</h3>

<p>Given this prompt, the model might respond with a <strong>tool call</strong> like:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"tool"</span><span class="p">:</span><span class="w"> </span><span class="s2">"query_splunk"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"arguments"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"query"</span><span class="p">:</span><span class="w"> </span><span class="s2">"index=auth user=jdoe action=failed earliest=-24h | stats count by src_ip"</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>Your system:</p>

<ol>
  <li>Executes the query.</li>
  <li>Sends the result back as another message.</li>
</ol>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"tool"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"query_splunk"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">"{ </span><span class="se">\"</span><span class="s2">results</span><span class="se">\"</span><span class="s2">: [ ... ] }"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>Then the model continues:</p>

<ul>
  <li>analyzes results</li>
  <li>maybe calls another tool</li>
  <li>eventually produces a final answer</li>
</ul>

<h3 id="why-this-example-matters">Why This Example Matters</h3>

<p>This shows something subtle but critical:</p>

<blockquote>
  <p>The model isn’t just “responding to a question”. It’s operating inside a <strong>structured environment you defined</strong>.</p>
</blockquote>

<p>You control:</p>

<ul>
  <li>what tools exist</li>
  <li>how they are described</li>
  <li>what instructions guide behavior</li>
  <li>what data is visible</li>
</ul>

<h2 id="context">Context</h2>

<p>The model doesn’t “remember” anything.</p>

<p>It only knows what you give it <em>right now</em>:</p>

<ul>
  <li>system prompt</li>
  <li>user input</li>
  <li>tool results</li>
  <li>retrieved documents</li>
</ul>

<p>That bundle is <strong>context</strong>.</p>

<blockquote>
  <p>The behavior of your agent is a function of the context you construct.</p>
</blockquote>

<p>This is why small prompt changes can completely change behavior.</p>

<h2 id="tools">Tools</h2>

<p>Tools are just:</p>

<blockquote>
  <p>functions your code executes on behalf of the model</p>
</blockquote>

<p>Example:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"query_splunk"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"args"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"query"</span><span class="p">:</span><span class="w"> </span><span class="s2">"index=auth failures"</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>The model:</p>

<ul>
  <li>decides when to call it</li>
  <li>generates arguments</li>
</ul>

<p>You:</p>

<ul>
  <li>execute it</li>
  <li>return results</li>
</ul>

<h2 id="agents">Agents</h2>

<p>An <strong>agent</strong> is not just “an LLM.”</p>

<p>It’s a system:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>LLM + tools + control loop
</code></pre></div></div>

<p>The defining feature:</p>

<blockquote>
  <p>it can take multiple steps to solve a problem</p>
</blockquote>

<p>Example:</p>

<ul>
  <li>search logs</li>
  <li>analyze output</li>
  <li>pivot queries</li>
  <li>produce a conclusion</li>
</ul>

<h2 id="control-loops">Control Loops</h2>

<p>This is the part people underestimate.</p>

<p>Basic loop:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>LLM -&gt; tool call -&gt; execute -&gt; result -&gt; LLM -&gt; ...
</code></pre></div></div>

<p>You control:</p>

<ul>
  <li>when to stop</li>
  <li>retries</li>
  <li>validation</li>
  <li>guardrails</li>
</ul>

<blockquote>
  <p>The LLM suggests actions. Your system decides what actually happens.</p>
</blockquote>

<h2 id="mcp">MCP</h2>

<p>MCP is a standard for exposing tools and data.</p>

<p>Instead of hardcoding tools into every app:</p>

<ul>
  <li>you run an MCP server</li>
  <li>your agent connects to it</li>
  <li>tools are discovered dynamically</li>
</ul>

<p>Think:</p>

<blockquote>
  <p>USB for AI tools</p>
</blockquote>

<p>Good starting point:</p>

<ul>
  <li><a href="https://modelcontextprotocol.io">https://modelcontextprotocol.io</a></li>
</ul>

<h2 id="skills">Skills</h2>

<p>If tools are <em>actions</em>, skills are <em>playbooks</em>.</p>

<p>A skill is:</p>

<ul>
  <li>instructions</li>
  <li>tool usage patterns</li>
  <li>constraints</li>
</ul>

<p>Example:</p>

<blockquote>
  <p>Analyze authentication logs for suspicious activity.</p>
</blockquote>

<p>Instead of the model figuring everything out every time, you:</p>

<ul>
  <li>guide its reasoning</li>
  <li>standardize behavior</li>
</ul>

<h2 id="state-and-memory">State And Memory</h2>

<p>The model is stateless. Your system isn’t.</p>

<p>Types of memory:</p>

<ul>
  <li><strong>Short-term</strong>: current conversation</li>
  <li><strong>Working memory</strong>: intermediate steps</li>
  <li><strong>Long-term</strong>: vector databases, logs, and knowledge bases</li>
</ul>

<p>If you want your agent to remember what you discussed or did last week you’re going to need a memory system.
There are many ideas being explored for building effective memory systems, we’ll go deeper in a future post.</p>

<h1 id="part-2-agent-patterns">Part 2: Agent Patterns</h1>

<p>Now let’s talk about how people actually structure agentic systems, depending on your application you may benefit from a single-agent pattern or a multi-agent patter. This post will deliberately not explore specific agent patterns like swarms, debaters, etc. we’re just doing an easy introduction.</p>

<h2 id="single-agent-pattern">Single-Agent Pattern</h2>

<p>Simplest useful setup with one agent doing a task beginning to end, for example:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>User -&gt; Agent -&gt; Tools -&gt; Answer
</code></pre></div></div>

<p>Good for:</p>

<ul>
  <li>log analysis</li>
  <li>simple investigations</li>
  <li>automation helpers</li>
</ul>

<p>Pros:</p>

<ul>
  <li>simple</li>
  <li>easier to debug</li>
</ul>

<p>Cons:</p>

<ul>
  <li>can get messy as complexity grows</li>
  <li>one model doing everything</li>
</ul>

<h2 id="multi-agent-pattern">Multi-Agent Pattern</h2>

<p>Now you split responsibilities between different specialized agents, for example:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Planner Agent -&gt; Executor Agent -&gt; Reviewer Agent
</code></pre></div></div>

<p>Or:</p>

<ul>
  <li>one agent for recon</li>
  <li>one for exploitation logic</li>
  <li>one for validating the finding</li>
</ul>

<p>Pros:</p>

<ul>
  <li>specialization</li>
  <li>better structure for complex workflows</li>
</ul>

<p>Cons:</p>

<ul>
  <li>harder to debug</li>
  <li>coordination overhead</li>
  <li>more latency and cost</li>
</ul>

<h3 id="reality-check">Reality Check</h3>

<p>Most teams overuse multi-agent setups.</p>

<blockquote>
  <p>Start with a single agent. Only split when you feel real pain.</p>
</blockquote>

<h1 id="part-3-frameworks-youll-encounter">Part 3: Frameworks You’ll Encounter</h1>

<p>You don’t <em>need</em> frameworks, but they can help.
They help with:</p>

<ul>
  <li>wiring</li>
  <li>structure</li>
  <li>integrations</li>
</ul>

<p>They don’t solve:</p>

<ul>
  <li>reasoning quality</li>
  <li>prompt design</li>
  <li>reliability</li>
</ul>

<blockquote>
  <p>You still need to understand the fundamentals.</p>
</blockquote>

<p>Some popular frameworks you’ll encounter:</p>

<h3 id="langchain">LangChain</h3>

<p>Probably the most widely used framework.</p>

<p>It provides:</p>

<ul>
  <li>tool abstractions</li>
  <li>chains for step-by-step workflows</li>
  <li>agent patterns</li>
  <li>integrations with databases, APIs, and other systems</li>
</ul>

<p>It’s flexible, but:</p>

<ul>
  <li>can feel complex</li>
  <li>sometimes abstracts too much</li>
</ul>

<p>Docs:</p>

<ul>
  <li><a href="https://python.langchain.com/docs/">https://python.langchain.com/docs/</a></li>
</ul>

<h3 id="llamaindex">LlamaIndex</h3>

<p>Another major general-purpose LLM framework like LangChain, especially suited for data-heavy and retrieval-heavy apps.</p>

<p>It provides:</p>

<ul>
  <li>document loading and ingestion</li>
  <li>indexes over private data</li>
  <li>query engines</li>
  <li>retrievers</li>
  <li>RAG pipelines</li>
  <li>agents and tools</li>
  <li>structured data extraction</li>
  <li>graph and vector-store integrations</li>
</ul>

<p>Best for:</p>

<ul>
  <li>RAG apps</li>
  <li>chatbots over private data</li>
  <li>document Q&amp;A</li>
  <li>structured extraction</li>
  <li>agents that need strong data access</li>
</ul>

<p>Docs:</p>

<ul>
  <li><a href="https://developers.llamaindex.ai/python/framework/">https://developers.llamaindex.ai/python/framework/</a></li>
</ul>

<h1 id="final-mental-model">Final Mental Model</h1>

<p>If you zoom out, an AI agent system looks like this:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>LLM (brain)
+ Context (what it sees)
+ Tools (what it can do)
+ Skills (how it behaves, playbooks)
+ MCP (how tools are exposed)
+ Memory (what it remembers)
+ Control loop (how it operates)
</code></pre></div></div>

<blockquote>
  <p>The hard part isn’t calling the model. It’s designing the system around it.</p>
</blockquote>]]></content><author><name>Diego Jules</name></author><category term="AI" /><category term="ai" /><category term="llms" /><category term="agents" /><category term="mcp" /><category term="security" /><summary type="html"><![CDATA[A glossary-style primer for people hearing terms like LLMs, agents, tools, and MCP and wanting a clear, practical mental model for how AI apps and agents work.]]></summary></entry></feed>