Skip to content

Split View: AI 스타트업 & 제품 개발 가이드: LLM API부터 스케일링, 비즈니스 모델까지

|

AI 스타트업 & 제품 개발 가이드: LLM API부터 스케일링, 비즈니스 모델까지

1. AI 제품 발굴: Problem-Solution Fit

AI가 실제로 필요한 문제를 찾아라

AI 스타트업의 가장 흔한 실수는 "AI를 쓰고 싶어서" 제품을 만드는 것입니다. 진짜 질문은 "이 문제를 AI 없이 해결할 수 없는가?" 입니다.

AI가 적합한 사용 케이스:

  • 비정형 데이터 처리 (텍스트, 이미지, 음성)
  • 패턴 인식이 필요한 반복 작업
  • 개인화된 응답이 대규모로 필요한 경우
  • 전문가 지식을 확장해야 할 때 (코파일럿 모델)
  • 문서 요약, 분류, 추출 자동화

AI 과도한 엔지니어링 징후:

  • 규칙 기반 if-else로 충분히 해결 가능한 문제
  • 정확도가 99.9% 이상 요구되는 safety-critical 시스템
  • 데이터가 없는 상태에서 ML 모델 구축 시도
  • LLM으로 단순 CRUD 대체 시도

Problem-Solution Fit 검증 프레임워크

좋은 AI 제품 아이디어의 조건:

  1. Before AI: 사람이 수동으로 하고 있는가? (시장 존재 확인)
  2. Pain Level: 얼마나 자주, 얼마나 고통스러운가?
  3. AI Advantage: AI가 기존 방법보다 10배 빠르거나 저렴한가?
  4. Data Availability: 학습/평가에 필요한 데이터를 얻을 수 있는가?
  5. Error Tolerance: 오류 발생 시 비즈니스에 미치는 영향은?

2. LLM 제품 스택 선택

주요 API 공급자 비교

공급자대표 모델강점약점
OpenAIGPT-4o, o3생태계, 도구 풍부비용, 의존성
AnthropicClaude 3.5 Sonnet긴 컨텍스트, 안전성제한된 멀티모달
GoogleGemini 2.0 Flash속도, 가격일관성
MetaLlama 3.3오픈소스, 무료자체 인프라 필요

오픈소스 자체 호스팅

Ollama (로컬 개발/프로토타이핑):

# Ollama 설치 후 모델 실행
ollama pull llama3.3
ollama run llama3.3

vLLM (프로덕션 자체 호스팅):

pip install vllm

python -m vllm.entrypoints.openai.api_server \
  --model meta-llama/Llama-3.3-70B-Instruct \
  --tensor-parallel-size 4 \
  --gpu-memory-utilization 0.9

모델 선택 결정 트리

예산이 제한적인가?
├── Yes오픈소스 (Llama, Mistral) 자체 호스팅
│         또는 Gemini Flash (저비용 API)
└── No  → 품질 요구사항 높은가?
          ├── YesClaude 3.5 Sonnet / GPT-4o
          └── NoGPT-4o mini / Claude Haiku

3. MVP 개발: 빠른 프로토타이핑

Streamlit으로 LLM 앱 프로토타입

import streamlit as st
from openai import OpenAI

client = OpenAI()

st.title("AI 문서 요약기 MVP")

uploaded_file = st.file_uploader("문서를 업로드하세요", type=["txt", "pdf"])
tone = st.selectbox("요약 톤", ["비즈니스", "캐주얼", "기술적"])

if uploaded_file and st.button("요약 시작"):
    text = uploaded_file.read().decode("utf-8")

    with st.spinner("AI가 요약 중..."):
        response = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[
                {
                    "role": "system",
                    "content": f"당신은 전문 문서 요약가입니다. {tone} 톤으로 요약해주세요."
                },
                {
                    "role": "user",
                    "content": f"다음 문서를 3-5문장으로 요약해주세요:\n\n{text[:4000]}"
                }
            ],
            max_tokens=500
        )

    summary = response.choices[0].message.content
    st.success("요약 완료!")
    st.write(summary)

    st.download_button(
        label="요약 다운로드",
        data=summary,
        file_name="summary.txt"
    )

LangChain으로 RAG 파이프라인 구축

from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA

# 문서 분할
splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200
)
chunks = splitter.split_documents(documents)

# 벡터 스토어 생성
vectorstore = Chroma.from_documents(
    chunks,
    OpenAIEmbeddings()
)

# RAG 체인 구성
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectorstore.as_retriever(search_kwargs={"k": 4}),
    return_source_documents=True
)

result = qa_chain.invoke({"query": "제품의 환불 정책은?"})
print(result["result"])

4. 평가와 이터레이션

LLM 출력 평가 방법론

LLM-as-a-Judge 패턴:

from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate

judge_llm = ChatOpenAI(model="gpt-4o", temperature=0)

