Mert Özen Further With Every Line

Blog

Mert Özen's blog posts on software development, backend, frontend, and DevOps.

Series
16 posts found #ollama
Provider-Independent LLM Code: IChatClient, the OpenAI-Compatible /v1 and DI
Artificial Intelligence PART 17

Provider-Independent LLM Code: IChatClient, the OpenAI-Compatible /v1 and DI

With the IChatClient abstraction we run the same code through Ollama's own API and its OpenAI-compatible /v1 endpoint, switching providers through configuration and environment variables. We wire it into an ASP.NET Core minimal API with DI, keep API keys in user secrets and environment variables, build the same idea in TypeScript with the openai package, and look at the limits of the abstraction.

6 Nov 2026 10 min 9
LLM Cost, Latency and Model Choice: From Tokens to the Bill
Artificial Intelligence PART 16

LLM Cost, Latency and Model Choice: From Tokens to the Bill

We turn token counts into cost per request and per month, and split latency into load, input processing and output generation. We compare gemma3:4b and 12b with real tokens/s measurements, see what Q4_K_M means by looking at tensor types, cache responses with Microsoft.Extensions.AI, and discuss the choice between local and cloud.

6 Nov 2026 12 min 8
LLM Hallucination and Reliability: Cite, Verify, Measure
Artificial Intelligence PART 15

LLM Hallucination and Reliability: Cite, Verify, Measure

Asked for the author of a novel that doesn't exist, gemma3:4b confidently invented a name and a year. We look at why hallucinations happen, force the answer to cite sources with structured output, verify those sources in code and compare three approaches with numbers using a ten-question golden set.

6 Nov 2026 17 min 7
LLMs and RAG: Answering with Data the Model Has Never Seen
Artificial Intelligence PART 14

LLMs and RAG: Answering with Data the Model Has Never Seen

Asked about the bookstore's return window, gemma3:4b confidently said 30 days; the right answer is 21. We split the policies into chunks, index them with nomic-embed-text, put the closest chunks into the prompt and get the model to say it doesn't know what isn't in the context. A minimal in-memory RAG in C# and its limits.

6 Nov 2026 11 min 6
Embeddings and Similarity for LLMs: Searching Text by Meaning
Artificial Intelligence PART 13

Embeddings and Similarity for LLMs: Searching Text by Meaning

What is an embedding and how do you compute cosine similarity? We produce 768-dimensional vectors with nomic-embed-text, write cosine similarity by hand in C# and TypeScript, build a small in-memory semantic search and compare it with keyword search. The negation trap and the limits with Turkish queries, with real scores.

6 Nov 2026 13 min 7
LLM Tool Calling (1): The Model Doesn't Call Functions, It Asks for Calls
Artificial Intelligence PART 11

LLM Tool Calling (1): The Model Doesn't Call Functions, It Asks for Calls

With tool calling the model runs no functions; it produces a call request and running it is up to your code. We send a raw tools request to Ollama's /api/chat endpoint with qwen3:4b, send the result back with the tool role and build the loop in TypeScript and in package-free C#.

6 Nov 2026 12 min 7
Structured Output with LLMs: JSON Mode, JSON Schema and GetResponseAsync<T>
Artificial Intelligence PART 10

Structured Output with LLMs: JSON Mode, JSON Schema and GetResponseAsync<T>

We see why parsing free text with a regex breaks, why JSON mode is not enough and how a JSON schema pins the format. We use Zod in TypeScript and GetResponseAsync<T> in C#, catch an answer that matches the schema but is wrong, and build two layers of validation.

6 Nov 2026 11 min 7
Writing Prompts for LLMs (2): Step-by-Step Thinking and Reasoning Models
Artificial Intelligence PART 09

Writing Prompts for LLMs (2): Step-by-Step Thinking and Reasoning Models

Does saying think step by step guarantee the right answer? We ask gemma3:4b a tricky order calculation in three ways, separate the thinking from the answer with qwen3:4b's think parameter, use ReasoningOptions in C# and measure what thinking costs in tokens and time.

6 Nov 2026 11 min 8
Writing Prompts for LLMs (1): Clear Instructions, Delimiters and Few-shot
Artificial Intelligence PART 08

Writing Prompts for LLMs (1): Clear Instructions, Delimiters and Few-shot

A prompt is a specification: context, task, input, format and constraints. We compare a bad and a good prompt on the same review with token counts, separate instructions from data with delimiters, and see with real gemma3:4b output how few-shot examples fix a classifier and how they mislead it.

6 Nov 2026 10 min 6
Streaming LLM Responses: NDJSON, IAsyncEnumerable and Time to First Token
Artificial Intelligence PART 07

Streaming LLM Responses: NDJSON, IAsyncEnumerable and Time to First Token

Streaming does not make the answer faster, it makes the wait shorter. We look at Ollama's NDJSON and OpenAI-compatible SSE streams with curl, read the answer with GetStreamingResponseAsync in C# and an async iterator in TypeScript, measure the time to first token, and cancel the stream in two SDKs to see how they differ.

6 Nov 2026 11 min 6
Sampling in LLMs: Temperature, Top-p, Top-k and Seed
Artificial Intelligence PART 06

Sampling in LLMs: Temperature, Top-p, Top-k and Seed

Why does the same question get different answers? We look at the model's candidate tokens with logprobs, calculate how temperature, top-k and top-p reshape that distribution, and see the promise and the limits of a seed, num_predict and stop sequences with real output from gemma3:4b.

6 Nov 2026 12 min 5
LLM Message Roles and the System Prompt: Giving the Bookstore Assistant an Identity
Artificial Intelligence PART 05

LLM Message Roles and the System Prompt: Giving the Bookstore Assistant an Identity

What are the system, user and assistant roles for, and how does Gemma 3's chat template carry them to the model? We write a system prompt for the Bookstore assistant, look at the parts of a good system prompt, and use real output to see how a forged assistant message from the client fools the model and how far separating user text from instructions helps as a first step against prompt injection.

6 Nov 2026 10 min 5
Blog Map