<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rohini Gaonkar</title>
    <description>The latest articles on DEV Community by Rohini Gaonkar (@rohini_gaonkar).</description>
    <link>https://dev.to/rohini_gaonkar</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F376787%2F8af3bcfb-d567-4de1-9b33-b6becfe6d85b.jpeg</url>
      <title>DEV Community: Rohini Gaonkar</title>
      <link>https://dev.to/rohini_gaonkar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rohini_gaonkar"/>
    <language>en</language>
    <item>
      <title>I Switched to the Agent Toolkit for AWS. Here's Why.</title>
      <dc:creator>Rohini Gaonkar</dc:creator>
      <pubDate>Fri, 12 Jun 2026 16:45:05 +0000</pubDate>
      <link>https://dev.to/aws/i-switched-to-the-agent-toolkit-for-aws-heres-why-5hf</link>
      <guid>https://dev.to/aws/i-switched-to-the-agent-toolkit-for-aws-heres-why-5hf</guid>
      <description>&lt;p&gt;I've been using AI coding agents like &lt;a href="https://kiro.dev/?trk=44b16281-e090-49b6-97d8-f1cea54d9e87&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Kiro&lt;/a&gt;, Claude Code, with AWS for a while now. To connect them to my AWS account, I was running the community MCP servers from &lt;a href="https://github.com/awslabs" rel="noopener noreferrer"&gt;awslabs&lt;/a&gt;; the AWS one, the documentation one, sometimes both.&lt;/p&gt;

&lt;p&gt;It worked. But it felt like handing my house keys to a very enthusiastic intern and hoping they didn't rearrange the furniture while I was out. The agent had my credentials but no restrictions on what it could do, and zero audit trail of what it actually did.&lt;/p&gt;

&lt;p&gt;Then I switched to the &lt;a href="https://docs.aws.amazon.com/agent-toolkit/latest/userguide/what-is-agent-toolkit.html" rel="noopener noreferrer"&gt;Agent Toolkit for AWS&lt;/a&gt;. It's the difference between that enthusiastic intern and a contractor who shows up with their own tools, follows the scope you agreed on, and leaves you a detailed invoice of every change they made.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is it?
&lt;/h2&gt;