EVAL_PROMPT = ChatPromptTemplate.from_template("""
당신은 AI 응답 품질 평가자입니다.

질문: {question}
AI 응답: {response}
기준 답변: {reference}

다음 기준으로 1-5점 평가하세요:
- 정확성 (Accuracy): 사실적으로 정확한가?
- 완전성 (Completeness): 질문에 충분히 답했는가?
- 명확성 (Clarity): 이해하기 쉬운가?

JSON 형식으로 응답: {{"accuracy": 점수, "completeness": 점수, "clarity": 점수, "reasoning": "설명"}}
""")

def evaluate_response(question, response, reference):
    chain = EVAL_PROMPT | judge_llm
    result = chain.invoke({
        "question": question,
        "response": response,
        "reference": reference
    })
    return result.content

A/B 테스트 프레임워크

import random
from dataclasses import dataclass
from typing import Dict, List
import json

@dataclass
class PromptVariant:
    name: str
    system_prompt: str
    wins: int = 0
    total: int = 0

    @property
    def win_rate(self):
        return self.wins / self.total if self.total > 0 else 0

class PromptABTest:
    def __init__(self, variants: List[PromptVariant]):
        self.variants = {v.name: v for v in variants}

    def select_variant(self) -> PromptVariant:
        # 엡실론-그리디: 10% 탐색, 90% 활용
        if random.random() < 0.1:
            return random.choice(list(self.variants.values()))
        return max(self.variants.values(), key=lambda v: v.win_rate)

    def record_feedback(self, variant_name: str, positive: bool):
        v = self.variants[variant_name]
        v.total += 1
        if positive:
            v.wins += 1

    def report(self) -> Dict:
        return {
            name: {"win_rate": f"{v.win_rate:.1%}", "total": v.total}
            for name, v in self.variants.items()
        }

# 사용 예시
ab_test = PromptABTest([
    PromptVariant("formal", "당신은 전문적이고 격식 있는 AI 어시스턴트입니다."),
    PromptVariant("casual", "안녕하세요! 친근하고 쉽게 설명하는 AI입니다."),
])

사용자 피드백 수집 API

from fastapi import FastAPI
from pydantic import BaseModel
from datetime import datetime
import json

app = FastAPI()

class FeedbackRequest(BaseModel):
    session_id: str
    message_id: str
    rating: int  # 1-5
    comment: str = ""
    prompt_variant: str = "default"

feedback_store = []

@app.post("/feedback")
async def collect_feedback(feedback: FeedbackRequest):
    entry = {
        "timestamp": datetime.utcnow().isoformat(),
        **feedback.dict()
    }
    feedback_store.append(entry)

    # 실제 환경에서는 DB 저장
    with open("feedback_log.jsonl", "a") as f:
        f.write(json.dumps(entry) + "\n")

    return {"status": "recorded", "message_id": feedback.message_id}

@app.get("/feedback/stats")
async def get_stats():
    if not feedback_store:
        return {"avg_rating": 0, "total": 0}

    avg = sum(f["rating"] for f in feedback_store) / len(feedback_store)
    return {
        "avg_rating": round(avg, 2),
        "total": len(feedback_store),
        "positive_rate": f"{sum(1 for f in feedback_store if f['rating'] >= 4) / len(feedback_store):.1%}"
    }

5. 비용과 확장: 토큰 비용 최적화

LLM API 비용 계산기

from dataclasses import dataclass
from typing import Dict

@dataclass
class ModelPricing:
    input_per_1m: float   # USD per 1M input tokens
    output_per_1m: float  # USD per 1M output tokens
    cache_write_per_1m: float = 0.0
    cache_read_per_1m: float = 0.0

PRICING: Dict[str, ModelPricing] = {
    "gpt-4o": ModelPricing(2.50, 10.00),
    "gpt-4o-mini": ModelPricing(0.15, 0.60),
    "claude-3-5-sonnet": ModelPricing(3.00, 15.00, 3.75, 0.30),
    "claude-3-haiku": ModelPricing(0.25, 1.25, 0.30, 0.03),
    "gemini-2.0-flash": ModelPricing(0.075, 0.30),
}

def calculate_monthly_cost(
    model: str,
    daily_requests: int,
    avg_input_tokens: int,
    avg_output_tokens: int,
    cache_hit_rate: float = 0.0
) -> dict:
    p = PRICING[model]
    monthly_requests = daily_requests * 30

    # 캐시 히트를 고려한 실제 입력 토큰
    cached_tokens = avg_input_tokens * cache_hit_rate
    fresh_tokens = avg_input_tokens * (1 - cache_hit_rate)

    input_cost = (fresh_tokens * monthly_requests / 1_000_000) * p.input_per_1m
    cache_read_cost = (cached_tokens * monthly_requests / 1_000_000) * p.cache_read_per_1m
    output_cost = (avg_output_tokens * monthly_requests / 1_000_000) * p.output_per_1m

    total = input_cost + cache_read_cost + output_cost

    return {
        "model": model,
        "monthly_requests": monthly_requests,
        "total_usd": round(total, 2),
        "cost_per_request_usd": round(total / monthly_requests, 6),
        "breakdown": {
            "input": round(input_cost, 2),
            "cache_read": round(cache_read_cost, 2),
            "output": round(output_cost, 2)
        }
    }

