<?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: Puttapaka Nikhil yadav</title>
    <description>The latest articles on DEV Community by Puttapaka Nikhil yadav (@puttapaka_nikhilyadav_63).</description>
    <link>https://dev.to/puttapaka_nikhilyadav_63</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3835155%2F6068c23b-a557-4c36-871b-595ba9f96546.png</url>
      <title>DEV Community: Puttapaka Nikhil yadav</title>
      <link>https://dev.to/puttapaka_nikhilyadav_63</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/puttapaka_nikhilyadav_63"/>
    <language>en</language>
    <item>
      <title>Building Memory for an AI Career Advisor Was Harder Than Building the AI Itself</title>
      <dc:creator>Puttapaka Nikhil yadav</dc:creator>
      <pubDate>Sat, 21 Mar 2026 10:04:00 +0000</pubDate>
      <link>https://dev.to/puttapaka_nikhilyadav_63/building-memory-for-an-ai-career-advisor-was-harder-than-building-the-ai-itself-8oi</link>
      <guid>https://dev.to/puttapaka_nikhilyadav_63/building-memory-for-an-ai-career-advisor-was-harder-than-building-the-ai-itself-8oi</guid>
      <description>&lt;p&gt;&lt;a href="https://youtu.be/II6dkz-5QxI?si=2_Eipj3kjVIRXLvK" rel="noopener noreferrer"&gt;https://youtu.be/II6dkz-5QxI?si=2_Eipj3kjVIRXLvK&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Building Memory for an AI Career Advisor Was Harder Than Building the Advisor Itself&lt;br&gt;
I thought memory would be easy&lt;/p&gt;

&lt;p&gt;While building an AI career advisor, I assumed memory would be straightforward.&lt;/p&gt;

&lt;p&gt;Store past conversations. Pass them back into the model.&lt;/p&gt;

&lt;p&gt;Done.&lt;/p&gt;

&lt;p&gt;That approach failed almost immediately.&lt;/p&gt;

&lt;p&gt;What the system actually does&lt;/p&gt;

&lt;p&gt;The system provides:&lt;/p&gt;

&lt;p&gt;resume feedback&lt;/p&gt;

&lt;p&gt;skill gap analysis&lt;/p&gt;

&lt;p&gt;internship tracking&lt;/p&gt;

&lt;p&gt;interview support&lt;/p&gt;

&lt;p&gt;But all of it depends on memory.&lt;/p&gt;

&lt;p&gt;Without context, every feature becomes generic.&lt;/p&gt;

&lt;p&gt;First attempt: store everything&lt;/p&gt;

&lt;p&gt;I started by storing everything:&lt;/p&gt;

&lt;p&gt;await db.save({&lt;br&gt;
  userId,&lt;br&gt;
  query,&lt;br&gt;
  response,&lt;br&gt;
  timestamp&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;Then I retrieved it like this:&lt;/p&gt;

&lt;p&gt;const history = await db.getAll(userId);&lt;/p&gt;

&lt;p&gt;const response = await llm.generate({&lt;br&gt;
  input: userQuery,&lt;br&gt;
  context: history&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;It worked for small inputs.&lt;/p&gt;

&lt;p&gt;Then it broke.&lt;/p&gt;

&lt;p&gt;The problem: too much context&lt;/p&gt;

&lt;p&gt;Issues:&lt;/p&gt;

&lt;p&gt;irrelevant data polluted responses&lt;/p&gt;

&lt;p&gt;repeated information confused the model&lt;/p&gt;

&lt;p&gt;token limits became a bottleneck&lt;/p&gt;

&lt;p&gt;I wasn’t building memory. I was building noise.&lt;/p&gt;

&lt;p&gt;The fix: structured memory&lt;/p&gt;

&lt;p&gt;I split memory into three layers:&lt;/p&gt;

&lt;p&gt;const profile = await getProfile(userId);&lt;br&gt;
const events = await getEvents(userId);&lt;br&gt;
const session = await getSession(userId);&lt;/p&gt;

&lt;p&gt;Then filtered:&lt;/p&gt;

&lt;p&gt;const context = {&lt;br&gt;
  skills: profile.skills,&lt;br&gt;
  projects: profile.projects,&lt;br&gt;
  recentEvents: events.slice(-5)&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;This improved quality significantly.&lt;/p&gt;

&lt;p&gt;Using Hindsight&lt;/p&gt;

&lt;p&gt;Instead of maintaining everything manually, I integrated&lt;br&gt;
👉 &lt;a href="https://github.com/vectorize-io/hindsight" rel="noopener noreferrer"&gt;https://github.com/vectorize-io/hindsight&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The flow became:&lt;/p&gt;

&lt;p&gt;const memory = await hindsight.retrieve(userId);&lt;/p&gt;

&lt;p&gt;const output = await llm.generate({&lt;br&gt;
  input: userQuery,&lt;br&gt;
  context: memory&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;await hindsight.store(userId, {&lt;br&gt;
  query: userQuery,&lt;br&gt;
  response: output&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;This gave a structured pipeline:&lt;/p&gt;

&lt;p&gt;recall&lt;/p&gt;

&lt;p&gt;reason&lt;/p&gt;

&lt;p&gt;store&lt;/p&gt;

&lt;p&gt;What worked&lt;/p&gt;

&lt;p&gt;selective retrieval&lt;/p&gt;

&lt;p&gt;structured storage&lt;/p&gt;

&lt;p&gt;limiting context size&lt;/p&gt;

&lt;p&gt;What didn’t&lt;/p&gt;

&lt;p&gt;dumping full history&lt;/p&gt;

&lt;p&gt;relying only on prompts&lt;/p&gt;

&lt;p&gt;ignoring time-based relevance&lt;/p&gt;

&lt;p&gt;Behavior after improvements&lt;/p&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;p&gt;repeated questions&lt;/p&gt;

&lt;p&gt;no personalization&lt;/p&gt;

&lt;p&gt;After:&lt;/p&gt;

&lt;p&gt;consistent context&lt;/p&gt;

&lt;p&gt;adaptive responses&lt;/p&gt;

&lt;p&gt;Lessons&lt;/p&gt;

&lt;p&gt;Memory is not storage—it’s retrieval&lt;/p&gt;

&lt;p&gt;Context should be minimal but relevant&lt;/p&gt;

&lt;p&gt;Systems should evolve after each interaction&lt;/p&gt;

&lt;p&gt;Final thought&lt;/p&gt;

&lt;p&gt;Building the AI part was straightforward.&lt;/p&gt;

&lt;p&gt;Making it remember—properly—was the real engineering challenge.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>hackathon</category>
      <category>hindsight</category>
    </item>
  </channel>
</rss>
