<?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: Harsh Gupta</title>
    <description>The latest articles on DEV Community by Harsh Gupta (@codereaper-hg).</description>
    <link>https://dev.to/codereaper-hg</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%2F3980668%2F9b785a2a-c567-4bcf-9eba-469239b3a29e.png</url>
      <title>DEV Community: Harsh Gupta</title>
      <link>https://dev.to/codereaper-hg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codereaper-hg"/>
    <language>en</language>
    <item>
      <title>I built the same AI app with and without LangChain. Here's what I learned.</title>
      <dc:creator>Harsh Gupta</dc:creator>
      <pubDate>Sun, 14 Jun 2026 09:52:08 +0000</pubDate>
      <link>https://dev.to/codereaper-hg/i-built-the-same-ai-app-with-and-without-langchain-heres-what-i-learned-3lpj</link>
      <guid>https://dev.to/codereaper-hg/i-built-the-same-ai-app-with-and-without-langchain-heres-what-i-learned-3lpj</guid>
      <description>&lt;p&gt;I'd used ChatGPT and Claude as a regular user for a while, but I had no idea what it actually takes to &lt;em&gt;build&lt;/em&gt; something like that yourself — what tools developers reach for to make an AI app. LangChain kept coming up as "the" framework for this, so I decided to find out what it actually does.&lt;/p&gt;

&lt;p&gt;So I built the same small AI app twice — first with raw API calls, then with LangChain — and wrote down everything I noticed along the way. This is the honest report.&lt;/p&gt;

&lt;p&gt;If you've been intimidated by LangChain or wondering whether to learn it as a beginner, this is for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;The app is a "document Q&amp;amp;A" — load a text file, ask the AI questions about its contents, and have a conversation with memory (so the AI remembers what you asked before).&lt;/p&gt;

&lt;p&gt;This is the foundation of every "chat with your documents" tool out there. ChatPDF. Notion AI. AskYourPDF. They all do this same thing, just with polish on top.&lt;/p&gt;

&lt;p&gt;My setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python in Google Colab (free, runs in the browser)&lt;/li&gt;
&lt;li&gt;Groq's free API for the LLM (no credit card needed)&lt;/li&gt;
&lt;li&gt;Llama 3.3 70B as the model&lt;/li&gt;
&lt;li&gt;LangChain in version 2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I went in completely fresh. I'd never built an AI app before.&lt;/p&gt;

&lt;h2&gt;
  
  
  Version 1: Raw Groq API
&lt;/h2&gt;