# 예시: 하루 10,000 요청
result = calculate_monthly_cost(
    model="claude-3-5-sonnet",
    daily_requests=10_000,
    avg_input_tokens=2000,
    avg_output_tokens=500,
    cache_hit_rate=0.7  # 70% 캐시 히트율
)
print(f"월 예상 비용: ${result['total_usd']}")

프롬프트 캐싱 구현 (Anthropic)

import anthropic

client = anthropic.Anthropic()

# 시스템 프롬프트를 캐시에 저장
response = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    system=[
        {
            "type": "text",
            "text": "당신은 전문 법률 AI 어시스턴트입니다.",
        },
        {
            "type": "text",
            "text": open("legal_knowledge_base.txt").read(),  # 대용량 컨텍스트
            "cache_control": {"type": "ephemeral"}  # 캐시 마킹
        }
    ],
    messages=[
        {"role": "user", "content": "계약서 해지 조건을 설명해주세요."}
    ]
)

# cache_read_input_tokens로 캐시 효율 확인
usage = response.usage
print(f"캐시 읽기 토큰: {usage.cache_read_input_tokens}")
print(f"캐시 쓰기 토큰: {usage.cache_creation_input_tokens}")

자체 호스팅 결정 기준

조건API 사용자체 호스팅
월 비용5만 달러 미만5만 달러 초과
데이터 민감도공개/일반 데이터PII, 기업 기밀
레이턴시 요구1-3초 허용100ms 이하 필요
팀 ML 역량없음MLOps 팀 보유
커스터마이징프롬프트 수준파인튜닝 필요

6. AI 스타트업 성공 사례 분석

Cursor: 코드 에디터 AI 혁신

비즈니스 모델:

  • Hobby: 무료 (제한된 사용)
  • Pro: 월 20달러 (무제한 Claude/GPT-4o)
  • Business: 월 40달러/좌석 (팀 기능, SSO)

핵심 차별화 전략:

  1. 코드베이스 인덱싱: 전체 프로젝트를 벡터 DB에 인덱싱하여 @codebase 컨텍스트 제공
  2. Shadow Workspace: AI가 백그라운드에서 코드 변경 예측 및 사전 계산
  3. 멀티 파일 편집: 한 번의 요청으로 여러 파일 동시 수정 (Composer 기능)
  4. 모델 선택 자유: Claude, GPT-4o, Gemini 중 사용자가 선택

GitHub Copilot과 달리 Cursor는 IDE 자체를 재설계하여 AI-first 경험을 제공합니다.

Perplexity AI: AI 검색 엔진

비즈니스 모델:

  • Free: 기본 검색 무제한
  • Pro: 월 20달러 (GPT-4o, Claude 접근, 파일 업로드)
  • Enterprise: 커스텀 가격

핵심 기술:

  • 실시간 웹 크롤링 + LLM 답변 생성
  • 출처 인용으로 할루시네이션 신뢰도 관리
  • Follow-up 질문으로 대화형 검색 경험

수익화 인사이트: 광고 없이 구독으로만 연간 1억 달러 ARR 달성 (2024년 기준).

Cognition (Devin): AI 소프트웨어 엔지니어

비즈니스 모델: Enterprise SaaS

  • 월 구독 + 사용량 기반 과금
  • 초기 가격: 월 500달러

핵심 기술: 장기 작업 에이전트 루프

  • 코드 실행 환경 (샌드박스)
  • 장기 기억 및 계획 수립
  • 도구 사용 (터미널, 브라우저, IDE)

Character.ai: AI 소셜 플랫폼

비즈니스 모델:

  • Free: 기본 캐릭터 대화
  • c.ai+: 월 9.99달러 (빠른 응답, 고급 캐릭터)

특이점: 구글에서 25억 달러에 라이선스 계약 체결 (2024년)


7. 규제와 리스크 관리

EU AI Act 핵심 내용

2025년 8월 시행된 EU AI Act는 AI 시스템을 위험도에 따라 분류합니다.

고위험(High-Risk) AI 분류 조건:

  • 의료 기기, 자율주행 차량 관련
  • 채용, 교육 평가 시스템
  • 신용 평가, 대출 심사
  • 법 집행, 국경 통제
  • 사법 행정, 민주주의 프로세스

고위험 AI 의무사항:

  • 적합성 평가 (Conformity Assessment)
  • 기술 문서화 및 로그 유지
  • 인간 감독 메커니즘 구현
  • 편향성 테스트 및 보고
  • CE 마크 취득 필요

할루시네이션 관리 전략

from openai import OpenAI

client = OpenAI()

