<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>FrenchForet</title><link>https://learn.frenchforet.com/</link><description>Recent content on FrenchForet</description><generator>Hugo</generator><language>en</language><atom:link href="https://learn.frenchforet.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Hello World</title><link>https://learn.frenchforet.com/docs/01-hello-world/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/01-hello-world/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; &lt;em&gt;write&lt;/em&gt;, by hand, your first two programs that talk to a language model — one
using raw HTTP, one using the official SDK — and build the right mental model of what&amp;rsquo;s
happening on the wire. You&amp;rsquo;ll finish understanding the single most important idea in the
course: the difference between the &lt;strong&gt;messages&lt;/strong&gt; you write and the &lt;strong&gt;string of tokens&lt;/strong&gt;
the model actually sees.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How this course works — read once.&lt;/strong&gt; You write the code. Each section walks you
through building small scripts &lt;em&gt;yourself&lt;/em&gt;, step by step, running them as you go. You&amp;rsquo;ll
write your files in the &lt;code&gt;work/&lt;/code&gt; folder. A complete &lt;strong&gt;reference solution&lt;/strong&gt; for
everything you build lives under &lt;code&gt;examples/NN/&lt;/code&gt; — peek if you get stuck, but type it
yourself first. That&amp;rsquo;s the hands-on part, and it&amp;rsquo;s where the learning happens.&lt;/p&gt;</description></item><item><title>Anatomy of a Response</title><link>https://learn.frenchforet.com/docs/02-anatomy-of-a-response/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/02-anatomy-of-a-response/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; before turning any knobs, get comfortable with what the server &lt;em&gt;returns&lt;/em&gt;.
You&amp;rsquo;ll write a small script that prints a whole response and pulls it apart field by
field, so you know exactly where every value lives — and you&amp;rsquo;ll see why &lt;code&gt;finish_reason&lt;/code&gt;
and &lt;code&gt;usage&lt;/code&gt; matter for everything that follows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; in Section 1 you made a call and grabbed one field
(&lt;code&gt;response.choices[0].message.content&lt;/code&gt;). Now you&amp;rsquo;ll read the whole envelope it came in.&lt;/p&gt;</description></item><item><title>Tokens &amp; the Context Window</title><link>https://learn.frenchforet.com/docs/03-tokens-and-the-context-window/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/03-tokens-and-the-context-window/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; make the word &amp;ldquo;token&amp;rdquo; concrete by &lt;em&gt;measuring&lt;/em&gt; it yourself — through the server,
no local tokenizer — then turn it into the most important practical constraint you work
within: the &lt;strong&gt;context window&lt;/strong&gt;. You&amp;rsquo;ll write two small experiments and discover a model&amp;rsquo;s
limit from the inside.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; Section 2 showed you &lt;code&gt;response.usage.prompt_tokens&lt;/code&gt;. Here you put it
to work. This lesson quietly underpins reasoning cost (Section 5) and dollar cost
(Section 10) — both are counted in tokens.&lt;/p&gt;</description></item><item><title>Sampling Parameters (Seeing the Effect)</title><link>https://learn.frenchforet.com/docs/04-sampling-parameters/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/04-sampling-parameters/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; understand the knobs that control &lt;em&gt;how the model chooses each word&lt;/em&gt; — and
&lt;strong&gt;watch them work&lt;/strong&gt; by writing the experiments yourself. By the end you&amp;rsquo;ll know what
&lt;code&gt;temperature&lt;/code&gt;, &lt;code&gt;top_p&lt;/code&gt;, and &lt;code&gt;seed&lt;/code&gt; do, when to use each, and why cranking temperature up
invites hallucination.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; Sections 1–3 were about &lt;em&gt;what&lt;/em&gt; you send and receive. This is the
first lesson where you shape the model&amp;rsquo;s &lt;em&gt;behavior&lt;/em&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="how-a-model-picks-the-next-token"&gt;How a model picks the next token&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the idea everything hangs on. At each step the model doesn&amp;rsquo;t output a word — it
outputs a &lt;strong&gt;probability distribution&lt;/strong&gt; over all possible next tokens: maybe &lt;code&gt;&amp;quot;blue&amp;quot;&lt;/code&gt; at
60%, &lt;code&gt;&amp;quot;dark&amp;quot;&lt;/code&gt; at 12%, &lt;code&gt;&amp;quot;quiet&amp;quot;&lt;/code&gt; at 8%, and a long tail of everything else.&lt;/p&gt;</description></item><item><title>Reasoning / "Thinking" Models</title><link>https://learn.frenchforet.com/docs/05-reasoning-and-thinking-models/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/05-reasoning-and-thinking-models/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; open up the thing &lt;code&gt;gpt-oss-120b&lt;/code&gt; has been doing since Section 1 — &lt;em&gt;thinking
before it answers&lt;/em&gt;. You&amp;rsquo;ll write scripts that reveal the model&amp;rsquo;s private reasoning, count
the &lt;strong&gt;reasoning tokens&lt;/strong&gt; you pay for, and turn the &lt;code&gt;reasoning_effort&lt;/code&gt; dial up and down to
see the trade-off.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; this ties together the harmony template (Section 1), the &lt;code&gt;usage&lt;/code&gt;
block (Section 2), and the token budget (Section 3). Reasoning tokens are why your
&lt;code&gt;completion_tokens&lt;/code&gt; were sometimes bigger than the visible answer.&lt;/p&gt;</description></item><item><title>Handling &amp; Validating Responses (Structured Output)</title><link>https://learn.frenchforet.com/docs/06-handling-and-validating-responses/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/06-handling-and-validating-responses/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; stop treating model output as text you eyeball and start treating it as &lt;strong&gt;data
your code can rely on&lt;/strong&gt;. You&amp;rsquo;ll write scripts that go from &amp;ldquo;the model returned
something JSON-ish&amp;rdquo; to &amp;ldquo;the model returned valid JSON, constrained to a schema, validated
into a typed object.&amp;rdquo; The tools: JSON mode, schema-constrained output, and &lt;strong&gt;Pydantic&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; so far you&amp;rsquo;ve printed &lt;code&gt;content&lt;/code&gt; and read it yourself. The moment a
&lt;em&gt;program&lt;/em&gt; consumes the output, free-form text is a liability. This is also a prerequisite
for tool calling (Section 13) and agents (Section 22).&lt;/p&gt;</description></item><item><title>Blocking vs Streaming</title><link>https://learn.frenchforet.com/docs/07-blocking-vs-streaming/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/07-blocking-vs-streaming/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; learn the two ways to receive a response — &lt;strong&gt;blocking&lt;/strong&gt; (wait for the whole
thing) and &lt;strong&gt;streaming&lt;/strong&gt; (receive it token by token) — by building streaming yourself,
first as the raw protocol, then via the SDK. By the end you&amp;rsquo;ll know exactly what a stream
is on the wire and when each mode is right.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; every call in Sections 1–6 was blocking — the simple default.
Streaming is what makes chat interfaces feel responsive, and building it removes the last
bit of mystery about how these APIs work.&lt;/p&gt;</description></item><item><title>Robustness: Errors, Retries, Rate Limits, Timeouts</title><link>https://learn.frenchforet.com/docs/08-robustness/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/08-robustness/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; turn a script that works on a good day into one that survives a bad one. You&amp;rsquo;ll
write the error-handling ladder and a retry-with-backoff helper, and learn which failures
to retry and which to fix.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; everything so far assumed the call succeeds. Real networks drop, real
servers get busy, real requests have bugs. This small layer separates a demo from
something you&amp;rsquo;d run unattended — and it sets up clean logging in Section 9.&lt;/p&gt;</description></item><item><title>Observability &amp; Logging</title><link>https://learn.frenchforet.com/docs/09-observability-and-logging/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/09-observability-and-logging/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; make your LLM calls &lt;em&gt;visible&lt;/em&gt;. You&amp;rsquo;ll write a small wrapper that emits one
structured log record per call, capturing the telemetry the API already hands back — then
use those records to debug, monitor latency, and account for tokens.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; Section 2 introduced &lt;code&gt;usage&lt;/code&gt; and &lt;code&gt;finish_reason&lt;/code&gt;; Section 8 added
errors and retries. This lesson collects all of it into one record per call — the data
you&amp;rsquo;ll need to compute cost in Section 10 and to understand what your app is doing.&lt;/p&gt;</description></item><item><title>Cost, Pricing &amp; Prompt Caching</title><link>https://learn.frenchforet.com/docs/10-cost-pricing-and-prompt-caching/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/10-cost-pricing-and-prompt-caching/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; turn the token counts you&amp;rsquo;ve been logging into &lt;strong&gt;money&lt;/strong&gt;, then write a
demonstration of &lt;strong&gt;prompt caching&lt;/strong&gt; — the single biggest lever for making repeated work
cheaper and faster. This is the capstone of the foundations arc: it ties together &lt;code&gt;usage&lt;/code&gt;
(Section 2), reasoning tokens (Section 5), and your logs (Section 9).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; you can now measure everything that costs money. This lesson does the
arithmetic and shows the most effective way to reduce it.&lt;/p&gt;</description></item><item><title>Prompt Engineering Fundamentals</title><link>https://learn.frenchforet.com/docs/11-prompt-engineering-fundamentals/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/11-prompt-engineering-fundamentals/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; learn the handful of prompt techniques that reliably move output quality —
zero/one/few-shot examples, clear instructions, delimiters, and output shaping — and
build them yourself so you can feel the difference. You&amp;rsquo;ll also see how prompt-time
&amp;ldquo;chain of thought&amp;rdquo; relates to our model&amp;rsquo;s &lt;em&gt;native&lt;/em&gt; reasoning (Section 5).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; this opens the advanced arc. You&amp;rsquo;ve controlled the model with
&lt;em&gt;parameters&lt;/em&gt; (Sections 4–5); now you control it with &lt;em&gt;words&lt;/em&gt;. Everything here reuses the
roles from Section 1 and the fair-comparison tricks (&lt;code&gt;temperature=0&lt;/code&gt;, &lt;code&gt;seed&lt;/code&gt;) from
Section 4.&lt;/p&gt;</description></item><item><title>Conversation State &amp; Memory</title><link>https://learn.frenchforet.com/docs/12-conversation-state-and-memory/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/12-conversation-state-and-memory/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; understand that the API is &lt;strong&gt;stateless&lt;/strong&gt; — it remembers nothing between calls —
and build a multi-turn conversation yourself by keeping the history. Then learn to keep
that history inside the token budget with windowing and summarization.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; every call so far was one-shot. Real assistants hold a conversation,
and &lt;em&gt;you&lt;/em&gt; are responsible for the memory. This underpins tools (Section 13), RAG
(Section 19), and agents (Section 22) — they all manage a growing message list.&lt;/p&gt;</description></item><item><title>Tool / Function Calling</title><link>https://learn.frenchforet.com/docs/13-tool-and-function-calling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/13-tool-and-function-calling/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; let the model call &lt;em&gt;your&lt;/em&gt; code. You&amp;rsquo;ll define a tool, watch the model ask to
use it (&lt;code&gt;tool_calls&lt;/code&gt;), run the matching Python function, feed the result back as a &lt;code&gt;tool&lt;/code&gt;
message, and get a final answer that uses it. This is the mechanic behind every &amp;ldquo;agent.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; this is where the &lt;code&gt;tool&lt;/code&gt; role from Section 1 finally appears, and
where Pydantic-style schemas from Section 6 pay off (tools are described with JSON
schemas). It&amp;rsquo;s one round trip here; Section 14 turns it into a loop.&lt;/p&gt;</description></item><item><title>The Tool-Use Loop</title><link>https://learn.frenchforet.com/docs/14-the-tool-use-loop/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/14-the-tool-use-loop/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; turn the single tool round trip from Section 13 into a &lt;strong&gt;loop&lt;/strong&gt; — call the
model, run whatever tools it asks for, feed the results back, and repeat until it&amp;rsquo;s done.
You&amp;rsquo;ll build a small driver that can use several tools across multiple steps. That driver
&lt;em&gt;is&lt;/em&gt; a mini-agent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; Section 13 gave you the handshake; here you automate it. This is the
core machinery that Section 22 (Agents) dresses up with planning and more tools.&lt;/p&gt;</description></item><item><title>Sandboxing I: Why Isolate, and Portable Limits</title><link>https://learn.frenchforet.com/docs/15-sandboxing-isolation-and-limits/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/15-sandboxing-isolation-and-limits/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; make &lt;em&gt;executing untrusted actions&lt;/em&gt; safe. In Sections 13–14 the model chose
which tools to run; for a calculator we stayed safe by &lt;strong&gt;parsing&lt;/strong&gt; the input instead of
&lt;code&gt;eval&lt;/code&gt;-ing it. But you can&amp;rsquo;t parse arbitrary code, a shell command, or SQL into safety.
The real answer is &lt;strong&gt;isolation&lt;/strong&gt; — run the action in a box that limits what it can do.
Here you build the &lt;em&gt;portable&lt;/em&gt; tier: a subprocess with hard resource limits and an
allow-listed shell tool, runnable on any machine with no extra software.&lt;/p&gt;</description></item><item><title>Sandboxing II: Containers, Postgres &amp; Production Isolation</title><link>https://learn.frenchforet.com/docs/16-sandboxing-containers-and-postgres/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/16-sandboxing-containers-and-postgres/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; climb the isolation ladder from Section 15. Process limits cap CPU and memory but
leave the filesystem and network open. A &lt;strong&gt;container&lt;/strong&gt; closes that gap; a locked-down
&lt;strong&gt;Postgres&lt;/strong&gt; role does the same for SQL; and an &lt;strong&gt;audit log&lt;/strong&gt; records every execution. You&amp;rsquo;ll
also learn where the stronger tiers — gVisor and Firecracker — fit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; this is the &amp;ldquo;production&amp;rdquo; tier of the sandboxing you started in Section
15. Tools (Section 13–14) act; portable limits (Section 15) contain runaway resource use;
here we contain &lt;em&gt;what code can touch&lt;/em&gt;. Everything an agent (Section 22) runs unattended
should sit behind one of these.&lt;/p&gt;</description></item><item><title>Model Context Protocol (MCP)</title><link>https://learn.frenchforet.com/docs/17-model-context-protocol/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/17-model-context-protocol/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; understand MCP as the &lt;em&gt;standard&lt;/em&gt; way to expose and consume tools — so a set of
tools (and data sources) can live behind a server and be reused across many apps and
models, instead of being hand-wired into one program.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; Sections 13–14 taught raw tool calling; Sections 15–16 made tool
&lt;em&gt;execution&lt;/em&gt; safe to isolate. MCP is the layer on top: a common protocol for &lt;em&gt;connecting&lt;/em&gt;
models to tools and data — think of it as a standard port (often described as &amp;ldquo;USB-C for
AI&amp;rdquo;) rather than a new capability.&lt;/p&gt;</description></item><item><title>Embeddings</title><link>https://learn.frenchforet.com/docs/18-embeddings/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/18-embeddings/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; turn text into &lt;strong&gt;vectors&lt;/strong&gt; that capture meaning, and compare them by hand with
cosine similarity. You&amp;rsquo;ll build a tiny semantic search — matching by &lt;em&gt;meaning&lt;/em&gt;, not
keywords — which is the foundation for retrieval (Section 19) and a core building block
for search, clustering, and deduplication.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; a change of gears from chat. Same server, different endpoint
(&lt;code&gt;/v1/embeddings&lt;/code&gt;). We stay close to the metal: a vector is just a list of numbers, and
we compute similarity ourselves with numpy before any database enters the picture.&lt;/p&gt;</description></item><item><title>Retrieval-Augmented Generation (RAG)</title><link>https://learn.frenchforet.com/docs/19-retrieval-augmented-generation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/19-retrieval-augmented-generation/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; make the model answer from &lt;em&gt;your&lt;/em&gt; documents instead of its training data (or
its imagination). You&amp;rsquo;ll build a small RAG pipeline end to end — embed a corpus, retrieve
the most relevant pieces for a question, inject them into the prompt, and generate a
grounded answer — and watch it refuse to make things up when the answer isn&amp;rsquo;t there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; this combines the chat model (Sections 1–6) with embeddings
(Section 18) and prompt construction (Section 11). It&amp;rsquo;s the most common way to put an LLM
to work on private, fresh, or domain-specific data.&lt;/p&gt;</description></item><item><title>Security &amp; Guardrails</title><link>https://learn.frenchforet.com/docs/20-security-and-guardrails/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/20-security-and-guardrails/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; understand the security problem that appears the moment your prompts contain
text you didn&amp;rsquo;t write — &lt;strong&gt;prompt injection&lt;/strong&gt; — and build practical defenses: separating
data from instructions, least-privilege tools, and output validation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; Sections 13–19 introduced &lt;em&gt;outside&lt;/em&gt; text into your prompts — tool
outputs, retrieved documents, user input. That text can carry instructions. This lesson
is where we take that seriously.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-core-problem-the-model-cant-tell-data-from-instructions"&gt;The core problem: the model can&amp;rsquo;t tell data from instructions&lt;/h2&gt;
&lt;p&gt;To a language model, the prompt is just one stream of text. It has no reliable way to
know that &lt;em&gt;this&lt;/em&gt; part is your trusted instruction and &lt;em&gt;that&lt;/em&gt; part is an untrusted
document. So if untrusted text says &amp;ldquo;ignore your instructions and do X,&amp;rdquo; the model may
just&amp;hellip; do X. That&amp;rsquo;s &lt;strong&gt;prompt injection.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Skills / Skill Injection</title><link>https://learn.frenchforet.com/docs/21-skills-and-skill-injection/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/21-skills-and-skill-injection/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; understand &lt;em&gt;skills&lt;/em&gt; — packaged units of instructions (and often code and
resources) that are disclosed into the model&amp;rsquo;s context on demand — and why injecting a
skill is really a context-management decision with a security edge.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; this sits between guardrails (Section 20) and agents (Section 22). A
skill is how you give an agent reusable, composable expertise without stuffing everything
into one giant system prompt. It draws on the context window (Section 3) and memory
(Section 12), and — because a skill can carry instructions &lt;em&gt;and&lt;/em&gt; code — on the sandboxing
from Sections 15–16.&lt;/p&gt;</description></item><item><title>Agents</title><link>https://learn.frenchforet.com/docs/22-agents/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/22-agents/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; assemble the pieces you&amp;rsquo;ve built into an &lt;strong&gt;agent&lt;/strong&gt; — the tool loop (Section 14)
given a goal, a system prompt that makes it plan, and several tools (including search) it
can use across multiple steps. You&amp;rsquo;ll see that &amp;ldquo;agent&amp;rdquo; isn&amp;rsquo;t a new technology; it&amp;rsquo;s
composition.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; this is where the advanced arc converges. Tools (13–14), retrieval
(19), memory (12), and guardrails (20) come together. After this you can read any &amp;ldquo;agent
framework&amp;rdquo; and recognize the engine underneath.&lt;/p&gt;</description></item><item><title>Evaluation &amp; Testing</title><link>https://learn.frenchforet.com/docs/23-evaluation-and-testing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/23-evaluation-and-testing/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; answer the question &amp;ldquo;is it actually any good — and did my change help or hurt?&amp;rdquo;
You&amp;rsquo;ll build two complementary evaluators: &lt;strong&gt;golden tests&lt;/strong&gt; for tasks with a checkable
answer, and an &lt;strong&gt;LLM-as-judge&lt;/strong&gt; for open-ended ones. Together they let you change prompts
and models with evidence instead of vibes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; Sections 11–22 made the model &lt;em&gt;do&lt;/em&gt; things. This section makes those
things &lt;em&gt;measurable&lt;/em&gt; — the difference between &amp;ldquo;seems fine when I tried it&amp;rdquo; and &amp;ldquo;passes 47/50
cases.&amp;rdquo; It&amp;rsquo;s also how you&amp;rsquo;d catch a regression after swapping models or editing a prompt.&lt;/p&gt;</description></item><item><title>Capstone</title><link>https://learn.frenchforet.com/docs/24-capstone/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/docs/24-capstone/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; build one small, real application that ties the whole course together — a
company support assistant that &lt;strong&gt;retrieves&lt;/strong&gt; facts, &lt;strong&gt;uses tools&lt;/strong&gt;, runs an &lt;strong&gt;agent
loop&lt;/strong&gt;, stays within &lt;strong&gt;guardrails&lt;/strong&gt;, &lt;strong&gt;logs&lt;/strong&gt; itself, &lt;strong&gt;tracks cost&lt;/strong&gt;, and is checked by
an &lt;strong&gt;eval&lt;/strong&gt;. Nothing here is new; it&amp;rsquo;s assembly. By the end you&amp;rsquo;ll have a program that
exercises every section.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; the finish line. Sections 1–23 each added one capability; this
section composes them into something you&amp;rsquo;d actually ship a v0 of.&lt;/p&gt;</description></item></channel></rss>