Back to Portfolio
Sep 2025 • 8 min read

From Prompts to Products: The New Production Stack

You're not programming anymore. You're orchestrating. And the stack changed overnight.

The Shift

"I just rewrote 3 microservices worth of business logic as a single LangGraph agent with 4 tools. Shipped in a weekend. Would've taken me 3 months in 2023."

— Me, last month, still processing what just happened

The Stack You Learned Is Changing

Remember when "full-stack" meant React + Node + Postgres? When you'd spin up Express, write 15 REST endpoints, handle auth, validation, error handling, logging...

That's still valid. But there's a new paradigm emerging that's fundamentally different:

Instead of writing code to handle every edge case, you're writing prompts that orchestrate LLMs to handle ambiguity. Instead of SQL queries, you're using vector databases and semantic search. Instead of business logic, you're designing agent workflows.

Welcome to the Agentic Stack.

Stack Comparison: Then vs. Now

The Traditional Stack (2023)

Frontend: React, Vue, Svelte
Backend: Node.js, Python Flask/FastAPI, Go
Database: PostgreSQL, MongoDB
API: REST or GraphQL endpoints
Business Logic: Manually coded if/else, state machines
Deployment: AWS EC2, Vercel, containers

Explicit, predictable, fully controlled. Also: rigid, time-intensive, breaks with edge cases.

The Agentic Stack (2025)

Frontend: Next.js + Vercel AI SDK (streaming UI)
Orchestration: LangGraph, LangChain, LlamaIndex
LLM Layer: OpenAI, Anthropic, open-source via Together/Replicate
Memory: Vector DB (Pinecone, Neon pgvector, Weaviate)
Business Logic: Agents + Tools + Prompts
Deployment: Vercel Functions, Modal, AWS Lambda

Dynamic, adaptive, handles ambiguity. Also: probabilistic, harder to debug, cost-per-call matters.

Real Example: Building a Medical Q&A System

Let me show you the difference with a real project I built: a system that answers clinical questions based on medical literature.

The Traditional Approach (2023)

  1. Build Elasticsearch cluster for full-text search
  2. Create custom NER pipeline to extract medical entities
  3. Write query parser to handle user input variations
  4. Implement ranking algorithm for result relevance
  5. Build template-based response generator
  6. Add error handling for 20+ edge cases

Time: 6 weeks, 2 engineers
Lines of code: ~8,000
Maintenance: Constant tuning, breaks with new query patterns

The Agentic Approach (2025)

  1. Chunk and embed papers into pgvector (LlamaIndex)
  2. Create retrieval tool with semantic search
  3. Design agent prompt with medical context
  4. Set up LangGraph workflow: query → retrieve → synthesize
  5. Add streaming response with Vercel AI SDK

Time: 1 weekend, 1 engineer (me)
Lines of code: ~400
Maintenance: Prompt refinement, way more robust to variations

The kicker? The agentic version handles edge cases I didn't even anticipate. Users can ask follow-ups, request clarifications, even switch topics mid-conversation. The traditional version would've choked.

What Actually Changed (Under the Hood)

This isn't just about using AI APIs. The fundamental abstractions shifted:

1. From Databases to Memory Systems

Old: SELECT * WHERE condition

New: Semantic search with embeddings, retrieve top-k similar chunks

You're not querying structured data. You're retrieving relevant context based on semantic similarity. Completely different mental model.

2. From Endpoints to Tools

Old: POST /api/users with strict JSON schema

New: "search_pubmed" tool that agents can call when needed

You define capabilities (tools), and the LLM decides when and how to use them. You're orchestrating, not controlling.

3. From Business Logic to Prompt Engineering

Old: 200 lines of if/else for handling user intent

New: "You are a medical AI assistant. Given context, answer concisely and cite sources."

Instead of hardcoding logic, you're describing behavior. The prompt IS the program.

4. From State Machines to Agent Graphs

Old: Explicit state transitions (idle → loading → success → idle)

New: LangGraph nodes with conditional edges based on agent decisions

Workflows can branch dynamically. The agent decides the path at runtime based on context.

Code Comparison (The Same Feature, Different Paradigms)

Here's actual code from my Medical RAG project:

Traditional Approach (Flask + Elasticsearch)