def grounded_response(query: str, context: str) -> dict:
    """RAG 기반 근거 있는 응답 생성"""

    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {
                "role": "system",
                "content": """반드시 제공된 컨텍스트에만 근거하여 답하세요.
                컨텍스트에 없는 정보는 '제공된 정보에 없습니다'라고 명확히 말하세요.
                확실하지 않으면 '확인이 필요합니다'라고 답하세요."""
            },
            {
                "role": "user",
                "content": f"컨텍스트:\n{context}\n\n질문: {query}"
            }
        ],
        temperature=0,  # 결정론적 응답
        logprobs=True   # 신뢰도 확인용
    )

    message = response.choices[0]
    # logprob으로 불확실성 추정
    avg_logprob = sum(
        t.logprob for t in message.logprobs.content
    ) / len(message.logprobs.content) if message.logprobs else 0

    return {
        "answer": message.message.content,
        "confidence": round(2.718 ** avg_logprob, 3),  # e^logprob = prob
        "needs_review": avg_logprob < -1.5  # 낮은 신뢰도 플래그
    }

법적 책임과 AI 보험

AI 제품 출시 전 체크리스트:

  • 이용약관에 AI 오류 면책 조항 포함
  • 의료/법률/금융 조언 면책 고지
  • 데이터 처리 동의서 (GDPR/개인정보보호법)
  • AI 생성 콘텐츠 저작권 정책
  • 사이버 보안 보험 (AI 특화 조항)
  • 모델 편향성 감사 기록 유지

퀴즈: AI 스타트업 & 제품 개발

Q1. LLM 제품에서 프롬프트 캐싱이 API 비용을 절감하는 원리는?

정답: 동일한 프롬프트 접두사(시스템 프롬프트, 문서 컨텍스트 등)를 서버 측 KV 캐시에 저장하여, 동일 접두사가 포함된 후속 요청에서 해당 토큰을 재처리하지 않고 캐시에서 읽어오는 방식입니다.

설명: Anthropic의 경우 캐시 읽기(cache_read)는 일반 입력 토큰 대비 90% 저렴합니다. 예를 들어 Claude 3.5 Sonnet에서 일반 입력은 1M 토큰당 3달러이지만, 캐시 읽기는 0.30달러입니다. 시스템 프롬프트가 크거나 동일한 문서를 반복 참조하는 제품(법률 AI, 문서 Q&A 등)에서 효과가 극대화됩니다. 캐시 쓰기(cache_creation)는 약 25% 추가 비용이 발생하지만, 캐시 히트율이 높으면 전체 비용이 크게 감소합니다.

Q2. RAG vs Fine-tuning: 어떤 상황에서 각각을 선택해야 하는가?

정답: RAG는 동적/최신 정보가 필요하거나 출처 인용이 중요한 경우에 선택하고, Fine-tuning은 특정 스타일/형식이 일관되게 필요하거나 도메인 전용 언어/지식이 깊이 내재화되어야 할 때 선택합니다.

설명:

  • RAG를 선택할 때: 기업 내부 문서 검색, 뉴스/최신 정보 Q&A, 출처 인용이 필요한 법률·의료 시스템, 데이터가 자주 변경되는 경우
  • Fine-tuning을 선택할 때: 특정 브랜드 목소리/톤 구현, 코드 생성에서 특정 프레임워크 스타일 강제, 짧은 프롬프트로 복잡한 태스크 수행, 레이턴시 최소화 (시스템 프롬프트 없이도 동작)
  • 실무 팁: 대부분의 경우 RAG로 시작하고, 스타일/형식 문제가 지속되면 Fine-tuning을 추가하는 RAG + Fine-tuning 하이브리드를 고려하세요.
Q3. AI 제품 평가에서 LLM-as-a-Judge 방법의 장단점은?

정답: 장점은 빠르고 저렴한 대규모 자동 평가와 미묘한 품질 판단 가능, 단점은 평가 모델 자체의 편향과 자기 강화(self-preferring) 문제입니다.

설명:

  • 장점: 사람 평가 대비 100배 이상 빠르고 저렴, 일관된 루브릭 적용, 스케일아웃 가능, 단순 키워드 매칭보다 의미론적 판단 우수
  • 단점: GPT-4로 평가 시 GPT-4 생성 답변을 선호하는 편향, 프롬프트 민감성(평가 프롬프트 변경 시 결과 달라짐), 길이 편향(긴 답변을 더 좋다고 판단하는 경향), 사실 검증 불가
  • 완화 방법: 여러 LLM 판사 앙상블 사용, 순위 비교(pairwise) 방식 활용, 일부 사람 평가와 교차 검증 필수
Q4. EU AI Act에서 고위험 AI 시스템으로 분류되는 조건은?

정답: Annex III에 열거된 8개 영역(의료기기, 자율주행, 채용/인사, 교육평가, 신용평가, 법집행, 이민/국경, 사법행정)에서 사용되거나, 사람의 안전이나 기본권에 중대한 영향을 미치는 AI 시스템이 해당됩니다.

설명: EU AI Act는 2024년 발효, 2025-2026년 단계적 적용입니다. 고위험 AI는 적합성 평가, CE 마킹, 기술 문서 유지, 로그 보존(최소 6개월), 인간 감독 설계가 의무입니다. 위반 시 최대 전 세계 연매출의 3% 또는 1,500만 유로 중 높은 금액의 과징금이 부과됩니다. 반면 단순 스팸 필터, 추천 시스템(일부 제외), 게임 AI 등은 저위험으로 분류됩니다.