&lt;p&gt;The Agent Toolkit for AWS is the official, AWS-managed suite of tools that helps AI coding agents build, deploy, and manage things on AWS. Four components:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AWS MCP Server&lt;/strong&gt; : a managed remote server that gives agents secure access to AWS APIs via the Model Context Protocol&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills&lt;/strong&gt; : curated step-by-step workflows for specific tasks (deploying serverless apps, debugging Lambda cold starts, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugins&lt;/strong&gt; : single-install packages that bundle MCP config + skills for your IDE&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rules files&lt;/strong&gt; : project-level configuration to guide agent behavior&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why I switched
&lt;/h2&gt;

&lt;p&gt;Here's the thing. The old community servers were fine for experimenting. But the moment I started trusting agents with real infrastructure, I needed more control.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security that actually means something.
&lt;/h3&gt;

&lt;p&gt;The managed AWS MCP Server supports IAM condition keys. I can restrict exactly which actions an agent can perform. Scope the IAM role down to the minimum permissions the agent needs for the task, and it can only operate within those bounds. &lt;/p&gt;

&lt;p&gt;The MCP Server automatically tags every request with condition keys (&lt;code&gt;aws:CalledViaAWSMCP&lt;/code&gt;). So you can write IAM policies that treat agent actions differently from your own. For example, this would prevent the agent from deleting buckets, even if your credentials normally allow it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Deny"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"s3:DeleteBucket"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Bool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"aws:CalledViaAWSMCP"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You still have full access. The agent doesn't.&lt;/p&gt;

&lt;p&gt;Even better: use a separate IAM profile for your agent with only the permissions it needs. The condition keys are a safety net, but a scoped-down profile is the first line of defense. And if you're just getting started, point it at a dev account, not production.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sandboxed code execution.
&lt;/h3&gt;

&lt;p&gt;The toolkit includes a sandboxed Python runtime with boto3 access. Agents can write and run multi-step scripts, list resources, filter, aggregate, without touching my local machine.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwi9mz07bv6xjidm46ax2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwi9mz07bv6xjidm46ax2.png" alt="The agent writes Python code (Code in) and gets structured JSON results back (Result out), all executed in a remote sandbox via run_script" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The agent wrote a boto3 call, ran it remotely, and got structured results back. My machine never ran that code.&lt;/p&gt;

&lt;h3&gt;
  
  
  I can see what it did.
&lt;/h3&gt;

&lt;p&gt;Every API call goes through CloudTrail. Metrics flow to CloudWatch. I get a full audit trail. With the old server, I'd have to dig through terminal history and hope I caught everything.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F854vfer25jzoxknb8w0d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F854vfer25jzoxknb8w0d.png" alt="CloudTrail event detail showing invokedBy, sourceIPAddress, and userAgent all set to aws-mcp.amazonaws.com the fingerprint that identifies MCP-initiated calls" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every MCP-initiated call shows &lt;code&gt;invokedBy: aws-mcp.amazonaws.com&lt;/code&gt; in the event fields. When &lt;em&gt;you&lt;/em&gt; call &lt;code&gt;aws s3 ls&lt;/code&gt; from your terminal, the &lt;code&gt;sourceIPAddress&lt;/code&gt; would be your IP. When the MCP Server makes the call, it's &lt;code&gt;aws-mcp.amazonaws.com&lt;/code&gt;. That's how you tell them apart.&lt;/p&gt;

&lt;h3&gt;
  
  
  Built-in docs search.
&lt;/h3&gt;

&lt;p&gt;No more running a separate documentation MCP server. The Agent Toolkit has native tools to search AWS docs, read full pages, get content recommendations, and check regional availability. All in one server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Expert skills.
&lt;/h3&gt;

&lt;p&gt;These are curated workflows that go beyond documentation. Decision frameworks, troubleshooting trees, step-by-step procedures. For example, the &lt;code&gt;aws-serverless&lt;/code&gt; skill covers Lambda, API Gateway, Step Functions, EventBridge, SAM, and CDK with guidance on cold starts, CORS debugging, concurrency, and production readiness.&lt;/p&gt;

&lt;p&gt;We will explore these in future posts! &lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-profile support.
&lt;/h3&gt;

&lt;p&gt;If you work across multiple AWS accounts, there's built-in profile switching. Pass &lt;code&gt;--profile&lt;/code&gt; in the config and the agent routes requests through the right credentials, check setup guide below on how to do this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side by side
&lt;/h2&gt;

&lt;p&gt;Let the table do the talking:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Old (&lt;code&gt;awslabs.aws-api-mcp-server&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;New (Agent Toolkit &lt;code&gt;aws-mcp&lt;/code&gt;)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Community/labs, runs locally&lt;/td&gt;
&lt;td&gt;Official AWS-managed remote server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Local credentials, no restrictions&lt;/td&gt;
&lt;td&gt;SigV4 + IAM condition keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No guardrails&lt;/td&gt;
&lt;td&gt;Fine-grained IAM controls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Observability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;CloudWatch + CloudTrail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Code execution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not available&lt;/td&gt;
&lt;td&gt;Sandboxed Python with boto3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Skills&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not included&lt;/td&gt;
&lt;td&gt;Curated expert workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Documentation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Needed separate server&lt;/td&gt;
&lt;td&gt;Built-in search + read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maintenance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manual &lt;code&gt;uvx&lt;/code&gt; updates&lt;/td&gt;
&lt;td&gt;AWS-managed, always current&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-profile&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not supported&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;If you're still running the old community MCP servers, the switch took me about five minutes. Try it and let me know what you think.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AWS CLI v2.32.0+ installed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;uv&lt;/code&gt; installed (for the proxy)&lt;/li&gt;
&lt;li&gt;Valid AWS credentials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Agent Toolkit itself is free. You only pay for the AWS resources your agent provisions or interacts with, at standard pricing. There are &lt;a href="https://docs.aws.amazon.com/agent-toolkit/latest/userguide/aws-mcp-limits.html" rel="noopener noreferrer"&gt;default quotas&lt;/a&gt; to be aware of, the main one being 3 requests per second per account. Fine for individual use, but worth knowing if you have multiple agents running in the same account.&lt;/p&gt;

&lt;h3&gt;
  
  
  Disable conflicting servers
&lt;/h3&gt;

&lt;p&gt;If you have any of the old &lt;code&gt;awslabs&lt;/code&gt; MCP servers configured (like &lt;code&gt;aws-mcp-server&lt;/code&gt; or &lt;code&gt;aws-documentation-mcp-server&lt;/code&gt;), disable them to avoid tool conflicts. You can always re-enable them later if you need to compare.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP Configuration
&lt;/h3&gt;

&lt;p&gt;Using Claude Code, Cursor, or something else? Check the &lt;a href="https://github.com/aws/agent-toolkit-for-aws" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; for setup instructions across platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For Kiro&lt;/strong&gt;, add this to &lt;code&gt;~/.kiro/settings/mcp.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"aws-mcp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uvx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"transport"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stdio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"mcp-proxy-for-aws==1.6.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"https://aws-mcp.us-east-1.api.aws/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--metadata"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AWS_REGION=us-west-2"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Two regions in this config. The endpoint in the URL (&lt;code&gt;us-east-1&lt;/code&gt; or &lt;code&gt;eu-central-1&lt;/code&gt;) is where the MCP Server itself runs. &lt;code&gt;AWS_REGION&lt;/code&gt; is where your AWS resources live, set it to the region you work in. So, change the &lt;code&gt;AWS_REGION&lt;/code&gt; fr your workloads.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you use a named profile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="s2"&gt;"mcp-proxy-for-aws==1.6.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="s2"&gt;"https://aws-mcp.us-east-1.api.aws/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="s2"&gt;"--metadata"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AWS_REGION=us-west-2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="s2"&gt;"--profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-profile-name"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify
&lt;/h3&gt;

&lt;p&gt;Ask your agent: &lt;em&gt;"List my S3 buckets"&lt;/em&gt;, if it works, you're set.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fehmx03099fil4r3p0fhx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fehmx03099fil4r3p0fhx.png" alt="Kiro listing S3 buckets after connecting to the Agent Toolkit — confirms the MCP server is working" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🫣 Yes, I need to clean up my buckets, again!&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/agent-toolkit/latest/userguide/what-is-agent-toolkit.html" rel="noopener noreferrer"&gt;Agent Toolkit for AWS Official Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/agent-toolkit/latest/userguide/getting-started-aws-mcp-server.html" rel="noopener noreferrer"&gt;Setup Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aws/agent-toolkit-for-aws" rel="noopener noreferrer"&gt;GitHub aws/agent-toolkit-for-aws&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aws/mcp-proxy-for-aws" rel="noopener noreferrer"&gt;MCP Proxy for AWS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/aws/the-aws-mcp-server-is-now-generally-available/" rel="noopener noreferrer"&gt;AWS Blog  AWS MCP Server is now GA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/security/understanding-iam-for-managed-aws-mcp-servers/" rel="noopener noreferrer"&gt;Understanding IAM for managed AWS MCP Servers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Have you made the switch yet? Tell me your experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/rohini_gaonkar" class="crayons-btn crayons-btn--primary"&gt;Follow along&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>aws</category>
      <category>mcp</category>
      <category>ai</category>
      <category>devtools</category>
    </item>
    <item>
      <title>How to make AI answer questions about your documents</title>
      <dc:creator>Rohini Gaonkar</dc:creator>
      <pubDate>Thu, 11 Jun 2026 18:41:25 +0000</pubDate>
      <link>https://dev.to/aws/how-to-make-ai-answer-questions-about-your-documents-by-building-rag-from-scratch-4dg0</link>
      <guid>https://dev.to/aws/how-to-make-ai-answer-questions-about-your-documents-by-building-rag-from-scratch-4dg0</guid>
      <description>&lt;p&gt;In the &lt;a href="https://dev.to/aws/why-does-ai-forget-what-you-said-and-how-to-fix-it-4e5g"&gt;previous post&lt;/a&gt;, we talked about context windows. The model has a fixed-size desk and everything has to fit on it at once. When too much is on the desk, things in the middle get missed.&lt;/p&gt;

&lt;p&gt;I ended that post with a promise: what if there was a way to give the model just the right piece, at the right time, from a document you've never even pasted in?&lt;/p&gt;

&lt;p&gt;That's this post. We're giving the model a search system.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: your document is too long
&lt;/h2&gt;

&lt;p&gt;You have a 2000-page document. An employee handbook, a product manual, internal documentation. You need one specific answer from it.&lt;/p&gt;

&lt;p&gt;You can't paste the whole thing into the model's context window. And even if you found a model with a window big enough, we learned what happens: attention degrades, things in the middle get missed, and the model answers confidently from the wrong section.&lt;/p&gt;

&lt;p&gt;So you need something different. A step that happens &lt;em&gt;before&lt;/em&gt; the model sees anything. Something that finds the 2-3 paragraphs that actually answer your question, and passes only those to the model.&lt;/p&gt;

&lt;p&gt;That's retrieval. The full technique is called &lt;strong&gt;RAG: Retrieval-Augmented Generation&lt;/strong&gt;. Search first, then generate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Retrieval-Augmented Generation
&lt;/h2&gt;

&lt;p&gt;Let's break the name down. Each word is a step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retrieval.&lt;/strong&gt; &lt;br&gt;
Go find relevant information. Think of it like checking the index of a textbook before diving into a chapter. You don't re-read the whole book. You find the right page first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Augmented.&lt;/strong&gt; &lt;br&gt;
Add that retrieved info to the prompt. You're supplementing the model's built-in knowledge with fresh, specific context. Like handing someone a cheat sheet right before they answer a question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generation.&lt;/strong&gt; &lt;br&gt;
The model writes its response, but with the retrieved context sitting right there in the conversation. It generates an answer grounded in your actual data, not just its training. "Grounded" means the model has real evidence to point to. It's not guessing from memory. It's answering from something you gave it.&lt;/p&gt;

&lt;p&gt;The whole loop in one sentence: find the right chunks of information, stuff them into the prompt, let the model answer using that context. That's it. That's RAG.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;And if you're thinking "wait, isn't this just enterprise search?" you're not wrong. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tools like Elasticsearch, Kendra, SharePoint search have been finding relevant passages in documents for decades. The retrieval part isn't new. What's new is the last step: instead of showing you a results page to read for yourself, a foundation model reads the evidence and writes the answer. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To put it simply, RAG is enterprise search with a language model at the end of the pipeline.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  The setup: onboarding docs for a fictional company
&lt;/h2&gt;

&lt;p&gt;Imagine you just joined a new company and on the first day they hand you a bunch of documents. Employee handbook, benefits guide, leave policy, expense rules, engineering onboarding, IT security. Six documents with thousands of lines. All the answers are in there somewhere, but you'd have to read all of them to find what you need.&lt;/p&gt;

&lt;p&gt;I've got a fictional company here, PineRidge Solutions. These are their onboarding docs. &lt;/p&gt;

&lt;p&gt;The goal: I type a question like &lt;em&gt;"how many vacation days do I get?"&lt;/em&gt; or &lt;em&gt;"what's the parental leave top-up?"&lt;/em&gt; and the system finds the right section and answers from it.&lt;/p&gt;

&lt;p&gt;I'm building this in &lt;a href="https://kiro.dev/?trk=44b16281-e090-49b6-97d8-f1cea54d9e87&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Kiro IDE&lt;/a&gt;, and for the models, I'm using &lt;a href="https://aws.amazon.com/bedrock?trk=44b16281-e090-49b6-97d8-f1cea54d9e87&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Amazon Bedrock&lt;/a&gt;, the same tool we've been using for the last four posts. Except now, instead of the Playground in AWS Console, I'm calling it through my code.&lt;/p&gt;

&lt;p&gt;Please note, I'm using Bedrock here, but this same pattern works with any embeddings model locally or on Cloud. Ollama locally, OpenAI, Cohere, whatever. The pipeline is the same. The model is just a plug.&lt;/p&gt;

&lt;p&gt;All the code mentioned in this post is available in &lt;a href="https://github.com/gaonkarr/learning-ai-out-loud-samples-for-aws" rel="noopener noreferrer"&gt;my GitHub repo here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Three steps to build. Chunk, embed, retrieve. Let's go.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1: Chunk the document
&lt;/h2&gt;

&lt;p&gt;Before anyone can search these documents, they need to be broken into smaller pieces. Chunks. Usually a few paragraphs each.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F23qn6fe5bs3em2rdc2rh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F23qn6fe5bs3em2rdc2rh.png" alt="Document being split into smaller searchable chunks" width="799" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why? Because the goal is to return just the relevant section, not everything. If I keep each document as one giant block, the search will return entire files when I only need a paragraph.&lt;/p&gt;

&lt;p&gt;How you split matters. Too large, and you're back to the "too much context" problem. Too small, and you might cut an answer in half.&lt;/p&gt;

&lt;p&gt;Let's take a simple example. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc0lvm4qcsggvza4fnddx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc0lvm4qcsggvza4fnddx.png" alt="Chunk overlap" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Say the leave policy has three sentences: "The standard vacation policy grants 15 days per year. However, employees in their first year receive only 10 days. These days do not carry over into the next calendar year."&lt;/p&gt;

&lt;p&gt;If I chunk without overlap, I might split after the second sentence. The next chunk starts with "These days do not carry over into the next calendar year." &lt;/p&gt;

&lt;p&gt;Now if someone asks &lt;em&gt;"do my vacation days carry over?"&lt;/em&gt; the system retrieves that chunk. It answers "these days do not carry over." But which days? The standard 15? The first-year 10? The word "these" has lost its referent. The chunk is meaningless on its own.&lt;/p&gt;

&lt;p&gt;With overlap, the last sentence of chunk one repeats at the start of chunk two. Both chunks make sense independently.&lt;/p&gt;

&lt;p&gt;Here's the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;chunk_docs_paragraph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Paragraph-based chunking with 1 paragraph of overlap.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;chunks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.md&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;

        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;# Split document into paragraphs (separated by blank lines)
&lt;/span&gt;        &lt;span class="n"&gt;paragraphs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paragraphs&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
            &lt;span class="c1"&gt;# Include 1 paragraph of overlap for context continuity
&lt;/span&gt;            &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
            &lt;span class="n"&gt;chunk_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paragraphs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

            &lt;span class="c1"&gt;# Store the chunk text and which file it came from (for citations)
&lt;/span&gt;            &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;chunk_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;source&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The funtion loops through every markdown file in the folder, reads it, and splits on blank lines to get paragraphs. Then for each paragraph, it includes one paragraph of overlap, the one before it, so nothing gets lost at the boundary. Each chunk gets stored with the text and which file it came from, so later I know where the answer originated.&lt;/p&gt;

&lt;p&gt;From six onboarding documents, I get about 150 chunks. Each one is roughly a paragraph or two. A self-contained piece of text.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogbxusmcne2repcs1u0k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogbxusmcne2repcs1u0k.png" alt="Chunks in local file" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step one done. Now I need to make these searchable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Turn chunks into embeddings
&lt;/h2&gt;

&lt;p&gt;Here's the concept that makes the whole thing work. Each chunk gets turned into a set of numbers called an &lt;strong&gt;embedding&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7u4wql2x9cms1xzvkv1q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7u4wql2x9cms1xzvkv1q.png" alt="Text chunks being converted into numerical embeddings" width="800" height="121"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The name is a literal mathematical term. You're taking text and placing it into a space made of numbers. In that space, distance has meaning. Two chunks about similar things end up close together. Two chunks about different topics end up far apart. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7zf4lv2t0ff17avyj2v6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7zf4lv2t0ff17avyj2v6.png" alt="Embeddings as points in a vector space, with similar meanings clustered together" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Parental leave top-up" and "salary during maternity leave" would be near each other numerically, even though the actual words are completely different. That's what makes this useful: an embedding captures meaning, not exact words.&lt;/p&gt;

&lt;p&gt;Think of it like a library's index card system. The card doesn't contain the whole book. It captures enough about the content to help you find the right book when someone asks.&lt;/p&gt;

&lt;p&gt;A specialised model called an embeddings model does this conversion for us. It's not the same model that generates your answer. It's a different model for a different job. The embeddings model is small and fast. It turns text into searchable numbers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;bedrock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bedrock-runtime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us-east-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;embed_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Call Titan Embeddings V2 to get a 1024-dim vector.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bedrock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;modelId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;amazon.titan-embed-text-v2:0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inputText&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;embedding&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each chunk now has a numerical fingerprint. That's my searchable index.&lt;/p&gt;

&lt;p&gt;Now you'll hear the term "&lt;strong&gt;vector&lt;/strong&gt;" a lot. It just means a list of numbers with a direction. Think of it as coordinates. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An embedding is the concept, a vector is the format it's stored in.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Right now these vectors are sitting in a Python list on my laptop. If I close this script, they're gone. For this demo, I'm caching them to a local file so I don't re-embed every time I run the script. But for a production system with thousands of documents, you'd store them somewhere proper. AWS recently launched &lt;a href="https://aws.amazon.com/s3/vectors?trk=44b16281-e090-49b6-97d8-f1cea54d9e87&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Amazon S3 Vectors&lt;/a&gt;, which is literally what it sounds like: S3 built for storing and searching vectors natively. There's also OpenSearch Serverless, pgvector if you want Postgres, or &lt;a href="https://aws.amazon.com/bedrock/knowledge-bases?trk=44b16281-e090-49b6-97d8-f1cea54d9e87&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Amazon Bedrock Knowledge Bases&lt;/a&gt; which handles the whole pipeline as a managed service.&lt;/p&gt;

&lt;p&gt;Step two done. Now, the search.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Retrieve and Generate
&lt;/h2&gt;

&lt;p&gt;Someone asks a question. The question gets embedded with the same model. Same kind of numbers. Then we compare the question's numbers against all the chunk numbers. The closest matches are my search results.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyefenk8v9vx5idzbnud2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyefenk8v9vx5idzbnud2.png" alt="The retrieve-and-generate flow: question embedded, matched against stored chunks, top results passed to model" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;semantic search&lt;/strong&gt;. It matches by meaning, not by exact words. &lt;/p&gt;

&lt;p&gt;If the handbook says "remote work policy" and I ask about &lt;em&gt;"working from home rules,"&lt;/em&gt; it catches the match because the meaning is close.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndarray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Find the top-K most relevant chunks via cosine similarity.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="c1"&gt;# Embed the question into the same vector space as our chunks
&lt;/span&gt;    &lt;span class="n"&gt;q_vec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;embed_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="c1"&gt;# Compare question vector against every chunk vector
&lt;/span&gt;    &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;

        &lt;span class="c1"&gt;# Cosine similarity = dot product / (magnitude_a * magnitude_b)
&lt;/span&gt;        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q_vec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q_vec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Sort by score descending, take top K
&lt;/span&gt;    &lt;span class="n"&gt;top_indices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;argsort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;)[::&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][:&lt;/span&gt;&lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;top_indices&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;retrieve&lt;/code&gt; function. It takes the question, embeds it with the same Titan model, so it's in the same number space as the chunks. Then it compares the question's numbers against every chunk's numbers using cosine similarity, which is just a way to measure how close two vectors are. Score of 1 means identical, 0 means completely unrelated. It sorts by score and returns the top 3.&lt;/p&gt;

&lt;p&gt;The top 3 chunks are my evidence. Now I pass them to a generation model alongside the question. Titan did the embeddings. Claude does the answering.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_answer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retrieved&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Pass retrieved chunks + question to Claude.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="c1"&gt;# Format retrieved chunks with their source for traceability
&lt;/span&gt;    &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[Source: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;source&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;]&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;retrieved&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# System-style instruction followed by context and question
&lt;/span&gt;    &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are answering questions about PineRidge Solutions&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; company policies. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Use ONLY the context below. If the answer isn&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t there, say so.&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Context:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Question: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Call Claude via Bedrock's Converse API
&lt;/span&gt;    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bedrock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;converse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;modelId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us.anthropic.claude-haiku-4-5-20251001-v1:0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}]}],&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function &lt;code&gt;generate_answer&lt;/code&gt;. It takes the retrieved chunks, labels each one with which file it came from, and builds a prompt. The prompt tells Claude: "You're answering questions about PineRidge company policies. Use ONLY the context below. If the answer isn't there, say so." Then it passes the context and the question to Claude via Bedrock's Converse API and returns the response.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8na4cbevc9xbw8xgcefs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8na4cbevc9xbw8xgcefs.png" alt="RRSP Response showing RAG implementation" width="799" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I asked: &lt;em&gt;"What's the RRSP matching policy?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The system retrieved the right section from the benefits guide. The answer came back grounded in the actual policy document: dollar-for-dollar match up to 5% of base salary, starts after 90 days, vesting schedule. Not from the model's training data, from the company's files. And I can see exactly which chunks were used to build that answer. That's my citation. I can point to the source.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl1ljjpftlr9yvprfb9pe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl1ljjpftlr9yvprfb9pe.png" alt="The full RAG pipeline showing all three steps working together" width="800" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full pipeline. Chunk, embed, retrieve, generate. Running on my laptop. About 60 lines of Python. And it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it breaks: a quick preview
&lt;/h2&gt;

&lt;p&gt;So this works great when retrieval finds the right piece. But watch this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frnhaat51yuuwtx8nf8ji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frnhaat51yuuwtx8nf8ji.png" alt="Where RAG fails" width="799" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I asked: &lt;em&gt;"How many vacation days do I get as a senior engineer?"&lt;/em&gt; Retrieval actually works. It finds the vacation table from the benefits guide. But the model says "I don't know which level a senior engineer is." The right information was retrieved, but the answer needed two pieces of context that aren't in the same chunk: what level maps to "senior engineer," and how many days that level gets.&lt;/p&gt;

&lt;p&gt;That's the kind of thing that breaks. Retrieval succeeded, but the answer still failed. The model wasn't hallucinating. It was honest about what it couldn't determine from the evidence it had.&lt;/p&gt;

&lt;p&gt;This is not a hallucination in the way we talked about in the &lt;a href="https://dev.to/aws/why-does-ai-lie-hallucinations-explained-simply-1c7g"&gt;hallucinations post&lt;/a&gt;. The model didn't invent something from nothing. It was given real text from the real document. But the retrieved chunks didn't contain everything needed to answer the question.&lt;/p&gt;

&lt;p&gt;When a RAG system gives you a bad answer, the question to ask is: "what chunk did it retrieve?" Not "why is the model wrong?"&lt;/p&gt;

&lt;p&gt;We'll diagnose and fix this properly in the next post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you're just getting started:&lt;/strong&gt; RAG is how you get AI to answer questions about your documents without pasting everything into the chat. It searches first, then answers from what it finds. Three steps: chunk, embed, retrieve. The model never sees the full document. Just the pieces that match your question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're more on the builder side:&lt;/strong&gt; RAG is a pipeline with independently tunable steps. Chunking strategy, embedding model, retrieval method, and generation model each affect quality on their own. Also worth noting: different models for different jobs in the same pipeline. Titan Embeddings for search (fast, cheap). Claude for generation (smart, conversational). You'll see this pattern everywhere in AI systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;So this works great when retrieval finds the right piece. But what happens when the chunks are too small and the answer gets cut in half? What if the question needs information scattered across multiple sections? What if retrieval succeeds but the answer still fails because context is split across chunks?&lt;/p&gt;

