Skip to main content
ROI Scale AI logoROI Scale AI
Business
Technology & Telecom
arrow_forward
Financial Services
arrow_forward
Healthcare
arrow_forward
Retail & E-Commerce
arrow_forward
Education
arrow_forward
Energy & Utilities
arrow_forward
Media & Entertainment
arrow_forward
Manufacturing & Industrial
arrow_forward
Real Estate & Construction
arrow_forward
Government & Public Sector
arrow_forward
Professional Services
arrow_forward
Transport and Logistics
arrow_forward
View all in Business arrow_forward
Technology
Models & Benchmarks
arrow_forward
AI Engineering
arrow_forward
Prompt Engineering
arrow_forward
Data Strategy
arrow_forward
AI Security & Governance
arrow_forward
Libraries & Frameworks
arrow_forward
AI for Developers
arrow_forward
Research & Papers
arrow_forward
View all in Technology arrow_forward
Marketplace
Contribute
How-Tos
arrow_forward
Business RoadMap
arrow_forward
Tech RoadMap
arrow_forward
View all in Contribute arrow_forward
About
Mission
arrow_forward
Editorial
arrow_forward
View all in About arrow_forward
search
person_outlineSign In
Categories
BusinessTechnology & TelecomFinancial ServicesHealthcareRetail & E-CommerceEducationEnergy & UtilitiesMedia & EntertainmentManufacturing & IndustrialReal Estate & ConstructionGovernment & Public SectorProfessional ServicesTransport and Logistics
TechnologyModels & BenchmarksAI EngineeringPrompt EngineeringData StrategyAI Security & GovernanceLibraries & FrameworksAI for DevelopersResearch & Papers
Marketplace
ContributeHow-TosBusiness RoadMapTech RoadMap
AboutMissionEditorial
searchSearchhomeHome
Community
person_outlineSign In / Join
Home/Technology/Libraries & Frameworks
July 2, 2026

Why I Removed LangChain from Our Production Stack — and Why I Would Do It Again

Dr. Orion Kade
Dr. Orion Kade Published Jul 2, 2026
Why I Removed LangChain from Our Production Stack — and Why I Would Do It Again

After fourteen months of running LangChain in a production document-intelligence agent, a financial-services team faced a 3x abstraction overhead on every debugging session, breaking changes in three consecutive minor releases, and a mean time to ship a new agent feature of nine days. Rebuilding the same system on the Anthropic SDK plus 400 lines of custom orchestration code reduced mean time to ship to two days and eliminated the dependency on a framework release cycle. The anti-pattern is framework lock-in for problems that do not require framework abstraction — specifically, the pattern of adopting a high-abstraction LLM framework before the system's requirements are stable enough to justify the abstraction cost.

 

The Production Failure That Started This

In early 2024, a financial services firm's AI team had been running a LangChain-based document-intelligence agent in production for fourteen months. The agent processed incoming contracts, extracted key terms, flagged non-standard clauses, and routed documents to appropriate reviewers. The LangChain version at adoption was 0.0.27. By month fourteen, the team was on 0.1.x and had navigated three breaking changes — LLMChain deprecation, the AgentExecutor refactor, and the vectorstore interface revision.

The operational metrics were instructive: mean time to implement a new extraction feature was nine days, of which an estimated three were spent navigating LangChain's abstraction layers and debugging issues that manifested in the framework rather than in the business logic. A senior engineer described debugging a retrieval issue as "peeling an onion in the dark" — the stack traces pointed into LangChain internals that were themselves calling OpenAI SDK methods that were in turn calling an HTTP client. The business logic was buried four layers deep.

When LangChain 0.2.0 introduced the LCEL (LangChain Expression Language) paradigm as the new composition model, the team faced a choice: migrate to the new paradigm (estimated three-week engineering effort) or replace the framework. They chose replacement.

Why Framework Lock-In Without Justified Abstraction Fails at Enterprise Scale

LangChain's design philosophy is to provide high-level abstractions over LLM operations — chains, agents, tools, memory, retrievers — that let engineers build quickly without dealing with raw API primitives. For prototyping and for teams evaluating AI capabilities, this is valuable. The abstraction cost is low when you are moving fast and the system's requirements are exploratory.

