Add why-ours.php — plain-language explainer page
Explains why Do Better Norge tools give different answers than ChatGPT: RAG, BM25+vector search, reranker, knowledge graph, fine-tuned model. Includes EN/NO translations, 5 optimised WebP/JPEG images, new kdoc-compare and kdoc-graph CSS components. Link added from index.php trust section. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@@ -7979,3 +7979,246 @@ body.lt-landing {
|
|||||||
font-size: 0.78em;
|
font-size: 0.78em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ── why-ours.php — two-path comparison ─────────────────────────────────── */
|
||||||
|
.kdoc-compare {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
gap: 2rem;
|
||||||
|
margin-top: 2rem;
|
||||||
|
}
|
||||||
|
.kdoc-compare__col {
|
||||||
|
background: var(--panel);
|
||||||
|
border-radius: 12px;
|
||||||
|
padding: 2rem;
|
||||||
|
box-shadow: 0 2px 12px rgba(25,35,52,.06);
|
||||||
|
}
|
||||||
|
.kdoc-compare__col--generic { border-top: 4px solid #c2410c; }
|
||||||
|
.kdoc-compare__col--dbn { border-top: 4px solid var(--dbn-blue, #00205b); }
|
||||||
|
.kdoc-compare__label {
|
||||||
|
font-size: .72rem;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: .1em;
|
||||||
|
font-weight: 700;
|
||||||
|
margin-bottom: 1.25rem;
|
||||||
|
}
|
||||||
|
.kdoc-compare__col--generic .kdoc-compare__label { color: #c2410c; }
|
||||||
|
.kdoc-compare__col--dbn .kdoc-compare__label { color: var(--dbn-blue, #00205b); }
|
||||||
|
.kdoc-compare__flow {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: .5rem;
|
||||||
|
}
|
||||||
|
.kdoc-compare__arrow {
|
||||||
|
text-align: center;
|
||||||
|
color: var(--muted, #667085);
|
||||||
|
font-size: 1.1rem;
|
||||||
|
line-height: 1;
|
||||||
|
padding: .1rem 0;
|
||||||
|
}
|
||||||
|
.kdoc-compare__flow-step {
|
||||||
|
background: var(--bg, #f7f8fb);
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: .75rem 1rem;
|
||||||
|
font-size: .88rem;
|
||||||
|
line-height: 1.55;
|
||||||
|
color: var(--ink, #1b2330);
|
||||||
|
}
|
||||||
|
.kdoc-compare__flow-step small {
|
||||||
|
display: block;
|
||||||
|
margin-top: .25rem;
|
||||||
|
font-size: .78rem;
|
||||||
|
color: var(--muted, #667085);
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
.kdoc-compare__flow-step--final { font-weight: 700; }
|
||||||
|
.kdoc-compare__col--generic .kdoc-compare__flow-step--final {
|
||||||
|
background: #fff0e8;
|
||||||
|
color: #c2410c;
|
||||||
|
}
|
||||||
|
.kdoc-compare__col--dbn .kdoc-compare__flow-step--final {
|
||||||
|
background: var(--soft-teal, #e7f5f2);
|
||||||
|
color: var(--teal-dark, #115e59);
|
||||||
|
}
|
||||||
|
.kdoc-compare__caption {
|
||||||
|
margin-top: 1.5rem;
|
||||||
|
text-align: center;
|
||||||
|
font-size: .92rem;
|
||||||
|
color: var(--muted, #667085);
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
@media (max-width: 700px) {
|
||||||
|
.kdoc-compare { grid-template-columns: 1fr; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Analogy term chip ───────────────────────────────────────────────────── */
|
||||||
|
.kdoc-feature-card__term {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: .75rem;
|
||||||
|
padding: .25rem .65rem;
|
||||||
|
background: var(--soft-teal, #e7f5f2);
|
||||||
|
color: var(--teal-dark, #115e59);
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: .72rem;
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: .03em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Knowledge graph (why-ours) ──────────────────────────────────────────── */
|
||||||
|
.kdoc-graph {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0;
|
||||||
|
margin-top: 2rem;
|
||||||
|
}
|
||||||
|
.kdoc-graph__node {
|
||||||
|
background: var(--panel);
|
||||||
|
border: 1.5px solid var(--line, #d8dde7);
|
||||||
|
border-radius: 10px;
|
||||||
|
padding: .85rem 1.5rem;
|
||||||
|
text-align: center;
|
||||||
|
max-width: 420px;
|
||||||
|
width: 100%;
|
||||||
|
box-shadow: 0 2px 8px rgba(25,35,52,.06);
|
||||||
|
}
|
||||||
|
.kdoc-graph__node--start {
|
||||||
|
background: var(--dbn-blue, #00205b);
|
||||||
|
color: #fff;
|
||||||
|
border-color: var(--dbn-blue, #00205b);
|
||||||
|
}
|
||||||
|
.kdoc-graph__node--end {
|
||||||
|
background: var(--soft-teal, #e7f5f2);
|
||||||
|
border-color: var(--teal, #0f766e);
|
||||||
|
}
|
||||||
|
.kdoc-graph__node-title {
|
||||||
|
font-family: 'Crimson Pro', Georgia, serif;
|
||||||
|
font-size: 1.05rem;
|
||||||
|
font-weight: 600;
|
||||||
|
color: inherit;
|
||||||
|
margin: 0 0 .15rem;
|
||||||
|
}
|
||||||
|
.kdoc-graph__node--start .kdoc-graph__node-title { color: #fff; }
|
||||||
|
.kdoc-graph__node--end .kdoc-graph__node-title { color: var(--teal-dark, #115e59); }
|
||||||
|
.kdoc-graph__node-note {
|
||||||
|
font-size: .75rem;
|
||||||
|
color: var(--muted, #667085);
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.kdoc-graph__node--start .kdoc-graph__node-note { color: rgba(255,255,255,.7); }
|
||||||
|
.kdoc-graph__node--end .kdoc-graph__node-note { color: var(--teal-dark, #115e59); opacity: .8; }
|
||||||
|
.kdoc-graph__connector {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
padding: .35rem 0;
|
||||||
|
color: var(--muted, #667085);
|
||||||
|
font-size: .8rem;
|
||||||
|
gap: .2rem;
|
||||||
|
}
|
||||||
|
.kdoc-graph__connector-line {
|
||||||
|
width: 2px;
|
||||||
|
height: 20px;
|
||||||
|
background: var(--line, #d8dde7);
|
||||||
|
}
|
||||||
|
.kdoc-graph__connector-label {
|
||||||
|
font-size: .68rem;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: .08em;
|
||||||
|
color: var(--muted, #667085);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Image placeholder slots ─────────────────────────────────────────────── */
|
||||||
|
.kdoc-img-slot {
|
||||||
|
position: relative;
|
||||||
|
border-radius: 12px;
|
||||||
|
overflow: hidden;
|
||||||
|
background: var(--dbn-blue, #00205b);
|
||||||
|
min-height: 300px;
|
||||||
|
margin: 2.5rem 0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.kdoc-img-slot picture,
|
||||||
|
.kdoc-img-slot img {
|
||||||
|
position: absolute;
|
||||||
|
inset: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
display: block;
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
.kdoc-img-slot__placeholder {
|
||||||
|
text-align: center;
|
||||||
|
color: rgba(255,255,255,.45);
|
||||||
|
padding: 2.5rem 2rem;
|
||||||
|
max-width: 700px;
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
.kdoc-img-slot__placeholder strong {
|
||||||
|
display: block;
|
||||||
|
font-size: .95rem;
|
||||||
|
color: rgba(255,255,255,.75);
|
||||||
|
margin-bottom: .6rem;
|
||||||
|
font-family: 'Crimson Pro', Georgia, serif;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.kdoc-img-slot__label {
|
||||||
|
font-size: .65rem;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: .1em;
|
||||||
|
color: rgba(255,255,255,.35);
|
||||||
|
margin-bottom: .4rem;
|
||||||
|
}
|
||||||
|
.kdoc-img-slot__prompt {
|
||||||
|
background: rgba(255,255,255,.06);
|
||||||
|
border: 1px solid rgba(255,255,255,.14);
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 1rem 1.25rem;
|
||||||
|
font-size: .78rem;
|
||||||
|
font-family: 'IBM Plex Sans', sans-serif;
|
||||||
|
color: rgba(255,255,255,.65);
|
||||||
|
line-height: 1.65;
|
||||||
|
margin-top: .75rem;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Privacy card (why-ours) ─────────────────────────────────────────────── */
|
||||||
|
.kdoc-privacy-card {
|
||||||
|
background: var(--dbn-blue, #00205b);
|
||||||
|
color: rgba(255,255,255,.9);
|
||||||
|
border-radius: 12px;
|
||||||
|
padding: 2.5rem;
|
||||||
|
margin-top: 1.5rem;
|
||||||
|
}
|
||||||
|
.kdoc-privacy-card h3 {
|
||||||
|
font-family: 'Crimson Pro', Georgia, serif;
|
||||||
|
font-size: 1.5rem;
|
||||||
|
font-weight: 700;
|
||||||
|
color: #fff;
|
||||||
|
margin: 0 0 .75rem;
|
||||||
|
}
|
||||||
|
.kdoc-privacy-card p {
|
||||||
|
font-size: .95rem;
|
||||||
|
line-height: 1.7;
|
||||||
|
color: rgba(255,255,255,.8);
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.kdoc-privacy-card__badges {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: .5rem;
|
||||||
|
margin-top: 1.25rem;
|
||||||
|
}
|
||||||
|
.kdoc-privacy-card__badge {
|
||||||
|
padding: .3rem .8rem;
|
||||||
|
background: rgba(255,255,255,.1);
|
||||||
|
border: 1px solid rgba(255,255,255,.18);
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: .72rem;
|
||||||
|
font-weight: 600;
|
||||||
|
color: rgba(255,255,255,.85);
|
||||||
|
letter-spacing: .03em;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
|
After Width: | Height: | Size: 161 KiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 140 KiB |
|
After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 133 KiB |
|
After Width: | Height: | Size: 79 KiB |
@@ -195,6 +195,9 @@ window.DBN_TOOLS_LANG = <?= json_encode($uiLang, JSON_UNESCAPED_UNICODE) ?>;
|
|||||||
<p><?= htmlspecialchars(dbnToolsT('source_text', $uiLang)) ?></p>
|
<p><?= htmlspecialchars(dbnToolsT('source_text', $uiLang)) ?></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div style="text-align:center;margin-top:2rem">
|
||||||
|
<a href="/why-ours.php" style="display:inline-block;padding:.6rem 1.4rem;border:1.5px solid rgba(0,32,91,.25);border-radius:8px;font-size:.85rem;font-weight:600;color:var(--dbn-blue,#00205b);text-decoration:none;transition:border-color .2s,background .2s" onmouseover="this.style.background='rgba(0,32,91,.05)'" onmouseout="this.style.background=''">Why our tools give different answers than ChatGPT →</a>
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<?php if (!$isAuthed): ?>
|
<?php if (!$isAuthed): ?>
|
||||||
|
|||||||
@@ -0,0 +1,203 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
'en' => [
|
||||||
|
'nav_signin' => 'Sign in',
|
||||||
|
'nav_open' => 'Open the tools →',
|
||||||
|
'hero_kicker' => 'Why Do Better Norge · Plain-language explainer',
|
||||||
|
'hero_title' => 'Why our tools give different answers than ChatGPT',
|
||||||
|
'hero_sub' => 'ChatGPT and Gemini are brilliant general assistants. But when your child welfare case depends on the exact wording of barnevernsloven § 4-4, "generally correct" is not enough.',
|
||||||
|
'stat_passages' => 'legal passages indexed',
|
||||||
|
'stat_tribunal' => 'tribunal decisions',
|
||||||
|
'stat_echr' => 'ECHR judgments vs Norway',
|
||||||
|
'stat_scope' => 'Norwegian law only',
|
||||||
|
'btn_try' => 'Try the tools →',
|
||||||
|
'btn_register' => 'Create free account',
|
||||||
|
|
||||||
|
'problem_eyebrow' => 'The core difference',
|
||||||
|
'problem_title' => 'Memory versus the library.',
|
||||||
|
'problem_sub' => 'General AI answers from memory. Our tools look it up first — every time.',
|
||||||
|
'col_generic_label'=> 'General AI (ChatGPT · Gemini)',
|
||||||
|
'col_dbn_label' => 'Do Better Norge Tools',
|
||||||
|
'col_generic_s1' => 'You ask a question',
|
||||||
|
'col_generic_s2' => 'The AI searches its memory — trained on the whole internet, up to a cutoff date',
|
||||||
|
'col_generic_s3' => 'It generates a plausible-sounding answer',
|
||||||
|
'col_generic_s4' => 'It may cite laws that don\'t exist, are out of date, or apply to a different country',
|
||||||
|
'col_dbn_s1' => 'You ask a question',
|
||||||
|
'col_dbn_s2' => 'The system searches 220,000+ verified Norwegian legal passages (RAG — Retrieval Augmented Generation)',
|
||||||
|
'col_dbn_s3' => 'It finds exact passages by keyword AND by meaning (BM25 + vector search, running in parallel)',
|
||||||
|
'col_dbn_s4' => 'A reranker picks the most relevant results for your specific situation',
|
||||||
|
'col_dbn_s5' => 'A law-trained AI writes your answer — citing the real passages it just found',
|
||||||
|
'problem_caption' => 'The difference is not speed or style. The difference is whether the answer is grounded in Norwegian law or not.',
|
||||||
|
|
||||||
|
'analogy_eyebrow' => 'How it works in plain English',
|
||||||
|
'analogy_title' => 'Three ideas that explain everything.',
|
||||||
|
'a1_icon' => '📚',
|
||||||
|
'a1_title' => 'The Librarian',
|
||||||
|
'a1_body' => 'Imagine asking a question and instead of the AI guessing from memory, a librarian runs to the shelves, pulls 10 books, finds the exact paragraphs — then reads them to you. That is what RAG means. Our tools do this with 220,000 Norwegian legal passages, every single time.',
|
||||||
|
'a1_term' => 'RAG — Retrieval Augmented Generation',
|
||||||
|
'a2_icon' => '🔍',
|
||||||
|
'a2_title' => 'Two ways to find a book',
|
||||||
|
'a2_body' => 'One approach finds exact words — searching for "§ 4-4 barnevernsloven" will locate that exact paragraph. The other finds meaning — if you describe your situation without knowing the law\'s name, it still finds it. We use both at the same time, then combine the results.',
|
||||||
|
'a2_term' => 'BM25 keyword search + semantic vector search',
|
||||||
|
'a3_icon' => '⚖️',
|
||||||
|
'a3_title' => 'The Second Opinion',
|
||||||
|
'a3_body' => 'After finding 30 candidate passages, a second AI reviews them and puts the most relevant ones first — the way a senior lawyer might sort through a pile of case files and pull out the three that actually matter to your situation.',
|
||||||
|
'a3_term' => 'Reranker — relevance scoring pass',
|
||||||
|
|
||||||
|
'graph_eyebrow' => 'The connected law',
|
||||||
|
'graph_title' => 'Norwegian law is a web, not a list.',
|
||||||
|
'graph_sub' => 'ChatGPT doesn\'t know which Norwegian laws connect to which ECHR articles in your specific type of case. Our corpus is built to follow those links.',
|
||||||
|
'graph_caption' => 'Your answer draws on all of these — statute, case law, international convention, guidance — linked and cross-referenced.',
|
||||||
|
|
||||||
|
'graph_n1' => 'Your question',
|
||||||
|
'graph_n2' => 'barnevernsloven § 4-4',
|
||||||
|
'graph_n2_note' => 'emergency care',
|
||||||
|
'graph_n3' => 'barneloven § 30 · § 34',
|
||||||
|
'graph_n3_note' => 'parental rights',
|
||||||
|
'graph_n4' => 'ECHR Article 8',
|
||||||
|
'graph_n4_note' => 'right to family life',
|
||||||
|
'graph_n5' => '23 ECHR judgments vs Norway',
|
||||||
|
'graph_n5_note' => 'Strand Lobben, Johansen, K.O. and V.M. …',
|
||||||
|
'graph_n6' => 'Bufdir + Statsforvalter guidance',
|
||||||
|
'graph_n6_note' => 'administrative practice',
|
||||||
|
'graph_n7' => 'Your answer',
|
||||||
|
'graph_n7_note' => 'grounded in all of the above',
|
||||||
|
|
||||||
|
'compare_eyebrow' => 'Real examples',
|
||||||
|
'compare_title' => 'The same question. Very different answers.',
|
||||||
|
'compare_sub' => 'Here is what happens when you ask a child-welfare question to a general AI versus our tools.',
|
||||||
|
'compare_th_q' => 'Your question',
|
||||||
|
'compare_th_gpt' => 'General AI answers',
|
||||||
|
'compare_th_dbn' => 'Do Better Norge answers',
|
||||||
|
'compare_r1_q' => '"Can Barnevernet take my child without warning?"',
|
||||||
|
'compare_r1_gpt' => 'Generic description of child protective services. May reference Swedish, UK or US procedures. No specific statute. No citation you can verify.',
|
||||||
|
'compare_r1_dbn' => 'Cites barnevernsloven § 4-2 (duty to investigate), § 4-6 (immediate removal conditions), ECHR Art. 8 proportionality test — with passage numbers from the corpus.',
|
||||||
|
'compare_r2_q' => '"How do I appeal a care order?"',
|
||||||
|
'compare_r2_gpt' => 'Describes a general appeals process. Mentions "the relevant authority" without naming it. Timeline may be wrong for Norway.',
|
||||||
|
'compare_r2_dbn' => 'Cites barnevernsloven § 7-2 (tribunal proceedings), tvisteloven, Statsforvalter complaint deadline — with direct source links.',
|
||||||
|
'compare_r3_q' => '"What does Article 8 mean for my case?"',
|
||||||
|
'compare_r3_gpt' => 'Explains ECHR Article 8 in general terms. No mention of the specific Norway judgments. No connection to barnevernsloven.',
|
||||||
|
'compare_r3_dbn' => 'Cites the 4 ECHR vs Norway judgments most relevant to family reunification, cross-referenced to barnevernsloven and Bufdir guidance — in plain Norwegian and your language.',
|
||||||
|
'compare_caption' => 'These are not hypothetical differences. They are what users encounter every day.',
|
||||||
|
|
||||||
|
'llm_eyebrow' => 'Trained for Norway',
|
||||||
|
'llm_title' => 'Not a general AI. A Norwegian law AI.',
|
||||||
|
'llm_body_html' => 'Our AI assistant was not just given access to legal documents. It was <strong>trained on Norwegian child welfare law specifically</strong> — barnevernsloven, barneloven, ECHR Article 8 case law — so it understands Norwegian legal reasoning, not just Norwegian words. A general LLM guesses at legal meaning. Ours was built for it.',
|
||||||
|
'llm_badge' => 'Fine-tuned model',
|
||||||
|
'llm_s1' => 'fine-tune method',
|
||||||
|
'llm_s2' => 'child welfare corpus',
|
||||||
|
'llm_s3' => 'ECHR Art. 8 case law',
|
||||||
|
'llm_s4' => 'Norwegian bokmål',
|
||||||
|
|
||||||
|
'privacy_eyebrow' => 'Your privacy',
|
||||||
|
'privacy_title' => 'Your case details never leave our servers.',
|
||||||
|
'privacy_body' => 'Unlike ChatGPT or Gemini, our tools run on infrastructure we control. Your case details are never sent to OpenAI, Google, or any third-party AI company. Your conversations are never used to train any model. What you share with us stays with us.',
|
||||||
|
|
||||||
|
'cta_title' => 'Ready to try it?',
|
||||||
|
'cta_sub' => 'Free to start. No legal training required.',
|
||||||
|
'btn_open' => 'Open the tools →',
|
||||||
|
'btn_signin_cta' => 'Sign in →',
|
||||||
|
],
|
||||||
|
|
||||||
|
'no' => [
|
||||||
|
'nav_signin' => 'Logg inn',
|
||||||
|
'nav_open' => 'Åpne verktøyene →',
|
||||||
|
'hero_kicker' => 'Hvorfor Do Better Norge · Forklaring på vanlig norsk',
|
||||||
|
'hero_title' => 'Hvorfor verktøyene våre gir andre svar enn ChatGPT',
|
||||||
|
'hero_sub' => 'ChatGPT og Gemini er glimrende generelle assistenter. Men når barnevernssaken din avhenger av den eksakte ordlyden i barnevernsloven § 4-4, er "generelt riktig" ikke godt nok.',
|
||||||
|
'stat_passages' => 'juridiske tekstutdrag indeksert',
|
||||||
|
'stat_tribunal' => 'nemndavgjørelser',
|
||||||
|
'stat_echr' => 'EMD-dommer mot Norge',
|
||||||
|
'stat_scope' => 'norsk rett',
|
||||||
|
'btn_try' => 'Prøv verktøyene →',
|
||||||
|
'btn_register' => 'Opprett gratis konto',
|
||||||
|
|
||||||
|
'problem_eyebrow' => 'Den grunnleggende forskjellen',
|
||||||
|
'problem_title' => 'Hukommelse mot biblioteket.',
|
||||||
|
'problem_sub' => 'Generell KI svarer fra hukommelsen. Verktøyene våre slår det opp – hver eneste gang.',
|
||||||
|
'col_generic_label'=> 'Generell KI (ChatGPT · Gemini)',
|
||||||
|
'col_dbn_label' => 'Do Better Norge-verktøy',
|
||||||
|
'col_generic_s1' => 'Du stiller et spørsmål',
|
||||||
|
'col_generic_s2' => 'KI-en søker i hukommelsen sin – trent på hele internett, frem til en bestemt dato',
|
||||||
|
'col_generic_s3' => 'Den genererer et svar som høres troverdig ut',
|
||||||
|
'col_generic_s4' => 'Den kan sitere lover som ikke finnes, er utdaterte eller gjelder i et annet land',
|
||||||
|
'col_dbn_s1' => 'Du stiller et spørsmål',
|
||||||
|
'col_dbn_s2' => 'Systemet søker gjennom 220 000+ verifiserte norske juridiske tekstutdrag (RAG – Retrieval Augmented Generation)',
|
||||||
|
'col_dbn_s3' => 'Det finner eksakte utdrag via nøkkelord OG via mening (BM25 + vektorsøk, parallelt)',
|
||||||
|
'col_dbn_s4' => 'En «reranker» velger de mest relevante resultatene for akkurat din situasjon',
|
||||||
|
'col_dbn_s5' => 'En juridisk trent KI skriver svaret ditt – og siterer de faktiske tekstutdragene den nettopp fant',
|
||||||
|
'problem_caption' => 'Forskjellen handler ikke om hastighet eller stil. Forskjellen er om svaret er forankret i norsk rett eller ikke.',
|
||||||
|
|
||||||
|
'analogy_eyebrow' => 'Slik fungerer det – forklart enkelt',
|
||||||
|
'analogy_title' => 'Tre ideer som forklarer alt.',
|
||||||
|
'a1_icon' => '📚',
|
||||||
|
'a1_title' => 'Bibliotekaren',
|
||||||
|
'a1_body' => 'Se for deg at du stiller et spørsmål, og i stedet for at KI-en gjetter fra hukommelsen, løper en bibliotekar til hyllene, henter 10 bøker, finner de eksakte avsnittene – og leser dem opp for deg. Det er det RAG betyr. Verktøyene våre gjør dette med 220 000 norske juridiske tekstutdrag, hver eneste gang.',
|
||||||
|
'a1_term' => 'RAG – Retrieval Augmented Generation',
|
||||||
|
'a2_icon' => '🔍',
|
||||||
|
'a2_title' => 'To måter å finne en bok',
|
||||||
|
'a2_body' => 'Én tilnærming finner eksakte ord – søk på «§ 4-4 barnevernsloven» finner akkurat det avsnittet. Den andre finner mening – hvis du beskriver situasjonen uten å kjenne lovens navn, finner systemet den likevel. Vi bruker begge samtidig og kombinerer resultatene.',
|
||||||
|
'a2_term' => 'BM25-nøkkelordssøk + semantisk vektorsøk',
|
||||||
|
'a3_icon' => '⚖️',
|
||||||
|
'a3_title' => 'Den andre vurderingen',
|
||||||
|
'a3_body' => 'Etter å ha funnet 30 kandidatutdrag, gjennomgår en annen KI dem og setter de mest relevante øverst – slik en erfaren advokat ville sortere gjennom en haug saksmapper og plukke ut de tre som faktisk gjelder din situasjon.',
|
||||||
|
'a3_term' => 'Reranker – relevansvurderingsrunde',
|
||||||
|
|
||||||
|
'graph_eyebrow' => 'Det sammenkoblede lovverket',
|
||||||
|
'graph_title' => 'Norsk lov er et nett, ikke en liste.',
|
||||||
|
'graph_sub' => 'ChatGPT vet ikke hvilke norske lover som er koblet til hvilke EMK-artikler i akkurat din type sak. Vår tekstsamling er bygd for å følge disse koblingene.',
|
||||||
|
'graph_caption' => 'Svaret ditt bygger på alt dette – lov, rettspraksis, internasjonal konvensjon, veiledning – koblet og kryssreferert.',
|
||||||
|
|
||||||
|
'graph_n1' => 'Ditt spørsmål',
|
||||||
|
'graph_n2' => 'barnevernsloven § 4-4',
|
||||||
|
'graph_n2_note' => 'akuttvedtak',
|
||||||
|
'graph_n3' => 'barneloven § 30 · § 34',
|
||||||
|
'graph_n3_note' => 'foreldrerett',
|
||||||
|
'graph_n4' => 'EMK artikkel 8',
|
||||||
|
'graph_n4_note' => 'retten til familieliv',
|
||||||
|
'graph_n5' => '23 EMD-dommer mot Norge',
|
||||||
|
'graph_n5_note' => 'Strand Lobben, Johansen, K.O. og V.M. …',
|
||||||
|
'graph_n6' => 'Bufdir + Statsforvalter-veiledning',
|
||||||
|
'graph_n6_note' => 'forvaltningspraksis',
|
||||||
|
'graph_n7' => 'Svaret ditt',
|
||||||
|
'graph_n7_note' => 'forankret i alt det ovenstående',
|
||||||
|
|
||||||
|
'compare_eyebrow' => 'Virkelige eksempler',
|
||||||
|
'compare_title' => 'Samme spørsmål. Svært forskjellige svar.',
|
||||||
|
'compare_sub' => 'Her er hva som skjer når du stiller et barnevernsspørsmål til generell KI versus verktøyene våre.',
|
||||||
|
'compare_th_q' => 'Spørsmålet ditt',
|
||||||
|
'compare_th_gpt' => 'Generell KI svarer',
|
||||||
|
'compare_th_dbn' => 'Do Better Norge svarer',
|
||||||
|
'compare_r1_q' => '«Kan Barnevernet ta barnet mitt uten varsel?»',
|
||||||
|
'compare_r1_gpt' => 'Generell beskrivelse av barneverntjenester. Kan referere til svenske, britiske eller amerikanske prosedyrer. Ingen spesifikk lovhjemmel. Ingen sitat du kan verifisere.',
|
||||||
|
'compare_r1_dbn' => 'Siterer barnevernsloven § 4-2 (undersøkelsesplikt), § 4-6 (vilkår for akuttvedtak), EMK art. 8 forholdsmessighetstest – med utdragsnummer fra tekstsamlingen.',
|
||||||
|
'compare_r2_q' => '«Hvordan klager jeg på et omsorgsovertakelsesvedtak?»',
|
||||||
|
'compare_r2_gpt' => 'Beskriver en generell klageprosess. Nevner «den aktuelle myndigheten» uten å navngi den. Fristen kan være feil for Norge.',
|
||||||
|
'compare_r2_dbn' => 'Siterer barnevernsloven § 7-2 (nemndbehandling), tvisteloven, klagefrist til Statsforvalteren – med direkte kildelenker.',
|
||||||
|
'compare_r3_q' => '«Hva betyr artikkel 8 for saken min?»',
|
||||||
|
'compare_r3_gpt' => 'Forklarer EMK artikkel 8 i generelle termer. Ingen omtale av de spesifikke Norge-dommene. Ingen kobling til barnevernsloven.',
|
||||||
|
'compare_r3_dbn' => 'Siterer de 4 EMD-dommene mot Norge som er mest relevante for familiegjenforening, kryssreferert med barnevernsloven og Bufdir-veiledning – på vanlig norsk og ditt språk.',
|
||||||
|
'compare_caption' => 'Dette er ikke hypotetiske forskjeller. Det er hva brukere opplever hver dag.',
|
||||||
|
|
||||||
|
'llm_eyebrow' => 'Trent for Norge',
|
||||||
|
'llm_title' => 'Ikke en generell KI. En norsk juridisk KI.',
|
||||||
|
'llm_body_html' => 'KI-assistenten vår fikk ikke bare tilgang til juridiske dokumenter. Den ble <strong>trent spesifikt på norsk barnevernrett</strong> – barnevernsloven, barneloven, EMK artikkel 8-saker – slik at den forstår norsk juridisk resonnement, ikke bare norske ord. En generell KI gjetter på juridisk mening. Vår er bygd for det.',
|
||||||
|
'llm_badge' => 'Finjustert modell',
|
||||||
|
'llm_s1' => 'finjusteringsmetode',
|
||||||
|
'llm_s2' => 'barnevernstekstsamling',
|
||||||
|
'llm_s3' => 'EMK art. 8-saker',
|
||||||
|
'llm_s4' => 'norsk bokmål',
|
||||||
|
|
||||||
|
'privacy_eyebrow' => 'Ditt personvern',
|
||||||
|
'privacy_title' => 'Saksinformasjonen din forlater aldri serverne våre.',
|
||||||
|
'privacy_body' => 'I motsetning til ChatGPT eller Gemini kjører verktøyene våre på infrastruktur vi kontrollerer. Saksdetaljene dine sendes aldri til OpenAI, Google eller noe annet tredjeparts KI-selskap. Samtalene dine brukes aldri til å trene noen modell. Det du deler med oss, forblir hos oss.',
|
||||||
|
|
||||||
|
'cta_title' => 'Klar til å prøve?',
|
||||||
|
'cta_sub' => 'Gratis å starte. Ingen juridisk opplæring nødvendig.',
|
||||||
|
'btn_open' => 'Åpne verktøyene →',
|
||||||
|
'btn_signin_cta' => 'Logg inn →',
|
||||||
|
],
|
||||||
|
|
||||||
|
'uk' => [], // TODO: translate — falls back to 'en'
|
||||||
|
'pl' => [], // TODO: translate — falls back to 'en'
|
||||||
|
];
|
||||||
@@ -0,0 +1,417 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
require_once __DIR__ . '/includes/bootstrap.php';
|
||||||
|
|
||||||
|
$uiLang = dbnToolsCurrentLanguage();
|
||||||
|
$isAuthed = dbnToolsIsAuthenticated();
|
||||||
|
$langPath = '/why-ours.php';
|
||||||
|
$toolsLogin = 'https://dobetternorge.no/tools-login.php?return=' . urlencode('/why-ours.php');
|
||||||
|
$registerUrl = 'https://dobetternorge.no/register.php';
|
||||||
|
$ctaUrl = $isAuthed ? '/index.php' : $toolsLogin;
|
||||||
|
|
||||||
|
$_pt = require __DIR__ . '/translations/why-ours.php';
|
||||||
|
$t = (!empty($_pt[$uiLang])) ? $_pt[$uiLang] : $_pt['en'];
|
||||||
|
|
||||||
|
/* Helper: image slot — serves WebP+JPG <picture> if optimised files exist, else shows placeholder */
|
||||||
|
function imgSlot(string $slot, string $file, string $label, string $caption, string $prompt): string {
|
||||||
|
$base = pathinfo($file, PATHINFO_FILENAME);
|
||||||
|
$webp = __DIR__ . '/assets/images/why-ours/' . $base . '.webp';
|
||||||
|
$jpg = __DIR__ . '/assets/images/why-ours/' . $base . '.jpg';
|
||||||
|
$webpSrc = 'assets/images/why-ours/' . $base . '.webp';
|
||||||
|
$jpgSrc = 'assets/images/why-ours/' . $base . '.jpg';
|
||||||
|
$alt = htmlspecialchars($caption);
|
||||||
|
|
||||||
|
$html = '<div class="kdoc-img-slot">';
|
||||||
|
if (file_exists($webp) && file_exists($jpg)) {
|
||||||
|
$html .= '<picture>';
|
||||||
|
$html .= '<source srcset="' . $webpSrc . '" type="image/webp">';
|
||||||
|
$html .= '<img src="' . $jpgSrc . '" alt="' . $alt . '" loading="lazy" style="width:100%;height:100%;object-fit:cover;display:block">';
|
||||||
|
$html .= '</picture>';
|
||||||
|
} else {
|
||||||
|
$html .= '<div class="kdoc-img-slot__placeholder">';
|
||||||
|
$html .= '<p class="kdoc-img-slot__label">Image slot ' . htmlspecialchars($slot) . ' — place generated image at assets/images/why-ours/' . htmlspecialchars($file) . '</p>';
|
||||||
|
$html .= '<strong>' . htmlspecialchars($label) . '</strong>';
|
||||||
|
$html .= '<div class="kdoc-img-slot__prompt"><strong>AI image prompt:</strong><br>' . htmlspecialchars($prompt) . '</div>';
|
||||||
|
$html .= '</div>';
|
||||||
|
}
|
||||||
|
$html .= '</div>';
|
||||||
|
return $html;
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="<?= htmlspecialchars($uiLang) ?>">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>Why our tools give different answers than ChatGPT · Do Better Norge Tools</title>
|
||||||
|
<meta name="description" content="Plain-language explainer: why RAG, BM25 keyword search, semantic vector search, a reranker, and a fine-tuned Norwegian law model give you fundamentally different — and more reliable — answers than ChatGPT or Gemini.">
|
||||||
|
<meta name="robots" content="index, follow">
|
||||||
|
<link rel="canonical" href="https://tools.dobetternorge.no/why-ours.php">
|
||||||
|
<meta property="og:title" content="Why our tools give different answers than ChatGPT">
|
||||||
|
<meta property="og:description" content="ChatGPT answers from memory. Do Better Norge tools look it up first — 220,000+ verified Norwegian legal passages, every time.">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta name="theme-color" content="#00205B">
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Crimson+Pro:wght@400;600;700&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap">
|
||||||
|
<link rel="stylesheet" href="assets/css/tools.css">
|
||||||
|
</head>
|
||||||
|
<body class="kdoc-page">
|
||||||
|
|
||||||
|
<!-- ── Navigation ─────────────────────────────────────────────────────────── -->
|
||||||
|
<header class="lt-nav">
|
||||||
|
<a href="https://dobetternorge.no" class="lt-nav__brand">
|
||||||
|
<picture>
|
||||||
|
<source srcset="assets/images/logo-header.webp" type="image/webp">
|
||||||
|
<img class="lt-nav__logo" src="assets/images/logo-header.png" alt="Do Better Norge" width="140" height="36" loading="eager">
|
||||||
|
</picture>
|
||||||
|
<span class="lt-nav__badge">Legal Tools</span>
|
||||||
|
</a>
|
||||||
|
<div class="lt-nav__right">
|
||||||
|
<nav class="shell-lang-switcher" aria-label="Language">
|
||||||
|
<?php foreach (dbnToolsSupportedLanguages() as $langCode): ?>
|
||||||
|
<a href="<?= htmlspecialchars($langPath . '?lang=' . $langCode) ?>" class="<?= $langCode === $uiLang ? 'is-active' : '' ?>"><?= htmlspecialchars(dbnToolsLanguageLabel($langCode)) ?></a>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</nav>
|
||||||
|
<?php if ($isAuthed): ?>
|
||||||
|
<a href="/index.php" class="lt-nav__cta lt-nav__cta--enter"><?= htmlspecialchars($t['nav_open']) ?></a>
|
||||||
|
<?php else: ?>
|
||||||
|
<a href="<?= htmlspecialchars($toolsLogin) ?>" class="lt-nav__cta"><?= htmlspecialchars($t['nav_signin']) ?></a>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<!-- ── Hero ───────────────────────────────────────────────────────────────── -->
|
||||||
|
<section class="kdoc-hero" style="background: linear-gradient(rgba(0,15,50,0.88),rgba(0,15,50,0.93)), url('assets/images/why-ours/hero.jpg') center/cover no-repeat;">
|
||||||
|
<div class="kdoc-hero__inner">
|
||||||
|
<p class="kdoc-hero__kicker"><?= htmlspecialchars($t['hero_kicker']) ?></p>
|
||||||
|
<h1 class="kdoc-hero__title"><?= htmlspecialchars($t['hero_title']) ?></h1>
|
||||||
|
<p class="kdoc-hero__sub"><?= htmlspecialchars($t['hero_sub']) ?></p>
|
||||||
|
|
||||||
|
<div class="kdoc-hero__stats">
|
||||||
|
<div class="kdoc-hero__stat">
|
||||||
|
<strong>220K+</strong>
|
||||||
|
<span><?= htmlspecialchars($t['stat_passages']) ?></span>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-hero__stat">
|
||||||
|
<strong>1,731</strong>
|
||||||
|
<span><?= htmlspecialchars($t['stat_tribunal']) ?></span>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-hero__stat">
|
||||||
|
<strong>23</strong>
|
||||||
|
<span><?= htmlspecialchars($t['stat_echr']) ?></span>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-hero__stat">
|
||||||
|
<strong>NO</strong>
|
||||||
|
<span><?= htmlspecialchars($t['stat_scope']) ?></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="kdoc-hero__ctas">
|
||||||
|
<a href="<?= htmlspecialchars($ctaUrl) ?>" class="kdoc-btn-primary"><?= htmlspecialchars($t['btn_try']) ?></a>
|
||||||
|
<?php if (!$isAuthed): ?>
|
||||||
|
<a href="<?= htmlspecialchars($registerUrl) ?>" class="kdoc-btn-secondary"><?= htmlspecialchars($t['btn_register']) ?></a>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<?php echo imgSlot(
|
||||||
|
'1',
|
||||||
|
'hero.jpg',
|
||||||
|
'Hero — ChatGPT vs Do Better Norge',
|
||||||
|
'Split composition: left side shows a person at a laptop with a vague "Maybe?" AI response; right side shows the same person at a clean Nordic desk with precise law citations glowing in gold.',
|
||||||
|
'Cinematic split composition. Left half: a person sits at a laptop, a large glowing chat bubble above their head filled with jumbled text — the word "Maybe?" prominent. Soft, uncertain light, slightly desaturated. Right half: the same person at a clean Nordic-minimalist desk, a glowing document interface with Norwegian law text visible, specific paragraph numbers highlighted in warm gold. Soft directional light. Navy blue and deep red color palette. Photorealistic, editorial style. Wide landscape format, 16:9.'
|
||||||
|
); ?>
|
||||||
|
|
||||||
|
<!-- ── Core problem: two-path comparison ─────────────────────────────────── -->
|
||||||
|
<div class="kdoc-section">
|
||||||
|
<p class="kdoc-section__eyebrow"><?= htmlspecialchars($t['problem_eyebrow']) ?></p>
|
||||||
|
<h2 class="kdoc-section__title"><?= htmlspecialchars($t['problem_title']) ?></h2>
|
||||||
|
<p class="kdoc-section__sub"><?= htmlspecialchars($t['problem_sub']) ?></p>
|
||||||
|
|
||||||
|
<div class="kdoc-compare">
|
||||||
|
|
||||||
|
<!-- Left: generic AI -->
|
||||||
|
<div class="kdoc-compare__col kdoc-compare__col--generic">
|
||||||
|
<p class="kdoc-compare__label"><?= htmlspecialchars($t['col_generic_label']) ?></p>
|
||||||
|
<div class="kdoc-compare__flow">
|
||||||
|
<div class="kdoc-compare__flow-step"><?= htmlspecialchars($t['col_generic_s1']) ?></div>
|
||||||
|
<div class="kdoc-compare__arrow">↓</div>
|
||||||
|
<div class="kdoc-compare__flow-step"><?= htmlspecialchars($t['col_generic_s2']) ?></div>
|
||||||
|
<div class="kdoc-compare__arrow">↓</div>
|
||||||
|
<div class="kdoc-compare__flow-step"><?= htmlspecialchars($t['col_generic_s3']) ?></div>
|
||||||
|
<div class="kdoc-compare__arrow">↓</div>
|
||||||
|
<div class="kdoc-compare__flow-step kdoc-compare__flow-step--final"><?= htmlspecialchars($t['col_generic_s4']) ?></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Right: Do Better Norge -->
|
||||||
|
<div class="kdoc-compare__col kdoc-compare__col--dbn">
|
||||||
|
<p class="kdoc-compare__label"><?= htmlspecialchars($t['col_dbn_label']) ?></p>
|
||||||
|
<div class="kdoc-compare__flow">
|
||||||
|
<div class="kdoc-compare__flow-step"><?= htmlspecialchars($t['col_dbn_s1']) ?></div>
|
||||||
|
<div class="kdoc-compare__arrow">↓</div>
|
||||||
|
<div class="kdoc-compare__flow-step"><?= htmlspecialchars($t['col_dbn_s2']) ?></div>
|
||||||
|
<div class="kdoc-compare__arrow">↓</div>
|
||||||
|
<div class="kdoc-compare__flow-step"><?= htmlspecialchars($t['col_dbn_s3']) ?></div>
|
||||||
|
<div class="kdoc-compare__arrow">↓</div>
|
||||||
|
<div class="kdoc-compare__flow-step"><?= htmlspecialchars($t['col_dbn_s4']) ?></div>
|
||||||
|
<div class="kdoc-compare__arrow">↓</div>
|
||||||
|
<div class="kdoc-compare__flow-step kdoc-compare__flow-step--final"><?= htmlspecialchars($t['col_dbn_s5']) ?></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<p class="kdoc-compare__caption"><?= htmlspecialchars($t['problem_caption']) ?></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ── Three analogies ───────────────────────────────────────────────────── -->
|
||||||
|
<section class="kdoc-section--alt">
|
||||||
|
<div class="kdoc-section">
|
||||||
|
<p class="kdoc-section__eyebrow"><?= htmlspecialchars($t['analogy_eyebrow']) ?></p>
|
||||||
|
<h2 class="kdoc-section__title"><?= htmlspecialchars($t['analogy_title']) ?></h2>
|
||||||
|
|
||||||
|
<div class="kdoc-features">
|
||||||
|
<div class="kdoc-feature-card">
|
||||||
|
<span class="kdoc-feature-card__icon"><?= $t['a1_icon'] ?></span>
|
||||||
|
<h3 class="kdoc-feature-card__title"><?= htmlspecialchars($t['a1_title']) ?></h3>
|
||||||
|
<p class="kdoc-feature-card__body"><?= htmlspecialchars($t['a1_body']) ?></p>
|
||||||
|
<span class="kdoc-feature-card__term"><?= htmlspecialchars($t['a1_term']) ?></span>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-feature-card">
|
||||||
|
<span class="kdoc-feature-card__icon"><?= $t['a2_icon'] ?></span>
|
||||||
|
<h3 class="kdoc-feature-card__title"><?= htmlspecialchars($t['a2_title']) ?></h3>
|
||||||
|
<p class="kdoc-feature-card__body"><?= htmlspecialchars($t['a2_body']) ?></p>
|
||||||
|
<span class="kdoc-feature-card__term"><?= htmlspecialchars($t['a2_term']) ?></span>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-feature-card">
|
||||||
|
<span class="kdoc-feature-card__icon"><?= $t['a3_icon'] ?></span>
|
||||||
|
<h3 class="kdoc-feature-card__title"><?= htmlspecialchars($t['a3_title']) ?></h3>
|
||||||
|
<p class="kdoc-feature-card__body"><?= htmlspecialchars($t['a3_body']) ?></p>
|
||||||
|
<span class="kdoc-feature-card__term"><?= htmlspecialchars($t['a3_term']) ?></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php echo imgSlot(
|
||||||
|
'2',
|
||||||
|
'library.jpg',
|
||||||
|
'The Librarian — RAG analogy',
|
||||||
|
'A warm Nordic library interior where a librarian reaches for a glowing book on a precise shelf, while shadowy figures fumble with random piles of books in the background.',
|
||||||
|
'A warm, Nordic-style library interior. A focused librarian reaches precisely for one glowing book on a vast shelf. The pages of the open book glow with highlighted text. In the background, dim shadowy figures fumble through random piles of books from memory. Warm amber and cool blue tones. Soft bokeh background. Square or 4:3 landscape. Photorealistic illustration style.'
|
||||||
|
); ?>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- ── Knowledge graph ───────────────────────────────────────────────────── -->
|
||||||
|
<div class="kdoc-section">
|
||||||
|
<p class="kdoc-section__eyebrow"><?= htmlspecialchars($t['graph_eyebrow']) ?></p>
|
||||||
|
<h2 class="kdoc-section__title"><?= htmlspecialchars($t['graph_title']) ?></h2>
|
||||||
|
<p class="kdoc-section__sub"><?= htmlspecialchars($t['graph_sub']) ?></p>
|
||||||
|
|
||||||
|
<div class="kdoc-graph">
|
||||||
|
<div class="kdoc-graph__node kdoc-graph__node--start">
|
||||||
|
<p class="kdoc-graph__node-title"><?= htmlspecialchars($t['graph_n1']) ?></p>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-graph__connector">
|
||||||
|
<div class="kdoc-graph__connector-line"></div>
|
||||||
|
<span class="kdoc-graph__connector-label">finds</span>
|
||||||
|
<div class="kdoc-graph__connector-line"></div>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-graph__node">
|
||||||
|
<p class="kdoc-graph__node-title"><?= htmlspecialchars($t['graph_n2']) ?></p>
|
||||||
|
<p class="kdoc-graph__node-note"><?= htmlspecialchars($t['graph_n2_note']) ?></p>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-graph__connector">
|
||||||
|
<div class="kdoc-graph__connector-line"></div>
|
||||||
|
<span class="kdoc-graph__connector-label">linked to</span>
|
||||||
|
<div class="kdoc-graph__connector-line"></div>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-graph__node">
|
||||||
|
<p class="kdoc-graph__node-title"><?= htmlspecialchars($t['graph_n3']) ?></p>
|
||||||
|
<p class="kdoc-graph__node-note"><?= htmlspecialchars($t['graph_n3_note']) ?></p>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-graph__connector">
|
||||||
|
<div class="kdoc-graph__connector-line"></div>
|
||||||
|
<span class="kdoc-graph__connector-label">linked to</span>
|
||||||
|
<div class="kdoc-graph__connector-line"></div>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-graph__node">
|
||||||
|
<p class="kdoc-graph__node-title"><?= htmlspecialchars($t['graph_n4']) ?></p>
|
||||||
|
<p class="kdoc-graph__node-note"><?= htmlspecialchars($t['graph_n4_note']) ?></p>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-graph__connector">
|
||||||
|
<div class="kdoc-graph__connector-line"></div>
|
||||||
|
<span class="kdoc-graph__connector-label">backed by</span>
|
||||||
|
<div class="kdoc-graph__connector-line"></div>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-graph__node">
|
||||||
|
<p class="kdoc-graph__node-title"><?= htmlspecialchars($t['graph_n5']) ?></p>
|
||||||
|
<p class="kdoc-graph__node-note"><?= htmlspecialchars($t['graph_n5_note']) ?></p>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-graph__connector">
|
||||||
|
<div class="kdoc-graph__connector-line"></div>
|
||||||
|
<span class="kdoc-graph__connector-label">plus</span>
|
||||||
|
<div class="kdoc-graph__connector-line"></div>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-graph__node">
|
||||||
|
<p class="kdoc-graph__node-title"><?= htmlspecialchars($t['graph_n6']) ?></p>
|
||||||
|
<p class="kdoc-graph__node-note"><?= htmlspecialchars($t['graph_n6_note']) ?></p>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-graph__connector">
|
||||||
|
<div class="kdoc-graph__connector-line"></div>
|
||||||
|
<span class="kdoc-graph__connector-label">becomes</span>
|
||||||
|
<div class="kdoc-graph__connector-line"></div>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-graph__node kdoc-graph__node--end">
|
||||||
|
<p class="kdoc-graph__node-title"><?= htmlspecialchars($t['graph_n7']) ?></p>
|
||||||
|
<p class="kdoc-graph__node-note"><?= htmlspecialchars($t['graph_n7_note']) ?></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="kdoc-section__sub" style="margin-top:1.5rem;text-align:center"><?= htmlspecialchars($t['graph_caption']) ?></p>
|
||||||
|
|
||||||
|
<?php echo imgSlot(
|
||||||
|
'3',
|
||||||
|
'graph.jpg',
|
||||||
|
'Knowledge graph — connected Norwegian law',
|
||||||
|
'Abstract visualization of a legal knowledge graph: glowing nodes labeled §4-4, ECHR Art.8, barneloven, Bufdir connected by golden threads on a midnight-navy background.',
|
||||||
|
'Abstract visualization of a legal knowledge graph on a deep midnight-navy background. Glowing circular nodes connected by golden threads — some nodes labeled with §4-4, ECHR Art.8, barneloven, Bufdir. The central node pulses white. Norwegian red (#BA0C2F) and gold (#C9A84C) accent colors. Data-visualization aesthetic, clean, no text clutter beyond the node labels. Wide landscape format 16:9.'
|
||||||
|
); ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ── Side-by-side answer comparison ────────────────────────────────────── -->
|
||||||
|
<section class="kdoc-section--alt">
|
||||||
|
<div class="kdoc-section">
|
||||||
|
<p class="kdoc-section__eyebrow"><?= htmlspecialchars($t['compare_eyebrow']) ?></p>
|
||||||
|
<h2 class="kdoc-section__title"><?= htmlspecialchars($t['compare_title']) ?></h2>
|
||||||
|
<p class="kdoc-section__sub"><?= htmlspecialchars($t['compare_sub']) ?></p>
|
||||||
|
|
||||||
|
<div class="kdoc-table-wrap">
|
||||||
|
<table class="kdoc-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th><?= htmlspecialchars($t['compare_th_q']) ?></th>
|
||||||
|
<th><?= htmlspecialchars($t['compare_th_gpt']) ?></th>
|
||||||
|
<th><?= htmlspecialchars($t['compare_th_dbn']) ?></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td><?= htmlspecialchars($t['compare_r1_q']) ?></td>
|
||||||
|
<td style="color:var(--coral,#c2410c)"><?= htmlspecialchars($t['compare_r1_gpt']) ?></td>
|
||||||
|
<td style="color:var(--teal-dark,#115e59)"><?= htmlspecialchars($t['compare_r1_dbn']) ?></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><?= htmlspecialchars($t['compare_r2_q']) ?></td>
|
||||||
|
<td style="color:var(--coral,#c2410c)"><?= htmlspecialchars($t['compare_r2_gpt']) ?></td>
|
||||||
|
<td style="color:var(--teal-dark,#115e59)"><?= htmlspecialchars($t['compare_r2_dbn']) ?></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><?= htmlspecialchars($t['compare_r3_q']) ?></td>
|
||||||
|
<td style="color:var(--coral,#c2410c)"><?= htmlspecialchars($t['compare_r3_gpt']) ?></td>
|
||||||
|
<td style="color:var(--teal-dark,#115e59)"><?= htmlspecialchars($t['compare_r3_dbn']) ?></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="kdoc-section__sub" style="margin-top:1.25rem;text-align:center;font-style:italic"><?= htmlspecialchars($t['compare_caption']) ?></p>
|
||||||
|
|
||||||
|
<?php echo imgSlot(
|
||||||
|
'4',
|
||||||
|
'comparison.jpg',
|
||||||
|
'Side-by-side answer comparison',
|
||||||
|
'Two browser windows on a desk: the left shows a vague, uncited AI chat response; the right shows a precise legal tool answer with numbered citations glowing in navy and gold.',
|
||||||
|
'Two browser windows side by side on a desk. Left window shows a generic AI chat interface with a long vague answer, no citations, generic. Right window shows a clean legal tool interface with a precise answer, numbered law citations highlighted in navy blue and gold, a clear source list below. The right window glows more brightly. Top-down editorial photography style, desks with minimal Norwegian decor. 4:3 landscape.'
|
||||||
|
); ?>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- ── Fine-tuned model ───────────────────────────────────────────────────── -->
|
||||||
|
<div class="kdoc-section">
|
||||||
|
<p class="kdoc-section__eyebrow"><?= htmlspecialchars($t['llm_eyebrow']) ?></p>
|
||||||
|
<h2 class="kdoc-section__title"><?= htmlspecialchars($t['llm_title']) ?></h2>
|
||||||
|
|
||||||
|
<div class="kdoc-llm-spotlight">
|
||||||
|
<div>
|
||||||
|
<span class="kdoc-llm-spotlight__badge"><?= htmlspecialchars($t['llm_badge']) ?></span>
|
||||||
|
<h3 class="kdoc-llm-spotlight__title">dbn-legal-agent</h3>
|
||||||
|
<p class="kdoc-llm-spotlight__body"><?= $t['llm_body_html'] ?></p>
|
||||||
|
|
||||||
|
<div class="kdoc-chips" style="margin-top:1rem">
|
||||||
|
<span class="kdoc-chip">QLoRA</span>
|
||||||
|
<span class="kdoc-chip">barnevernsloven</span>
|
||||||
|
<span class="kdoc-chip">barneloven</span>
|
||||||
|
<span class="kdoc-chip">ECHR Art. 8</span>
|
||||||
|
<span class="kdoc-chip">220K passages</span>
|
||||||
|
<span class="kdoc-chip">Norwegian bokmål</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-llm-stats">
|
||||||
|
<div class="kdoc-llm-stat">
|
||||||
|
<strong>QLoRA</strong>
|
||||||
|
<span><?= htmlspecialchars($t['llm_s1']) ?></span>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-llm-stat">
|
||||||
|
<strong>220K+</strong>
|
||||||
|
<span><?= htmlspecialchars($t['llm_s2']) ?></span>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-llm-stat">
|
||||||
|
<strong>23</strong>
|
||||||
|
<span><?= htmlspecialchars($t['llm_s3']) ?></span>
|
||||||
|
</div>
|
||||||
|
<div class="kdoc-llm-stat">
|
||||||
|
<strong>bokmål</strong>
|
||||||
|
<span><?= htmlspecialchars($t['llm_s4']) ?></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php echo imgSlot(
|
||||||
|
'5',
|
||||||
|
'finetune.jpg',
|
||||||
|
'Fine-tuned model — trained for Norwegian law',
|
||||||
|
'Abstract illustration: a neural network converges from broad diffuse light on the left to a sharp focused point surrounded by Norwegian legal symbols on the right.',
|
||||||
|
'A clean abstract illustration of a neural network being shaped and focused. On one side, broad diffuse light representing general knowledge. On the other side, the network converges to a sharp point surrounded by Norwegian legal symbols (§ marks, scales of justice, Norwegian flag colors). Midnight navy background, gold and teal accents. Square format, minimalist, editorial.'
|
||||||
|
); ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ── Privacy ────────────────────────────────────────────────────────────── -->
|
||||||
|
<section class="kdoc-section--alt">
|
||||||
|
<div class="kdoc-section">
|
||||||
|
<p class="kdoc-section__eyebrow"><?= htmlspecialchars($t['privacy_eyebrow']) ?></p>
|
||||||
|
<h2 class="kdoc-section__title"><?= htmlspecialchars($t['privacy_title']) ?></h2>
|
||||||
|
|
||||||
|
<div class="kdoc-privacy-card">
|
||||||
|
<h3><?= htmlspecialchars($t['privacy_title']) ?></h3>
|
||||||
|
<p><?= htmlspecialchars($t['privacy_body']) ?></p>
|
||||||
|
<div class="kdoc-privacy-card__badges">
|
||||||
|
<span class="kdoc-privacy-card__badge">No OpenAI</span>
|
||||||
|
<span class="kdoc-privacy-card__badge">No Google</span>
|
||||||
|
<span class="kdoc-privacy-card__badge">GDPR compliant</span>
|
||||||
|
<span class="kdoc-privacy-card__badge">Servers in EU</span>
|
||||||
|
<span class="kdoc-privacy-card__badge">Zero training data from users</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- ── CTA strip ──────────────────────────────────────────────────────────── -->
|
||||||
|
<section class="kdoc-cta-strip">
|
||||||
|
<h2 class="kdoc-cta-strip__title"><?= htmlspecialchars($t['cta_title']) ?></h2>
|
||||||
|
<p class="kdoc-cta-strip__sub"><?= htmlspecialchars($t['cta_sub']) ?></p>
|
||||||
|
<div class="kdoc-hero__ctas">
|
||||||
|
<?php if ($isAuthed): ?>
|
||||||
|
<a href="/index.php" class="kdoc-btn-primary"><?= htmlspecialchars($t['btn_open']) ?></a>
|
||||||
|
<?php else: ?>
|
||||||
|
<a href="<?= htmlspecialchars($toolsLogin) ?>" class="kdoc-btn-primary"><?= htmlspecialchars($t['btn_signin_cta']) ?></a>
|
||||||
|
<a href="<?= htmlspecialchars($registerUrl) ?>" class="kdoc-btn-secondary"><?= htmlspecialchars($t['btn_register']) ?></a>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<?php require_once __DIR__ . '/includes/footer.php'; ?>
|
||||||
|
<script src="assets/js/tools.js" defer></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||