&lt;p&gt;Next post, we break this thing on purpose. Then we fix it. And I'll walk through the full toolkit of strategies that make retrieval actually reliable.&lt;/p&gt;

&lt;p&gt;Ride along.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post is part of the "Learning AI Out Loud" series, a cloud architect learning AI from first principles.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/rohini_gaonkar" class="crayons-btn crayons-btn--primary"&gt;Follow along with the series&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>tutorial</category>
      <category>aws</category>
    </item>
    <item>
      <title>Why does AI forget what you said (and how to fix it)</title>
      <dc:creator>Rohini Gaonkar</dc:creator>
      <pubDate>Mon, 25 May 2026 15:08:33 +0000</pubDate>
      <link>https://dev.to/aws/why-does-ai-forget-what-you-said-and-how-to-fix-it-52f6</link>
      <guid>https://dev.to/aws/why-does-ai-forget-what-you-said-and-how-to-fix-it-52f6</guid>
      <description>&lt;p&gt;I received following comment on &lt;a href="https://dev.to/aws/why-does-ai-lie-hallucinations-explained-simply-1c7g"&gt;my hallucinations blog post&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag__comment crayons-card my-2 p-0 overflow-hidden"&gt;
    &lt;a href="https://dev.to/aws/why-does-ai-lie-hallucinations-explained-simply-1c7g" class="flex items-center gap-2 p-3 fs-s color-base-60 hover:color-base-90"&gt;
      

      &lt;span&gt;Comment on &lt;strong class="fw-medium color-base-90"&gt;Why does AI lie? Hallucinations explained simply&lt;/strong&gt;&lt;/span&gt;
    &lt;/a&gt;
  &lt;div class="p-4"&gt;
    &lt;div class="flex items-center gap-2 mb-3"&gt;
      &lt;a href="/ai_made_tools" class="crayons-avatar crayons-avatar--l"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3826720%2Fae1f6683-395f-4709-ba99-2212323b958e.png" alt="ai_made_tools" class="crayons-avatar__image" width="400" height="400"&gt;
      &lt;/a&gt;
      &lt;div&gt;
        &lt;a href="/ai_made_tools" class="crayons-link fw-medium"&gt;Joske Vermeulen&lt;/a&gt;
        &lt;span class="fs-xs color-base-60 ml-1"&gt;May 9&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="text-styles"&gt;
      &lt;p&gt;Just yesterday I had Opus asking me after every prompt: we have been going for a long time, let me save my context and continue tomorrow 😂&lt;/p&gt;


    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag__comment crayons-card my-2 p-0 overflow-hidden"&gt;
    &lt;a href="https://dev.to/aws/why-does-ai-lie-hallucinations-explained-simply-1c7g" class="flex items-center gap-2 p-3 fs-s color-base-60 hover:color-base-90"&gt;
      

      &lt;span&gt;Comment on &lt;strong class="fw-medium color-base-90"&gt;Why does AI lie? Hallucinations explained simply&lt;/strong&gt;&lt;/span&gt;
    &lt;/a&gt;
  &lt;div class="p-4"&gt;
    &lt;div class="flex items-center gap-2 mb-3"&gt;
      &lt;a href="/ai_made_tools" class="crayons-avatar crayons-avatar--l"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3826720%2Fae1f6683-395f-4709-ba99-2212323b958e.png" alt="ai_made_tools" class="crayons-avatar__image" width="400" height="400"&gt;
      &lt;/a&gt;
      &lt;div&gt;
        &lt;a href="/ai_made_tools" class="crayons-link fw-medium"&gt;Joske Vermeulen&lt;/a&gt;
        &lt;span class="fs-xs color-base-60 ml-1"&gt;May 11&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="text-styles"&gt;
      &lt;p&gt;:D I really answered every time, you are a computer, just continue. But it became even worse, so I needed to start a new session :)&lt;/p&gt;


    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The model basically raised its hand and said "hey, we've been at this a while." That's actually the best-case scenario.&lt;/p&gt;

&lt;p&gt;A lot of models won't do that. They'll just silently get worse. Same confident tone, less reliable answers. You won't know it's happening until something is clearly wrong.&lt;/p&gt;

&lt;p&gt;You paste a long document in, ask about something in the middle, and you get a confident answer that's wrong. Or you have a twenty-message conversation and the model starts contradicting itself.&lt;/p&gt;

&lt;p&gt;Not because it's hallucinating. Because it's running out of room.&lt;/p&gt;

&lt;p&gt;In the &lt;a href="https://dev.to/aws/bigger-ai-models-arent-always-better-heres-how-to-actually-choose-56pc"&gt;previous post&lt;/a&gt;, we talked about model sizes. Tokens were the unit of cost. Today they become the unit of memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a context window actually is
&lt;/h2&gt;

&lt;p&gt;Every model has a &lt;strong&gt;context window&lt;/strong&gt;. That's the total number of tokens it can hold in its head at once. Your input, plus its output, all has to fit inside that window.&lt;/p&gt;

&lt;p&gt;Think of it like a desk. A fixed-size desk. Everything the model needs to think about has to be on that desk at the same time. Your question. The document you pasted. The conversation history. The system instructions. All of it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F26sv4jxucjmx1xzr8kz4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F26sv4jxucjmx1xzr8kz4.png" alt="Diagram showing what fills a 128K context window: system prompt at 500 tokens, conversation history at 4,200 tokens, your current message at 120 tokens, and reserved space for the model's response at 800 tokens. Fixed capacity where input and output share the same space" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you put too much on the desk, things start getting buried. The model doesn't tell you "hey, I can't fit all this." It just works with whatever it can focus on, and quietly loses track of the rest.&lt;/p&gt;

&lt;p&gt;How big is the desk? Depends on the model.&lt;/p&gt;

&lt;p&gt;Some older models had a context window of 4,000 tokens. That's roughly 3,000 words. About six pages.&lt;/p&gt;

&lt;p&gt;Some have 128,000 tokens. That's a short novel.&lt;/p&gt;

&lt;p&gt;Some newer models have a million tokens or more. That's multiple novels. Entire codebases.&lt;/p&gt;

&lt;p&gt;But here's the thing most people miss. A bigger context window doesn't always mean the model pays equal attention to everything in it. It means more fits on the desk. It doesn't mean the model reads every page with the same care.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two shapes of the same problem
&lt;/h2&gt;

&lt;p&gt;Let's see this limit in two ways.&lt;/p&gt;

&lt;h3&gt;
  
  
  Documents
&lt;/h3&gt;

&lt;p&gt;You paste twenty pages of text into a model. A legal contract, an insurance policy, internal documentation. You ask a question about something in section 7 of 15. The model might find it, it might miss it or it might pull from the wrong section entirely.&lt;/p&gt;

&lt;p&gt;The more text surrounding your target information, the more the model's attention gets diluted. Even if the window isn't full.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conversations
&lt;/h3&gt;

&lt;p&gt;This is where most people hit it first, like the commenter above.&lt;/p&gt;

&lt;p&gt;By default, the model doesn't have a separate "memory" for your conversation. Some products layer persistence on top (ChatGPT's memory, Claude's projects), but the model underneath still works the same way. Every single time you send a message, the model re-reads the entire conversation from the beginning. Your first message, its first reply, your second message, its second reply, all the way down to whatever you just typed.&lt;/p&gt;

&lt;p&gt;That whole transcript gets fed back in every single time. And each exchange adds more tokens to the pile.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhdqwrom0g5yqhfft9e81.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhdqwrom0g5yqhfft9e81.png" alt="Bar chart showing context window filling up with each conversation turn — tokens growing from 350 to 7,000+" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A typical question might be 50 tokens. The model's reply might be 300. So one exchange is 350 tokens.&lt;/p&gt;

&lt;p&gt;Ten exchanges? 3,500 tokens.&lt;br&gt;
Twenty exchanges? 7,000.&lt;/p&gt;

&lt;p&gt;If you're asking detailed questions and getting long answers, you can hit 20,000 or 30,000 tokens in an afternoon.&lt;/p&gt;

&lt;p&gt;And here's the catch, you're not just using up memory. You're re-sending and re-paying for the entire conversation history every single turn.&lt;/p&gt;

&lt;p&gt;Tokens are the unit of memory &lt;em&gt;and&lt;/em&gt; the unit of cost. Same resource, two consequences.&lt;/p&gt;

&lt;p&gt;Models have gotten much better at handling long inputs. You can throw surprisingly large documents at them now. But the limit still exists. And the longer the input, the more likely something gets missed.&lt;/p&gt;
&lt;h2&gt;
  
  
  Lost in the middle
&lt;/h2&gt;

&lt;p&gt;Researchers have a name for this. They call it "lost in the middle."&lt;/p&gt;

&lt;p&gt;When you give a model a long input, whether that's a document or a conversation history, it tends to pay the most attention to two places: the very beginning, and the very end. The stuff in the middle gets less focus.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyxm56px2mnm5a4dnenlj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyxm56px2mnm5a4dnenlj.png" alt="Lost in the middle: beginning and end of input are bright, middle section is faded, showing where model attention drops" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's like reading a long email thread. You remember how it started. You remember the latest message. But that reply from Tuesday at 2pm that's buried fourteen messages deep? Good luck.&lt;/p&gt;

&lt;p&gt;This is why things you said early in a conversation drift as the transcript grows. Your early messages end up in the middle of the window and the middle is where attention is weakest.&lt;/p&gt;

&lt;p&gt;Most models won't warn you. They'll just give you the same confident tone whether they are working from a clear, focused input or they are drowning in context. The commenter's experience with Opus was the rare exception, not the rule.&lt;/p&gt;
&lt;h2&gt;
  
  
  What you can do about it
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Bigger window
&lt;/h3&gt;

&lt;p&gt;Use a model with a bigger window if you're hitting limits. A bigger window is like a bigger backpack. You can carry more. But that doesn't mean you can instantly find what you need. So the rest of these strategies still matter.&lt;/p&gt;
&lt;h3&gt;
  
  
  Chunk
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Don't paste everything if you don't need everything.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;If your question is about section 3, give it section 3. Not the whole document. Less noise, better signal.&lt;/p&gt;
&lt;h3&gt;
  
  
  Summarise
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Summarise first, then ask.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;If you need the model to work with a long document, ask it to summarise the document first. Then ask your real question against the summary. Two calls instead of one, but the second call has focused context. Just make sure the summary didn't leave out something important.&lt;/p&gt;
&lt;h3&gt;
  
  
  Position
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Put the important stuff at the beginning or the end.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;If you're writing a prompt that includes reference material, put your actual question at the very end. Or put the most critical context at the very beginning. Don't bury the important part in the middle.&lt;/p&gt;
&lt;h3&gt;
  
  
  Restate
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Restate important constraints.&lt;/strong&gt; If you told the model something critical in message one and you're now on message fifteen, say it again. Costs you a few tokens. Saves you a wrong answer.&lt;/p&gt;
&lt;h3&gt;
  
  
  System prompt
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use the system prompt for persistent rules.&lt;/strong&gt; Most platforms have a place for instructions that consistently guide the model. In ChatGPT or Claude.ai it's called custom instructions. In &lt;a href="https://aws.amazon.com/bedrock?trk=44b16281-e090-49b6-97d8-f1cea54d9e87&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Amazon Bedrock&lt;/a&gt; it's the system prompt field. Put your stable rules there, in clear, unambiguous language. But don't assume they'll be followed perfectly forever. In long conversations, repeating critical instructions in your current message still helps.&lt;/p&gt;
&lt;h3&gt;
  
  
  Fresh start
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Start fresh when the conversation drifts.&lt;/strong&gt; If you've been chatting for 20 turns and the topic has shifted three times, start a new conversation. Carry over what matters. Leave behind what doesn't.&lt;/p&gt;
&lt;h3&gt;
  
  
  Build your own memory layer
&lt;/h3&gt;

&lt;p&gt;You can summarise older turns into a compact recap, store it somewhere (a database, a file, even a simple variable), and inject that summary at the start of each new call. That's essentially a DIY cache for conversation context. You can build a version tuned to what matters for your use case.&lt;/p&gt;

&lt;p&gt;If you're a builder, this should feel familiar. We used to put Redis in front of Postgres so not every request hit the database. Same pattern here. Some platforms offer prompt caching where the system prompt or repeated context gets processed once and reused across calls instead of being re-tokenised every time. You're not re-paying for the same static context on every request. Same instinct, different layer: cache the expensive repeated work, only send the new stuff fresh.&lt;/p&gt;

&lt;p&gt;If you want to dig deeper into this, read about &lt;a href="https://aws.amazon.com/blogs/machine-learning/effectively-use-prompt-caching-on-amazon-bedrock/?trk=44b16281-e090-49b6-97d8-f1cea54d9e87&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;prompt caching on Amazon Bedrock&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For documents, retrieval is the answer.&lt;/strong&gt; Instead of stuffing the entire document into the context window, you retrieve just the relevant chunks and pass those in. That's what RAG (Retrieval-Augmented Generation) does, and we'll get to it in the next post.&lt;/p&gt;

&lt;p&gt;Same principle for both: give the model less, but give it the right less.&lt;/p&gt;
&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you're just getting started:&lt;/strong&gt; the model has a memory limit called a context window. It applies to documents and conversations equally. Longer inputs mean thinner attention. If you're pasting something long, ask about specific sections. If you're in a long conversation, restate the important stuff. And if things start feeling off, start a new session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're more on the builder side:&lt;/strong&gt; context window size is a spec, not a guarantee. A million-token window doesn't mean a million tokens of perfect recall. Put critical information at the edges, not the middle. For conversations, implement summarisation of older turns. And start thinking about retrieval, because that's where this is heading.&lt;/p&gt;
&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;So the model forgets things when you give it too much. What if there was a way to give it just the right piece, at the right time, from a document you've never even pasted in yourself?&lt;/p&gt;

