[{"data":1,"prerenderedAt":893},["ShallowReactive",2],{"blog-semantic-product-search-b2b-de":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":25,"sources":33,"cover":73,"og":74,"expertise":75,"locales":76,"lang":78,"title":80,"description":81,"coverAlt":82,"metaTitle":83,"takeaways":84,"faq":90,"toc":109,"blocks":149,"others":600},"semantic-product-search-b2b","2026-10-02",13,"rag",[9,10,11,12,13],"B2B search","Hybrid search","Semantic search","Spryker","OpenSearch",[15,16,17,18,19,20,21,22,23,24],"semantic product search B2B","B2B ecommerce search","hybrid search BM25 vector","part number search ecommerce","Spryker search Elasticsearch","OpenSearch hybrid search RRF","multilingual product search German English Hungarian","zero results rate site search","LLM query understanding ecommerce","AI product search for B2B shops",[26,28,31],{"name":11,"url":27},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSemantic_search",{"name":29,"url":30},"Elasticsearch","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FElasticsearch",{"name":13,"url":32},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOpenSearch",[34,37,40,43,46,49,52,55,58,61,64,67,70],{"title":35,"url":36},"Baymard Institute: E-commerce search query types","https:\u002F\u002Fbaymard.com\u002Fblog\u002Fecommerce-search-query-types",{"title":38,"url":39},"Elastic Search Labs: Hybrid search in Elasticsearch","https:\u002F\u002Fwww.elastic.co\u002Fsearch-labs\u002Fblog\u002Fhybrid-search-elasticsearch",{"title":41,"url":42},"Elasticsearch documentation: kNN query (pre-filters and post-filters)","https:\u002F\u002Fwww.elastic.co\u002Fdocs\u002Freference\u002Fquery-languages\u002Fquery-dsl\u002Fquery-dsl-knn-query",{"title":44,"url":45},"Elasticsearch documentation: Semantic reranking","https:\u002F\u002Fwww.elastic.co\u002Fdocs\u002Fsolutions\u002Fsearch\u002Franking\u002Fsemantic-reranking",{"title":47,"url":48},"Elasticsearch documentation: Word delimiter graph token filter","https:\u002F\u002Fwww.elastic.co\u002Fdocs\u002Freference\u002Ftext-analysis\u002Fanalysis-word-delimiter-graph-tokenfilter",{"title":50,"url":51},"Elasticsearch documentation: Synonym graph token filter","https:\u002F\u002Fwww.elastic.co\u002Fdocs\u002Freference\u002Ftext-analysis\u002Fanalysis-synonym-graph-tokenfilter",{"title":53,"url":54},"OpenSearch documentation: Score ranker processor (RRF)","https:\u002F\u002Fdocs.opensearch.org\u002Flatest\u002Fsearch-plugins\u002Fsearch-pipelines\u002Fscore-ranker-processor\u002F",{"title":56,"url":57},"OpenSearch documentation: Normalization processor","https:\u002F\u002Fdocs.opensearch.org\u002Flatest\u002Fsearch-plugins\u002Fsearch-pipelines\u002Fnormalization-processor\u002F",{"title":59,"url":60},"Spryker documentation: Search feature overview","https:\u002F\u002Fdocs.spryker.com\u002Fdocs\u002Fpbc\u002Fall\u002Fsearch\u002Flatest\u002Fbase-shop\u002Fsearch-feature-overview\u002Fsearch-feature-overview",{"title":62,"url":63},"Spryker documentation: Migrate from OpenSearch 1.3 to 3.5","https:\u002F\u002Fdocs.spryker.com\u002Fdocs\u002Fpbc\u002Fall\u002Fsearch\u002Flatest\u002Fbase-shop\u002Finstall-and-upgrade\u002Fmigrate-from-opensearch-1.3-to-3.5.html",{"title":65,"url":66},"Instacart via ZenML: Rebuilding query understanding for e-commerce search with LLMs","https:\u002F\u002Fwww.zenml.io\u002Fllmops-database\u002Frebuilding-query-understanding-for-e-commerce-search-with-llms",{"title":68,"url":69},"arXiv: M3-Embedding, multilingual, multi-functionality, multi-granularity text embeddings","https:\u002F\u002Farxiv.org\u002Fabs\u002F2402.03216",{"title":71,"url":72},"Algolia documentation: Search analytics metrics","https:\u002F\u002Fwww.algolia.com\u002Fdoc\u002Fguides\u002Fsearch-analytics\u002Fconcepts\u002Fmetrics\u002F","\u002Fimages\u002Fblog\u002Fsemantic-product-search-b2b\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fsemantic-product-search-b2b\u002Fog.jpg","b2b-ecommerce-developer",[77,78,79],"en","de","hu","Semantische Produktsuche für B2B-Shops: Artikelnummern, Hybrid-Retrieval und was du messen solltest","Semantische Suche im B2B-Shop, ohne die Artikelnummern-Suche zu zerstören: Hybrid aus BM25 und Vektoren, Filter, DE\u002FEN\u002FHU, LLM-Query-Parsing, Reranking, Metriken.","Diagramm: Eine Suchanfrage wird auf eine Kennungs-Spur, lexikalisches BM25 und Vektor-kNN verteilt, fusioniert, neu gerankt und als Ergebnis ausgegeben.","B2B-Produktsuche: hybrid und semantisch · Balázs Csorba",[85,86,87,88,89],"Im B2B ist die Artikelnummer die wichtigste Suchanfrage. Gib Kennungen eine eigene Spur mit normalisiertem Exakt- und Präfix-Match und lass die semantische Suche nur helfen, wenn diese Spur keine starke Antwort hat.","Hybridsuche (BM25 plus Vektoren, per Reciprocal Rank Fusion zusammengeführt) schlägt jede Methode allein, weil Einkäufer „10-32-4711“ und „Schraube für Holz außen“ in dasselbe Feld tippen.","Sortimente, Preislisten und Lagerbestand müssen Pre-Filter innerhalb der Vektorsuche sein, keine Post-Filter, sonst verschwinden Treffer oder werden über Kunden hinweg sichtbar.","Nutze ein LLM, um Anfragen in Produkttyp, Attribute und Einheiten zu zerlegen, prüfe die Ausgabe gegen den Katalog und cache häufige Anfragen offline, statt bei jedem Tastendruck ein Modell zu rufen.","Bewerte das System je Anfragetyp: Zero-Result-Rate, Suchabbruchrate und Klickrate, dazu ein kleines bewertetes Anfrage-Set, in dem exakte Kennungen immer auf Platz 1 stehen müssen.",[91,94,97,100,103,106],{"q":92,"a":93},"Was ist semantische Suche im B2B-E-Commerce?","Semantische Suche wandelt Produkttexte und Anfragen in Vektoren um, sodass eine Anfrage wie „Schraube für Holz außen“ passende Produkte auch ohne gemeinsame Wörter findet. In einem B2B-Shop sollte sie die lexikalische Suche ergänzen, nicht ersetzen, weil Artikelnummern, EANs und exakte Spezifikationen weiterhin präzise Treffer brauchen.",{"q":95,"a":96},"Was ist Hybridsuche und warum brauchen B2B-Shops sie?","Hybridsuche führt eine lexikalische Abfrage (BM25) und eine Vektorabfrage parallel aus und fusioniert beide Ranglisten, oft per Reciprocal Rank Fusion. B2B-Shops brauchen sie, weil ihre Einkäufer exakte Kennungen und natürlichsprachliche Beschreibungen mischen und keine der beiden Methoden allein beides gut abdeckt.",{"q":98,"a":99},"Wie bleibt die Artikelnummern-Suche exakt, wenn ich Vektorsuche einsetze?","Indexiere Kennungen in eigenen Feldern mit einem Normalizer, der Groß-\u002FKleinschreibung, Bindestriche, Punkte und Leerzeichen entfernt, matche sie zuerst exakt und per Präfix und ranke diese Treffer über alles, was der Vektor-Zweig liefert. Verlass dich bei Kennungen nicht auf Embeddings, denn sie behandeln ähnlich aussehende Nummern als ähnlich.",{"q":101,"a":102},"Funktioniert semantische Suche für deutsche, englische und ungarische Kataloge?","Ja, mit einem mehrsprachigen Embedding-Modell und sprachspezifischer Textanalyse. Mehrsprachige Modelle wie BGE-M3 decken mehr als 100 Sprachen ab, aber deutsche Komposita und ungarische Flexion musst du trotzdem mit eigenen Anfragen testen und die Ergebnisse je Sprache messen.",{"q":104,"a":105},"Wie messe ich, ob die Produktsuche besser geworden ist?","Segmentiere nach Anfragetyp und verfolge Zero-Result-Rate, Suchabbruchrate, Klickrate und In-den-Warenkorb-Rate aus der Suche. Ergänze ein Offline-Set bewerteter Anfragen, in dem jede exakte Kennung auf Platz 1 stehen muss. Eine sinkende Zero-Result-Rate allein kann irrelevante Treffer verdecken, lies sie deshalb immer neben der Klickrate.",{"q":107,"a":108},"Kann ich semantische Suche in Spryker einbauen?","Ja. Spryker liefert Elasticsearch als Standardsuche aus und dokumentiert einen OpenSearch-Upgrade-Pfad, du kannst also beim Publish Vektorfelder zu den Suchdokumenten hinzufügen und die Suchabfrage um eine Vektor-Klausel erweitern. Ich würde das als Pilot hinter einem Feature-Flag bauen und mit der bestehenden Suche vergleichen.",[110,113,116,119,122,125,128,131,134,137,140,143,146],{"id":111,"title":112},"why-b2b-search-differs","Warum B2B-Suche keine Endkunden-Suche ist",{"id":114,"title":115},"architecture","Die Architektur: Spuren, Fusion, Rerank",{"id":117,"title":118},"exact-match-first","Artikelnummern und Exakt-Match kommen zuerst",{"id":120,"title":121},"hybrid-retrieval","Hybrid-Retrieval: BM25 plus Vektoren, per Rang fusioniert",{"id":123,"title":124},"filters-and-attributes","Attributbewusste Filter, und warum Zahlen Struktur brauchen",{"id":126,"title":127},"multilingual","Deutsch, Englisch und Ungarisch in einem Katalog",{"id":129,"title":130},"synonyms","Synonyme und Teilenummern bleiben wichtig",{"id":132,"title":133},"llm-query-understanding","Query Understanding mit einem LLM",{"id":135,"title":136},"reranking","Die Spitze der Liste neu ranken",{"id":138,"title":139},"evaluation","Evaluation: Zero Results, Abbrüche und ein bewertetes Set",{"id":141,"title":142},"spryker-integration","Integration in Spryker, Elasticsearch und OpenSearch",{"id":144,"title":145},"rollout-checklist","Eine Rollout-Checkliste",{"id":147,"title":148},"sources","Quellen",[150,154,157,160,168,171,254,257,258,261,270,273,276,277,280,283,308,315,316,323,334,337,344,347,348,355,358,361,362,365,372,375,376,383,386,387,401,408,435,438,439,446,453,454,457,505,508,511,512,523,526,529,532,533,536,555,558,559],{"type":151,"content":152},"paragraph",[153],"Ein Einkäufer beim Sanitärgroßhändler tippt „4711-32“. Ein zweiter tippt „Edelstahlschraube für Holz außen“. Ein dritter tippt „hex bolt M8x40 A2“. Alle drei nutzen dasselbe Suchfeld, und in den meisten B2B-Shops, die ich gesehen habe, bekommt mindestens einer von ihnen eine leere Seite.",{"type":151,"content":155},[156],"Semantische Suche verspricht, den zweiten und dritten Fall zu lösen. Das Risiko: Sie zerstört den ersten. Dieser Artikel zeigt, wie ich semantisches Retrieval in einen B2B-Katalog einbauen würde, ohne die exakte Artikelnummern-Suche zu verlieren: Architektur, Anfragetypen, Hybrid-Fusion, Filter, drei Sprachen, Synonyme, LLM-Query-Understanding, Reranking, Messung und was das für einen Spryker-Shop auf Elasticsearch oder OpenSearch bedeutet.",{"type":158,"level":159,"id":111,"text":112},"heading",2,{"type":151,"content":161},[162,163,167],"B2B-Anfragen sind heterogener als Endkunden-Anfragen. Einkäufer kopieren eine Artikelnummer aus einer Zeichnung, tippen eine Lieferantennummer aus einer alten Bestellung ab, kürzen Branchenjargon ab oder beschreiben einen Anwendungsfall. Baymard, das Endkunden-Shops vergleicht, unterscheidet ",{"tag":164,"href":36,"children":165},"a",[166],"acht Arten von Suchanfragen"," und fand, dass 56 % der getesteten Seiten die Suchbedürfnisse der Nutzer nicht ausreichend unterstützen. B2B-Kataloge bringen obendrein kennungs- und spezifikationslastige Daten mit.",{"type":151,"content":169},[170],"Praktische Folge: Keine einzelne Retrieval-Methode ist die richtige. Das ist die Taxonomie, mit der ich in Projekte starte. Die Beispiele sind erfunden, aber die Muster tauchen in echten Suchlogs auf.",{"type":172,"head":173,"rows":182},"table",[174,176,178,180],[175],"Anfragetyp",[177],"Beispiel",[179],"Bestes Retrieval",[181],"Typischer Fehler",[183,192,201,210,219,228,237,245],[184,186,188,190],[185],"Artikel- oder Teilenummer",[187],"„4711-32“, „4711 32“",[189],"Kennungs-Spur: normalisiert exakt, dann Präfix",[191],"Bindestriche und Leerzeichen brechen den Exakt-Match; ein Vektor-Zweig liefert Ähnliches",[193,195,197,199],[194],"Lieferantennummer, EAN",[196],"„4006381333931“",[198],"Kennungs-Spur auf eigenem Feld",[200],"Als Zahl gespeichert, führende Nullen weg",[202,204,206,208],[203],"Produkttyp",[205],"„Sechskantschraube“",[207],"Lexikalisch plus Vektor, Kategorie-Boost",[209],"Komposita und Plurale verfehlen die lexikalische Suche",[211,213,215,217],[212],"Spezifikation",[214],"„M8x40 A2 DIN 933“",[216],"In Filter zerlegt plus lexikalisch",[218],"Embeddings verwischen Zahlen und Einheiten",[220,222,224,226],[221],"Anwendungsfall",[223],"„Schraube für Holz außen“",[225],"Vektor plus Attributfilter",[227],"Lexikalische Suche liefert null Treffer",[229,231,233,235],[230],"Abkürzung oder Jargon",[232],"„VA Schraube“",[234],"Synonyme, dann Vektor",[236],"Abkürzung dem Analyzer unbekannt",[238,240,242,244],[239],"Sprachübergreifend",[241],"„hex bolt“ im deutschen Katalog",[243],"Mehrsprachiger Vektor plus Synonyme",[227],[246,248,250,252],[247],"Kein Produkt",[249],"„Lieferzeit“, „Datenblatt“",[251],"Auf Hilfe- oder CMS-Inhalte routen",[253],"Produktindex liefert zufällige Produkte",{"type":151,"content":255},[256],"Zähle, wie viele deiner echten Anfragen in welche Zeile fallen, bevor du dich für etwas entscheidest. In einem Katalog technischer Teile können die ersten beiden Zeilen einen großen Anteil ausmachen, und genau dort bringt semantische Suche nichts und kann schaden.",{"type":158,"level":159,"id":114,"text":115},{"type":151,"content":259},[260],"Mein Referenzdesign hat einen Einstiegspunkt und drei parallele Retrieval-Spuren. Ein günstiger Verstehensschritt normalisiert die Anfrage und erkennt, ob sie wie eine Kennung aussieht. Die Kennungs-Spur, eine lexikalische BM25-Abfrage und eine Vektor-kNN-Abfrage laufen alle unter denselben Filtern. Ihre Ranglisten werden fusioniert, ein Reranker sortiert nur die Spitze der Liste neu, und die Antwort enthält die Facetten, die der Shop braucht.",{"type":262,"attrs":263,"inner":267,"caption":268},"diagram",{"viewBox":264,"role":265,"aria-labelledby":266},"0 0 720 436","img","d1-sps-t d1-sps-d","\u003Ctitle id=\"d1-sps-t\">Hybride Produktsuche in Spuren\u003C\u002Ftitle>\u003Cdesc id=\"d1-sps-d\">Eine Anfrage läuft durch einen Verstehensschritt in drei parallele Spuren: Kennung, lexikalisches BM25 und Vektor-kNN, alle unter gemeinsamen Filtern. Die Ergebnisse werden per RRF fusioniert, neu gerankt und mit Facetten zurückgegeben. Such-Logs speisen Synonyme und ein bewertetes Anfrage-Set.\u003C\u002Fdesc>\u003Ctext x=\"20\" y=\"26\" class=\"d-title\">Hybride Produktsuche in Spuren\u003C\u002Ftext>\u003Ctext x=\"700\" y=\"26\" text-anchor=\"end\" class=\"d-label\">Architekturskizze\u003C\u002Ftext>\u003Crect x=\"20\" y=\"120\" width=\"100\" height=\"56\" rx=\"10\" class=\"d-sky\" \u002F>\u003Ctext x=\"70\" y=\"144\" text-anchor=\"middle\" class=\"d-text\">Anfrage\u003C\u002Ftext>\u003Ctext x=\"70\" y=\"163\" text-anchor=\"middle\" class=\"d-small\">getippter Text\u003C\u002Ftext>\u003Cpath d=\"M120 148 H132\" class=\"d-line\" \u002F>\u003Cpath d=\"M140 148 l-9 -5 v10 z\" class=\"d-head\" \u002F>\u003Crect x=\"140\" y=\"120\" width=\"140\" height=\"56\" rx=\"10\" class=\"d-accent\" \u002F>\u003Ctext x=\"210\" y=\"144\" text-anchor=\"middle\" class=\"d-text\">Verstehen\u003C\u002Ftext>\u003Ctext x=\"210\" y=\"163\" text-anchor=\"middle\" class=\"d-small\">normalisieren\u003C\u002Ftext>\u003Cpath d=\"M280 148 C298 148 292 68 312 68\" class=\"d-line\" \u002F>\u003Cpath d=\"M320 68 l-9 -5 v10 z\" class=\"d-head\" \u002F>\u003Crect x=\"320\" y=\"40\" width=\"180\" height=\"56\" rx=\"10\" class=\"d-mint\" \u002F>\u003Ctext x=\"410\" y=\"64\" text-anchor=\"middle\" class=\"d-text\">Kennungs-Spur\u003C\u002Ftext>\u003Ctext x=\"410\" y=\"83\" text-anchor=\"middle\" class=\"d-small\">exakt, dann Präfix\u003C\u002Ftext>\u003Cpath d=\"M500 68 C515 68 512 148 528 148\" class=\"d-line\" \u002F>\u003Cpath d=\"M280 148 C298 148 292 148 312 148\" class=\"d-line\" \u002F>\u003Cpath d=\"M320 148 l-9 -5 v10 z\" class=\"d-head\" \u002F>\u003Crect x=\"320\" y=\"120\" width=\"180\" height=\"56\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"410\" y=\"144\" text-anchor=\"middle\" class=\"d-text\">Lexikalisch BM25\u003C\u002Ftext>\u003Ctext x=\"410\" y=\"163\" text-anchor=\"middle\" class=\"d-small\">Text, Synonyme\u003C\u002Ftext>\u003Cpath d=\"M500 148 C515 148 512 148 528 148\" class=\"d-line\" \u002F>\u003Cpath d=\"M280 148 C298 148 292 228 312 228\" class=\"d-line\" \u002F>\u003Cpath d=\"M320 228 l-9 -5 v10 z\" class=\"d-head\" \u002F>\u003Crect x=\"320\" y=\"200\" width=\"180\" height=\"56\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"410\" y=\"224\" text-anchor=\"middle\" class=\"d-text\">Vektor-kNN\u003C\u002Ftext>\u003Ctext x=\"410\" y=\"243\" text-anchor=\"middle\" class=\"d-small\">mehrsprachig\u003C\u002Ftext>\u003Cpath d=\"M500 228 C515 228 512 148 528 148\" class=\"d-line\" \u002F>\u003Cpath d=\"M536 148 l-9 -5 v10 z\" class=\"d-head\" \u002F>\u003Crect x=\"536\" y=\"120\" width=\"164\" height=\"56\" rx=\"10\" class=\"d-accent\" \u002F>\u003Ctext x=\"618\" y=\"144\" text-anchor=\"middle\" class=\"d-text\">Fusion (RRF)\u003C\u002Ftext>\u003Ctext x=\"618\" y=\"163\" text-anchor=\"middle\" class=\"d-small\">Ränge, keine Scores\u003C\u002Ftext>\u003Cpath d=\"M618 176 V198\" class=\"d-line\" \u002F>\u003Cpath d=\"M618 206 l-5 -9 h10 z\" class=\"d-head\" \u002F>\u003Crect x=\"536\" y=\"206\" width=\"164\" height=\"56\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"618\" y=\"230\" text-anchor=\"middle\" class=\"d-text\">Rerank Top N\u003C\u002Ftext>\u003Ctext x=\"618\" y=\"249\" text-anchor=\"middle\" class=\"d-small\">Cross-Encoder\u003C\u002Ftext>\u003Cpath d=\"M618 262 V284\" class=\"d-line\" \u002F>\u003Cpath d=\"M618 292 l-5 -9 h10 z\" class=\"d-head\" \u002F>\u003Crect x=\"536\" y=\"292\" width=\"164\" height=\"56\" rx=\"10\" class=\"d-mint\" \u002F>\u003Ctext x=\"618\" y=\"316\" text-anchor=\"middle\" class=\"d-text\">Ergebnis + Facetten\u003C\u002Ftext>\u003Ctext x=\"618\" y=\"335\" text-anchor=\"middle\" class=\"d-small\">zurück in den Shop\u003C\u002Ftext>\u003Crect x=\"320\" y=\"292\" width=\"180\" height=\"56\" rx=\"10\" class=\"d-gold\" \u002F>\u003Ctext x=\"410\" y=\"316\" text-anchor=\"middle\" class=\"d-text\">Pre-Filter\u003C\u002Ftext>\u003Ctext x=\"410\" y=\"335\" text-anchor=\"middle\" class=\"d-small\">Sortiment, Bestand\u003C\u002Ftext>\u003Crect x=\"20\" y=\"376\" width=\"680\" height=\"40\" rx=\"10\" class=\"d-box d-dash\" \u002F>\u003Ctext x=\"360\" y=\"401\" text-anchor=\"middle\" class=\"d-small\">Such-Logs: Zero Results, Abbrüche, Klicks speisen Synonyme und das bewertete Set\u003C\u002Ftext>",[269],"Kennungstreffer gewinnen direkt, die anderen Spuren konkurrieren über die Fusion, und jede Spur beachtet dieselben Filter.",{"type":151,"content":271},[272],"Zwei Designentscheidungen tragen das meiste Gewicht. Erstens: Die Kennungs-Spur ist kein Feature der lexikalischen Spur, sondern eine eigene Abfrage auf eigenen Feldern, und ihre Treffer können den Rest kurzschließen. Zweitens: Die Filter sitzen vor allen Spuren, weil sie im B2B nicht bloß Facetten sind, sondern Berechtigungen.",{"type":151,"content":274},[275],"Als Engine funktionieren Elasticsearch und OpenSearch gleichermaßen. Beide unterstützen BM25, approximatives kNN und Rank-Fusion. Ich würde nehmen, was deine Plattform ohnehin betreibt, und keine zweite Suchmaschine einführen, bevor du der ersten entwachsen bist.",{"type":158,"level":159,"id":117,"text":118},{"type":151,"content":278},[279],"Der billigste Weg, eine B2B-Suche zu ruinieren, ist, ein semantisches Modell entscheiden zu lassen, wie ähnlich sich zwei Teilenummern sind. Für ein Embedding sind „4711-32“ und „4711-33“ fast identisch, für einen Einkäufer sind es zwei verschiedene Teile. Deshalb bekommen Kennungen eine eigene Behandlung.",{"type":151,"content":281},[282],"Das gehört in meine Kennungs-Spur:",{"type":284,"ordered":285,"items":286},"list",false,[287,293,298,303],[288,292],{"tag":289,"children":290},"strong",[291],"Eigene Keyword-Felder"," für Artikelnummer, Herstellernummer, Lieferantennummer, kundenspezifische Nummer und EAN, immer als Strings gespeichert.",[294,297],{"tag":289,"children":295},[296],"Ein Normalizer",", der beim Indexieren und bei der Anfrage klein schreibt und Bindestriche, Punkte, Schrägstriche und Leerzeichen entfernt, sodass „4711-32“, „4711 32“ und „471132“ in derselben Form zusammentreffen.",[299,302],{"tag":289,"children":300},[301],"Erst exakt, dann Präfix."," Ein vollständiger Treffer steht über einem Präfix-Treffer, sodass ein Einkäufer, der die ersten Ziffern tippt, Kandidaten sieht, während eine vollständige Nummer genau ein Produkt findet.",[304,307],{"tag":289,"children":305},[306],"Ein Kurzschluss."," Ist die normalisierte Anfrage ein exakter Kennungstreffer, liefere ihn aus, ohne auf den Vektor-Zweig oder den Reranker zu warten.",{"type":151,"content":309},[310,311,314],"Vorsicht bei Analyzern, die Tokens für dich zerlegen. Der ",{"tag":164,"href":48,"children":312},[313],"Word-Delimiter-Graph-Filter"," von Elasticsearch kann an Buchstaben-Zahlen-Übergängen trennen, aus „XL500“ werden dann „XL“ und „500“. Das hilft beim Freitext-Match auf Modellnamen und schadet bei Kennungen, ein weiterer Grund, sie in separaten Feldern mit eigener Analyse zu halten.",{"type":158,"level":159,"id":120,"text":121},{"type":151,"content":317},[318,319,322],"Lexikalische Suche ist präzise bei Wörtern, die sie kennt. Vektorsuche findet Bedeutung über Wörter hinweg, die nie zusammen vorkamen. Elastic beschreibt ",{"tag":164,"href":39,"children":320},[321],"Hybridsuche"," als oft deutlich besser als die Summe beider Teile und nennt zwei Fusionsverfahren: eine Konvexkombination normalisierter Scores und Reciprocal Rank Fusion (RRF), die die Position in jeder Liste nutzt und deshalb keine Score-Normalisierung braucht.",{"type":151,"content":324},[325,326,329,330,333],"Ich starte mit RRF. BM25-Scores und Vektorähnlichkeiten liegen auf unterschiedlichen Skalen, und eine gewichtete Summe braucht eine Normalisierung, die leicht falsch wird und sich mit dem Katalog verschiebt. RRF addiert pro Liste 1\u002F(k + Rang), die Skalen müssen also nie zusammenpassen. OpenSearch bietet dieselbe Idee über den ",{"tag":164,"href":54,"children":327},[328],"Score-Ranker-Prozessor",", eingeführt in 2.19, mit einer Rank-Konstante zwischen 1 und 10.000: Eine größere Konstante glättet den Einfluss der Spitzenränge, eine kleinere bevorzugt sie. Dazu gibt es einen ",{"tag":164,"href":57,"children":331},[332],"Normalization-Prozessor"," mit den Verfahren Min-Max, L2 und Z-Score, falls du score-basierte Fusion bevorzugst.",{"type":151,"content":335},[336],"Tune zwei Dinge, sobald die erste Version läuft: das Rank-Fenster (wie viele Kandidaten jede Spur beisteuert) und das Gewicht je Spur. Beides sind günstige Experimente gegen ein bewertetes Anfrage-Set, auf das ich im Abschnitt zur Evaluation zurückkomme.",{"type":338,"variant":339,"title":340,"body":341},"callout","warn","Prüfe Lizenz und Version, bevor du dich festlegst",[342],[343],"Als Elastic seinen Hybridsuche-Artikel veröffentlichte, brauchte RRF-Ranking eine kommerzielle Lizenz (Enterprise), mit verfügbarer Testphase. Lizenzen und Funktionen ändern sich, prüfe also die aktuellen Bedingungen für deine Elasticsearch-Version. Auf OpenSearch braucht der RRF-Prozessor 2.19 oder neuer, was zählt, wenn dein Cluster alt ist.",{"type":151,"content":345},[346],"Ein Fehlermodus verdient eine eigene Warnung. Bei einer exakten Kennungsanfrage liefert der Vektor-Zweig trotzdem etwas, und die Fusion kann einen Beinahe-Treffer über das richtige Teil schieben. Deshalb schließt die Kennungs-Spur kurz, und deshalb muss das bewertete Set Kennungsanfragen enthalten, die Platz 1 prüfen.",{"type":158,"level":159,"id":123,"text":124},{"type":151,"content":349},[350,351,354],"Filter sind im B2B keine Kosmetik. Ein Einkäufer darf nur sein verhandeltes Sortiment, seine Preisliste und das sehen, was an seine Adresse geliefert wird. Filterst du nach der Vektorsuche, fragst du nach den zehn nächsten Produkten und wirfst dann die weg, die der Kunde nicht kaufen darf, was eine kurze oder leere Liste hinterlässt. Die ",{"tag":164,"href":42,"children":352},[353],"kNN-Query"," von Elasticsearch dokumentiert den Unterschied: Ein Pre-Filter wird während der approximativen Suche angewendet, sodass k passende Dokumente zurückkommen, ein Post-Filter läuft danach und kann weniger als k Ergebnisse liefern, obwohl genug Treffer existieren.",{"type":151,"content":356},[357],"Sortiment, Verfügbarkeit, Sprache und Sichtbarkeit gehören deshalb als Pre-Filter in jede Spur. Ich behandle das als Sicherheitseigenschaft, nicht als Relevanzdetail: Eine Vektor-Spur ohne Berechtigungsfilter kann Produkte zeigen, die ein Kunde nicht sehen darf.",{"type":151,"content":359},[360],"Embeddings sind schwach bei Zahlen und Einheiten. „M8x40“ und „M8x50“ liegen fast gleich im Vektorraum, und „1,5 Zoll“ und „38 mm“ haben wenig gemeinsam. Bei Spezifikationen zerlege ich die Anfrage in strukturierte Attribute (Gewindegröße, Länge, Material, Norm) und wende sie als Filter oder Boosts auf die Attributfelder an, die dein PIM ohnehin pflegt. Der Vektor-Zweig übernimmt dann den unscharfen Teil des Satzes, Anwendungsfall und Produkttyp, und die Attribute den exakten Teil.",{"type":158,"level":159,"id":126,"text":127},{"type":151,"content":363},[364],"Ein mehrsprachiger Katalog bringt dir drei getrennte Probleme. Deutsch bildet lange Komposita, „Sechskantschraube“ muss „Schraube“ lexikalisch also nicht treffen. Ungarisch ist stark flektiert, die Form, die der Einkäufer tippt, entspricht daher oft nicht der Form im Produkttext. Englische Anfragen gegen einen deutschen Katalog liefern lexikalisch nichts, weil kein Wort gemeinsam ist.",{"type":151,"content":366},[367,368,371],"Mein Ansatz kombiniert beide Welten. Die lexikalische Analyse läuft pro Sprache, mit dem Stemming und der Kompositabehandlung, die jede Sprache braucht, auf getrennten Feldern je Locale. Der Vektor-Zweig nutzt ein mehrsprachiges Modell, damit eine Anfrage in einer Sprache ein Produkt finden kann, das in einer anderen beschrieben ist. Das ",{"tag":164,"href":69,"children":369},[370],"BGE-M3-Paper"," beschreibt ein solches Modell, mit semantischem Retrieval in mehr als 100 Arbeitssprachen und Eingaben bis 8.192 Tokens. Ich würde trotzdem zwei oder drei Kandidaten mit eigenen Anfragen vergleichen, denn Katalogvokabular ist weit von allgemeinem Text entfernt.",{"type":151,"content":373},[374],"Zwei praktische Regeln. Embedde den Text, den ein Einkäufer wiedererkennt, also Titel, Schlüsselattribute und eine kurze Beschreibung, nicht das ganze Datenblatt. Und berichte jede Metrik je Sprache, weil ein Durchschnitt über drei Sprachen die eine versteckt, in der die Suche kaputt ist.",{"type":158,"level":159,"id":129,"text":130},{"type":151,"content":377},[378,379,382],"Vektoren machen Synonyme nicht überflüssig, sie verringern nur den Bedarf. Branchenkürzel, Markenkurzformen, alte und neue Produktnamen und Lieferantennummern lassen sich weiterhin am besten über explizite Regeln lösen, weil du sie lesen, testen und zurücknehmen kannst. Der ",{"tag":164,"href":51,"children":380},[381],"Synonym-Graph-Filter"," von Elasticsearch ist nur für Such-Analyzer gedacht, kann als updateable markiert ohne Reindexierung neu geladen werden und bezieht Regeln aus verwalteten Synonym-Sets (standardmäßig bis zu 100.000 Regeln je Set).",{"type":151,"content":384},[385],"Die beste Quelle für Synonyme ist dein eigenes Zero-Result-Log. Prüfe wöchentlich die häufigsten fehlschlagenden Anfragen, entscheide, ob es ein fehlendes Synonym, ein fehlendes Produkt oder eine Anfrage nach etwas ist, das du nicht verkaufst, und halte die Entscheidung fest. Dieses kleine Ritual ist mehr wert als jedes Modell-Upgrade und gibt dem Vektor-Zweig eine saubere Basislinie zum Schlagen.",{"type":158,"level":159,"id":132,"text":133},{"type":151,"content":388},[389,390,395,396,400],"Ein LLM ist gut im Schritt in der Mitte: „Edelstahl-Sechskantschraube 8 mal 40 für draußen“ in eine strukturierte Abfrage mit Produkttyp, Material, Gewindegröße, Länge und Sprache zu verwandeln. Als Suchmaschine taugt es schlecht. Ich nutze es als Parser mit striktem Ausgabeschema (siehe meine Beiträge zu ",{"tag":391,"to":392,"children":393},"link","\u002Fblog\u002Fjev-typed-decisions-llm-routing",[394],"typisierten Entscheidungen"," und zum ",{"tag":391,"to":397,"children":398},"\u002Fblog\u002Fllm-evals-for-product-features",[399],"Evaluieren von LLM-Features",") und für nichts anderes.",{"type":151,"content":402},[403,404,407],"Instacarts Bericht über den ",{"tag":164,"href":66,"children":405},[406],"Umbau des Query Understanding mit LLMs"," ist eine nützliche Referenz für das Muster. Sie haben die Katalog-Taxonomie in Prompts eingespeist, Guardrails ergänzt, die Ausgaben per semantischer Ähnlichkeit prüfen, und das Ergebnis in ein kleineres, feinabgestimmtes Modell destilliert. Häufige Anfragen kamen aus einem Offline-Cache, nur der seltene Tail ging an ein Echtzeit-Modell, womit ein Latenzziel von 300 ms erreicht wurde. Das ist ein Endkunden-Lebensmittelfall, aber die Form lässt sich auf B2B übertragen.",{"type":284,"ordered":285,"items":409},[410,415,420,430],[411,414],{"tag":289,"children":412},[413],"Gegen den Katalog validieren."," Liefert das LLM ein Material, einen Attributwert oder eine Teilenummer, die in deinen Daten nicht existiert, wirf sie weg. Lass es niemals Kennungen erfinden.",[416,419],{"tag":289,"children":417},[418],"Häufige Anfragen cachen."," B2B-Anfrageverteilungen haben einen kurzen Kopf, ein nächtlicher Batch über die Top-Anfragen entfernt die meisten Echtzeit-Aufrufe.",[421,424,425,429],{"tag":289,"children":422},[423],"Latenzbudget und Fallback festlegen."," Ist der Parser spät oder fällt aus, läuft die einfache Hybrid-Abfrage. Die Suche darf nie ausfallen, weil ein Modell langsam ist. Siehe ",{"tag":391,"to":426,"children":427},"\u002Fblog\u002Fllm-cost-latency-prompt-caching-routing",[428],"Kosten- und Latenz-Routing",".",[431,434],{"tag":289,"children":432},[433],"Von Kennungen fernhalten."," Hat die Kennungs-Spur einen exakten Treffer, wird der Parser gar nicht erst gerufen.",{"type":151,"content":436},[437],"Behandle die geparsten Felder als Hinweise, nicht als Wahrheit. Ein Boost auf ein geparstes Attribut verzeiht Fehler, ein harter Filter auf ein falsch geparstes Attribut erzeugt eine Seite ohne Treffer. Ich starte deshalb mit Boosts und mache ein Attribut erst zum Filter, wenn seine Parse-Genauigkeit belegt ist.",{"type":158,"level":159,"id":135,"text":136},{"type":151,"content":440},[441,442,445],"Die Fusion liefert eine ordentliche Liste, ein Reranker macht die ersten zehn besser. Die Doku zum ",{"tag":164,"href":45,"children":443},[444],"Semantic Reranking"," von Elastic erklärt den Trade-off: Ein Cross-Encoder liest Anfrage und Dokument gemeinsam und beurteilt Relevanz besser, zum Preis größerer Modelle, höherer Latenz und mehr Rechenaufwand. Deshalb läuft er auf einem Kandidatenfenster (der Rank-Window-Größe) statt auf der gesamten Ergebnismenge, und deshalb bietet die Dokumentation Wege, die gesendeten Tokens zu begrenzen, da lange Dokumente abgeschnitten werden können, bevor sie das Modell erreichen.",{"type":151,"content":447},[448,449,429],"Ich würde ihn nur auf Nicht-Kennungsanfragen anwenden, vielleicht die Top 50 bis 100 Kandidaten neu ranken und einen kurzen Produkttext senden, nicht das Datenblatt. Danach kommen Geschäftssignale: Verfügbarkeit, frühere Bestellungen des Kunden, bevorzugte Lieferanten. Das allgemeine Muster aus Retrieval und Rerank vertieft mein ",{"tag":391,"to":450,"children":451},"\u002Fblog\u002Frag-pipeline-chunking-hybrid-search-reranking",[452],"RAG-Pipeline-Artikel",{"type":158,"level":159,"id":138,"text":139},{"type":151,"content":455},[456],"Ohne Messung ist semantische Suche eine Demo. Ich verfolge eine kleine Menge von Suchmetriken, immer nach Anfragetyp und Sprache aufgeteilt.",{"type":172,"head":458,"rows":465},[459,461,463],[460],"Metrik",[462],"Was sie dir sagt",[464],"Falle",[466,477,484,491,498],[467,469,475],[468],"Zero-Result-Rate",[470,471,474],"Anteil der Suchen ohne Treffer; Analytics-Tools wie ",{"tag":164,"href":72,"children":472},[473],"Algolia"," melden sie als No Results Rate",[476],"Semantische Suche senkt sie, indem sie Unsinn liefert; lies sie zusammen mit der Klickrate",[478,480,482],[479],"Suchabbruchrate",[481],"Anteil der Suchen, nach denen der Besucher geht (meine Definition: kein Klick, keine Verfeinerung, Sitzung endet)",[483],"Braucht eigenes Event-Tracking; Bots und Lesezeichen erzeugen Rauschen",[485,487,489],[486],"Klickrate",[488],"Anteil der Suchen mit mindestens einem Klick auf ein Ergebnis",[490],"Positions-Bias: Ein besserer Top-Treffer hebt sie, ein schlechter versteckt sich unter der Falz",[492,494,496],[493],"Reformulierungsrate",[495],"Anteil der Suchen, auf die in derselben Sitzung eine weitere Anfrage folgt",[497],"Etwas Reformulierung ist gesunde Verfeinerung",[499,501,503],[500],"Rang-1-Genauigkeit bei Kennungen",[502],"Bewertetes Set: Steht das exakte Teil an erster Stelle",[504],"Muss bei 100 % bleiben; jeder Rückgang ist eine Regression",{"type":151,"content":506},[507],"Das bewertete Set überspringen die meisten Teams. Ich nehme einige hundert echte Anfragen aus den Logs, geschichtet nach den Anfragetypen der ersten Tabelle, und halte fest, welche Produkte richtig sind. Kennungsanfragen prüfen exakt Rang 1, beschreibende Anfragen prüfen, dass ein relevantes Produkt in den Top Ten steht. Lass es bei jeder Änderung an Analyzern, Synonymen, Embeddings oder Fusion-Einstellungen laufen, möglichst in der CI.",{"type":151,"content":509},[510],"Danach folgt ein A\u002FB-Test mit Live-Traffic, der Klickrate, In-den-Warenkorb-Rate aus der Suche und Suchabbruchrate je Anfragetyp vergleicht. Eine Anfrage ohne Treffer ist manchmal korrekt, weil das Teil nicht im Sortiment ist. Jage die Rate also nicht gegen null, sondern die Zahl der Zero-Result-Anfragen, die etwas hätten finden sollen.",{"type":158,"level":159,"id":141,"text":142},{"type":151,"content":513},[514,515,518,519,522],"Spryker wird ",{"tag":164,"href":60,"children":516},[517],"mit Elasticsearch als Standardsuche ausgeliefert"," und indexiert Produktname, Beschreibung und SKU, Produktattribute, Bewertungen und CMS-Seiten. Die Dokumentation beschreibt außerdem Drittanbieter-Integrationen für die Suche und ein Tutorial zur Integration beliebiger Suchmaschinen sowie ",{"tag":164,"href":63,"children":520},[521],"einen Migrationspfad für OpenSearch"," von 1.3 über 2.19 auf 3.5. Dieses Upgrade ist hier relevant, weil Hybrid-Fusion in OpenSearch eine aktuelle Version braucht.",{"type":151,"content":524},[525],"Meine vorgeschlagene Integration ist ein Designvorschlag und kein Spryker-Feature und hat vier Schritte. Berechne ein Embedding je Abstract-Produkt und Locale im Publish-and-Sync-Ablauf, der die Suchdokumente baut, und speichere es in einem Vektorfeld neben den Textfeldern. Erweitere die Suchabfrage so, dass sie Kennungs-, lexikalische und Vektor-Klausel unter den bestehenden Filtern des Shops absetzt, und fusioniere sie mit RRF. Setze den LLM-Parser davor, hinter einem Timeout. Und verpacke alles in ein Feature-Flag je Store und Locale.",{"type":151,"content":527},[528],"Zwei Vorbehalte aus der Erfahrung mit diesen Plattformen. Vektoren vergrößern den Index und verlängern die Publish-Zeit, plane den Cluster also entsprechend und embedde nur neu, wenn sich der eingebettete Text ändert. Und behalte die bestehende Suche als Fallback-Pfad: Ist die Vektor-Spur nicht erreichbar, soll der Shop weiter über die lexikalische und die Kennungs-Spur antworten.",{"type":151,"content":530},[531],"Baust du neu, ist ein gehostetes Suchprodukt eine Alternative, und Spryker dokumentiert Integrationen für diesen Weg. Von jedem Anbieter würde ich trotzdem dieselben vier Dinge verlangen: Kennungsbehandlung, Berechtigungs-Pre-Filter, Metriken je Sprache und eine Möglichkeit, dein bewertetes Set laufen zu lassen.",{"type":158,"level":159,"id":144,"text":145},{"type":151,"content":534},[535],"In dieser Reihenfolge würde ich arbeiten.",{"type":284,"ordered":537,"items":538},true,[539,541,543,545,547,549,551,553],[540],"Exportiere drei Monate Such-Logs und klassifiziere die Anfragen in die Typen der ersten Tabelle. Zähle sie.",[542],"Baue das bewertete Set mit Kennungsanfragen, die Rang 1 prüfen, und miss die aktuelle Suche als Basislinie.",[544],"Behebe die lexikalischen Grundlagen: Kennungsfelder mit Normalizer, Analyzer je Sprache, ein gepflegtes Synonym-Set.",[546],"Füge die Vektor-Spur mit mehrsprachigem Modell, Berechtigungs-Pre-Filtern und RRF-Fusion hinter einem Feature-Flag hinzu.",[548],"Schließe Kennungstreffer kurz, sodass Vektor-Zweig und Reranker sie nie anfassen.",[550],"Ergänze den LLM-Parser mit Schema-Validierung, Offline-Cache für häufige Anfragen, Timeout und Boost-zuerst-Regel.",[552],"Ergänze einen Reranker auf einem kleinen Fenster für Nicht-Kennungsanfragen und prüfe die Latenz bei p95.",[554],"Fahre einen A\u002FB-Test, vergleiche die Metriken je Anfragetyp und Sprache und prüfe das Zero-Result-Log wöchentlich.",{"type":151,"content":556},[557],"Der größte Gewinn in diesen Projekten kommt aus den Schritten 3 und 4, nicht vom modischsten Modell, und das Vertrauen schafft Schritt 2. Mach die Kennungs-Spur zuerst langweilig zuverlässig, dann fühlt sich semantische Suche wie ein Upgrade an statt wie ein Risiko.",{"type":158,"level":159,"id":147,"text":148},{"type":284,"ordered":537,"items":560},[561,564,567,570,573,576,579,582,585,588,591,594,597],[562],{"tag":164,"href":36,"children":563},[35],[565],{"tag":164,"href":39,"children":566},[38],[568],{"tag":164,"href":42,"children":569},[41],[571],{"tag":164,"href":45,"children":572},[44],[574],{"tag":164,"href":48,"children":575},[47],[577],{"tag":164,"href":51,"children":578},[50],[580],{"tag":164,"href":54,"children":581},[53],[583],{"tag":164,"href":57,"children":584},[56],[586],{"tag":164,"href":60,"children":587},[59],[589],{"tag":164,"href":63,"children":590},[62],[592],{"tag":164,"href":66,"children":593},[65],[595],{"tag":164,"href":69,"children":596},[68],[598],{"tag":164,"href":72,"children":599},[71],[601,677,759,826],{"slug":602,"published":5,"minutes":6,"category":7,"tags":603,"keywords":609,"about":620,"sources":630,"cover":670,"og":671,"expertise":672,"locales":673,"lang":78,"title":674,"description":675,"coverAlt":676},"llm-hallucination-grounding-citations",[604,605,606,607,608],"Hallucinations","RAG","Citations","Grounding","Faithfulness",[610,611,612,613,614,615,616,617,618,619],"reduce LLM hallucinations in production","how to reduce hallucinations in RAG","LLM citations API","Anthropic citations API","RAG faithfulness metric","LLM abstention I don't know","claim-level verification LLM","grounding LLM answers in sources","check grounding API","show sources in AI chatbot UI",[621,624,627],{"name":622,"url":623},"Hallucination (artificial intelligence)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHallucination_(artificial_intelligence)",{"name":625,"url":626},"Retrieval-augmented generation","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRetrieval-augmented_generation",{"name":628,"url":629},"Large language model","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLarge_language_model",[631,634,637,640,643,646,649,652,655,658,661,664,667],{"title":632,"url":633},"Anthropic: Citations (Claude API documentation)","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fcitations",{"title":635,"url":636},"Anthropic: Search results (Claude API documentation)","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fsearch-results",{"title":638,"url":639},"Anthropic: Reduce hallucinations (Claude API documentation)","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Ftest-and-evaluate\u002Fstrengthen-guardrails\u002Freduce-hallucinations",{"title":641,"url":642},"Anthropic: Introducing Citations on the Anthropic API","https:\u002F\u002Fclaude.com\u002Fblog\u002Fintroducing-citations-api",{"title":644,"url":645},"Simon Willison: Anthropic's new Citations API (24 January 2025)","https:\u002F\u002Fsimonwillison.net\u002F2025\u002FJan\u002F24\u002Fanthropics-new-citations-api\u002F",{"title":647,"url":648},"OpenAI: Web search guide (url_citation annotations and display requirement)","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Ftools-web-search",{"title":650,"url":651},"Cohere: Documents and citations","https:\u002F\u002Fdocs.cohere.com\u002Fdocs\u002Fdocuments-and-citations",{"title":653,"url":654},"Google Cloud: Check grounding API","https:\u002F\u002Fdocs.cloud.google.com\u002Fgenerative-ai-app-builder\u002Fdocs\u002Fcheck-grounding",{"title":656,"url":657},"AWS: Amazon Bedrock Guardrails contextual grounding check","https:\u002F\u002Fdocs.aws.amazon.com\u002Fbedrock\u002Flatest\u002Fuserguide\u002Fguardrails-contextual-grounding-check.html",{"title":659,"url":660},"Ragas: Faithfulness metric","https:\u002F\u002Fdocs.ragas.io\u002Fen\u002Fstable\u002Fconcepts\u002Fmetrics\u002Favailable_metrics\u002Ffaithfulness\u002F",{"title":662,"url":663},"Kalai, Nachum, Vempala, Zhang: Why Language Models Hallucinate (arXiv 2509.04664)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2509.04664",{"title":665,"url":666},"Magesh et al.: Hallucination-Free? Assessing the Reliability of Leading AI Legal Research Tools (arXiv 2405.20362)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2405.20362",{"title":668,"url":669},"Wallat, Heuss, de Rijke, Anand: Correctness is not Faithfulness in RAG Attributions (arXiv 2412.18004)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2412.18004","\u002Fimages\u002Fblog\u002Fllm-hallucination-grounding-citations\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fllm-hallucination-grounding-citations\u002Fog.jpg","ai-engineer",[77,78,79],"LLM-Halluzinationen in Produktion reduzieren: Grounding, Zitate und das Nein zur richtigen Zeit","Halluzinationen im produktiven RAG senken: Zitier-APIs, Abstention, Claim-Prüfung, Faithfulness-Metriken, Quellen-UI und die Fehler, die trotzdem durchrutschen.","Diagramm: Ein Retrieval-Schritt speist ein Evidenz-Gate, eine Antwort mit Zitaten und einen Claim-Prüfer und endet in einer Antwort mit Quellen; Pfade für Abstention und Markierung zweigen ab.",{"slug":678,"published":5,"minutes":6,"category":7,"tags":679,"keywords":683,"about":694,"sources":702,"cover":753,"og":754,"expertise":672,"locales":755,"lang":78,"title":756,"description":757,"coverAlt":758},"pgvector-vs-vector-databases",[680,681,605,10,682],"pgvector","Vector databases","EU hosting",[684,685,686,687,688,689,690,691,692,693],"pgvector vs vector database","pgvector vs Qdrant","pgvector vs Pinecone","best vector database 2026","pgvector HNSW iterative scan","pgvector halfvec","OpenSearch vs Elasticsearch vector search","vector database EU hosting","hybrid search Postgres","Weaviate vs Milvus",[695,698,701],{"name":696,"url":697},"Vector database","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FVector_database",{"name":699,"url":700},"PostgreSQL","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPostgreSQL",{"name":625,"url":626},[703,706,709,712,715,718,721,724,727,730,733,736,739,742,745,748,750],{"title":704,"url":705},"pgvector README (index limits, HNSW defaults, iterative scans, filtering, halfvec)","https:\u002F\u002Fgithub.com\u002Fpgvector\u002Fpgvector\u002Fblob\u002Fmaster\u002FREADME.md",{"title":707,"url":708},"pgvector CHANGELOG (0.4.0 to 0.8.7)","https:\u002F\u002Fgithub.com\u002Fpgvector\u002Fpgvector\u002Fblob\u002Fmaster\u002FCHANGELOG.md",{"title":710,"url":711},"pgvectorscale: StreamingDiskANN, statistical binary quantization, filtered search","https:\u002F\u002Fgithub.com\u002Ftimescale\u002Fpgvectorscale",{"title":713,"url":714},"Qdrant documentation: Filtering","https:\u002F\u002Fqdrant.tech\u002Fdocumentation\u002Fconcepts\u002Ffiltering\u002F",{"title":716,"url":717},"Qdrant documentation: Hybrid queries","https:\u002F\u002Fqdrant.tech\u002Fdocumentation\u002Fconcepts\u002Fhybrid-queries\u002F",{"title":719,"url":720},"Qdrant documentation: Create a cluster (providers, free tier, Hybrid Cloud)","https:\u002F\u002Fqdrant.tech\u002Fdocumentation\u002Fcloud\u002Fcreate-cluster\u002F",{"title":722,"url":723},"Weaviate documentation: Hybrid search","https:\u002F\u002Fdocs.weaviate.io\u002Fweaviate\u002Fconcepts\u002Fsearch\u002Fhybrid-search",{"title":725,"url":726},"Weaviate documentation: Vector index types","https:\u002F\u002Fdocs.weaviate.io\u002Fweaviate\u002Fconcepts\u002Fvector-index",{"title":728,"url":729},"Weaviate Cloud pricing and deployment options","https:\u002F\u002Fweaviate.io\u002Fpricing",{"title":731,"url":732},"Milvus documentation: Overview","https:\u002F\u002Fmilvus.io\u002Fdocs\u002Foverview.md",{"title":734,"url":735},"Pinecone documentation: Database architecture","https:\u002F\u002Fdocs.pinecone.io\u002Fguides\u002Fget-started\u002Fdatabase-architecture",{"title":737,"url":738},"Pinecone documentation: Create an index (clouds, regions, sparse and hybrid)","https:\u002F\u002Fdocs.pinecone.io\u002Fguides\u002Findex-data\u002Fcreate-an-index",{"title":740,"url":741},"OpenSearch documentation: Methods and engines","https:\u002F\u002Fdocs.opensearch.org\u002Flatest\u002Fmappings\u002Fsupported-field-types\u002Fknn-methods-engines\u002F",{"title":743,"url":744},"OpenSearch documentation: Efficient k-NN filtering","https:\u002F\u002Fdocs.opensearch.org\u002Flatest\u002Fvector-search\u002Ffilter-search-knn\u002Fefficient-knn-filtering\u002F",{"title":746,"url":747},"Elasticsearch documentation: Dense vector search","https:\u002F\u002Fwww.elastic.co\u002Fdocs\u002Fsolutions\u002Fsearch\u002Fvector\u002Fdense-vector",{"title":749,"url":42},"Elasticsearch documentation: kNN query (filter as pre-filter)",{"title":751,"url":752},"GitHub releases: Qdrant, Weaviate, Milvus, OpenSearch, pgvectorscale (versions as of 1 October 2026)","https:\u002F\u002Fgithub.com\u002Fqdrant\u002Fqdrant\u002Freleases","\u002Fimages\u002Fblog\u002Fpgvector-vs-vector-databases\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fpgvector-vs-vector-databases\u002Fog.jpg",[77,78,79],"pgvector oder Vektordatenbank? So wählst du 2026 den Vektorspeicher","pgvector, Qdrant, Weaviate, Milvus, Pinecone, OpenSearch oder Elasticsearch? Ein praktischer Leitfaden 2026 zu Filtern, Hybridsuche, Skalierung, Kosten und EU-Hosting.","Diagramm: ein Entscheidungspfad von deinen Daten zu pgvector in Postgres, einer Suchmaschine mit Vektorfeldern oder einer dedizierten Vektordatenbank.",{"slug":760,"published":5,"minutes":6,"category":7,"tags":761,"keywords":765,"about":775,"sources":783,"cover":820,"og":821,"expertise":672,"locales":822,"lang":78,"title":823,"description":824,"coverAlt":825},"graphrag-knowledge-graph-rag",[762,763,764,605],"GraphRAG","Knowledge graphs","LightRAG",[762,766,767,768,769,770,771,772,773,774],"knowledge graph RAG","GraphRAG vs vector RAG","Microsoft GraphRAG explained","LightRAG vs GraphRAG","GraphRAG global vs local search","GraphRAG indexing cost","when to use GraphRAG","multi-hop RAG","LazyGraphRAG",[776,779,780],{"name":777,"url":778},"Knowledge graph","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FKnowledge_graph",{"name":625,"url":626},{"name":781,"url":782},"Leiden algorithm","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLeiden_algorithm",[784,787,790,793,796,799,802,805,808,811,814,817],{"title":785,"url":786},"Edge et al.: From Local to Global: A Graph RAG Approach to Query-Focused Summarization (arXiv:2404.16130)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2404.16130",{"title":788,"url":789},"Microsoft GraphRAG documentation: overview","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002F",{"title":791,"url":792},"Microsoft GraphRAG documentation: default dataflow","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Findex\u002Fdefault_dataflow\u002F",{"title":794,"url":795},"Microsoft GraphRAG documentation: global search","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fquery\u002Fglobal_search\u002F",{"title":797,"url":798},"Microsoft GraphRAG documentation: local search","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fquery\u002Flocal_search\u002F",{"title":800,"url":801},"Microsoft GraphRAG documentation: DRIFT search","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fquery\u002Fdrift_search\u002F",{"title":803,"url":804},"Microsoft GraphRAG documentation: getting started","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fget_started\u002F",{"title":806,"url":807},"Microsoft Research: LazyGraphRAG, setting a new standard for quality and cost (25 November 2024)","https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fblog\u002Flazygraphrag-setting-a-new-standard-for-quality-and-cost\u002F",{"title":809,"url":810},"Guo et al.: LightRAG: Simple and Fast Retrieval-Augmented Generation (arXiv:2410.05779)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2410.05779",{"title":812,"url":813},"HKUDS\u002FLightRAG on GitHub","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FLightRAG",{"title":815,"url":816},"Gutiérrez et al.: HippoRAG: Neurobiologically Inspired Long-Term Memory for Large Language Models (arXiv:2405.14831)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2405.14831",{"title":818,"url":819},"Xiang et al.: When to use Graphs in RAG: A Comprehensive Analysis for Graph Retrieval-Augmented Generation (arXiv:2506.05690)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2506.05690","\u002Fimages\u002Fblog\u002Fgraphrag-knowledge-graph-rag\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fgraphrag-knowledge-graph-rag\u002Fog.jpg",[77,78,79],"GraphRAG und Knowledge-Graph-RAG: wann ein Graph die Vektorsuche schlägt","Was Microsoft GraphRAG und LightRAG wirklich tun, was die Indexierung kostet und wann ein Wissensgraph Vektor-RAG schlägt: Multi-Hop, globale Fragen, Produktkataloge.","Diagramm: ein Wissensgraph als Zentrum, verbunden mit Entitäten, Communities, lokaler Suche, globaler Suche und Produktteilen.",{"slug":827,"published":5,"minutes":828,"category":7,"tags":829,"keywords":835,"about":845,"sources":853,"cover":887,"og":888,"expertise":672,"locales":889,"lang":78,"title":890,"description":891,"coverAlt":892},"rag-evaluation-metrics",12,[830,831,832,833,834],"RAG evaluation","Retrieval metrics","LLM-as-judge","Golden set","Ragas",[830,836,837,838,839,840,841,842,843,844],"how to evaluate RAG","RAG evaluation metrics","recall@k MRR nDCG","faithfulness vs answer relevance","golden dataset for RAG","LLM as a judge calibration","Ragas vs DeepEval vs TruLens","RAG evals in CI","retrieval vs generation failure",[846,847,850],{"name":625,"url":626},{"name":848,"url":849},"Discounted cumulative gain","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDiscounted_cumulative_gain",{"name":851,"url":852},"Mean reciprocal rank","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMean_reciprocal_rank",[854,857,860,863,865,868,871,874,877,880,882,884],{"title":855,"url":856},"Es et al.: RAGAS, Automated Evaluation of Retrieval Augmented Generation (arXiv 2309.15217)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2309.15217",{"title":858,"url":859},"Zheng et al.: Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena (arXiv 2306.05685)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2306.05685",{"title":861,"url":862},"Ragas documentation: available metrics","https:\u002F\u002Fdocs.ragas.io\u002Fen\u002Fstable\u002Fconcepts\u002Fmetrics\u002Favailable_metrics\u002F",{"title":864,"url":660},"Ragas documentation: faithfulness",{"title":866,"url":867},"Ragas documentation: context precision","https:\u002F\u002Fdocs.ragas.io\u002Fen\u002Fstable\u002Fconcepts\u002Fmetrics\u002Favailable_metrics\u002Fcontext_precision\u002F",{"title":869,"url":870},"Ragas documentation: context recall","https:\u002F\u002Fdocs.ragas.io\u002Fen\u002Fstable\u002Fconcepts\u002Fmetrics\u002Favailable_metrics\u002Fcontext_recall\u002F",{"title":872,"url":873},"DeepEval documentation: metrics introduction","https:\u002F\u002Fdeepeval.com\u002Fdocs\u002Fmetrics-introduction",{"title":875,"url":876},"TruLens","https:\u002F\u002Fwww.trulens.org\u002F",{"title":878,"url":879},"Arize Phoenix documentation","https:\u002F\u002Farize.com\u002Fdocs\u002Fphoenix",{"title":881,"url":849},"Wikipedia: Discounted cumulative gain",{"title":883,"url":852},"Wikipedia: Mean reciprocal rank",{"title":885,"url":886},"Wikipedia: Cohen's kappa","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCohen%27s_kappa","\u002Fimages\u002Fblog\u002Frag-evaluation-metrics\u002Fcover.webp","\u002Fimages\u002Fblog\u002Frag-evaluation-metrics\u002Fog.jpg",[77,78,79],"RAG evaluieren: Retrieval-Metriken, Faithfulness und wie du erkennst, welche Hälfte versagt hat","So evaluierst du ein RAG-System: recall at k, MRR und nDCG vs. Faithfulness und Antwortrelevanz, Golden Set aus echten Anfragen, kalibrierter LLM-Judge, Evals in CI.","Diagramm: Eine RAG-Antwort wird auf zwei Seiten bewertet, mit Retrieval-Metriken wie recall at k, MRR und nDCG sowie Generierungs-Metriken wie Faithfulness und Antwortrelevanz, die in eine Diagnose münden.",1791009037609]