@app.route('/api/query', methods=['POST'])
def handle_query():
    user_query = request.json['query']

    # Entity extraction
    entities = ner_model.extract(user_query)

    # Build Elasticsearch query
    es_query = {
        "bool": {
            "must": [{"match": {"content": user_query}}],
            "should": [{"terms": {"entities": entities}}]
        }
    }

    # Search
    results = es.search(index="medical_papers", body=es_query)

    # Rank results
    ranked = rank_by_relevance(results, entities)

    # Generate response from template
    if not ranked:
        return {"answer": "No results found"}

    top_result = ranked[0]
    answer = f"Based on {top_result['title']}: {top_result['summary']}"

    return {"answer": answer, "sources": ranked[:3]}

Rigid. Every step is explicit. Breaks when user asks in unexpected ways.

Agentic Approach (LangGraph + pgvector)

from langgraph.graph import StateGraph, START, END
from langchain_openai import ChatOpenAI
from typing_extensions import TypedDict

# Define state schema
class State(TypedDict):
    query: str
    context: str
    answer: str

# Retrieval function using vector store
def retrieve(state: State) -> dict:
    docs = vector_store.similarity_search(state["query"], k=5)
    return {"context": docs}

def synthesize(state: State) -> dict:
    response = llm.invoke(f"""
        Context: {state["context"]}
        Question: {state["query"]}
        Provide a concise answer with citations.
    """)
    return {"answer": response}

# Build the graph
workflow = StateGraph(State)
workflow.add_node("retrieve", retrieve)
workflow.add_node("synthesize", synthesize)

workflow.add_edge(START, "retrieve")
workflow.add_edge("retrieve", "synthesize")
workflow.add_edge("synthesize", END)

# That's it. Handles variations, follow-ups, clarifications.
agent = workflow.compile()
response = agent.invoke({"query": user_input})

Flexible. Describes what to do, not how. Adapts to user intent.

When to Use Which Stack

Look, the agentic stack isn't always the answer. Here's my decision framework:

✓ Use Agentic Stack When:

  • • User input is ambiguous or natural language
  • • Requirements change frequently (startup mode)
  • • You need to handle unexpected edge cases gracefully
  • • The problem involves reasoning over unstructured data
  • • Speed to market > cost optimization (for now)

✗ Stick with Traditional When:

  • • Deterministic output is critical (financial transactions, medical dosing)
  • • Latency must be <100ms (LLM calls add 1-3s)
  • • Cost per operation matters (at scale, LLM calls get expensive)
  • • Compliance requires full auditability of logic
  • • You have well-structured data and clear rules

The Hybrid Reality (What I Actually Do)

Real talk: Most production systems are hybrid.

My Medical Chatbot uses:

  • Traditional: Auth, user management, session storage (Postgres)
  • Agentic: Query understanding, RAG retrieval, response generation (LangGraph + OpenAI)
  • Traditional: Rate limiting, caching, monitoring (Redis + Datadog)

You don't replace everything. You use the right tool for each layer.

Metrics That Matter Now

The KPIs changed too. Here's what I track in agentic apps vs. traditional:

MetricTraditionalAgentic
Response Time50-200ms1-5s (LLM latency)
Cost per Request$0.001$0.02-0.10 (token usage)
Edge Case HandlingRequires codingOften handled automatically
DebuggingStack traces, logsPrompt tracing, LLM observability
Iteration SpeedSlower (code changes)Faster (prompt tweaks)

Skills You Need Now

If you want to build with the agentic stack, here's what to learn (in order):

1. Prompt Engineering (Not a Meme)

Learn system prompts, few-shot examples, chain-of-thought. This is your new "business logic" layer.

2. Vector Databases & Embeddings

Understand cosine similarity, chunking strategies, hybrid search. This is your new "database" layer.

3. LangChain / LangGraph / LlamaIndex

Pick one framework. Learn its primitives (agents, tools, chains). This is your new "backend framework."

4. LLM Observability

Use LangSmith, Helicone, or Weights & Biases. You can't debug with console.log anymore.

5. Cost & Latency Optimization

Learn caching strategies, prompt compression, and when to use smaller/faster models.

The Bottom Line

The stack didn't just get new tools. The paradigm shifted.

You're not writing code that executes deterministically. You're orchestrating probabilistic systems that reason and adapt.

It's weird at first. But once you internalize it? You ship faster, handle more complexity, and build products that were impossible 2 years ago.

Traditional development isn't dead. But if you're only learning React and REST APIs in 2025, you're missing the biggest shift in software since mobile.

Learn to orchestrate. The new stack isn't about control—it's about direction.

Ulises Arellano
AI Software Engineer | Medical Student