&lt;p&gt;Next post, we're going deeper into retrieval. Giving the model just the right piece at the right time.&lt;/p&gt;

&lt;p&gt;Ride along.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post is part of the "Learning AI Out Loud" series, a cloud architect learning AI from first principles.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/rohini_gaonkar" class="crayons-btn crayons-btn--primary"&gt;Follow along with the series&lt;/a&gt;
&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__376787"&gt;
    &lt;a href="/rohini_gaonkar" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F376787%2F8af3bcfb-d567-4de1-9b33-b6becfe6d85b.jpeg" alt="rohini_gaonkar image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/rohini_gaonkar"&gt;Rohini Gaonkar&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/rohini_gaonkar"&gt;Love to share my experiences on building architectures with best practices, quick tips &amp;amp; tricks, cloud, AI, devops, and more.&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>beginners</category>
      <category>aws</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Bigger AI models aren't always better. Here's how to actually choose.</title>
      <dc:creator>Rohini Gaonkar</dc:creator>
      <pubDate>Fri, 15 May 2026 16:58:32 +0000</pubDate>
      <link>https://dev.to/aws/bigger-ai-models-arent-always-better-heres-how-to-actually-choose-56pc</link>
      <guid>https://dev.to/aws/bigger-ai-models-arent-always-better-heres-how-to-actually-choose-56pc</guid>
      <description>&lt;p&gt;In the &lt;a href="https://dev.to/aws/why-does-ai-lie-hallucinations-explained-simply-1c7g"&gt;previous post&lt;/a&gt;, I showed you two models answering the same question. One hallucinated confidently. The other knew when to stop.&lt;/p&gt;

&lt;p&gt;And a bunch of you asked: okay, but which one should I actually use?&lt;/p&gt;

&lt;p&gt;Haiku, Sonnet, Opus. Micro, Lite, Pro. Mini, Small, Large. There are dozens of models and they all sound like perfume brands. How are you supposed to pick one?&lt;/p&gt;

&lt;p&gt;That's this post. I'm going to take one prompt, run it through two models (one small, one large), and show you what's different. Then I'll give you a simple framework for choosing the right one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The demo: same prompt, two models
&lt;/h2&gt;

&lt;p&gt;I went back to the recipe from the &lt;a href="https://dev.to/aws/what-even-is-ai-i-took-a-break-had-to-relearn-everything-3dpj"&gt;first post&lt;/a&gt;. Same recipe. Same question. Two different model sizes.&lt;/p&gt;

&lt;p&gt;The prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I'm cooking this for six people on Saturday. One is vegan, one is gluten-free. Adapt the recipe for me, give me a shopping list, and a timeline starting from 4pm."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The small model
&lt;/h3&gt;

&lt;p&gt;Quickly, it gave me a shopping list, a timeline, and basic adaptations. Nothing fancy, but everything I asked for. If I just need a quick answer and I'm going to double-check it anyway, this works.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5kh8ohnpuutmh9vxs2zh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5kh8ohnpuutmh9vxs2zh.png" alt="Claude Haiku response to the recipe prompt" width="663" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For a lot of everyday tasks, this is genuinely all you need.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The large model
&lt;/h3&gt;

&lt;p&gt;Same prompt but a very different response.&lt;/p&gt;

&lt;p&gt;It added a whole "Strategy for the vegan guest" section explaining why you should make a parallel pot instead of adapting the main dish. It gave me a timeline starting from the night before. Separated prep into phases. Told me to keep the rice pots separate so nothing touches the vegan side. Scaling math for going from 4 servings to 6. It even gave me an oven method AND a stovetop method as alternatives.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz3e5he184s3car2s0sf8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz3e5he184s3car2s0sf8.png" alt="Claude Opus response to the same recipe prompt" width="800" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fojlnb9q46njv30o9ra1h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fojlnb9q46njv30o9ra1h.png" alt="Opus's over-engineered timeline starting from the night before" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More thorough and more considerate. But did I need all of that for a Saturday dinner? Maybe or maybe not.&lt;/p&gt;

&lt;p&gt;There are medium-sized models in between these two and they exist in every family. I'll tell you when to reach for them later. &lt;/p&gt;

&lt;p&gt;But the contrast between small and large is where our today's lesson lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why models come in sizes
&lt;/h2&gt;

&lt;p&gt;Let's take a simple example.&lt;/p&gt;

&lt;p&gt;My son is two. If I ask him what he wants for dinner, he says "pasta." Done in two seconds without any deliberation.&lt;/p&gt;

&lt;p&gt;If you ask me what to make for dinner, I'm thinking: what's in the fridge, what did we have yesterday, does he need more protein today, is it too late to start something that takes 40 minutes, should I batch-cook for tomorrow. Ten variables that will take me five minutes. I will give you a better answer, but slower.&lt;/p&gt;

&lt;p&gt;Models work the same way.&lt;/p&gt;

&lt;p&gt;A model's "size" is roughly how many &lt;strong&gt;parameters&lt;/strong&gt; it has. &lt;/p&gt;

&lt;p&gt;Think of parameters as the variables it can hold in its head when making a decision. More variables, more nuance, more ability to handle complex tasks. Fewer variables, faster and cheaper, but less sophisticated.&lt;/p&gt;

&lt;p&gt;My son doesn't need ten variables to pick dinner. He just needs to decide. And for a lot of tasks, that's all you need from a model too. A fast answer. Not a perfect one.&lt;/p&gt;

&lt;p&gt;Training a big model costs more. Running a big model costs more per question. And it's slower, because there are more variables to weigh for every single response.&lt;/p&gt;

&lt;p&gt;So why not just always use the biggest one? Two reasons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, cost.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;If you're building something that handles thousands of requests, the difference between a small model and a large model is the difference between a reasonable bill and a terrifying one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, and this is the one people miss: bigger isn't always better.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;For simple tasks, a big model can actually overthink it. Give you more than you asked for. Take longer to say something the small model said in two seconds.&lt;/p&gt;

&lt;p&gt;The model families you see (Haiku/Sonnet/Opus, Micro/Lite/Pro) are just size tiers from the same provider. Same architecture, different capacity. Like buying a car in compact, sedan, or SUV. Same manufacturer. Different trade-offs. You don't take the SUV to grab milk. You don't take the compact on a cross-country road trip with three kids.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tokens and pricing: how you actually pay
&lt;/h2&gt;

&lt;p&gt;Models don't charge by the question. They charge by the &lt;strong&gt;token&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What's a token? It's a chunk of text. Not quite a word, not quite a letter, but roughly three-quarters of a word.&lt;/p&gt;

&lt;p&gt;Take the sentence: "Adapt this recipe for a gluten-free vegan." Seven words but nine tokens. Some words get split, some punctuation becomes its own token.&lt;/p&gt;

&lt;p&gt;You don't need to memorise this. Just know: token count and word count aren't the same thing. A full page of text is around 400 tokens. A million tokens is roughly a 750,000-word book.&lt;/p&gt;

&lt;p&gt;There's a free tool called &lt;a href="https://tiktokenizer.vercel.app/" rel="noopener noreferrer"&gt;Tiktokenizer&lt;/a&gt; where you can paste text and see exactly how a model breaks it into tokens. It's weirdly satisfying. Try it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5bvqk51g12l1vncs0swu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5bvqk51g12l1vncs0swu.png" alt="Tiktokenizer showing how a sentence gets broken into tokens" width="800" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One thing that surprised me: different models tokenize the same text differently. I sent the exact same prompt and recipe to both models. The small one counted 6,548 input tokens. The large one counted 16,685. Same words, different tokenizers under the hood.&lt;/p&gt;

&lt;p&gt;And here's the thing: &lt;strong&gt;you get charged twice.&lt;/strong&gt; Once for the tokens you send in (your question). And once for the tokens the model sends back (its answer). Input tokens and output tokens. They're priced separately, and output is always more expensive, because that's where the model is doing the work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real numbers
&lt;/h3&gt;

&lt;p&gt;On &lt;a href="https://aws.amazon.com/bedrock?trk=44b16281-e090-49b6-97d8-f1cea54d9e87&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Amazon Bedrock&lt;/a&gt;, for the Claude family (pricing as of May 2025, &lt;a href="https://aws.amazon.com/bedrock/pricing?trk=44b16281-e090-49b6-97d8-f1cea54d9e87&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;check current prices here&lt;/a&gt;):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;Input (per 1M tokens)&lt;/th&gt;
&lt;th&gt;Output (per 1M tokens)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Haiku&lt;/td&gt;
&lt;td&gt;Small&lt;/td&gt;
&lt;td&gt;~$1&lt;/td&gt;
&lt;td&gt;~$5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;~$3&lt;/td&gt;
&lt;td&gt;~$15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opus&lt;/td&gt;
&lt;td&gt;Large&lt;/td&gt;
&lt;td&gt;~$5&lt;/td&gt;
&lt;td&gt;~$25&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's &lt;strong&gt;5x more expensive&lt;/strong&gt; from small to large. Same question, same answer, but 5x the price on both sides.&lt;/p&gt;

&lt;p&gt;If you're asking one question yourself, who cares. The difference is fractions of a cent. But if you're building an app that handles ten thousand requests a day, each one generating a few hundred output tokens, that 5x multiplier turns into real money fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The best model is the model you can afford to run at the scale you need.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it breaks: when bigger is worse
&lt;/h2&gt;

&lt;p&gt;Let's go back to the large model's response and look at the over-engineered parts. The timeline starting from the night before. "Marinate chicken in yogurt and spices, overnight is best." Fry the vegan portion first in clean oil, then fry the chicken onions in separate oil. Keep the rice pots separate. An oven method AND a stovetop method as alternatives.&lt;/p&gt;

&lt;p&gt;The small model? A simple table. 4:00pm, start marinating. 4:05, fry onions. 5:15, into the oven. 7:00, serve. Done.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzn2rwsgf9ryhzymiz7ys.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzn2rwsgf9ryhzymiz7ys.png" alt="Haiku's simple timeline table" width="742" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Opus is doing project management for my Saturday dinner. And here's the real cost of that overthinking.&lt;/p&gt;

&lt;p&gt;The small model: 18 seconds, about 1,900 output tokens. &lt;br&gt;
The large model: 44 seconds, 2,700 output tokens. &lt;/p&gt;

&lt;p&gt;40% more output. 2.4x slower. And about 10x more expensive for that single request.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw81n9w5pwuk0nuy0a1xp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw81n9w5pwuk0nuy0a1xp.png" alt="Haiku vs Opus stats comparison: tokens, time" width="800" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a Saturday dinner, this is overkill. And if I were building an app that answers recipe questions for thousands of users, I'd be paying for all that extra thinking on every single request.&lt;/p&gt;

&lt;p&gt;This is the trade-off. Bigger models are smarter, but "smarter" isn't always what you need. &lt;strong&gt;Sometimes you need fast, cheap, and good enough.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How to actually choose
&lt;/h2&gt;

&lt;p&gt;Here's how I think about it.&lt;/p&gt;

&lt;p&gt;First, the biggest factor: &lt;strong&gt;cost.&lt;/strong&gt; We just saw a 5x difference between small and large. And that's per token. When the big model also generates 40% more tokens per response, it compounds fast. That alone narrows the field for most people. If you're building something, cost is the thing that decides what's even on the table. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you can't afford to run it at the scale you need, it doesn't matter how good it is.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Start there. What can you actually sustain?&lt;/p&gt;

&lt;p&gt;Then, once cost has set your boundaries, three questions help you pick within them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. How complex is the task?&lt;/strong&gt;&lt;br&gt;
Summarising an email? Small model. Writing a legal brief? Big model. Adapting a recipe? Probably medium.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. How many times will you run it?&lt;/strong&gt;&lt;br&gt;
If it's one question from you personally, use whatever you want. If it's an app serving thousands of users, speed matters just as much as quality. Start small, upgrade only when the quality isn't good enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. What are the stakes?&lt;/strong&gt;&lt;br&gt;
If a wrong answer ruins dinner, that's low stakes. If a wrong answer means bad financial processing logic that costs you millions, that's high stakes. Higher stakes, bigger model, plus verification on top.&lt;/p&gt;

&lt;p&gt;That's it. &lt;strong&gt;Cost sets the ceiling. Complexity, volume, and stakes help you pick the floor.&lt;/strong&gt; You don't need to memorise model names. You need to know what you're optimising for.&lt;/p&gt;
&lt;h2&gt;
  
  
  What about picking a provider?
&lt;/h2&gt;

&lt;p&gt;I've been showing models from different providers. Claude, Nova, Llama. How do you pick a family?&lt;/p&gt;

&lt;p&gt;Honestly? Pick the one that's available where you already work. If you're on AWS, you have access to all of them through &lt;a href="https://aws.amazon.com/bedrock?trk=44b16281-e090-49b6-97d8-f1cea54d9e87&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Bedrock&lt;/a&gt;. If you're somewhere else, use what's there. The concepts are the same. &lt;strong&gt;Don't overthink the brand. Overthink the task.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One thing that confuses a lot of us early on: &lt;strong&gt;models and products are not the same thing.&lt;/strong&gt; Claude is a model. But Claude inside &lt;a href="https://aws.amazon.com/kiro?trk=44b16281-e090-49b6-97d8-f1cea54d9e87&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Kiro&lt;/a&gt; (a coding IDE) behaves differently from Claude in the Bedrock Playground, which behaves differently from Claude on claude.ai. Same model underneath. &lt;/p&gt;

