E-learning: AI, LLM, MCP and Tensors

Practical concepts with runnable Python examples on this page.

Examples are predefined and executed on the server to keep execution safe and predictable.

Requirements for full ML examples

pip install -r requirements.txt
# Includes: torch, tensorflow-cpu
Academy tracks
SQL & Databases — Complete Course Python Data Analysis — Professional Course Python Fundamentals Machine Learning with Python Django Web Development

AI (Artificial Intelligence)

AI is the field that enables machines to perform tasks that usually require human intelligence, such as classification and prediction.

# Simple threshold classifier
loans = [1200, 3400, 900, 5100, 2200]
threshold = 2500
labels = ["high" if x >= threshold else "low" for x in loans]
print("Loans:", loans)
print("Risk labels:", labels)
Step by step
  1. Define a rule and a threshold.
  2. Compute one label per observation.
  3. Compare output labels with your expected risk classes.
  4. This is a deterministic classifier baseline before neural models.
Math behind
y = 1 if x >= t else 0
Expected output: Risk labels: ['low', 'high', 'low', 'high', 'low']

LLM (Large Language Model)

An LLM is a language model trained on large text corpora to generate, summarize, and transform content.

# Tiny toy language model with bigram counts
text = "ai helps teams make better decisions with data"
words = text.split()
bigrams = {}
for i in range(len(words) - 1):
    pair = (words[i], words[i + 1])
    bigrams[pair] = bigrams.get(pair, 0) + 1
print("Bigrams:")
for pair, count in sorted(bigrams.items()):
    print(f"{pair}: {count}")
Step by step
  1. Split text into tokens.
  2. Count each adjacent token pair.
  3. Use counts to estimate next-word likelihood.
  4. This is the conceptual bridge to autoregressive LLM decoding.
Math behind
P(w_t|w_{t-1}) ~= count(w_{t-1}, w_t) / count(w_{t-1})
Expected output: Bigrams with token pairs and counts, e.g. ('ai', 'helps'): 1

MCP (Model Context Protocol)

MCP standardizes how tools provide context to models, making integrations safer and more predictable.

# MCP-like context payload (tool + request + constraints)
context = {
    "user_intent": "summarize monthly sales",
    "tool": "sql_query",
    "constraints": ["read_only", "tenant_isolation"],
}
print("Context keys:", list(context.keys()))
print("Tool selected:", context["tool"])
Step by step
  1. Collect user intent.
  2. Attach tool and constraints metadata.
  3. Pass context to model and execute deterministic tool call.
  4. Observe that routing quality depends on context quality.
Math behind
Decision = argmax score(tool_i | context)
Expected output: Context keys: ['user_intent', 'tool', 'constraints'] Tool selected: sql_query

Tensors

A tensor is an n-dimensional structure used to represent data in AI and deep learning (vectors, matrices, and volumes).

# Tensor basics using nested lists (2D matrix)
matrix = [
    [1, 2, 3],
    [4, 5, 6],
]
rows = len(matrix)
cols = len(matrix[0])
col_sums = [sum(matrix[r][c] for r in range(rows)) for c in range(cols)]
print("Shape:", (rows, cols))
print("Column sums:", col_sums)
Step by step
  1. Represent data as matrix X (rows, cols).
  2. Compute summaries per axis.
  3. Reuse same structure for transformations.
  4. The same concept scales to 3D/4D tensors for batches and channels.
Math behind
X in R^(m x n), s_j = sum_i X_ij
Expected output: Shape: (2, 3) Column sums: [5, 7, 9]

PyTorch (minimal neural net)

Simple example with linear layers to inspect input and output tensors.

# Minimal PyTorch forward pass
try:
    import torch
except Exception as e:
    print("PyTorch not available:", e)
else:
    torch.manual_seed(0)
    x = torch.randn(4, 3)
    model = torch.nn.Sequential(
        torch.nn.Linear(3, 4),
        torch.nn.ReLU(),
        torch.nn.Linear(4, 1),
    )
    y = model(x)
    print("Input shape:", tuple(x.shape))
    print("Output shape:", tuple(y.shape))
    print("First output:", float(y[0, 0]))
