<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Sajid Nazir</title>
    <description>Writing about LLMs, data engineering and software development.</description>
    <link>https://sajid.se</link>
    <atom:link href="https://sajid.se/feed.xml" rel="self" type="application/rss+xml"/>
    <language>en-GB</language>
    <lastBuildDate>Wed, 21 Oct 2026 16:11:57 GMT</lastBuildDate>
    
    <item>
      <title><![CDATA[DeepEval's JevEval Trades Generative Judging for Bounded Decisions]]></title>
      <description><![CDATA[DeepEval added a mode where Jev, not a generative LLM, decides the score. What that buys you, what the real benchmark numbers show and where it runs out of road.]]></description>
      <link>https://sajid.se/blog/deepeval-jeveval-bounded-judging</link>
      <guid isPermaLink="true">https://sajid.se/blog/deepeval-jeveval-bounded-judging</guid>
      <pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[llm-evaluation]]></category>
      <category><![CDATA[deepeval]]></category>
      <category><![CDATA[machine-learning]]></category>
      <category><![CDATA[software-testing]]></category>
    </item>
  
    <item>
      <title><![CDATA[jevgrep Uses Jev to Find Files Instead of Grepping for Them]]></title>
      <description><![CDATA[A CLI tool that asks a decision model which files are relevant instead of pattern-matching for them. The benchmark numbers come with a real caveat worth reading before you trust them.]]></description>
      <link>https://sajid.se/blog/jevgrep-find-code-by-asking</link>
      <guid isPermaLink="true">https://sajid.se/blog/jevgrep-find-code-by-asking</guid>
      <pubDate>Mon, 12 Oct 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[agents]]></category>
      <category><![CDATA[developer-tools]]></category>
      <category><![CDATA[inference]]></category>
      <category><![CDATA[cli]]></category>
      <category><![CDATA[production]]></category>
    </item>
  
    <item>
      <title><![CDATA[OpenAI's Decisions API Puts a Typed Endpoint on gpt-6-luna]]></title>
      <description><![CDATA[OpenAI's Decisions API returns predicates, choices and scores instead of free text. What's confirmed about it, how it differs from Jev under the hood and what I'd do about it in a production system.]]></description>
      <link>https://sajid.se/blog/openai-decisions-api</link>
      <guid isPermaLink="true">https://sajid.se/blog/openai-decisions-api</guid>
      <pubDate>Sat, 10 Oct 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[llm]]></category>
      <category><![CDATA[agents]]></category>
      <category><![CDATA[inference]]></category>
      <category><![CDATA[architecture]]></category>
      <category><![CDATA[production]]></category>
    </item>
  
    <item>
      <title><![CDATA[Jev Only Picks From the Answers You Give It]]></title>
      <description><![CDATA[TypeSafe AI's Jev returns typed answers with calibrated probabilities to a fixed set of questions and generates no tokens. How it works and where I'd put it in a production system.]]></description>
      <link>https://sajid.se/blog/jev-decision-model</link>
      <guid isPermaLink="true">https://sajid.se/blog/jev-decision-model</guid>
      <pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[llm]]></category>
      <category><![CDATA[agents]]></category>
      <category><![CDATA[inference]]></category>
      <category><![CDATA[architecture]]></category>
      <category><![CDATA[production]]></category>
    </item>
  
    <item>
      <title><![CDATA[Modeling Data Lineage in Neo4j: Make the Transformation a Node]]></title>
      <description><![CDATA[Graph modeling choices that decide whether a Neo4j lineage graph can answer "where did this value come from" or only looks like it can.]]></description>
      <link>https://sajid.se/blog/modeling-data-lineage-neo4j</link>
      <guid isPermaLink="true">https://sajid.se/blog/modeling-data-lineage-neo4j</guid>
      <pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[neo4j]]></category>
      <category><![CDATA[data-lineage]]></category>
      <category><![CDATA[graph-databases]]></category>
      <category><![CDATA[cypher]]></category>
      <category><![CDATA[architecture]]></category>
    </item>
  
    <item>
      <title><![CDATA[What PostGIS Is Actually Doing When Your Spatial Query Is Slow]]></title>
      <description><![CDATA[A field guide to the column type, index and distance mistakes that catch almost everyone new to PostGIS.]]></description>
      <link>https://sajid.se/blog/postgis-spatial-queries-gotchas</link>
      <guid isPermaLink="true">https://sajid.se/blog/postgis-spatial-queries-gotchas</guid>
      <pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[postgis]]></category>
      <category><![CDATA[postgresql]]></category>
      <category><![CDATA[geospatial]]></category>
      <category><![CDATA[databases]]></category>
      <category><![CDATA[performance]]></category>
    </item>
  
    <item>
      <title><![CDATA[Ground Truth and LLM Judges Measure Different Things]]></title>
      <description><![CDATA[Why my thesis evaluation pipeline scored every run with both a deterministic benchmark and an LLM judge. The disagreements between them turned out to be the useful part.]]></description>
      <link>https://sajid.se/blog/deterministic-benchmark-vs-llm-judge</link>
      <guid isPermaLink="true">https://sajid.se/blog/deterministic-benchmark-vs-llm-judge</guid>
      <pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[evaluation]]></category>
      <category><![CDATA[llm]]></category>
      <category><![CDATA[rag]]></category>
      <category><![CDATA[architecture]]></category>
      <category><![CDATA[production]]></category>
    </item>
  
    <item>
      <title><![CDATA[Using the LLM as a Query Planner]]></title>
      <description><![CDATA[In my thesis work the model only routes questions to the right data partition and pushes predicates down to PostGIS and Neo4j. Inference token cost dropped 3x and routing-index quality ended up deciding answer accuracy.]]></description>
      <link>https://sajid.se/blog/llm-as-query-planner</link>
      <guid isPermaLink="true">https://sajid.se/blog/llm-as-query-planner</guid>
      <pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[llm]]></category>
      <category><![CDATA[rag]]></category>
      <category><![CDATA[architecture]]></category>
      <category><![CDATA[query-planning]]></category>
      <category><![CDATA[production]]></category>
    </item>
  
    <item>
      <title><![CDATA[Semantic Search over 1M+ arXiv Papers With No Backend]]></title>
      <description><![CDATA[Papyrus runs the embedding model, the vector search and the reranker entirely in your browser. Here's how I made a million-document index fit on consumer hardware.]]></description>
      <link>https://sajid.se/blog/papyrus-in-browser-semantic-search</link>
      <guid isPermaLink="true">https://sajid.se/blog/papyrus-in-browser-semantic-search</guid>
      <pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[rag]]></category>
      <category><![CDATA[vector-databases]]></category>
      <category><![CDATA[semantic-search]]></category>
      <category><![CDATA[webgpu]]></category>
      <category><![CDATA[client-side]]></category>
    </item>
  
    <item>
      <title><![CDATA[Data Skew and Small Files: Why Your Spark Job Waits on One Task]]></title>
      <description><![CDATA[A field guide to two PySpark performance problems that hide behind healthy-looking averages. Covers what Databricks now fixes for you before you reach for salting.]]></description>
      <link>https://sajid.se/blog/pyspark-data-skew-small-files</link>
      <guid isPermaLink="true">https://sajid.se/blog/pyspark-data-skew-small-files</guid>
      <pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[pyspark]]></category>
      <category><![CDATA[databricks]]></category>
      <category><![CDATA[data-engineering]]></category>
      <category><![CDATA[performance]]></category>
      <category><![CDATA[spark]]></category>
    </item>
  
    <item>
      <title><![CDATA[Memvid Put a Vector Database in an MP4, Then Dropped the Video]]></title>
      <description><![CDATA[Memvid started as a joke about hiding AI memory inside MP4 video files. The serious version that replaced it drops the video entirely. It's worth explaining why.]]></description>
      <link>https://sajid.se/blog/memvid-video-vector-rag</link>
      <guid isPermaLink="true">https://sajid.se/blog/memvid-video-vector-rag</guid>
      <pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[rag]]></category>
      <category><![CDATA[ai-infrastructure]]></category>
      <category><![CDATA[vector-databases]]></category>
      <category><![CDATA[open-source]]></category>
      <category><![CDATA[llm]]></category>
    </item>
  
    <item>
      <title><![CDATA[What Actually Happens When a RAG Pipeline Fails]]></title>
      <description><![CDATA[A field guide to the failure modes that don't show up in tutorials and how to systematically debug them.]]></description>
      <link>https://sajid.se/blog/rag-pipeline-failures</link>
      <guid isPermaLink="true">https://sajid.se/blog/rag-pipeline-failures</guid>
      <pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[rag]]></category>
      <category><![CDATA[debugging]]></category>
      <category><![CDATA[llm]]></category>
      <category><![CDATA[information-retrieval]]></category>
      <category><![CDATA[production]]></category>
    </item>
  
    <item>
      <title><![CDATA[Evaluating Embedding Strategies for Structured Knowledge Extraction]]></title>
      <description><![CDATA[MTEB scores won't help you here. How I choose embeddings when the data has structure.]]></description>
      <link>https://sajid.se/blog/embedding-strategies-structured-knowledge</link>
      <guid isPermaLink="true">https://sajid.se/blog/embedding-strategies-structured-knowledge</guid>
      <pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[embeddings]]></category>
      <category><![CDATA[knowledge-extraction]]></category>
      <category><![CDATA[rag]]></category>
      <category><![CDATA[evaluation]]></category>
      <category><![CDATA[nlp]]></category>
    </item>
  
    <item>
      <title><![CDATA[RAG vs Fine-Tuning: When to Use Which]]></title>
      <description><![CDATA[Everyone asks this question. Most of the answers online are wrong or at least incomplete.]]></description>
      <link>https://sajid.se/blog/rag-vs-fine-tuning</link>
      <guid isPermaLink="true">https://sajid.se/blog/rag-vs-fine-tuning</guid>
      <pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[rag]]></category>
      <category><![CDATA[fine-tuning]]></category>
      <category><![CDATA[llm]]></category>
      <category><![CDATA[machine-learning]]></category>
      <category><![CDATA[architecture]]></category>
    </item>
  
    <item>
      <title><![CDATA[Building a Knowledge Graph from Unstructured Text]]></title>
      <description><![CDATA[How to go from messy documents to structured, queryable knowledge without a PhD in NLP.]]></description>
      <link>https://sajid.se/blog/knowledge-graph-from-unstructured-text</link>
      <guid isPermaLink="true">https://sajid.se/blog/knowledge-graph-from-unstructured-text</guid>
      <pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[knowledge-graphs]]></category>
      <category><![CDATA[nlp]]></category>
      <category><![CDATA[information-extraction]]></category>
      <category><![CDATA[rag]]></category>
      <category><![CDATA[neo4j]]></category>
    </item>
  
  </channel>
</rss>