<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: NovAsia Estate</title>
    <description>The latest articles on DEV Community by NovAsia Estate (@novasia).</description>
    <link>https://dev.to/novasia</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4191369%2Fdee05e2a-9aef-4d35-a7a1-e6532a284884.webp</url>
      <title>DEV Community: NovAsia Estate</title>
      <link>https://dev.to/novasia</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/novasia"/>
    <language>en</language>
    <item>
      <title>Why parsing real estate contracts with LLMs is ten times harder than tutorials claim</title>
      <dc:creator>NovAsia Estate</dc:creator>
      <pubDate>Sun, 18 Oct 2026 04:52:15 +0000</pubDate>
      <link>https://dev.to/novasiaestate/why-parsing-real-estate-contracts-with-llms-is-ten-times-harder-than-tutorials-claim-4pak</link>
      <guid>https://dev.to/novasiaestate/why-parsing-real-estate-contracts-with-llms-is-ten-times-harder-than-tutorials-claim-4pak</guid>
      <description>&lt;p&gt;When we started building the data pipeline for &lt;a href="https://novasia.estate/en/" rel="noopener noreferrer"&gt;NovAsia&lt;/a&gt; (a property catalog and market tool for Southeast Asia), the plan looked embarrassingly simple on paper:&lt;/p&gt;

&lt;p&gt;Grab property PDFs and developer contracts (SPAs).&lt;/p&gt;

&lt;p&gt;Run them through a modern vision LLM.&lt;/p&gt;

&lt;p&gt;Dump structured JSON into PostgreSQL.&lt;/p&gt;

&lt;p&gt;Call it a day.&lt;/p&gt;

&lt;p&gt;Two weeks in, the pipeline was completely broken. Here is why standard tutorial advice fell apart in production, and what we had to change to get reliable data out of scanned documents.&lt;/p&gt;

&lt;p&gt;The stuff tutorials don't warn you about&lt;br&gt;
Most LLM document parsing demos use crisp, born-digital PDFs with clean typography. In emerging markets like Cambodia and Thailand, reality looks very different:&lt;/p&gt;

&lt;p&gt;Phone scans: Half the documents are multi-generation scans or photos taken with a phone camera under uneven lighting.&lt;/p&gt;

&lt;p&gt;Dual-language layout: Khmer or Thai text mixed with English, often in adjacent table columns where line baselines don't match.&lt;/p&gt;

&lt;p&gt;Physical stamps: Red rubber stamps, signatures, and notary seals placed directly over critical numbers (payment milestone dates, sinking fund fees, transfer taxes).&lt;/p&gt;

&lt;p&gt;The 40-page prompt trap: If you shove a 35-page PDF into a long-context model and ask for "all fees and payment dates", it will extract 80% correctly and quietly hallucinate the rest with total confidence.&lt;/p&gt;

&lt;p&gt;Three practical changes that fixed it&lt;br&gt;
Instead of trying to find one magic model that does everything, we broke the pipeline down into smaller, boring steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Aggressive image cleanup before text extraction&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before any model sees the page, we run basic OpenCV passes: deskewing, binarization, and contrast normalization. Removing phone-scan shadows did more for extraction accuracy than upgrading to a larger model tier.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Section-level chunking with rigid schema validation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We stopped asking the model to parse whole documents at once. We chunk by specific section (e.g., "Schedule of Payments", "Maintenance Obligations") and enforce strict Pydantic schemas. If a field fails validation or falls outside expected bounds, the pipeline flags it for manual check rather than guessing.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Treating tables and narrative text as separate problems&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Vision models are great at answering qualitative questions ("under what conditions is the deposit refundable?"), but notoriously sloppy with columns in financial tables. We split table extraction into dedicated passes with explicit row-by-row checks.&lt;/p&gt;

&lt;p&gt;The takeaway&lt;br&gt;
If you're building with LLMs on messy, physical-world paperwork, raw context window size won't save you. Most of the reliability comes from image hygiene and strict schema boundaries.&lt;/p&gt;

&lt;p&gt;Happy to trade notes if anyone else here is wrestling with noisy scans and table extraction.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>webscraping</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