Step by step
  1. Create input tensor x with shape [batch, features].
  2. Apply linear layer, non-linearity, then output layer.
  3. Inspect output shape and first prediction value.
Math behind
y = W2 * ReLU(W1 * x + b1) + b2
Expected output: Input shape: (4, 3) Output shape: (4, 1) First output: numeric value

TensorFlow (minimal Keras)

Simple Sequential model example to understand batch inference.

# Minimal TensorFlow/Keras forward pass
try:
    import tensorflow as tf
except Exception as e:
    print("TensorFlow not available:", e)
else:
    tf.random.set_seed(0)
    x = tf.random.normal((4, 3))
    model = tf.keras.Sequential([
        tf.keras.layers.Dense(4, activation="relu"),
        tf.keras.layers.Dense(1),
    ])
    y = model(x)
    print("Input shape:", x.shape)
    print("Output shape:", y.shape)
    print("First output:", float(y[0, 0]))
Step by step
  1. Build a Sequential model with Dense layers.
  2. Feed batch tensor and run forward inference.
  3. Read tensor shape and sample output.
Math behind
Dense(x) = activation(x * W + b)
Expected output: Input shape: (4, 3) Output shape: (4, 1) First output: numeric value

Tiny teaching LLM

Very small language model (bigrams) to teach tokens, logits, and probabilities.

# Tiny LLM teaching model (char-level bigram logits)
try:
    import torch
except Exception as e:
    print("PyTorch not available:", e)
else:
    text = "hello llm"
    vocab = sorted(set(text))
    stoi = {c: i for i, c in enumerate(vocab)}
    itos = {i: c for c, i in stoi.items()}

    ids = torch.tensor([stoi[c] for c in text], dtype=torch.long)
    model = torch.nn.Embedding(len(vocab), len(vocab))
    logits = model(ids)
    probs = torch.softmax(logits[-1], dim=-1)

    top_p, top_i = torch.topk(probs, k=min(3, len(vocab)))
    print("Vocab:", vocab)
    print("Last input token:", repr(itos[int(ids[-1])]))
    print("Top next-token probabilities:")
    for p, i in zip(top_p, top_i):
        print(itos[int(i)], round(float(p), 4))
Step by step
  1. Build a character vocabulary and token IDs.
  2. Use embedding table as learnable logits producer.
  3. Apply softmax and read top-k next-token probabilities.
Math behind
p(next) = softmax(logits_last_token)
Expected output: Vocab: [...] Last input token: ... Top next-token probabilities: three token-probability lines

RAG (Retrieval-Augmented Generation)

RAG combines retrieval + generation to produce more grounded and auditable answers.

# Tiny RAG demo (keyword overlap retrieval + prompt assembly)
docs = [
    "LGPD requires lawful basis, consent management, and data subject rights.",
    "Dedicated AI servers provide tenant isolation and private GPU workloads.",
    "RAG improves answer grounding by injecting retrieved context into prompts.",
]
query = "How to run AI servers with LGPD compliance?"

q_terms = set(w.strip('.,!?').lower() for w in query.split())
scored = []
for d in docs:
    d_terms = set(w.strip('.,!?').lower() for w in d.split())
    score = len(q_terms & d_terms)
    scored.append((score, d))

scored.sort(reverse=True, key=lambda x: x[0])
top_doc = scored[0][1]
prompt = f"Question: {query}\nContext: {top_doc}\nAnswer:"

print("Query:", query)
print("Top document:", top_doc)
print("Prompt preview:", prompt[:120] + "...")
Step by step
  1. 1) Index a small knowledge base (docs).
  2. 2) Retrieve the best context for the query.
  3. 3) Build the final prompt with question + retrieved context.
Math behind
argmax_d sim(query, doc_d) -> prompt = [query + top_doc]
Expected output: Query: ... Top document: ... Prompt preview: ...

Dedicated AI services

Dedicated AI servers: private GPU, tenant isolation, monitoring, SLA, and MLOps.

LGPD by design: data minimization, retention policy, audit trail, consent management, and right to erasure.

We can deploy your dedicated AI server with LGPD compliance.

Contact