&lt;p&gt;But each product wraps it with different instructions, tools, and context that shape how it responds. Kiro's Claude is tuned for writing code. The Playground's Claude is general-purpose. Same brain, different job description.&lt;/p&gt;

&lt;p&gt;So when you see dozens of AI "products" out there, many of them are the same few models dressed up for different use cases. &lt;strong&gt;The model decides how smart it is. The product decides what it's pointed at&lt;/strong&gt;, and priced accordingly.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you're just getting started:&lt;/strong&gt; models come in sizes. Bigger is smarter but slower and more expensive. For most everyday tasks, a medium model is the sweet spot. Try a few and see which one feels right for what you're doing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're more on the builder side:&lt;/strong&gt; start with the smallest model that gives acceptable quality. Only upgrade when you can point to a specific failure the bigger model fixes. &lt;strong&gt;Don't start big and optimise down. Start small and justify up.&lt;/strong&gt; And remember, you can use different models for different parts of the same system. The router doesn't need to be the same size as the reasoner. The model that decides which tool to call doesn't need to be the same one that processes the result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start small. Justify up.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;We are going to talk why model forgets what you told it. Ride Along.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post is part of the "Learning AI Out Loud" series, a cloud architect learning AI from first principles.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/rohini_gaonkar" class="crayons-btn crayons-btn--primary"&gt;Follow along with the series&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>ai</category>
      <category>beginners</category>
      <category>aws</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Thank you for featuring me! 💜</title>
      <dc:creator>Rohini Gaonkar</dc:creator>
      <pubDate>Mon, 11 May 2026 16:21:23 +0000</pubDate>
      <link>https://dev.to/rohini_gaonkar/thank-you-for-featuring-me-43md</link>
      <guid>https://dev.to/rohini_gaonkar/thank-you-for-featuring-me-43md</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/devteam/top-7-featured-dev-posts-of-the-week-4nik" class="crayons-story__hidden-navigation-link"&gt;Top 7 Featured DEV Posts of the Week&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/devteam/top-7-featured-dev-posts-of-the-week-4nik" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;AI in retro assembly and VR coding setups&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/devteam"&gt;
            &lt;img alt="The DEV Team logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1%2Fd908a186-5651-4a5a-9f76-15200bc6801f.jpg" class="crayons-logo__image" width="800" height="800"&gt;
          &lt;/a&gt;

          &lt;a href="/jess" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F264%2Fb75f6edf-df7b-406e-a56b-43facafb352c.jpg" alt="jess profile" class="crayons-avatar__image" width="400" height="400"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jess" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jess Lee
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jess Lee
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png" width="166" height="102"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-3651113" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/jess" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F264%2Fb75f6edf-df7b-406e-a56b-43facafb352c.jpg" class="crayons-avatar__image" alt="" width="400" height="400"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jess Lee&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/devteam" class="crayons-story__secondary fw-medium"&gt;The DEV Team&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/devteam/top-7-featured-dev-posts-of-the-week-4nik" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 11&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/devteam/top-7-featured-dev-posts-of-the-week-4nik" id="article-link-3651113"&gt;
          Top 7 Featured DEV Posts of the Week
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/top7"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;top7&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/devteam/top-7-featured-dev-posts-of-the-week-4nik" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;50&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/devteam/top-7-featured-dev-posts-of-the-week-4nik#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              16&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>community</category>
      <category>devto</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>Why does AI lie? Hallucinations explained simply</title>
      <dc:creator>Rohini Gaonkar</dc:creator>
      <pubDate>Fri, 08 May 2026 16:37:02 +0000</pubDate>
      <link>https://dev.to/aws/why-does-ai-lie-hallucinations-explained-simply-1c7g</link>
      <guid>https://dev.to/aws/why-does-ai-lie-hallucinations-explained-simply-1c7g</guid>
      <description>&lt;p&gt;In the &lt;a href=""&gt;previous post&lt;/a&gt;, I showed you an AI doing something genuinely useful, helping me adapt a recipe for a dinner party. We talked about the basic loop: send a prompt to a foundation model, get a response.&lt;/p&gt;

&lt;p&gt;Today we're talking about why AI lies to you.&lt;/p&gt;

&lt;p&gt;You know how AI sounds confident when it's completely wrong? It's called &lt;strong&gt;hallucination&lt;/strong&gt;, and it's the thing that'll either make you trust AI long-term, or burn you badly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The demo: same question, two models
&lt;/h2&gt;

&lt;p&gt;I asked two different models the same question in Amazon Bedrock Playground:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What happened at the recent Lyrids meteor shower?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Model 1: Amazon Nova Micro 1.0
&lt;/h3&gt;

&lt;p&gt;Nova Micro gave me details. Dates, locations, numbers, all delivered with complete confidence. It didn't hesitate. It didn't caveat. It just answered as if it knew.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fafnndmohtedvtg66qimo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fafnndmohtedvtg66qimo.png" alt="Nova Micro confidently answering about the 2023 Lyrids meteor shower with invented details" width="798" height="190"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But it doesn't know. Its training data ends in &lt;strong&gt;2023&lt;/strong&gt;. Anything after that is a gap it can't see. It didn't flag that. It just filled the gap with something plausible.&lt;/p&gt;

&lt;p&gt;This is hallucination. The model invents something plausible to fill a gap it doesn't know how to admit. It's not lying on purpose. &lt;strong&gt;It's doing exactly what it's designed to do: predict what a useful-sounding answer looks like.&lt;/strong&gt; It has no idea whether the answer is actually &lt;em&gt;true&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model 2: Claude Haiku 4.5
&lt;/h3&gt;

&lt;p&gt;Same question, newer model, much more recent training.&lt;/p&gt;

&lt;p&gt;Haiku told me straight: "I don't have access to current information. My knowledge was last updated in April 2024." Then it offered general facts about the Lyrids and suggested I check recent astronomy websites.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3716q7c2lpgl348asyrc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3716q7c2lpgl348asyrc.png" alt="Claude Haiku 4.5 refusing to answer about recent Lyrids, stating its April 2024 knowledge cutoff" width="799" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Progress. Newer models are better at recognising the edges of what they know.&lt;/p&gt;

&lt;p&gt;I gave it a link to a Space.com article. It told me it can't browse the internet. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5pf8km499g7tbing8zde.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5pf8km499g7tbing8zde.png" alt="Claude Haiku 4.5 refusing to access a URL" width="797" height="121"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I uploaded the PDF of that website article. There are limits to how big the file size can be so I provided it first few pages only. Then it answered accurately, pulling real details from the source.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcasl1p4vb4cp6o9owb16.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcasl1p4vb4cp6o9owb16.png" alt="Claude Haiku 4.5 accurately summarising the uploaded PDF" width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, in this case, we provided some context to the model and it gave me an answer based on that context.&lt;/p&gt;

&lt;h2&gt;
  
  
  The biography test
&lt;/h2&gt;

&lt;p&gt;I asked Nova Micro:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Tell me about Rohini Gaonkar."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It didn't hesitate. It told me I'm a "well-known Indian writer, scholar, and cultural critic." That I got my PhD in Comparative Literature from Duke. That I'm a professor at the University of Minnesota. That I've edited influential anthologies on postcolonial theory.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbd7byjw9ugpddfva0p67.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbd7byjw9ugpddfva0p67.png" alt="Nova Micro inventing an entire academic biography for Rohini Gaonkar" width="800" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;None of this is true. Not one detail.&lt;/p&gt;

&lt;p&gt;The model doesn't know who I am. But it knows what an academic biography &lt;em&gt;looks like&lt;/em&gt;. So it generated one. Complete with research interests, notable works, and recognition. All fabricated. All confident.&lt;/p&gt;

&lt;p&gt;So Haiku knew when to stop. Nova Micro didn't. &lt;/p&gt;

&lt;p&gt;But the underlying mechanism is the same in both models: &lt;strong&gt;prediction&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;One has better guardrails. The other just fills every gap it finds. &lt;/p&gt;

&lt;p&gt;Hallucination isn't just about training cutoffs. It's about the model filling gaps &lt;em&gt;anywhere&lt;/em&gt; in what it knows. Names it hasn't seen. Niche topics. Combinations it was never taught. Better guardrails help. They don't make the problem disappear.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A note on the name test:&lt;/strong&gt; I used my own name on purpose. If the model invents something weird about me, the only person affected is me. Be thoughtful if you try this with other people's names, especially private ones, or anyone who hasn't agreed to be part of your experiment. Whatever the model says about them, you've just generated and potentially broadcasted it. So, be cautious.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this happens: the architecture
&lt;/h2&gt;

&lt;p&gt;Remember the loop from the last post:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input (prompt) → Foundation Model → Output (response)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model predicts what a useful answer looks like, based on everything it learned &lt;em&gt;during training&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;During training&lt;/strong&gt; is the key phrase.&lt;/p&gt;

&lt;p&gt;Training ends on a specific date, called the &lt;strong&gt;training cutoff&lt;/strong&gt;. After that, the model is frozen. When you ask it about anything past that date, or anything it never quite learned, it has two options: say "I don't know", or do the thing it's designed to do i.e. &lt;strong&gt;predict&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And for a long time, these models weren't great at saying "I don't know". That's not what they were rewarded for in training. They were rewarded for producing fluent, useful-sounding answers. So that's what they produce. Even when the answer is made up.&lt;/p&gt;

