Back to Blog
DevOps & Tools

Building an Internal AI Platform: What I Wish I'd Known Before Year One

A year of building the AI platform other teams build on top of — the abstractions that paid off, the ones that didn't, and the governance work nobody warned me about.

Amit ShrivastavaJune 29, 20267 min read

Building an Internal AI Platform: What I Wish I'd Known Before Year One

It’s been a whirlwind year. Twelve months ago, I was handed a challenging but incredibly exciting mandate: build an internal AI platform that other teams within our organization could leverage to integrate AI into their products and services. My background, spanning frontend, Web3, and now AI, felt like a perfect, if eclectic, blend for this venture. We started with a small, dedicated team, a lot of ambition, and what we thought was a clear path forward.

Now, a year in, I can look back with both pride at what we’ve accomplished and a healthy dose of humility about the lessons learned. If I could go back in time and give myself some advice, here's what I'd emphasize.

The Abstractions That Paid Off (and the Ones That Didn't)

When you're building a platform, the core of your work is abstraction. You want to hide complexity from your users – the developers leveraging your platform – so they can focus on their business logic, not on the intricacies of model serving, data pipelines, or GPU cluster management.

Abstractions That Were Golden

1. The "Model as a Service" (MaaS) API: This was our biggest win. We decided early on that our internal users wouldn't interact directly with deep learning frameworks or even specific model endpoints. Instead, they’d call a unified API.

// Example: Simplified interaction with our MaaS API
interface ModelConfig {
  modelId: string;
  version?: string;
  temperature?: number;
  maxTokens?: number;
}

interface PredictionResponse {
  output: string;
  metadata: {
    modelUsed: string;
    latencyMs: number;
  };
}

class InternalAIClient {
  private baseUrl: string;

  constructor(baseUrl: string) {
    this.baseUrl = baseUrl;
  }

  async predict(
    config: ModelConfig,
    input: Record<string, any>
  ): Promise<PredictionResponse> {
    const response = await fetch(`${this.baseUrl}/predict`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({ config, input }),
    });

    if (!response.ok) {
      throw new Error(`Prediction failed: ${response.statusText}`);
    }

    return response.json();
  }
}

// Usage by an internal team
const aiClient = new InternalAIClient('https://api.internal-ai-platform.com');

async function processUserQuery(query: string) {
  try {
    const result = await aiClient.predict(
      { modelId: 'summarizer-v2', temperature: 0.7 },
      { text: query }
    );
    console.log('Summary:', result.output);
  } catch (error) {
    console.error('AI prediction error:', error);
  }
}

This abstraction insulated consuming teams from model updates, infrastructure changes, and even switching underlying model providers. We handle routing, scaling, and observability behind this single interface. It was a non-negotiable from day one, and it paid dividends.

2. Managed Feature Stores: Instead of each team figuring out how to preprocess and store features for their models, we built a centralized feature store with common transformations and versioning. This reduced duplication and improved consistency.

Abstractions That Were... Less Than Ideal

1. Over-engineered Workflow Orchestration for Simple Tasks: We initially tried to build a highly generalized, DAG-based workflow engine for almost all AI tasks, anticipating complex multi-step pipelines. For 80% of use cases, this was overkill. Most teams just needed to call a model, maybe do some light pre/post-processing. The overhead of defining these simple workflows in a complex DSL (domain-specific language) outweighed the benefits. We ended up building simpler, function-based wrappers for common tasks on top of the generic engine, which defeats the purpose.

Lesson Learned: Start simple. Build reusable functions first. If patterns emerge that genuinely require complex orchestration, then abstract. Don’t build a Boeing 747 when a drone will suffice.

The Governance Work Nobody Warned Me About

This was perhaps the biggest blind spot. When you’re building an internal platform, you’re not just building technology; you’re building a foundational service that impacts how your entire organization operates. This comes with a heavy dose of governance.

Data Governance and Privacy

Our models ingest and process a lot of data. Ensuring we were compliant with internal data privacy policies and external regulations (like GDPR, HIPAA, etc., depending on our industry) was a monumental effort. This involved:

  • Data Masking/Anonymization: Implementing robust pipelines to mask PII (Personally Identifiable Information) before it ever reached the models.
  • Access Controls: Granular permissions for which models could access what data, and by extension, which teams could train/fine-tune models on sensitive datasets.
  • Data Retention Policies: Automated systems for purging data after specific periods.

We had to work hand-in-hand with legal and compliance teams from day one. I initially underestimated the sheer volume of meetings, documentation, and technical implementations this required. It’s not just "secure the database," it’s about understanding every data flow.

Cost Management and Attribution

AI, especially with GPUs, can get expensive fast. Early on, teams were spinning up resources without a clear understanding of the cost impact. We had to build robust tooling for:

  • Cost Visibility: Dashboards showing per-team resource consumption and projected costs.
  • Budgeting and Quotas: Implementing soft and hard quotas for GPU hours, API calls, etc., per team, with clear pathways for requesting increases.
  • Chargeback Mechanisms: Tying costs back to specific teams or projects.

The key here wasn't just to track costs, but to make it transparent and provide mechanisms for teams to manage their own spend.

Model Lifecycle Management and Versioning

Models aren't static. They get updated, retrained, and deprecated. Managing this lifecycle was crucial for predictability and reproducibility.

graph TD
    A[Model Training] --> B{Model Review & Approval};
    B -- Approved --> C[Model Packaging & Versioning];
    C --> D[Deploy to Staging];
    D -- Tests Pass --> E[Deploy to Production];
    E --> F[Monitoring & Metrics];
    F -- Performance Degrades --> B;
    B -- Rejected --> G[Retire Model];

We invested in a robust model registry that stored metadata, performance metrics, and lineage. This allowed teams to easily roll back to previous versions, understand the impact of model updates, and manage different model variants (e.g., a smaller, faster model for real-time inference vs. a larger, more accurate one for batch processing).

What I'd Do Differently (If I Had a Time Machine)

1. Hyper-focus on Developer Experience (DevEx) Earlier: While our MaaS API was good, the initial documentation, SDKs, and example code were basic. We waited too long to invest heavily in making the developer experience truly delightful. This led to slower adoption and more support requests than necessary. Dedicate a significant portion of early resources to DevEx – it’s as important as the core functionality.

2. Engage Legal/Compliance Even Earlier: Seriously, bring them into initial design discussions, not just for reviews. Their insights can prevent costly re-architectures later on.

3. Build a Dedicated Community of Practice: We eventually created a Slack channel and hosted internal tech talks, but I wish we'd formalized a "AI Guild" or "MLOps Community" sooner. This fostered knowledge sharing, identified common pain points, and helped prioritize platform features based on genuine user needs.

Looking Forward

The journey is far from over. We're now exploring edge deployments, multi-modal capabilities, and even more sophisticated experimentation platforms. The core lesson remains: building an internal AI platform is less about individual models and more about creating an entire ecosystem – technical, operational, and organizational – that empowers others to build.

It's been challenging, rewarding, and a constant learning experience. If you're embarking on a similar journey, remember that infrastructure, delightful abstractions, and robust governance are the pillars of a successful platform.


Let's Connect! I love discussing platform engineering, AI, and developer experience. Feel free to connect with me on LinkedIn or X. I'm always open to sharing insights and learning from your experiences.

AI Platform
Infrastructure
Engineering Leadership
Lessons Learned