Q5. Cursor가 GitHub Copilot과 다른 핵심 차별화 전략은?

정답: Cursor는 전체 코드베이스를 벡터 임베딩으로 인덱싱하여 프로젝트 전체 컨텍스트를 AI에 제공하는 반면, GitHub Copilot은 현재 열린 파일과 인접 파일만 컨텍스트로 사용합니다.

설명:

  • Cursor의 코드베이스 인덱싱: 프로젝트 내 모든 파일을 임베딩 벡터로 변환 후 로컬 벡터 DB 저장, @codebase 명령으로 프로젝트 전체에서 관련 코드 검색
  • 멀티 파일 편집(Composer): 하나의 AI 요청으로 수십 개 파일 동시 수정 — Copilot은 불가
  • Shadow Workspace: 사용자가 타이핑하는 동안 AI가 백그라운드에서 예측 편집 사전 계산
  • 모델 유연성: Claude Sonnet, GPT-4o, Gemini 중 태스크에 맞게 선택 — Copilot은 자체 모델만 사용
  • 비즈니스 임팩트: 이 전략으로 2024년 ARR 1억 달러 돌파, GitHub Copilot 대비 개인 개발자 만족도 우위

마치며

AI 스타트업 성공의 핵심은 기술이 아니라 올바른 문제를 올바른 방식으로 AI로 해결하는 것입니다.

실전 로드맵:

  1. Problem-Solution Fit 먼저 검증 (AI 없이도 사람들이 돈 쓰는가?)
  2. 가장 저렴한 모델로 MVP 구축 (GPT-4o mini, Claude Haiku)
  3. 사용자 피드백 루프와 LLM 평가 체계 구축
  4. 비용이 문제가 될 때 최적화 시작 (캐싱, 배치, 작은 모델 파인튜닝)
  5. 규제 요구사항 조기 파악 및 컴플라이언스 설계

Cursor, Perplexity, Cognition의 공통점은 모두 기존 도구가 해결 못한 고통스러운 문제에서 시작했다는 것입니다. AI는 수단이고, 가치 창출이 목표입니다.

AI Startup & Product Development Guide: From LLM APIs to Scaling and Business Models

1. AI Product Discovery: Problem-Solution Fit

Find Problems That Genuinely Need AI

The most common mistake in AI startups is building a product because you want to use AI. The real question is: "Can this problem NOT be solved without AI?"

Use cases where AI is a good fit:

  • Processing unstructured data (text, images, audio)
  • Repetitive tasks that require pattern recognition at scale
  • Personalized responses needed at massive scale
  • Extending expert knowledge (the copilot model)
  • Automating document summarization, classification, and extraction

Signs of AI over-engineering:

  • Problems solvable with simple if-else rules
  • Safety-critical systems requiring accuracy above 99.9%
  • Attempting ML with no existing data
  • Replacing a simple CRUD operation with an LLM call

Problem-Solution Fit Validation Framework

A good AI product idea satisfies all of these:

  1. Before AI: Is someone doing this manually today? (validates market)
  2. Pain Level: How frequent and how painful is the problem?
  3. AI Advantage: Is AI 10x faster or cheaper than the current approach?
  4. Data Availability: Can you obtain data for training and evaluation?
  5. Error Tolerance: What is the business impact when the AI is wrong?

2. Choosing Your LLM Product Stack

Major API Provider Comparison

ProviderModelStrengthsWeaknesses
OpenAIGPT-4o, o3Ecosystem, toolingCost, lock-in
AnthropicClaude 3.5 SonnetLong context, safetyMultimodal limits
GoogleGemini 2.0 FlashSpeed, priceConsistency
MetaLlama 3.3Open source, freeOwn infra required

Open-Source Self-Hosting

Ollama (local development and prototyping):

# After installing Ollama, pull and run a model
ollama pull llama3.3
ollama run llama3.3

vLLM (production self-hosting):

pip install vllm

python -m vllm.entrypoints.openai.api_server \
  --model meta-llama/Llama-3.3-70B-Instruct \
  --tensor-parallel-size 4 \
  --gpu-memory-utilization 0.9

Model Selection Decision Tree

Is budget constrained?
├── YesOpen source (Llama, Mistral) self-hosted
OR Gemini Flash (low-cost API)
└── NoAre quality requirements high?
          ├── YesClaude 3.5 Sonnet / GPT-4o
          └── NoGPT-4o mini / Claude Haiku

3. MVP Development: Rapid Prototyping

LLM App Prototype with Streamlit

import streamlit as st
from openai import OpenAI

client = OpenAI()

st.title("AI Document Summarizer MVP")

uploaded_file = st.file_uploader("Upload a document", type=["txt", "pdf"])
tone = st.selectbox("Summary tone", ["Business", "Casual", "Technical"])