The failure mode is not that the abstractions are wrong. It is that they are premature — adopted before the system's requirements were stable, and retained after the requirements had stabilized in ways that the framework's abstractions did not match. This is the classic premature-abstraction trap, well documented in software engineering literature. Martin Fowler's refactoring canon warns against abstractions that do not reflect the actual problem structure. When your problem is "extract clauses from a contract and route to reviewers", a DocumentChain abstraction that was designed for general document Q&A is not the right shape.

The more specific failure mode with LangChain at enterprise scale is release velocity mismatch. LangChain was shipping minor releases with breaking changes faster than enterprise teams could absorb them. The framework's development velocity, appropriate for an open-source project optimizing for feature coverage, was mismatched with enterprise operational requirements for stability. AWS re:Invent 2024 presentations from multiple enterprise AI teams described the same pattern: LangChain adoption for speed, followed by framework migration cost, followed by a move toward lower-abstraction orchestration.

The IEEE Software principle of architectural fitness functions (Ford et al., Building Evolutionary Architectures, 2017) applies here: a dependency on an external framework is an architectural fitness constraint, and that constraint should be evaluated against the system's actual requirements. If your requirements are: (a) single model provider (Anthropic), (b) fixed retrieval strategy, (c) three tool types, and (d) deterministic routing logic — you do not need a general-purpose LLM framework. You need a model SDK and 400 lines of orchestration code.

The CNCF's [platform engineering maturity model](https://tag-app-delivery.cncf.io/whitepapers/platform-engineering-maturity-model/) explicitly addresses third-party dependency governance: dependencies should be adopted based on a documented needs assessment, and the adoption decision should include an exit strategy. For LLM frameworks in 2024, exit strategies were rarely documented at adoption time.

The Architecture I Recommend Instead

The replacement system for the financial services firm was built on three layers:

Layer 1: The Anthropic SDK directly. All LLM calls use the Anthropic Python SDK with typed request and response objects. There is no intermediate abstraction. Every LLM call is a function in llm_client.py with explicit parameters, explicit error handling, and direct access to the raw response. Token usage, latency, and model version are logged at the call site. Debugging is immediate: the stack trace ends at the LLM call, not at a framework abstraction.

import anthropic

from typing import Optional

 

client = anthropic.Anthropic()

 

def extract_contract_clauses(

    document_text: str,

    extraction_schema: dict,

    model: str = "claude-3-5-sonnet-20241022",

    max_tokens: int = 2048,

) -> dict:

    """Extract structured clause data from a contract document."""

    response = client.messages.create(

        model=model,

        max_tokens=max_tokens,

        system=EXTRACTION_SYSTEM_PROMPT,

        messages=[

            {

                "role": "user",

                "content": f"<document>\n{document_text}\n</document>\n\nExtract clauses according to schema: {extraction_schema}",

            }

        ],

    )

    raw_output = response.content[0].text

    return validate_and_parse(raw_output, extraction_schema)

Layer 2: A thin orchestration layer (400 lines). The orchestration layer handles: routing between extraction, flagging, and review-assignment steps; retry logic with exponential backoff; state management for multi-document batches; and tool dispatch for the three tools the agent uses (document parser, clause database lookup, reviewer routing API). This layer is entirely custom — no framework. It is 400 lines of Python that the team fully understands and fully controls.

class ContractAgent:

    def __init__(self, llm_client, tools, router):

        self.llm = llm_client

        self.tools = tools  # DocumentParser, ClauseDB, ReviewerRouter

        self.router = router

 

    def process(self, document: Document) -> AgentResult:

        parsed = self.tools["parser"].parse(document)

        clauses = self.llm.extract_contract_clauses(parsed.text, CLAUSE_SCHEMA)

        flags = self.llm.flag_nonstandard_clauses(clauses, STANDARD_CLAUSE_DB)

        routing = self.router.route(document.metadata, flags.severity)

        return AgentResult(clauses=clauses, flags=flags, routing=routing)

Layer 3: A versioned prompt registry. All prompts are stored in a versioned YAML registry, loaded at agent initialization, and logged with every LLM call so that prompt version is always traceable in the audit log. Prompt changes are reviewed and deployed independently of code changes.