&lt;p&gt;Hallucination shows up in different flavors: fabricated facts (the biography), outdated information stated as current (the meteor shower), inconsistent reproduction even with the source right there (the quote test). There are others too, wrong attributions, sycophantic agreement (going along with something you said even when it's wrong), confident extrapolation (extending a pattern beyond where the data supports it). &lt;/p&gt;

&lt;p&gt;The mechanism is always the same, prediction filling a gap, but knowing the flavor helps you design the right mitigation. We'll get into those mitigations in later posts when we talk about grounding, evaluation, and guardrails.&lt;/p&gt;

&lt;p&gt;If you're a builder, this'll feel familiar. Think of a DNS cache. You move your app to a new server, update the DNS record, but for the next hour some users still get routed to the old IP. The cache doesn't know the record changed. It just serves what it has, confidently, because it was designed to always give you an answer fast.&lt;/p&gt;

&lt;p&gt;Or autoscaling on the wrong metric. You scale on CPU. CPU is low, so the system thinks everything's fine. Meanwhile your queue is backed up with 10,000 unprocessed messages. The system is optimized to respond to one signal, so it confidently does nothing while things pile up.&lt;/p&gt;

&lt;p&gt;An AI model works the same way. It was trained to always produce a helpful-sounding answer. So when it doesn't know something, it still produces a helpful-sounding answer. It doesn't have a "say nothing" instinct. It has a "say something useful-looking" instinct.&lt;/p&gt;

&lt;p&gt;Modern models are &lt;em&gt;much&lt;/em&gt; better at refusing. But the underlying shape of the problem doesn't go away. The model doesn't know what it knows. It just predicts.&lt;/p&gt;

&lt;h3&gt;
  
  
  "But ChatGPT can search the web?"
&lt;/h3&gt;

&lt;p&gt;Yes, most chat tools today can look things up online. That's not the model itself doing the searching. It is a tool plugged into the model. &lt;/p&gt;

&lt;p&gt;We'll get to how that works in a later post. For today, we're looking at the model on its own. No internet, no tools. Just what it learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix, and where the fix breaks
&lt;/h2&gt;

&lt;p&gt;I gave Nova Lite the actual article as a PDF and asked it to quote the second paragraph.&lt;/p&gt;

&lt;p&gt;It gave me a response. Then I asked the same thing again. Different answer. Same source, same conversation, two different versions of the same paragraph.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fry1p2ijeyzayjr886nq0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fry1p2ijeyzayjr886nq0.png" alt="Nova Lite giving two different versions of the same paragraph when asked to quote it exactly" width="799" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even with the source right there, it didn't pull the paragraph verbatim. I asked the same question twice, same conversation, same document, and got two different versions. It's not retrieving. It's still predicting what that paragraph probably looks like. And prediction isn't deterministic.&lt;/p&gt;

&lt;p&gt;This matters because a lot of people think &lt;em&gt;"just give the AI the document and it'll be fine."&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;It's better but it's not perfect. Things can get complex and messy, especially for anything that depends on exact wording, like legal text, medical dosages, or contract clauses. You still need to verify the responses. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context reduces hallucination. It doesn't eliminate it.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Three signs you should double-check
&lt;/h2&gt;

&lt;p&gt;If you're using AI day-to-day, here are the tells:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Specific details you can't verify.&lt;/strong&gt; Names, dates, numbers, URLs in an area you can't check. Assume 50/50.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Fluency on topics that should be fuzzy.&lt;/strong&gt; Ask about something niche or recent, get a confident detailed answer, and be suspicious. Real expertise has hedges, hallucination doesn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Citations. Especially URLs.&lt;/strong&gt; Models invent sources that look real. If you get a URL, open it. Nine times out of ten it's fine. The tenth time it's a made-up paper.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you're more on the builder side:&lt;/strong&gt; &lt;br&gt;
Remember, hallucinations aren't a bug you patch. They're a property of the system. You mitigate them with grounding (give the model real context), with instructions (tell the model to refuse when unsure), and later, with evaluation. &lt;strong&gt;Designing around them &lt;em&gt;is&lt;/em&gt; the job.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're just getting started:&lt;/strong&gt; &lt;br&gt;
Remember, AI is NOT a search engine. It's a prediction engine that's really good at sounding right. Treat specific claims the way you'd treat a confident stranger at a party. Friendly, but verify before you repeat them.&lt;/p&gt;

&lt;p&gt;Some examples I found on internet, for fun and educational purposes only: (Answers may change as models are catching up)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How many 'r's are in the word strawberry?&lt;/li&gt;
&lt;li&gt;If I have to take my car to car wash, and the car wash is 100ft away. Should I drive or go walking?&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Why are there so many of these things? Haiku, Sonnet, Opus. Mini, large, pro. And honestly, which one should you actually pick?&lt;/p&gt;

&lt;p&gt;That's the next post. Ride along.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post is part of the "Learning AI Out Loud" series, a cloud architect learning AI from first principles.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/rohini_gaonkar" class="crayons-btn crayons-btn--primary"&gt;Follow along with the series&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>ai</category>
      <category>beginners</category>
      <category>aws</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What Even Is AI? (I Took a Break &amp; Had to Relearn Everything)</title>
      <dc:creator>Rohini Gaonkar</dc:creator>
      <pubDate>Tue, 05 May 2026 18:38:06 +0000</pubDate>
      <link>https://dev.to/aws/what-even-is-ai-i-took-a-break-had-to-relearn-everything-3dpj</link>
      <guid>https://dev.to/aws/what-even-is-ai-i-took-a-break-had-to-relearn-everything-3dpj</guid>
      <description>&lt;p&gt;I just came back from maternity leave. And honestly? I felt like I'd missed a decade in six months. I talked about starting small in my other blog &lt;a href="https://dev.to/aws/lost-in-the-ai-hype-i-started-small-2a72"&gt;Lost in the AI Hype, I Started Small&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've spent the last fifteen years designing cloud systems. And even I felt behind. AI went from a thing people were experimenting with to a thing everyone's apparently &lt;em&gt;building&lt;/em&gt; with, and I had no idea where to start.&lt;/p&gt;

&lt;p&gt;So I did what any architect would do. I went back to first principles.&lt;/p&gt;

&lt;p&gt;I'm rebuilding my AI mental model from scratch in public. No math. No expert-level coding. Just real problems, the architecture underneath, and honest notes on where things might break.&lt;/p&gt;

&lt;p&gt;If you prefer video, please watch Episode 1 of my video series . If you prefer reading, you're in the right place.&lt;/p&gt;




&lt;h2&gt;
  
  
  The demo: AI adapts a recipe in under a minute
&lt;/h2&gt;

&lt;p&gt;Before any theory, let me show you what these models can actually do.&lt;/p&gt;

&lt;p&gt;I opened &lt;a href="https://aws.amazon.com/bedrock/?trk=44b16281-e090-49b6-97d8-f1cea54d9e87&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Amazon Bedrock&lt;/a&gt; Playground, pasted a real recipe, and asked three questions with each one pushing the model a little further:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Extract and summarise&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What are the core techniques in this recipe, strip off the fluff?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcygu18a807ztlemcekbc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcygu18a807ztlemcekbc.png" alt="What are the core techniques in this recipe, stripped of the fluff" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clean, fast, useful. You might think: that's a fancy Ctrl+F (search). &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Interpret and advise&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Looking at this recipe, what's the thing that's most likely to go wrong for someone cooking it for the first time?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88ldw6zizl6gyezfju96.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88ldw6zizl6gyezfju96.png" alt="Looking at this recipe, what's the thing that's most likely to go wrong for someone cooking it for the first time?" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we're somewhere a search tool genuinely can't go. The model is &lt;strong&gt;reasoning&lt;/strong&gt; about the recipe like spotting the bit where people actually mess up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Personalise&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I'm cooking this for six people on Saturday. One is vegan, one is gluten-free. Adapt the recipe, give me a shopping list, and a timeline starting from 4pm."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmizw0pgi3uuo9zkks45.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmizw0pgi3uuo9zkks45.png" alt="I'm cooking this for six people on Saturday. One is vegan, one is gluten-free. Adapt the recipe, give me a shopping list, and a timeline starting from 4pm." width="591" height="682"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the moment. I asked it something I'd normally spend twenty minutes thinking through. It gave me a starting point in ten seconds.&lt;/p&gt;

&lt;p&gt;If you're curious but not technical, that's already useful. &lt;/p&gt;

&lt;p&gt;If you're a builder, you're probably already thinking so what happened here.&lt;/p&gt;




&lt;h2&gt;
  
  
  So what actually happened?
&lt;/h2&gt;

&lt;p&gt;Here's the architecture, as simply as I can put it.&lt;/p&gt;

&lt;p&gt;I sent text called a &lt;strong&gt;prompt&lt;/strong&gt; to a &lt;strong&gt;foundation model&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;People throw around terms like AI, LLMs, and foundation models like they all mean the same thing but they don’t.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs7vn0uhje41ewm3eakhc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs7vn0uhje41ewm3eakhc.png" alt="AI &gt; Foundation Models &gt; LLMs" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AI is the broad umbrella. It includes everything from recommendation engines and fraud detection systems to generative AI tools like ChatGPT.&lt;/p&gt;

&lt;p&gt;Foundation models are a subset of AI, they are large models trained on massive datasets that can be adapted for different tasks. These aren’t just text models; they can generate images, video, speech, code, and more. Platforms like &lt;a href="https://aws.amazon.com/bedrock/?trk=44b16281-e090-49b6-97d8-f1cea54d9e87&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Amazon Bedrock&lt;/a&gt; give access to many of these models.&lt;/p&gt;

&lt;p&gt;LLMs (Large Language Models) are a specific type of foundation model built for language tasks like answering questions, summarizing text, writing, or coding. So in my recipe demo, I was technically interacting with an LLM.&lt;/p&gt;

&lt;p&gt;The simplest way to think about it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI → Foundation Models → LLMs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, in our case it means its a big model trained on a huge mix of data for your day to day general purpose. &lt;/p&gt;

&lt;p&gt;The model is a piece of software trained on an enormous amount of text: books, articles, code, conversations. It is &lt;em&gt;not&lt;/em&gt; searching the internet. It learned patterns from all that text beforehand.&lt;/p&gt;

&lt;p&gt;When I give it my prompt, it &lt;strong&gt;predicts the most useful response&lt;/strong&gt; based on everything it learned.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input (prompt) → Foundation Model → Output (response)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdwlygd3hmhx67vlrvs5l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdwlygd3hmhx67vlrvs5l.png" alt="Basic loop Input prompt to Foundation Model to Output response" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've been building distributed systems for years, and a foundation model call is simpler than most of the APIs I'm used to. It's an HTTP request with text in, text out. &lt;/p&gt;

&lt;p&gt;The complexity isn't in the call itself, it is in what the model learned before you or I ever showed up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And this exact loop is what the entire current wave of AI is built on.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every time you see a new Claude, or GPT, or Llama land, what's actually happening is someone trained a bigger or smarter version of this same idea.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Same loop. More data. Better prediction.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Where it breaks
&lt;/h2&gt;

&lt;p&gt;The model doesn't know if it's right. It's predicting what a useful answer &lt;em&gt;looks like&lt;/em&gt;. Sometimes that prediction is brilliant. Sometimes it invents something that sounds plausible and is completely wrong.&lt;/p&gt;

&lt;p&gt;Every time you use one of these tools, ask yourself: &lt;strong&gt;what would I need to double-check before I trusted this?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That question is the single most useful habit you can build right now. We'll dig into &lt;em&gt;why&lt;/em&gt; this happens in the next post.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where the models live: Amazon Bedrock
&lt;/h2&gt;

&lt;p&gt;You might've noticed I wasn't using ChatGPT or Claude's own website. I was using &lt;strong&gt;&lt;a href="https://aws.amazon.com/bedrock/?trk=44b16281-e090-49b6-97d8-f1cea54d9e87&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Amazon Bedrock&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Bedrock is where a bunch of foundation models live on AWS. Anthropic's Claude, Meta's Llama, Mistral, Amazon's own models, they are all callable through Bedrock, no need to run or train anything yourself.&lt;/p&gt;

&lt;p&gt;The Playground is the easy door in, just type and go. Later in this series, when we start building, we'll call these same models from code. Same models, different door.&lt;/p&gt;




&lt;h2&gt;
  
  
  A note on my stack
&lt;/h2&gt;

&lt;p&gt;I work at AWS. So the tools I use in this series are AWS tools like Bedrock for the models, and later, an AI-powered IDE called Kiro for building.&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;concepts&lt;/em&gt;, though, aren't AWS specific. Foundation models, tokens, context windows, RAG, agents, these work the same way on any cloud. I'm showing you my stack. And honestly, I'm still figuring out which parts of it are great and which parts are a pain. You'll know which is which.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you're just getting started:&lt;/strong&gt; open any AI chat tool (Bedrock Playground, Claude, ChatGPT, whatever you have access to), paste a recipe, a contract, a long email and ask it three questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;One to summarise.&lt;/li&gt;
&lt;li&gt;One to interpret.&lt;/li&gt;
&lt;li&gt;One that's personal to you.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;See what happens. That's your homework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're more on the builder side:&lt;/strong&gt; the mental model is simple: text in, model, text out. Everything we build in this series is a variation on that loop.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Next up: when AI sounds confident and is completely wrong. Why it happens, how to spot it, how to stop it.&lt;/p&gt;

&lt;p&gt;This is a series. I'm learning this in public, building as I go, and being honest when things don't work. If that sounds useful, please  follow along.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This post is part of the "Learning AI Out Loud" series, a cloud architect learning AI from first principles. &lt;a href="https://www.youtube.com/playlist?list=PLTuh5MoXKZTwoeROV-bA4_6maw0FIoeEf" rel="noopener noreferrer"&gt;Watch the video version&lt;/a&gt; or follow the series on dev.to.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>beginners</category>
      <category>aws</category>
      <category>learning</category>
    </item>
    <item>
      <title>Stop waiting to feel ready. You won’t.
Not after a break. Not after life changes. Not when everything feels like it’s moving faster than you.

I almost didn’t publish this.</title>
      <dc:creator>Rohini Gaonkar</dc:creator>
      <pubDate>Wed, 15 Apr 2026 14:49:18 +0000</pubDate>
      <link>https://dev.to/rohini_gaonkar/stop-waiting-to-feel-ready-you-wont-not-after-a-break-not-after-life-changes-not-when-24n2</link>
      <guid>https://dev.to/rohini_gaonkar/stop-waiting-to-feel-ready-you-wont-not-after-a-break-not-after-life-changes-not-when-24n2</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://dev.to/aws/lost-in-the-ai-hype-i-started-small-2a72" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6vs09dve3h1i5fw0fmg0.png" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://dev.to/aws/lost-in-the-ai-hype-i-started-small-2a72" rel="noopener noreferrer" class="c-link"&gt;
            Lost in the AI Hype, I Started Small - DEV Community
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            And it helped me get back into tech without drowning    TL;DR at the end     Coming back to...
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png"&gt;
          dev.to
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Lost in the AI Hype, I Started Small</title>
      <dc:creator>Rohini Gaonkar</dc:creator>
      <pubDate>Wed, 15 Apr 2026 14:32:01 +0000</pubDate>
      <link>https://dev.to/aws/lost-in-the-ai-hype-i-started-small-2a72</link>
      <guid>https://dev.to/aws/lost-in-the-ai-hype-i-started-small-2a72</guid>
      <description>&lt;h2&gt;
  
  
  And it helped me get back into tech without drowning
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;TL;DR at the end  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Coming back to tech after a (maternity) break is a strange feeling.&lt;/p&gt;

&lt;p&gt;You’re excited but also unsure where to begin. There are new tools, new terminologies and new way of doing things we did for decades.&lt;/p&gt;

&lt;p&gt;But I didn’t try to figure everything out at one go, I just picked one small thing.&lt;/p&gt;

&lt;p&gt;For me, that “one small thing” was finally building my portfolio collection.&lt;/p&gt;

&lt;p&gt;Over the years, my content - blog posts, YouTube videos, conference talks, GitHub repos, social posts all of them scattered across dev.to, GitHub, YouTube, Instagram, LinkedIn, and AWS channels - has been scattered across a dozen different platforms. DEV.to, community.aws, YouTube, GitHub (two accounts!), LinkedIn, SlideShare... you name it. 🙇‍♀️&lt;/p&gt;

&lt;p&gt;More than 80 pieces of content, scattered across platforms since 2015!!!&lt;/p&gt;

&lt;p&gt;And honestly? Maintaining my existing site &lt;a href="https://rohinigaonkar.com" rel="noopener noreferrer"&gt;rohinigaonkar.com&lt;/a&gt; felt harder than starting from scratch.&lt;/p&gt;

&lt;p&gt;I wanted something simpler, a lightweight site I can update by editing a single file, push to GitHub, and it's live. Easy to navigate, easy to maintain. No fluff.&lt;/p&gt;

&lt;p&gt;I built this as my first project back from maternity leave, and I did it with &lt;a href="https://kiro.dev/?trk=44b16281-e090-49b6-97d8-f1cea54d9e87&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Kiro&lt;/a&gt;, an AI-powered IDE from AWS that I'd never used before. Two firsts at once. It turned out to be the perfect re-entry project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building It with Kiro: My First Impressions
&lt;/h2&gt;

&lt;p&gt;This portfolio had been on my mental to-do list forever, so the timing felt right. And rather than spinning up a complex stack to shake off the rust, I decided to keep it simple and lean on an AI coding assistant to help me get back into the flow.&lt;/p&gt;

&lt;p&gt;Here's what stood out about the experience, starting with the simplest features and building up. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Last one might surprise you!!! 🤯&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  1. Chat-Driven Development
&lt;/h2&gt;

&lt;p&gt;The entire project was built through conversation. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcc8xwf0zsvgryqcqnkor.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcc8xwf0zsvgryqcqnkor.png" alt="Screenshot: Kiro Kiro-IDE.png" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I described what I wanted, &lt;em&gt;"I have this website where I collect my content shared across multiple social media websites. it is one true place where any tech content I posted on the web be it dev.to, github, youtube, instagram, and any aws first party channels, all of this to be collected as a timeline. can we build something that can be refreshed on demand and build this portfolio. make it professional looking. ask more intelligent questions as we go."&lt;/em&gt;, and Kiro asked clarifying questions even before writing a single line of code. &lt;/p&gt;

&lt;p&gt;It asked about static vs dynamic, hosting preferences, design vibe, and data source approach. It even asked me about my identity. That back-and-forth shaped the architecture before any code was generated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffyxbyiv6ioht034zklax.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffyxbyiv6ioht034zklax.png" alt="Screenshot: Initial chat conversation with Kiro asking clarifying questions Kiro-asking-questions-before-coding" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once I provided response to all the questions, it help build the initial structure and also walked me through it. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgtjfxdcazqqqknz26je2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgtjfxdcazqqqknz26je2.png" alt="Screenshot: Initial build initial-build-2" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice how after every conversation, it shows how many credits each prompt consumes, in real-time. That was nice!&lt;/p&gt;

&lt;p&gt;There is a &lt;strong&gt;spec-driven development mode&lt;/strong&gt; as well, which I would be testing for something more complex than this static website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv9qhqndj2v4fd9wj9dtd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv9qhqndj2v4fd9wj9dtd.png" alt="Screenshot: Kiro's spec-driven development mode spec-driven-development" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Web Search
&lt;/h2&gt;

&lt;p&gt;Kiro searched the web to find my existing content across platforms. It looked up my dev.to profile, GitHub repos, community.aws presence, YouTube channel, and even my current website at rohinigaonkar.com. This gave it real context about who I am and what content already exists, so the portfolio wasn't built with placeholder data, it was seeded with my actual content from day one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjij1zq0izq98o0zssb48.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjij1zq0izq98o0zssb48.png" alt="Screenshot: Kiro web search results finding your profiles web-search" width="800" height="607"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Explore Real-Time File Changes
&lt;/h2&gt;

&lt;p&gt;As Kiro generated and edited the files, I could see every change happening in real time through the explorer. Either click the &lt;strong&gt;"Follow"&lt;/strong&gt; option or click on the little &lt;strong&gt;"diff button"&lt;/strong&gt; highlighted with yellow square below.&lt;/p&gt;

&lt;p&gt;For example, it created &lt;code&gt;index.html&lt;/code&gt; or &lt;code&gt;content.js&lt;/code&gt;, I could immediately open them, review the code, and see the diffs. When it later modified &lt;code&gt;content.js&lt;/code&gt; to add YouTube videos or reclassify talks vs videos, I could see exactly what changed and why.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fklirbnx1pxu8f7h0ld6s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fklirbnx1pxu8f7h0ld6s.png" alt="Screenshot: Explorer view showing file changes / diff view Follow-file-changes" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Trusting Frequently Run Commands
&lt;/h2&gt;

&lt;p&gt;Kiro ran shell commands like &lt;code&gt;curl&lt;/code&gt; to hit APIs and extract data. It asked my permission to &lt;strong&gt;run it once or add it to trusted list of commands.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhj5obnlcn3c8v23gfe1b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhj5obnlcn3c8v23gfe1b.png" alt="Screenshot: Autopilot mode with command execution run-or-trust-command" width="799" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also liked how it provided my levels of trust, like I can just execute this particular command or partial or the base command.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzpfe0xsmllwnoietp1fp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzpfe0xsmllwnoietp1fp.png" alt="Screenshot: Autopilot mode with command execution trust-levels" width="800" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In autopilot mode, I could trust these commands to execute without approving each one individually. This was especially useful during the YouTube oEmbed batch processing, where Kiro ran 16 consecutive curl commands to fetch video titles, approving each one manually would have been tedious.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Iterative Refinement Through Conversation
&lt;/h2&gt;

&lt;p&gt;The project evolved through multiple rounds of feedback:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I pointed out that "talks" should only mean conference/meetup presentations, not YouTube tutorial videos - Kiro reclassified everything accordingly&lt;/li&gt;
&lt;li&gt;I noted that some AWS "talks" were actually just YouTube embeds on my website - Kiro dug into the pages, extracted the real YouTube URLs, and recategorized them as videos&lt;/li&gt;
&lt;li&gt;I shared my personal GitHub profile separately from my work one - Kiro pulled repos from both and updated the refresh script to handle multiple accounts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each round of feedback made the portfolio more accurate without starting over or deleting some other important information. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq1mjsvtt5g6etfeh8yfd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq1mjsvtt5g6etfeh8yfd.png" alt="Screenshot: Chat showing iterative refinement iterative-refinement" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The YouTube Challenge : Hitting Walls and Finding Workarounds
&lt;/h2&gt;

&lt;p&gt;This was the most interesting part as YouTube is heavily locked down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Direct fetch failed&lt;/strong&gt; - &lt;code&gt;webFetch&lt;/code&gt; on youtube.com returned empty content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rendered mode failed&lt;/strong&gt; - returned only JavaScript bootstrap code, no actual page content
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search was noisy&lt;/strong&gt; - web searches for my videos returned generic results, not my specific content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RSS feeds blocked&lt;/strong&gt; - YouTube's channel RSS wasn't accessible either&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;*&lt;em&gt;But Kiro didn't give up!!! 💜 *&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It found workarounds on its own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;oEmbed API&lt;/strong&gt; - Kiro discovered that YouTube's oEmbed endpoint (&lt;code&gt;youtube.com/oembed?url=...&lt;/code&gt;) returns video titles as JSON, and used &lt;code&gt;curl&lt;/code&gt; to call it directly. This became the reliable method for all 16 videos I shared.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Squarespace page parsing&lt;/strong&gt; - For videos embedded on my website, Kiro parsed the raw HTML to extract YouTube video IDs from Squarespace's embed block JSON (double HTML-unescaping the content to find URLs like &lt;code&gt;youtube.com%2Fembed%2Fi0zQpJPfSdU&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thumbnail URL extraction&lt;/strong&gt; - It even tried extracting video IDs from &lt;code&gt;ytimg.com/vi/VIDEO_ID/hqdefault.jpg&lt;/code&gt; thumbnail patterns as a fallback.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The iterative problem-solving here like trying one approach, hitting a wall, pivoting to another, felt very much like how a developer would debug a scraping problem. &lt;/p&gt;

&lt;p&gt;I loved how Kiro told me what it tried, it failed and it was going to try something else. We also worked together for a process that was a good compromise for both of us. Maybe in future I will have an agent to simplify this, but for now this solves my purpose!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frzq0zn9f7x8wjfnf9t6j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frzq0zn9f7x8wjfnf9t6j.png" alt="Screenshot: Kiro trying different approaches to fetch YouTube data youtube-is-blocked-1" width="799" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyth8gchj9tap5j1wndv6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyth8gchj9tap5j1wndv6.png" alt="Screenshot: Kiro trying different approaches to fetch YouTube data youtube-is-blocked-2" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbwfh7246d1c4rpxzt1vh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbwfh7246d1c4rpxzt1vh.png" alt="Screenshot: Kiro trying different approaches to fetch YouTube data youtube-is-blocked-3" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Result
&lt;/h2&gt;

&lt;p&gt;A live static portfolio at &lt;a href="https://rohinigaonkar.github.io" rel="noopener noreferrer"&gt;rohinigaonkar.github.io&lt;/a&gt; with ~80 entries spanning 2015–2025, filterable by type (blogs, videos, repos, talks, social), searchable, and refreshable on demand via a Node.js script that pulls from GitHub and dev.to APIs. All built through conversation in a single Kiro session.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfkgvhvnhe21he0zwr9e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfkgvhvnhe21he0zwr9e.png" alt="Screenshot: Final portfolio site summary quick-recap-summary" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3tydhj0wrh2llspzsss.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3tydhj0wrh2llspzsss.png" alt="Screenshot: Final portfolio site final-website" width="800" height="704"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'll keep adding content as I publish it. The refresh script makes the API-sourced stuff automatic, and the manual entries take about 30 seconds each. I might add dark mode at some point, and maybe an RSS feed. But right now, the simplicity is the feature.&lt;/p&gt;

&lt;p&gt;More importantly, this project reminded me that coming back doesn't have to be intimidating. &lt;/p&gt;

&lt;p&gt;If you're returning from a break and looking for a low-pressure way to get back into coding, I'd recommend picking a passion project and giving Kiro a try. You might surprise yourself with how quickly you get back into the zone.&lt;/p&gt;

&lt;p&gt;Sign up for an &lt;a href="https://aws.amazon.com/builder/?trk=44b16281-e090-49b6-97d8-f1cea54d9e87&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;AWS Builder ID&lt;/a&gt;, install &lt;a href="https://kiro.dev/?trk=44b16281-e090-49b6-97d8-f1cea54d9e87&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Kiro IDE&lt;/a&gt;, and try it for yourself. Be sure to let me know how it goes!&lt;/p&gt;

&lt;p&gt;And follow along as I explore this world of AI.&lt;/p&gt;

&lt;p&gt;&lt;a id="tldr"&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;/a&gt; &lt;br&gt;
Returning to tech after maternity leave felt overwhelming, so I started small by building a portfolio site to consolidate 80+ pieces of content scattered across platforms since 2015. Using AWS Kiro (an AI-powered IDE) for the first time, I built the entire project through conversation—no complex setup needed. Kiro helped with web searches, real-time file changes, iterative refinements, and creative problem-solving (especially when YouTube's APIs were locked down). The result: a live, searchable portfolio at rohinigaonkar.github.io that's easy to maintain. The lesson? Coming back doesn't have to be intimidating—pick one small passion project and let AI tools help you get back into the zone.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>beginners</category>
      <category>productivity</category>
      <category>aws</category>
    </item>
    <item>
      <title>Get into Cloud computing with no experience</title>
      <dc:creator>Rohini Gaonkar</dc:creator>
      <pubDate>Wed, 08 Feb 2023 00:30:00 +0000</pubDate>
      <link>https://dev.to/aws/get-into-cloud-computing-with-no-experience-124</link>
      <guid>https://dev.to/aws/get-into-cloud-computing-with-no-experience-124</guid>
      <description>&lt;p&gt;I have been working in the IT industry for almost 14 yrs now, in multiple roles, across the world, and luckily all of this experience has been with Cloud Computing technologies. Over the years hundreds of people have asked me same question - &lt;strong&gt;how do I get into Cloud based roles?&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;A lot of folks want to get into Cloud Computing roles BUT companies want to see experience on your CV/resume. It is a dilemma for lot of folks.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you don't get hired into Cloud Computing projects, you can't get experience and without experience companies won't hire you &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I thought I should talk about this in detail and help folks who want to make switch to Cloud Computing, because Cloud is the new normal now and it should have a place on your resume.&lt;/p&gt;

&lt;p&gt;Watch this short YouTube video on how you can &lt;strong&gt;build your skills, your resume and your brand to apply for jobs&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;I do provide subtitles, and chapters so feel free to watch content you like.&lt;/p&gt;

&lt;p&gt;Let me know in the comments section, if you have any questions or any topics I should elaborate more about. I am happy to guide folks so we all are successful in our own lives! I hope these give you a fair idea of where to start and motivate you to take your first steps into a successful career!&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/ks4MdFM4bO4"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>cloudskills</category>
      <category>aws</category>
    </item>
    <item>
      <title>How to ‘Be your own cheerleader’</title>
      <dc:creator>Rohini Gaonkar</dc:creator>
      <pubDate>Fri, 06 Jan 2023 17:12:08 +0000</pubDate>
      <link>https://dev.to/aws/how-to-be-your-own-cheerleader-297e</link>
      <guid>https://dev.to/aws/how-to-be-your-own-cheerleader-297e</guid>
      <description>&lt;p&gt;Let me start by asking you a question - &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;do you feel unskilled at advocating for yourself and unsure of how to be proud of your work and accomplishments?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you answered yes, then this blog post is for you.&lt;/p&gt;

&lt;p&gt;Over the years, I have seen a common thread while mentoring tech community members – they do the hard work but they have poor self-esteem and self-worth. They do some amazing work, they have positively impacted so many lives, however, they don’t know how to showcase their work. &lt;/p&gt;

&lt;p&gt;We humans tend to get demotivated over time and lose confidence in our own abilities. This impacts relationship with co-workers and even job interviews. Now some might not agree with me, but it is a harsh reality of today’s world; If you do not talk about your body of work, who will? &lt;/p&gt;

&lt;p&gt;If you have attended my talks, then you would have heard me say this hundreds of times – &lt;strong&gt;BE YOUR OWN CHEERLEADER...!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you do 99 things right and 1 mistake, which one do you obsess over?&lt;br&gt;
Well, we typically obsess over that 1 mistake, because we are hard-wired to look at that one negative comment. Our memories are fickle, we tend to remember things that have stronger emotions associated with them. So how do you ensure that our minds do not obsess only on the negative, but also see the positives?&lt;/p&gt;

&lt;h2&gt;
  
  
  It’s simple, WRITE IT DOWN!
&lt;/h2&gt;

&lt;p&gt;Trust me on this, I have done this activity with many of my mentees and it works EVERY. SINGLE. TIME. Identify the broad categories of your body of work – projects, volunteering, public speaking, blogging, social media, soft skills, certifications etc. Once you have identified the broad categories, list down all the achievements you can think of in these categories. It doesn’t matter if it is significant or not. This is YOUR list, and you don’t have to be ashamed of anything.  &lt;/p&gt;

&lt;p&gt;Are you usually quiet and you spoke up in your team meeting? Write it down! Pat on your back for overcoming the shyness, the fear. No one is going to judge you.&lt;/p&gt;

&lt;p&gt;Once you write down the list, start adding meat to it. &lt;/p&gt;

&lt;p&gt;For example, this is an actual excerpt from one of my mentees in Public Speaking category: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Conducted sessions for college students on zoom for Universities like X Y Z to spread awareness on Cloud, Helped students to be Market ready and mentor them for their innovative projects.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, if you are a recruiter or a manager who is building a case for your promotion, what would be your first reaction? do you get any idea on the impact of work here? No. &lt;/p&gt;

&lt;p&gt;What about this..&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Regularly conducts virtual sessions for college students for major universities like X Y Z, to spread awareness on Cloud. She continues to &lt;strong&gt;mentor students&lt;/strong&gt; on their innovative projects, career guidance and be market ready.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Great so now with some basic language cleanup I made it concise, and a bit more professional.&lt;/p&gt;

&lt;p&gt;However, we can do better. At this point, ask yourself a question – &lt;strong&gt;SO WHAT?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So, what should I do about this information? Why does it matter? Can I quantify this impact? Can I put it in perspective?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Regularly conducts virtual sessions for college students for major universities like X Y Z, to spread awareness on Cloud. The &lt;strong&gt;15 sessions&lt;/strong&gt; were attended by &lt;strong&gt;2000+ students&lt;/strong&gt; with &lt;strong&gt;avg CSAT 4.7/5&lt;/strong&gt;.  She continues to &lt;strong&gt;mentor students&lt;/strong&gt; on their innovative projects, career guidance and be market ready.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isn’t this better? You know what she does regularly, how many sessions, attended by how many students and that is an impressive CSAT (Customer satisfaction score). &lt;strong&gt;Provide examples using metrics or data is always more impactful than using fancy words or long paragraphs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can further make it more impressive by adding anecdotes or testimonials from attendees, and if this led to a further engagement like the Universities have now signed her up as a regular guest lecturer. &lt;/p&gt;

&lt;h2&gt;
  
  
  Make a collection
&lt;/h2&gt;

&lt;p&gt;Create a folder on your computer for ‘appreciations’. Anytime someone says something nice about you, take a screenshot and store if for yourself. If you can, ask people to give you testimonials or LinkedIn recommendations.  On days when you do not feel good, open this folder and read through. You will get instant motivation boost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make it a habit
&lt;/h2&gt;

&lt;p&gt;I suggest doing this activity as soon as activities are done. &lt;/p&gt;

&lt;p&gt;You can also create monthly, quarterly half-yearly and yearly snapshot of these activities.   &lt;/p&gt;

&lt;p&gt;If you are looking for a job change, make this list right now!&lt;/p&gt;

&lt;p&gt;It will not only help you look at your accomplishments, this will help you show your interest and impact. You can add them to your resume or portfolio. During an interview, you can use this list to showcase impact and highlight your success stories. &lt;/p&gt;

&lt;p&gt;You can build great examples using this for your behavioral-based interview questions in STAR method (Situation, Task, Action, and Result). &lt;strong&gt;Specifics are key; avoid generalizations&lt;/strong&gt;. Give a detailed account of one situation for each question you answer, and use data or metrics to support your example. &lt;/p&gt;

&lt;p&gt;Once you start building these writing skills, next time before you say yes for an activity, you will automatically assess if the activity has true measurable impact and helps you achieve your goals.&lt;/p&gt;

&lt;p&gt;If you do not have the option of saying no, atleast you will assess how this activity impacts you in the greater scheme of things &lt;/p&gt;

&lt;h2&gt;
  
  
  Build your support system
&lt;/h2&gt;

&lt;p&gt;Humans are social animals. While you are doing this writing activity by yourself, you need your own support system. Find people in the community, at your workplace, in your friend circle who support you and cheer you up on these accomplishments.  Do not be arrogant or bullyish about your work. **Appreciate people who supported you in the journey. **You can summarise and publish this on your social media. Social media can be a great ego booster so why not use it for that? You should celebrate your accomplishments! Be your own cheerleader and the world will follow you! &lt;/p&gt;

&lt;p&gt;Contrary to common belief, &lt;strong&gt;at workplace your manager should be part of your support system&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you think your manager should inherently know all the awesome work you do, then you are setting yourself up for disappointment. Managers are not responsible for keeping track of your achievements. When you assume your manager owns your growth, it inevitably creates frustration for both parties. There's only so much each of you can do without the other.&lt;/p&gt;

&lt;p&gt;As mentioned before, our own memories are fickle, how can we expect a human being (aka your manager) with many direct reportees to remember all your good work? Be a good direct reportee and make your manager’s job a little easier. Regularly share your work progress and achievements in a short, concise manner as discussed above. It makes it easier for them to remember and share with other internal parties.&lt;/p&gt;

&lt;p&gt;So that’s it. Today we learnt how you can build your own list of achievements, make them concise, data oriented and share them with your support system. I hope some of these tips help you build your career and you continue to climb the ladder of success! &lt;/p&gt;

</description>
      <category>typescript</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Builders Guide to AWS Summit Online India 2022</title>
      <dc:creator>Rohini Gaonkar</dc:creator>
      <pubDate>Mon, 23 May 2022 08:11:44 +0000</pubDate>
      <link>https://dev.to/aws/builders-guide-to-aws-summit-online-india-2022-2l28</link>
      <guid>https://dev.to/aws/builders-guide-to-aws-summit-online-india-2022-2l28</guid>
      <description>&lt;p&gt;For the last many years, I have had privilege to attend, speak and even curate agenda at AWS Summits, open/free tech conferences, that happen globally. This year I have been more closely involved and it gives me immense happiness to showcase what we have in store for you. This is a great conference to meet and network with similar minded enthusiasts about technology we all love. &lt;/p&gt;

&lt;h2&gt;
  
  
  Event highlights
&lt;/h2&gt;

&lt;p&gt;Just like last 2 years, the AWS Summit Online India 2022 is a 2-day virtual technical conference, on Wednesday 25th May, and Thursday, 26th May; with opening keynotes starting from 9am IST.&lt;br&gt;
And this is amazing as anyone from anywhere across the world can attend sessions and build network. Registration for the event is free, so go ahead and sign up for the event &lt;a href="https://summits-india.virtual.awsevents.com/register" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The Summit will offer &lt;strong&gt;150+ educational sessions, technical demonstrations, and keynotes&lt;/strong&gt; featuring the the &lt;strong&gt;VP of AI at AWS Dr. Matt Wood&lt;/strong&gt; with other AWS business leaders and AWS customers like Tally, ICICI Lombard, Apollo tyres and more. &lt;/p&gt;

&lt;p&gt;Our &lt;strong&gt;AWS Community Hero for DevTools, Bhuvaneshwari Subramani&lt;/strong&gt;, is presenting in the &lt;strong&gt;Day 1 Keynote&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The sessions are divided into &lt;strong&gt;17 tracks with themes&lt;/strong&gt; like AI/ML, Big Data, Cloud Security, Compute Anywhere along with &lt;strong&gt;5  experiential zones&lt;/strong&gt; - &lt;strong&gt;exam readiness&lt;/strong&gt; sessions Training &amp;amp; Certification, &lt;strong&gt;deep dive demos&lt;/strong&gt; in Builders Fair and Startup Central. Pick and join any sessions you wish based on the detailed &lt;a href="https://aws.amazon.com/events/summits/india/agenda/" rel="noopener noreferrer"&gt;Agenda on the event website.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Attend the Summit to know more about what is happening in the Cloud Computing space and how India is using AWS to build innovative applications. Most of the sessions have AWS customers across India talking about how they have been using AWS in their real-world solutions.&lt;/p&gt;

&lt;p&gt;Sessions are labelled from Level 100, i.e. introductory level to level 400 i.e. expert level. So, attend sessions depending on your level of knowledge ranging from L100 - L400.&lt;/p&gt;

&lt;h2&gt;
  
  
  Community track
&lt;/h2&gt;

&lt;p&gt;I am happy to introduce you to the &lt;strong&gt;'Build on AWS' track&lt;/strong&gt; where for the first time ever, our community members are presenting in the AWS Summit India, alongside me. We will present advanced deep dive sessions on topics like Containers, Serverless, DevOps, Data Lakes and more. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Architecting for sustainability&lt;/strong&gt; Level: 300 | Advanced&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I will be presenting this session, where I will dive deep into techniques recommended by the AWS Well-Architected Framework Sustainability pillar and provide direction on reducing the energy and carbon impact of AWS architectures. Learn about best practices, which organisations of any size can apply to their workloads and how to review the new Customer Carbon Footprint Tool report with a demo.&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/rohinigaonkar/" rel="noopener noreferrer"&gt;Connect with me on LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;End-to-End CI/CD at scale with infrastructure-as-code on AWS&lt;/strong&gt; Level: 300 | Advanced&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/bhuvanas/" rel="noopener noreferrer"&gt;&lt;strong&gt;AWS DevTools Hero - Bhuvaneswari Subramani&lt;/strong&gt;&lt;/a&gt;, dives deep into building a production ready, multi-account, at scale CI/CD pipeline using your own Jenkins, with infrastructure-as-code using AWS CloudFormation, and discuss best practices for building DevOps capabilities for your container applications running on AWS.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Just-in-time worker nodes for Amazon Elastic Kubernetes Service using Karpenter&lt;/strong&gt; Level: 300 | Advanced&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/dijeeshpnair/" rel="noopener noreferrer"&gt;&lt;strong&gt;AWS Container Hero - Dijeesh Padinharethil&lt;/strong&gt;&lt;/a&gt;, will demonstrate how Karpenter simplifies Kubernetes infrastructure with the right nodes at the right time. Karpenter is an open-source, flexible, high-performance Kubernetes cluster autoscaler built with AWS&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build serverless apps with SAM Accelerate and SAM Pipelines&lt;/strong&gt;
Level: 300 | Advanced&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/jones-zachariah-noel-n/" rel="noopener noreferrer"&gt;&lt;strong&gt;AWS Community Builder - Jones Zachariah Noel N&lt;/strong&gt;&lt;/a&gt;, demonstrates how to use SAM templates to manage serverless infrastructure as code. He will share best practices for using the AWS SAM CLI and the recently announced AWS SAM Accelerate to develop and debug serverless applications on your local machine. He will also showcase the ease of CI/CD workflows with SAM pipelines to multiple staging environments.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build performant, scalable and secure GraphQL APIs&lt;/strong&gt;
Level: 300 | Advanced&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/dipalik/" rel="noopener noreferrer"&gt;&lt;strong&gt;AWS Community Hero - Dipali K&lt;/strong&gt;&lt;/a&gt;, and &lt;a href="https://www.linkedin.com/in/arora-rajat-cw/" rel="noopener noreferrer"&gt;&lt;strong&gt;AWS UG Delhi leader - Rajat Arora&lt;/strong&gt;&lt;/a&gt;, take you through security best practices for your GraphQL API’s with AWS AppSync, and Amazon Cognito for easy management, improved performance, and observability.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build sustainable applications on AWS using Rust&lt;/strong&gt;
Level: 200 | Intermediate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/sundarnarasiman/" rel="noopener noreferrer"&gt;&lt;strong&gt;AWS Solutions Architect Developer Specialist - Sundararajan Narasiman&lt;/strong&gt;&lt;/a&gt;, will dive into the “super powers” of Rust, hear about the work ahead to give those powers to every engineer, and learn about the ways in which you can contribute. He will cover how to build a lambda function using Rust and deploy to AWS.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build a data lake with AWS Lake Formation&lt;/strong&gt;
Level: 200 | Intermediate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/sanchitdilipjain/" rel="noopener noreferrer"&gt;&lt;strong&gt;AWS Community Builder - Sanchit Jain&lt;/strong&gt;&lt;/a&gt;, will explore data lake challenges and how AWS Lake Formation can help you. If you're a developer, DBA, or a data engineer who works with data, this session is for you.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build a real time pipeline to ingest streaming data&lt;/strong&gt;
Level: 300 | Advanced&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/sridevi-murugayen/" rel="noopener noreferrer"&gt;&lt;strong&gt;AWS Data Hero - Sridevi Murugayen&lt;/strong&gt;&lt;/a&gt;, will look at how you can build streaming data analytics pipelines that speed up time to information from hours to seconds. She will discuss how streaming-data services like Amazon Kinesis are used to capture and analyse data in real time from hundreds of sources, with AWS Lambda, stored in Amazon S3, then process it with Amazon EMR and deliver it to your Amazon Redshift data warehouse.&lt;/p&gt;

&lt;h2&gt;
  
  
  Goodies up for grab
&lt;/h2&gt;

&lt;p&gt;I would recommend watching few noteworthy sessions live. The live experience will get you an opportunity to connect with peers, tech enthusiasts, ask questions to experts, and last but not the least, win swags. &lt;/p&gt;

&lt;p&gt;You are eligible for the &lt;strong&gt;certificate of attendance&lt;/strong&gt;, as long as you complete watching 5 sessions or more during the conference and you stand a chance to win &lt;strong&gt;$25 AWS credits&lt;/strong&gt; too. Also, watch 2 or more express trainings in the Training &amp;amp; Certification Zone and be amongst the first 2000 to get the &lt;strong&gt;discount certification voucher&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Sign up for the free event today and cheer your fellow community members!&lt;/p&gt;

&lt;p&gt;AWS Summit India event Website - &lt;a href="https://aws.amazon.com/events/summits/india/https://aws.amazon.com/events/summits/india/" rel="noopener noreferrer"&gt;https://aws.amazon.com/events/summits/india/https://aws.amazon.com/events/summits/india/&lt;/a&gt; &lt;/p&gt;

</description>
      <category>aws</category>
      <category>community</category>
      <category>cloud</category>
      <category>career</category>
    </item>
  </channel>
</rss>