if uploaded_file and st.button("Summarize"):
    text = uploaded_file.read().decode("utf-8")

    with st.spinner("AI is summarizing..."):
        response = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[
                {
                    "role": "system",
                    "content": f"You are a professional document summarizer. Use a {tone} tone."
                },
                {
                    "role": "user",
                    "content": f"Summarize the following document in 3-5 sentences:\n\n{text[:4000]}"
                }
            ],
            max_tokens=500
        )

    summary = response.choices[0].message.content
    st.success("Summary complete!")
    st.write(summary)

    st.download_button(
        label="Download summary",
        data=summary,
        file_name="summary.txt"
    )

Building a RAG Pipeline with LangChain

from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA

# Split documents
splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200
)
chunks = splitter.split_documents(documents)

# Create vector store
vectorstore = Chroma.from_documents(
    chunks,
    OpenAIEmbeddings()
)

# Build RAG chain
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectorstore.as_retriever(search_kwargs={"k": 4}),
    return_source_documents=True
)

result = qa_chain.invoke({"query": "What is the refund policy?"})
print(result["result"])

4. Evaluation and Iteration

LLM Output Evaluation Methods

LLM-as-a-Judge Pattern:

from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate

judge_llm = ChatOpenAI(model="gpt-4o", temperature=0)

EVAL_PROMPT = ChatPromptTemplate.from_template("""
You are an AI response quality evaluator.

Question: {question}
AI Response: {response}
Reference Answer: {reference}

Score each criterion from 1 to 5:
- Accuracy: Is the response factually correct?
- Completeness: Does it fully address the question?
- Clarity: Is it easy to understand?

Respond in JSON: {{"accuracy": score, "completeness": score, "clarity": score, "reasoning": "explanation"}}
""")

def evaluate_response(question, response, reference):
    chain = EVAL_PROMPT | judge_llm
    result = chain.invoke({
        "question": question,
        "response": response,
        "reference": reference
    })
    return result.content

A/B Test Framework for Prompts

import random
from dataclasses import dataclass
from typing import Dict, List

@dataclass
class PromptVariant:
    name: str
    system_prompt: str
    wins: int = 0
    total: int = 0

    @property
    def win_rate(self):
        return self.wins / self.total if self.total > 0 else 0

class PromptABTest:
    def __init__(self, variants: List[PromptVariant]):
        self.variants = {v.name: v for v in variants}

    def select_variant(self) -> PromptVariant:
        # Epsilon-greedy: 10% exploration, 90% exploitation
        if random.random() < 0.1:
            return random.choice(list(self.variants.values()))
        return max(self.variants.values(), key=lambda v: v.win_rate)

    def record_feedback(self, variant_name: str, positive: bool):
        v = self.variants[variant_name]
        v.total += 1
        if positive:
            v.wins += 1

    def report(self) -> Dict:
        return {
            name: {"win_rate": f"{v.win_rate:.1%}", "total": v.total}
            for name, v in self.variants.items()
        }

# Usage
ab_test = PromptABTest([
    PromptVariant("formal", "You are a professional and formal AI assistant."),
    PromptVariant("casual", "Hey! I'm a friendly AI that explains things simply."),
])

User Feedback Collection API

from fastapi import FastAPI
from pydantic import BaseModel
from datetime import datetime
import json

app = FastAPI()

class FeedbackRequest(BaseModel):
    session_id: str
    message_id: str
    rating: int  # 1-5
    comment: str = ""
    prompt_variant: str = "default"

feedback_store = []

@app.post("/feedback")
async def collect_feedback(feedback: FeedbackRequest):
    entry = {
        "timestamp": datetime.utcnow().isoformat(),
        **feedback.dict()
    }
    feedback_store.append(entry)

    with open("feedback_log.jsonl", "a") as f:
        f.write(json.dumps(entry) + "\n")

    return {"status": "recorded", "message_id": feedback.message_id}

@app.get("/feedback/stats")
async def get_stats():
    if not feedback_store:
        return {"avg_rating": 0, "total": 0}

    avg = sum(f["rating"] for f in feedback_store) / len(feedback_store)
    return {
        "avg_rating": round(avg, 2),
        "total": len(feedback_store),
        "positive_rate": f"{sum(1 for f in feedback_store if f['rating'] >= 4) / len(feedback_store):.1%}"
    }

5. Cost and Scale: Token Cost Optimization

LLM API Cost Calculator

from dataclasses import dataclass
from typing import Dict

@dataclass
class ModelPricing:
    input_per_1m: float   # USD per 1M input tokens
    output_per_1m: float  # USD per 1M output tokens
    cache_write_per_1m: float = 0.0
    cache_read_per_1m: float = 0.0

PRICING: Dict[str, ModelPricing] = {
    "gpt-4o": ModelPricing(2.50, 10.00),
    "gpt-4o-mini": ModelPricing(0.15, 0.60),
    "claude-3-5-sonnet": ModelPricing(3.00, 15.00, 3.75, 0.30),
    "claude-3-haiku": ModelPricing(0.25, 1.25, 0.30, 0.03),
    "gemini-2.0-flash": ModelPricing(0.075, 0.30),
}