&lt;p&gt;The simplest possible AI call looks like this:&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;from&lt;/span&gt; &lt;span class="n"&gt;groq&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Groq&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Groq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&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;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama-3.3-70b-versatile&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="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;system&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You answer questions about a document.&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;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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What is this text about?&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="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&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="n"&gt;choices&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;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three things to notice: you set up a &lt;code&gt;client&lt;/code&gt;, you send a list of &lt;code&gt;messages&lt;/code&gt; with roles (&lt;code&gt;system&lt;/code&gt;, &lt;code&gt;user&lt;/code&gt;), and you dig into the response to find the actual text (&lt;code&gt;response.choices[0].message.content&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;To turn this into a real Q&amp;amp;A app, I wrapped it in a &lt;code&gt;while True&lt;/code&gt; loop so I could ask multiple questions.&lt;/p&gt;

&lt;p&gt;That's when I hit my first surprise.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI has no memory
&lt;/h2&gt;

&lt;p&gt;I asked three questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;"How many players per team?" → AI answered correctly.&lt;/li&gt;
&lt;li&gt;"What is the pitch length?" → AI answered correctly.&lt;/li&gt;
&lt;li&gt;"What did I just ask you?" → AI said: "You asked me what you just asked me, but prior to that, you provided a document..."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A complete dodge. The AI had no idea what I'd asked 10 seconds earlier.&lt;/p&gt;

&lt;p&gt;This is when I realized: &lt;strong&gt;the AI is goldfish-brained by default.&lt;/strong&gt; Every API call is fresh. The model has no memory of the past. Each question is an isolated event.&lt;/p&gt;

&lt;p&gt;To fix this, you have to do the memory yourself. You maintain a list of every message — yours AND the AI's replies — and send the whole thing back every time. The list grows with each round.&lt;/p&gt;

&lt;p&gt;​&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="n"&gt;conversation&lt;/span&gt; &lt;span class="o"&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;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;system&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;...&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="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;question&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Your question: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;conversation&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;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="n"&gt;question&lt;/span&gt;&lt;span class="p"&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;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama-3.3-70b-versatile&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="n"&gt;conversation&lt;/span&gt;  
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&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;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;
    &lt;span class="n"&gt;conversation&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;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;assistant&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="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;​&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
python&lt;/p&gt;

&lt;p&gt;That was Day 2 done. App worked. Onto LangChain.&lt;/p&gt;
&lt;h2&gt;
  
  
  Version 2: The same app with LangChain
&lt;/h2&gt;

&lt;p&gt;Here's the LangChain version of the exact same conversation loop:&lt;/p&gt;

&lt;p&gt;​&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;from&lt;/span&gt; &lt;span class="n"&gt;langchain_groq&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChatGroq&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_core.messages&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;HumanMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SystemMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AIMessage&lt;/span&gt;

&lt;span class="n"&gt;llm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatGroq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama-3.3-70b-versatile&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;conversation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nc"&gt;SystemMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You answer questions about a document.&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="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;question&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Your question: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;conversation&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="nc"&gt;HumanMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&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;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;conversation&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="nc"&gt;AIMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nf"&gt;print&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="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look at it next to Day 2. The structure is identical. What changed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;{"role": "user", ...}&lt;/code&gt; became &lt;code&gt;HumanMessage(content=...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{"role": "assistant", ...}&lt;/code&gt; became &lt;code&gt;AIMessage(content=...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;client.chat.completions.create()&lt;/code&gt; became &lt;code&gt;llm.invoke()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;response.choices[0].message.content&lt;/code&gt; became &lt;code&gt;response.content&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. Memory is still my job. The loop is still mine. LangChain didn't make the AI smarter or give it real memory — it renamed the parts and gave me cleaner ways to access them.&lt;/p&gt;

&lt;p&gt;So why use it? The pitch is: &lt;strong&gt;LangChain is a translator.&lt;/strong&gt; It speaks Groq's language, OpenAI's, Anthropic's, all of them — but you only have to learn LangChain. Want to swap Groq for OpenAI tomorrow? Change one line — &lt;code&gt;ChatGroq&lt;/code&gt; to &lt;code&gt;ChatOpenAI&lt;/code&gt; — and the rest of the code works. With raw APIs, you'd have to rewrite the whole thing in each provider's specific format.&lt;/p&gt;

&lt;p&gt;That's a real benefit if you ever need it. For my one-file app? Honestly, no benefit yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The friction nobody warns you about
&lt;/h2&gt;

&lt;p&gt;Here's what tripped me up in 3 days:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. LangChain's imports keep moving.&lt;/strong&gt; I copied an import from a tutorial — &lt;code&gt;from langchain.schema import HumanMessage&lt;/code&gt; — and got &lt;code&gt;ModuleNotFoundError&lt;/code&gt;. Turns out LangChain moved its core pieces to &lt;code&gt;langchain_core.messages&lt;/code&gt;. Half the tutorials online still use the old path. If you're a beginner, you'll burn 20 minutes on this exact error at least once.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The LangChain version looked &lt;em&gt;too&lt;/em&gt; similar — I almost didn't trust it actually worked.&lt;/strong&gt; When I rewrote Day 2's code in LangChain, the structure was nearly identical — same loop, same append pattern, just renamed pieces. Part of me expected LangChain to feel different, more "magic." When I ran it and got the same correct memory-based answers, it didn't feel like a breakthrough — it felt like I'd basically retyped the same program with different words. That's when it actually clicked: LangChain isn't doing something fundamentally different here, it's giving the same thing a standard name.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, is LangChain worth it?
&lt;/h2&gt;

&lt;p&gt;After 3 days, my honest take:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where LangChain helped:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cleaner response access (&lt;code&gt;response.content&lt;/code&gt; instead of &lt;code&gt;response.choices[0].message.content&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Type-safe message classes (typo in &lt;code&gt;SystemMessage&lt;/code&gt; and Python yells immediately — typo in &lt;code&gt;"system"&lt;/code&gt; and the API silently breaks)&lt;/li&gt;
&lt;li&gt;Provider-agnostic — easy to swap LLMs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where it didn't:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memory is still my responsibility&lt;/li&gt;
&lt;li&gt;Imports keep churning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The honest verdict: &lt;strong&gt;for a single-file chat app, LangChain is a slight cosmetic upgrade. The real value probably shows up later&lt;/strong&gt; — vector databases, swapping providers, agents that use tools, chaining multiple AI calls. I haven't built any of that yet. But after these 3 days, at least I understand what LangChain &lt;em&gt;is&lt;/em&gt; — not magic, just a wrapper with a standard vocabulary.&lt;/p&gt;

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

&lt;p&gt;I'm going to keep going — next step is adding a vector database so the app can handle large documents (this is where LangChain is supposed to actually pay off). I'll write that up next.&lt;/p&gt;

&lt;p&gt;If you're a beginner: &lt;strong&gt;build it raw first.&lt;/strong&gt; Don't start with LangChain. You'll understand the framework so much better once you know what it's hiding from you.&lt;/p&gt;

&lt;p&gt;And if you've used LangChain in real production code — I'd love to hear where it actually saved you time. The framework's value is theoretical to me right now. Tell me where it stopped being theoretical for you.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>beginners</category>
      <category>llm</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
