Grafiittisen RAG-todisteiden kaksinkertaistaminen ilmeinenRAG (Suomi (Finnish))

Grafiittisen RAG-todisteiden kaksinkertaistaminen ilmeinenRAG

Saturday, 17 January 2026

//

10 minute read

TOTEAA: Tämä ei ole tavallinen blogiartikkeli. Se on tekninen eritelmä kirjattu konkreettiselle ominaisuudelle ilmeinenRAG. Olen toistuvasti antanut tämän asiakirjan koodiin:-, "focused LLMs during development," "reason about trade", "offs", "validate assumptions" ja "converge on a rational implementation".

Tässä asiakirjassa kuvataan alajärjestelmää ilmeinenRAG, hanke IM SK1 kehitän aktiivisesti

Yksi keskeinen vaatimus ilmeinenRAG on kyky ekstrahoida todisteiden osia - lauseetM SK1 kappaleet , otsikot, otsikotMSC4 puitteetMST5 tai rakenteelliset lohkot SSK6 ja varmistaa, että kyseiset osat kaksinkertaistettu ilman hyödyllisen signaalin tuhoamista.

ilmeinenRAG työt analysoimalla ja keräämällä paras saatavilla olevat todisteet asiakirjoista, kuvat, äänioikeudessa , ja rakenteelliset tiedotM SK3 toisin kuin useimmissa RAG-rakenteiden täytäntöönpanossa ei varastoida LLM-generoida yhteenvedot ensisijaisena artefaktina . Monissa tapauksissa, syöminen ei edellytä lainkaan LLM:tä M SK3, vaikka sitä voidaan käyttää, kun syvennys on perusteltuaMSC4

Sen sijaan, ilmeinenRAG soveltaa monia deterministisia ja todennäköisiä tekniikoita:

  • poistaa ehdokassegmentit
  • arvioidaan niiden informatiivista arvoa
  • ja säilyttävät vain vahvimman edustajan

Redupollu on ratkaiseva osa tätä prosessia.

Yksinkertainen ketjujen yhdenvertaisuus ei riitä. Sama käsite ilmaistaan usein erilaisten sanamuotojen avulla , rakenteenaM SK2 tai muodollisuutena. Niiden käsitteleminen erillisenä johtaa ylimääräiseen varastointiin ja huonoon menettelytapaan ketjun jälkeenMSC4

Ongelma moninkertaistuu pyyntiajan jälkeen.