def calculate_monthly_cost(
    model: str,
    daily_requests: int,
    avg_input_tokens: int,
    avg_output_tokens: int,
    cache_hit_rate: float = 0.0
) -> dict:
    p = PRICING[model]
    monthly_requests = daily_requests * 30

    cached_tokens = avg_input_tokens * cache_hit_rate
    fresh_tokens = avg_input_tokens * (1 - cache_hit_rate)

    input_cost = (fresh_tokens * monthly_requests / 1_000_000) * p.input_per_1m
    cache_read_cost = (cached_tokens * monthly_requests / 1_000_000) * p.cache_read_per_1m
    output_cost = (avg_output_tokens * monthly_requests / 1_000_000) * p.output_per_1m

    total = input_cost + cache_read_cost + output_cost

    return {
        "model": model,
        "monthly_requests": monthly_requests,
        "total_usd": round(total, 2),
        "cost_per_request_usd": round(total / monthly_requests, 6),
        "breakdown": {
            "input": round(input_cost, 2),
            "cache_read": round(cache_read_cost, 2),
            "output": round(output_cost, 2)
        }
    }

# Example: 10,000 requests per day
result = calculate_monthly_cost(
    model="claude-3-5-sonnet",
    daily_requests=10_000,
    avg_input_tokens=2000,
    avg_output_tokens=500,
    cache_hit_rate=0.7  # 70% cache hit rate
)
print(f"Estimated monthly cost: ${result['total_usd']}")

Implementing Prompt Caching (Anthropic)

import anthropic

client = anthropic.Anthropic()

# Cache the system prompt and large context
response = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    system=[
        {
            "type": "text",
            "text": "You are a professional legal AI assistant.",
        },
        {
            "type": "text",
            "text": open("legal_knowledge_base.txt").read(),  # large context
            "cache_control": {"type": "ephemeral"}  # mark for caching
        }
    ],
    messages=[
        {"role": "user", "content": "Explain the conditions for contract termination."}
    ]
)

usage = response.usage
print(f"Cache read tokens: {usage.cache_read_input_tokens}")
print(f"Cache write tokens: {usage.cache_creation_input_tokens}")

Self-Hosting Decision Criteria

ConditionUse APISelf-Host
Monthly costUnder $50KOver $50K
Data sensitivityPublic/general dataPII, trade secrets
Latency requirement1-3 seconds OKUnder 100ms needed
Team ML capabilityNoneMLOps team available
Customization neededPrompt-levelFine-tuning required

6. AI Startup Case Studies

Cursor: Reinventing the Code Editor

Business Model:

  • Hobby: Free (limited usage)
  • Pro: $20/month (unlimited Claude/GPT-4o)
  • Business: $40/seat/month (team features, SSO)

Key Differentiation Strategy:

  1. Codebase Indexing: Entire project is indexed into a vector DB, enabling @codebase context across all files
  2. Shadow Workspace: AI pre-computes predicted edits in the background while the user types
  3. Multi-file Editing: A single AI request can modify dozens of files simultaneously (Composer feature)
  4. Model Flexibility: Users choose between Claude, GPT-4o, and Gemini per task

Unlike GitHub Copilot, Cursor redesigned the IDE itself to deliver an AI-first experience.

Perplexity AI: The AI Search Engine

Business Model:

  • Free: Unlimited basic search
  • Pro: $20/month (GPT-4o, Claude access, file uploads)
  • Enterprise: Custom pricing

Core Technology:

  • Real-time web crawling combined with LLM answer generation
  • Source citations to manage hallucination trust
  • Follow-up questions creating a conversational search experience

Monetization Insight: Reached $100M ARR in 2024 through subscriptions alone, with no advertising.

Cognition (Devin): The AI Software Engineer

Business Model: Enterprise SaaS

  • Monthly subscription plus usage-based billing
  • Initial price: $500/month

Core Technology: Long-horizon agentic loop

  • Sandboxed code execution environment
  • Long-term memory and planning
  • Tool use (terminal, browser, IDE)

Character.ai: The AI Social Platform

Business Model:

  • Free: Basic character conversations
  • c.ai+: $9.99/month (faster responses, premium characters)

Notable: Signed a $2.5B licensing deal with Google in 2024.


7. Regulation and Risk Management

EU AI Act: Key Points

The EU AI Act, which entered into force in August 2025, classifies AI systems by risk level.

High-Risk AI Classification Conditions:

  • Medical devices and autonomous vehicles
  • Recruitment and educational assessment systems
  • Credit scoring and loan underwriting
  • Law enforcement and border control
  • Judicial administration and democratic processes

High-Risk AI Obligations:

  • Conformity Assessment
  • Technical documentation and audit logs
  • Human oversight mechanisms
  • Bias testing and reporting
  • CE marking required

Hallucination Management Strategy

from openai import OpenAI

client = OpenAI()