# prompts/v2.3.0/extraction.yaml

extraction_system_prompt: |

  You are a contract clause extraction engine. Extract the following clause types

  from the provided document text. Return a JSON object conforming to the provided

  schema. If a clause type is not present, return null for that field.

  Do not infer or fabricate clause content. If uncertain, return null.

The result: mean time to ship a new extraction feature fell from nine days to two. Debugging time fell by approximately 70% by self-report from the engineering team. The system has run through two Anthropic model releases without any framework migration cost — the upgrade was a one-line version bump in the model string.

This architecture is not novel. It is what AWS describes as the [Bedrock patterns for agent construction](https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html) — use the managed service APIs directly, implement orchestration in your own code, maintain full observability. Google's Vertex AI Agent Builder has the same philosophy. The frameworks exist for exploration; the SDKs exist for production.

Production Readiness Checklist

1.  Dependency justification is documented — every third-party LLM framework or library has a documented needs assessment explaining why it is required; the same needs assessment includes an exit strategy.

2.  Framework's release stability is evaluated — before adopting a framework, the last six months of release notes are reviewed for breaking change frequency; any framework with breaking changes in two or more consecutive minor releases is a red flag.

3.  Abstraction layers are countable — the team can state how many abstraction layers exist between the business logic and the LLM API call; more than two is a smell.

4.  All LLM calls are logged at the call site — model version, token usage, latency, and prompt version are captured at the site of the API call, not inferred from framework internals.

5.  Prompts are versioned in a registry — prompt text is not hardcoded in source files; changes to prompts are deployed and logged independently of code changes.

6.  The orchestration layer is readable by a mid-level engineer — if the orchestration code requires framework-specific expertise to understand, it is over-abstracted.

7.  Upgrade path is tested quarterly — model provider SDK upgrades are tested in a staging environment quarterly; breaking changes are caught before they reach production.

What I Would Build Differently

Removing LangChain was the right call for this team. I want to be precise about the conditions under which it is the right call: the system had stable requirements, a single model provider, a known tool set, and a team with strong Python fundamentals. For a team that is still in requirements discovery — testing multiple retrieval strategies, experimenting with different agent topologies, evaluating multiple model providers simultaneously — a framework provides scaffolding that is worth the abstraction cost. I would adopt LangChain or LangGraph in a prototype environment and make the "remove or retain" decision at the point of production hardening, not at the point of prototype adoption.

The custom orchestration layer at 400 lines is small enough to be readable and large enough to be non-trivial to maintain. At 400 lines it has no test coverage gaps; I have seen teams write similar custom orchestration that grew to 2,000 lines without adding corresponding tests, at which point it becomes more fragile than the framework it replaced. The 400-line ceiling should be enforced with a lint rule or a PR review policy. If the orchestration layer is growing beyond that, it is a signal that framework abstraction is earning its cost again.

Finally, the versioned prompt registry approach works well for a single-agent system. When the organization scaled to twelve agents with shared prompts, the registry became a coordination bottleneck — a change to a shared prompt component required updating the registry, regression-testing all twelve agents, and coordinating deployment. We eventually moved to a component-based prompt composition system, but that architecture deserves its own article.

DIAGRAM_HINT: Layered architecture comparison diagram: left panel shows LangChain stack (business logic → LangChain LCEL → LangChain agent executor → LangChain tool wrappers → LangChain retriever → OpenAI SDK → HTTP) with debugging path annotated as four layers deep; right panel shows direct-SDK architecture (business logic → thin orchestration layer (400 lines) → Anthropic SDK → HTTP) with versioned prompt registry feeding the orchestration layer, and mean-time-to-ship annotations on both panels.

P4_Lib_1_5b950131.jpg

Figure 6. Layered stack comparison: left shows LangChain architecture (business logic → LCEL chains → AgentExecutor → tool wrappers → retriever abstractions → SDK → HTTP, with 9-day ship time and 4-layer deb…


Share this article:

Comments (0)

Join the conversation!

Loading comments...
Back to Home / Technology / Libraries & Frameworks

Marketplace matches for this article

Quick links

  • Home
  • Search

Support

  • Contact Us

© 2026 ROI Scale AI. All rights reserved.

Powered by Publishi.ai