Kun tulokset otetaan käyttöön, (SQL:n välityksellä , vektorin sisällyttämisen avulla, BM-lähettiläiden välitykselläM SK3 tai hybridien välitysjärjestelmien välitykselläMSC4 liitetään LLM:lle useita segmenttejä, jotka kaikki ilmaisevat saman taustalla olevan ajatuksen, tuodaan tuskallisiaMST5 toistuvia vastauksiaMSP6 Viisi läheisyydessäMSV7 eri asiakirjoista saaduista samankaltaisista osista ei lisätä selkeyden lisäämistä.

Tätä varten, ilmeinenRAG kaksinkertaistaminen first-luokan kompilointiongelma, ei lähetetä postia

Muissa asiakirjoissa kuvataan, miten tämä päällekkäisyyksiin perustuva strategia on suunniteltu.This is part of how I work with Code LLMs 'Agile Speccing mukautettu koodi LLMS.

Tämä kristallisoi ajatukset, erilaiset käsitteet ja pakottaa LLM:n dokumentoimaan ne. Tämä on ensimmäinen vaihe sen varmistamisessa rakentaa oikean asian.

Lisätietoja ilmeinenRAG täällä.

Yhdenmukaistamisstrategia

ilmeinenRAG käytetään kahta vaihetta koskevaa menetelmää, jonka avulla voidaan poistaa ylimääräinen sisältö ja säilyttää tärkeitä signaaleja. signaali-varmistava filterti, ei sisällön normalisointia

Yleiskatsaus

┌─────────────────────────────────────────────────────────────────────────────┐
│                           INGESTION (Per Document)                          │
│                                                                             │
│  Document → Extract → Embed → DEDUPE (intra-doc) → Index to Vector Store   │
│                                   │                                         │
│                                   ├─ Near-duplicates: boost salience        │
│                                   └─ Exact duplicates: drop (no boost)      │
└─────────────────────────────────────────────────────────────────────────────┘
                                    │
                                    ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│                          RETRIEVAL (Cross Document)                         │
│                                                                             │
│  Query → Search → Rank (RRF) → DEDUPE (cross-doc) → Top K → LLM Synthesis  │
│                                   │                                         │
│                                   └─ Keep segment with highest RRF score    │
└─────────────────────────────────────────────────────────────────────────────┘

Suunnitelmatakeet

Nämä invariantit säilytetään vähentämisjärjestelmässä:

Takuutus Kuvaus
Asetus säilytetään päällekkäisyydellä ei koskaan muuteta semanttista järjestystä RRF:n luokituksen jälkeen.
Ei käsitteen menetystä päällekkäisyydellä ei koskaan poisteta kaikkia käsitteen instanseja.
Asiakirjan raja noudatetaan päällekkäisyydet eivät koskaan ylitä asiakirjan rajoja syöttäessä
Muutamaton sisältö päällekkäisyydellä ei koskaan muuteta sisällytyksiä tai tekstisisältöä
Deterministi Kun otetaan huomioon identtiset tulot ja configM SK1 päällekkäisyydet tuottavat identtisiä tuloksia

Ei---tavoitteet

Tämä järjestelmä ei yritetään:

  • Todellisen ristiriidan havaitseminen - Kaksi kohtaa, joissa sanotaan vastakkaisia asioita, eivät ole kaksinkertaistettuja
  • Kannikaalisoida totuus - Me emmeM SK1 valitse "correct" versiota eri lähteistä
  • Collapse parafrases across documents at ingestion - Jokainen asiakirja säilyttää omat segmentit
  • Terminologian normalisointi Eri asiakirjoissa säilytetään erikseen - "ML" ja SSK3koneiden oppiminenM SK4
  • Entitysratkaisu korvataan - Se, että ' GraphRAG ' työ, , toiminta eri tasolla

Determinismi & Reprodussibility

Kahdenkertaistaminen on täysin deterministista:

  • Sisällytykset ovat muuttamattomia kerran laskettu kaivausajankohtana
  • Sortointi on vakaa --osat, joilla on yhtä suuri merkitys, säilyttävät alkuperäisen järjestyksen
  • Ei sattumaa - ei näytteitä
  • Ei ulkoista tilannetta - vähennyspäätökset riippuvat vain nykyisestä segmenttimäärästä

Miksi tämä on tärkeää: Käyttäjät voivat luottaa siihen, että re-käynnin samaa inputtia käyttäen tuottaa samat outputitM SK1 Tämä vastaa ilmeinenRAG'laajempi "rajoittunut epämääräisyysM SK2filosofia - epämääräinen vastaavuus deterministiseen käyttäytymiseen.


Miksi kaksi vaihetta?

Phase 1: Ingestion Deduplication

Tavoitteena: Vähennetään varastointia ja estetään asiakirjan sisäinen-ylijäämä

Ongelma: Asiakirjat sisältävät usein toistuvaa sisältöä:

  • Tekijäteksti (otsakkeetM SK1jalkakkeet ,väittämättömät lausunnot)
  • Kopiota-muokatut osat
  • Sama käsite selitti useita tapoja

ratkaisu: Ennen indeksointia kaksinkertaistetaan kussakin asiakirjassa.

Avainkäsitys: Lähes-duplikaatit käsitellään riippumattomia tärkeitä todisteitaJos esittelijä selittää käsitteen kolmella eri tavalla, se on merkityksellinen.

Phasen 2:-jäljittämisväärennys

Tavoitteena: Varmistaa, ettei LLM saa ylimääräistä tietoa asiakirjoista.

Ongelma: Useiden asiakirjojen välisessä kysymyksessä samankaltaiset kappaleet voivat esiintyä eri lähteissä.

ratkaisu: Rakennerahaston (RRF) luokituksen jälkeen (, joka yhdistää semanttiseen samankaltaisuuteen , avainsanojen yhteensopivuusM SK2 merkityksellisyys, ja tuoreuusMSC4 kaksinkertaistetaan asiakirjoissa pitämällä kiinni korkeimmasta prosenttimäärästä

Miksi RRF:n jälkeen RRF-tulos on paras kokonaisvaltainen merkittävyyden mittaus.

Miks Salience Boost Only at Ingestion

Separointi on tarkoituksellista:

Fassi Mitä se saa aikaan
Kuluttamisen lisääminen Esittelijä korostaa - miten paljon asiakirjassa korostetaan käsitettä
Päätöstulos Kysymyksen relevanssi - miten hyvin sisältö vastaa käyttäjän aikomusta

Näiden sekoittaminen hakuvaiheessa sekoittaa asiakirjan tarkoituksen käyttäjän tarkoitukseen. On tärkeää, että käsite toistetaan M SK1 kertaa asiakirjassa asiakirjaan,, mutta se ei voi olla merkityksellinen tähän kysymykseen. Nopeuttamalla vastaanottoaM SK1 säilytämme esittelijän signaalin ilman kysymyksen tulosten puolueellistamista .


Phase 1: Ingestion Deduplication

Location

src/Mostlylucid.DocSummarizer.Core/Services/BertRagSummarizer.cs

Menetelmä

DeduplicateSegments()

Algoritmi

1. Filter segments by minimum salience threshold (0.05)
2. Sort by salience score (highest first)
3. For each segment:
   a. If no embedding → keep (can't compare)
   b. Check cosine similarity against all selected segments
   c. If similarity >= 0.90:
      - If same ContentHash → exact duplicate, drop silently
      - If different ContentHash → near-duplicate, boost kept segment's salience
   d. If no match → add to selected list
4. Apply salience boosts: +15% per near-duplicate merged
5. Cap salience at 1.0 to prevent any single concept from dominating

Parametrit

Parameter Default
similarityThreshold
salienceThreshold
boostPerNearDuplicate

Esimerkkejä

Täsmällinen jäljennöksi (Ei lisäystäM SK1

Segment A: "Contact us at [email protected]" [hash: abc123]
Segment B: "Contact us at [email protected]" [hash: abc123]  ← same hash
Result: Keep A, drop B, no boost (likely boilerplate)

Läheltä-Duplicate M SK1Boost Applied)

Segment A: "Machine learning models require training data" [hash: abc123]
Segment B: "ML systems need data for training" [hash: def456]  ← different hash, 0.92 similarity
Segment C: "Training data is essential for ML" [hash: ghi789]  ← different hash, 0.91 similarity
Result: Keep A with +30% salience boost (concept emphasized 3 ways)

Racionaliteetti raja-arvojen osalta

  • 0.90 vastaavuus Tutkimuksen perusteella (NVIDIA NeMo käyttää 0.90-0.92, teollisuutta koskevaa standardia semanttiseen vähentämiseen
  • 0.05 salienssi Filtroi hyvin alhaiset segmentit, joiden arvo on -, säilyttäen kuitenkin suurimman osan sisällöstä
  • 15% lisäys Merkittävä signaali ilman ylittävää-painotusta toistuviin käsitteisiin

Phasen 2:-jäljittämisväärennys

Location

src/LucidRAG.Core/Services/AgenticSearchService.cs

Menetelmä

DeduplicateByEmbeddingPostRanking()

Algoritmi

1. Receive ranked results (already sorted by RRF or dense score)
2. For each segment (in score order):
   a. If no embedding → keep
   b. Check cosine similarity against all selected segments
   c. If similarity >= 0.90 → skip (higher-scored duplicate already selected)
   d. If no match → add to selected list
3. Return deduplicated list (maintains score ordering)

Parametrit

Parameter Default
similarityThreshold

Miksi lähetetään-RRFM SK1

RRF (Reciprocal Rank Fusion

  1. Tiukka tulos: Semanttinen samankaltaisuus kysymykseen
  2. BM25 tulos Lexical/kysymyksen vastaavuus
  3. Saliensin tulos: Asiakirjan merkitys
  4. Värvyyden tulos: Recenssin nopeuttaminen

RRF:n jälkeen päällekkäistyminen tarkoittaa sitä, että säilytämme segmentin, joka sopii parhaiten kysymykseen kaikissa mittasuhteissa.

Esimerkki

Query: "How do I configure authentication?"

Results before dedup:
1. [Doc A] "Authentication is configured via config.yaml..." (RRF: 0.052)
2. [Doc B] "Configure auth using the config.yaml file..." (RRF: 0.048, similarity to #1: 0.93)
3. [Doc A] "Set the API key in environment variables..." (RRF: 0.041)

Results after dedup:
1. [Doc A] "Authentication is configured via config.yaml..." (RRF: 0.052)
2. [Doc A] "Set the API key in environment variables..." (RRF: 0.041)

Doc B's similar paragraph dropped - Doc A's version had higher RRF score.

Epävalvonnan muodot & kaupankäynti

Tunnetut rajoitukset

Epäonnistumisvaihe Kuvaus SSK2 lieventäminen
Valheellinen positiivinen (overM SK1dedup ) Kaksi erillistä mutta läheisesti toisiinsa liittyvää käsitettä voivat ylittää 0.90 samankaltaisuudet
False negative (under Hyvin lyhyet segmentit saattavat sijoittaa huonostiM SK1 puuttuvaa semanttista samankaltaisuutta Hash-pohjainen täsmällinen päällekkäisyyksien havaitseminen saa samat tekstit
Sisällyttäminen ajoon Siihen sisällyttämistä koskevien mallien muuttaminen mitätöi vähennyksen olettamukset Requires full re
Luetteloherkkyys Hyödyllinen valinta merkitsee ensisijaisen korkean tason valintaaM SK1hyväksyntäosuus voittaa lievennetään vakaan sortoinnin avulla; korkein tason valiminenMSC4hyhäksyntäosa säilytetään

Hyväksytty kauppa

  • Precision over recall: Pidämme mieluummin tilapäisesti lähempänä - päällekkäisyyksiä kuin erillisen sisällön tahallista poistamista
  • Todenmukaisuuden ylittävä varastointi: säilytämme kutakin -asiakirjaa maailmanlaajuisen vähennyksen sijasta säilyttääksemme lähteen merkityksen
  • Yksinkertaistaminen optimoinnissa: O(n²) hyväksytään tyypillisille asiakirjakokouksilleM SK2 LSH lisää monimutkaisuutta

Monikieliset näkökohdat

Monikielisen sisällön päällekkäisyydet:

Scénari Behavior Rationale SSK3
Sama kieli Sovelletaan tavanomaista vähennysarvoa.
Cross-kielinen johdanto-osan kappale ei ole kaksinkertaistettu.
Sekakielinen-asiakirja Dedup kieliryhmittymien sisällä Siirron samankaltaisuus erottaa kielet luonnollisesti toisistaan

Suunnitelma choice: Cross-kielinen vähennys ei selvästikään ole tuettu. Tämä säilyttää kyvyn palauttaa sama tosiasia käyttäjän toivomassa kielessä tai verrata sitä, miten erilaiset lähteet sanovat asiat

Tuleva parannus:YhteenlaajuinenM SK1kielten vähennykset voitaisiin jakaa käännösten välityksellä


Turvallisuus & Vastustajien näkökohdat

päällekkäisyyksiä koskeva järjestelmä sisältää epäsuorat suojat:

hyökkäysvektori
Salienssin inflaatio toistuvasti Nopeuttaminen rajoittuu 1.0; täsmälliset päällekkäisyydet ei
Kopiota-paste spam across documents CrossM SK1doc dedup jäljittämisessä poistaa ylimääräiset tulokset
Palkintojen manipulointi päällekkäisillä syytyksillä vähennys tapahtuu sen jälkeen, kun tulostaulukko on suoritettu.
Katilavalvonnan aiheuttama tulva Täsmällinen hash-vastauksen havaitseminen vähenee ilman nopeuttamista

Huomautus: Väärentäminen ei ole turvallisuusrajaa. Köyllinen sisältö, joka kulkee syöttämisfilterejä läpi, indeksoidaan


GraphRAGin vuorovaikutus

Redupollu ja GraphRAG ovat tarkoituksellisesti ortogonaisia:

Järjestelmä
Yhdenmukaistaminen Segmentit (tekstikierroksia) Poistaa ylimääräiset hakutulokset SSK4
GraphRAG Yritykset & Suhteet SSK2 Tietämyksen rakentaminen Grafi , Ratkaisevia viittauksia S

Miksi erottaa:

  • Yhteinen segmentti, jossa mainitaan "AppleM SK1 ja toinen, joka mainitsee "yhtiön", voi poistaa saman tekstin, mutta se edustaa samaa entiteettiä, jota on ratkaistava
  • Dedup ei tarvitse entity-tietoisuutta, se toimii puhtaasti semanttisella samankaltaisuudella.
  • Entity-aware dedup-mahdollisuus voitaisiin lisätä myöhemmin lisäyksenä, mutta ei korvauksena

Tarkastuskelpoisuus & Mitrit

Nykyinen logging

Ingestion:

[dim]Deduplication: 150 → 98 segments[/]

Takaaminen:

Post-ranking deduplication: 50 → 42 segments (removed 8 cross-doc duplicates)

Suositetut mittarit

Tuotantovalvontaa varten, harkitaan seurantaaM SK1

Metriki SSK1 Kuvaus Terve vyöhyke S
dedup_ratio_ingestion % segmentit poistetaan syöttäessä
dedup_ratio_retrieval
avg_salience_boost Asiakirjaa kohden sovellettava keskimääräinen lisäys
max_salience_boost Asiakirjan korkein nousu < \0.60 \ (muunlainen käsite hallitsee
dedup_by_doc_type vähennystavoite, joka on segmentoitu asiakirjatyypin mukaan

Parannuskeinot

  • Korkean syövän vähennys (>50%): Asiakirjassa voi olla liiallista kattoplatea tai se on autogeneraoitu
  • Alhainen kulutuksen vähennys (<5%): Asiakirjan sisältö on monipuolinen (hyväM SK1 tai sisällytykset ovat huonot (tarkastella)
  • Korkean jäljitettävyyden vähentäminen (>30%): Kysymys voi olla liian laaja, tai Corpusilla on monia samankaltaisia asiakirjoja
  • Salience lähestyy 1.0: Konceptia korostettiin voimakkaasti:;, "todistuksen tekeminen", ', "laillinen", ,, "ei spam".

Ohjelmointi

päällekkäisyydet on määritelty DocSummarizerConfig.Deduplication -osuus appsettings.json:

{
  "DocSummarizer": {
    "Deduplication": {
      "Ingestion": {
        "Enabled": true,
        "SimilarityThreshold": 0.90,
        "SalienceThreshold": 0.05,
        "EnableSalienceBoost": true,
        "BoostPerNearDuplicate": 0.15,
        "MaxSalienceBoost": 1.0,
        "BoostDecayMode": "Logarithmic",
        "LogBase": 2.0
      },
      "Retrieval": {
        "Enabled": true,
        "SimilarityThreshold": 0.90,
        "MinRelevanceScore": 0.25
      },
      "Analytics": {
        "EnableLogging": true,
        "EnableMetrics": true,
        "HighIngestionDedupThreshold": 0.50,
        "HighRetrievalDedupThreshold": 0.30,
        "HighSalienceBoostThreshold": 0.60
      }
    }
  }
}

Kuluttamisen valvonta

Parameter Default
Enabled true sallitaanM SK1suljetaan syömisen päällekkäisyydestä
SimilarityThreshold 0.90 Kosineiden samankaltaisuuden kynnys päällekkäisyyksien havaitsemiseksi
SalienceThreshold 0.05 vähimmäismäärä, jota on otettava huomioon
EnableSalienceBoost true Korostaa esiintyvyyttä läheisyydessä
BoostPerNearDuplicate 0.15 Alkutuki läheisyydessäM SK1toistaa (+15%)
MaxSalienceBoost 1.0 enimmäis salienssin katto
BoostDecayMode Logarithmic Linear tai Logarithmic kuivuus
LogBase 2.0 Logarithmic decay -perusta

Takaamista koskevat järjestelyt

Parameter Default
Enabled true Sovuttaa/suljettaa jäljittämisväärennys
SimilarityThreshold 0.90 Kosiinijohdonmukaisuuden kynnysarvo
MinRelevanceScore 0.25 vähimmäismääräinen RRF-tulos, johon sisältyy

Analyyseja koskeva konfigurointi

Parameter Default
EnableLogging true Login päällekkäisyydet
EnableMetrics true Valvontaa varten kerättävät mittarit
HighIngestionDedupThreshold 0.50 Varoittakaa, jos
HighRetrievalDedupThreshold 0.30 Varoittakaa, jos
HighSalienceBoostThreshold 0.60 Varoittakaa, jos kasvu ylittää

Nopeuttaa häviämisoikeuksia

Lineaarinen menettely ( yksinkertainen , ennustettavissa olevaM SK2

boost = boostPerNearDuplicate × count

Esimerkki: M SK1 lähellä-dupes × \0.15 |= \ \ +45% \ lisäys

Logaritmillinen menettely (vähennyspalautuksistaM SK1默aehtoinen ):

boost = boostPerNearDuplicate × log₂(1 + count)

Esimerkki: M SK1 lähellä-dupes → \0.15 |× logi \ ₂(4) | = | +30%\ boost

Logarithmic mode on suositeltava, koska:

  • Ensimmäiset muutaman jäljennöksen voimakkaimmat signaalit ovat: (autor emphasisM SK1
  • Monet päällekkäisyydet saattavat osoittaa, että kattoplate, ei ole tärkeä
  • Ennaltaehkäisetään runaway salienceinflaatio

Toimivuusnäkökohdat

Monimutkaisuus

vaihe monimutkaisuus tyypillinen koko S vaikutukset M
Ingestion OM SK2n² SSK4 \50-500 segments < 100 ms SSK9
Päätöslauselma OmM SK3 SSK4 \20-100 segmentit < SSK8ms

Laajennettu tie

Useiden suurten asiakirjojen osalta (10,000+ segmentit

  1. LSH (YhtäläisyysM SK1Sensitiivinen haastaminen ): O(nM SK1 arvio vähennyksestä
  2. : Menettely chunkeissa muistin vähentämiseksi
  3. Ennakkofiltrointi: Agressiivisempi salienssikynnys

Nykyinen täytäntöönpano on optimoitu tyypillisille asiakirjakokosuhteille. LSH lisää monimutkaisuutta ilman hyötyä useimmille käyttötapauksille


Vertailu tutkimukseen

Lähestymistapa
Tämä täytäntöönpano
NVIDIA NeMo Curator SemDeDup -ohjelma
MinHash LSH Googlen paperi C4, GPT
SemHash GitHub

Meidän kynnysarvomme 0.90 vastaa alan parhaita käytänteitä semanttisesta kaksinkertaistamisesta


Mitä ei ole kaksinkertaistettu

Sisältötyyppi Syy SSK2
YhdenmukainenM SK1asiakirja syöttäessä säilytetään kutakin source resolution ja attributionta kohti SSK3
alhainenM SK1johdonmukaisuuspitoisuus
Eri segmenttityypit Johdanto-osan ja kohdan väliset rakenteelliset tehtävät ovat erilaiset
Yhdyskielinen -kieliset lausekkeet SSK2 säilyttää kielellisen monimuotoisuuden

täytäntöönpanotilanne

Merkintö Tilanne sijaintipaikka SSK3
Konfiguroitavissa olevat kynnysarvot DeduplicationConfig luokka
Boost decay ( Log scale ) 3 4 täytäntöön pantu BoostDecayMode.Logarithmic
Dedup-analyyttinen analyysi DeduplicationResult<T> kirjallinen
DI-palvelujen integroiminen IDeduplicationService

Tulevat parannukset

  1. Dedup-analyysitaulukko: Määrärahojen näkyvä seuranta asiakirjatyypin mukaan
  2. Yhdensuuntainen-kielimahdollisuus käännös-invarianttiembeddings monikieliselle vähentämiselle
  3. Yhteinen osapuoli-tiedonmukainen vähennysM SK1 GraphRAG-yksiköiden käyttö lisäsignaalina (ei korvaustaM SK1
  4. Prometheus/OpenTelemetry: Valvonnan taulukon mittausvälineet

Lyhyesti sanottuna

Tämä kaksinkertaistumisstrategia:

  • Varmistaa signaalin - lähelläM SK1toistukset lisäävät merkitystä poisheittämisen sijasta
  • Kunnioittaa rajoja - Asiakirjat ylläpitävät riippumattomia segmenttikokonaisuuksia
  • Luettelo siirrettävistä viroista - käyttää täytä RRF-signaalia ennen ristiä
  • Epäonnistuminen turvallisesti - mieluummin säilyttää sisältö kuin aggressiivinen poistaminen
  • pysyy deterministisena - Samat tulot tuottavat aina samaa tulosta
Finding related posts...
logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.