def grounded_response(query: str, context: str) -> dict:
    """Generate a grounded response using RAG context."""

    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {
                "role": "system",
                "content": """Answer only based on the provided context.
                If information is not in the context, say 'Not found in provided information.'
                If you are uncertain, say 'Verification required.'"""
            },
            {
                "role": "user",
                "content": f"Context:\n{context}\n\nQuestion: {query}"
            }
        ],
        temperature=0,   # deterministic
        logprobs=True    # for confidence scoring
    )

    message = response.choices[0]
    avg_logprob = sum(
        t.logprob for t in message.logprobs.content
    ) / len(message.logprobs.content) if message.logprobs else 0

    return {
        "answer": message.message.content,
        "confidence": round(2.718 ** avg_logprob, 3),
        "needs_review": avg_logprob < -1.5
    }

Before launching an AI product:

  • Include AI error disclaimer in Terms of Service
  • Add disclaimers against medical/legal/financial advice
  • Data processing consent forms (GDPR/privacy law)
  • AI-generated content copyright policy
  • Cyber insurance with AI-specific clauses
  • Maintain bias audit records for the model

Quiz: AI Startup & Product Development

Q1. How does prompt caching reduce API costs in LLM products?

Answer: Prompt caching stores the KV (key-value) representation of a fixed prompt prefix — such as a system prompt or large document context — on the server. Subsequent requests that share the same prefix retrieve the cached computation instead of reprocessing those tokens.

Explanation: With Anthropic, cache reads are 90% cheaper than standard input tokens. For Claude 3.5 Sonnet, standard input costs 3per1Mtokenswhilecachereadscostonly3 per 1M tokens while cache reads cost only 0.30. Products with large system prompts or those repeatedly referencing the same documents (legal AI, document Q&A) see the greatest benefit. Cache writes add about 25% overhead, but high cache hit rates reduce overall costs dramatically.

Q2. RAG vs Fine-tuning: When should you choose each?

Answer: Choose RAG when dynamic or recent information is needed or when source citation matters. Choose fine-tuning when a consistent style or format is required or when domain-specific knowledge must be deeply internalized.

Explanation:

  • When to choose RAG: Enterprise internal document search, news/current events Q&A, legal and medical systems requiring source citation, frequently changing data
  • When to choose fine-tuning: Specific brand voice or tone, enforcing a particular framework style in code generation, complex tasks with minimal prompting, minimizing latency (operates without a large system prompt)
  • Practical tip: Start with RAG. If style or format problems persist, consider a RAG + fine-tuning hybrid.
Q3. What are the pros and cons of LLM-as-a-Judge in AI product evaluation?

Answer: Pros include fast, cheap, large-scale automated evaluation with nuanced quality judgments. Cons include biases in the judge model and self-preferring behavior.

Explanation:

  • Pros: 100x faster and cheaper than human evaluation, consistent rubric application, scales easily, better semantic judgment than keyword matching
  • Cons: When using GPT-4 as judge, it tends to prefer GPT-4-generated answers; sensitivity to prompt wording; length bias (longer answers rated higher); cannot verify factual accuracy
  • Mitigation: Use an ensemble of multiple LLM judges, prefer pairwise comparison over absolute scoring, always cross-validate with human evaluations
Q4. What conditions classify an AI system as High-Risk under the EU AI Act?

Answer: Systems listed in Annex III across eight domains (medical devices, autonomous vehicles, employment/HR, education, credit scoring, law enforcement, immigration/border control, justice administration) or systems with significant impact on human safety or fundamental rights.

Explanation: The EU AI Act entered into force in 2024 with phased application through 2025-2026. High-risk AI must undergo a conformity assessment, obtain CE marking, maintain technical documentation, retain logs for at least six months, and implement human oversight by design. Penalties for non-compliance reach up to 3% of global annual turnover or 15 million euros, whichever is higher. Low-risk classifications include basic spam filters, some recommendation systems, and game AI.

Q5. How does Cursor's differentiation strategy differ from GitHub Copilot?

Answer: Cursor indexes the entire codebase as vector embeddings, giving the AI full project context, while GitHub Copilot uses only the currently open file and nearby files as context.

Explanation:

  • Codebase Indexing: All project files are converted to embedding vectors and stored in a local vector DB; the @codebase command retrieves relevant code across the entire project
  • Multi-file Editing (Composer): A single AI request can modify dozens of files — not possible in Copilot
  • Shadow Workspace: While the user types, AI pre-computes predicted edits in the background
  • Model Flexibility: Users choose Claude Sonnet, GPT-4o, or Gemini based on the task — Copilot uses only its own model
  • Business Impact: This strategy helped Cursor surpass $100M ARR in 2024 and achieve higher individual developer satisfaction than GitHub Copilot

Conclusion

The key to AI startup success is not the technology — it is solving the right problem in the right way with AI.

A practical roadmap:

  1. Validate Problem-Solution Fit first (do people already spend money on this without AI?)
  2. Build MVP with the cheapest model (GPT-4o mini, Claude Haiku)
  3. Establish a user feedback loop and LLM evaluation framework
  4. Begin optimization when cost becomes a constraint (caching, batching, fine-tuning smaller models)
  5. Identify regulatory requirements early and design for compliance

Cursor, Perplexity, and Cognition all share one thing: they started with a genuinely painful problem that existing tools could not solve. AI is the means; value creation is the goal.