[{"data":1,"prerenderedAt":697},["ShallowReactive",2],{"blog-rag-product-catalog-pim-data-de":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":26,"sources":36,"cover":63,"og":64,"expertise":65,"locales":66,"lang":68,"title":70,"description":71,"coverAlt":72,"metaTitle":73,"takeaways":74,"faq":80,"toc":96,"blocks":127,"others":439},"rag-product-catalog-pim-data","2026-10-17",10,"rag",[9,10,11,12,13],"RAG","PIM","Product data","B2B e-commerce","Metadata filtering",[15,16,17,18,19,20,21,22,23,24,25],"rag product catalog","rag pim data","llm product data","product catalog chatbot","akeneo rag","pimcore ai search","rag structured data","metadata filtering rag","product attributes embeddings","b2b product assistant","etim classification ai",[27,30,33],{"name":28,"url":29},"Product information management","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FProduct_information_management",{"name":31,"url":32},"Retrieval-augmented generation","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRetrieval-augmented_generation",{"name":34,"url":35},"ETIM (standard)","https:\u002F\u002Fwww.etim-international.com\u002Fclassification\u002F",[37,40,43,46,48,51,54,57,60],{"title":38,"url":39},"Akeneo API: Products, product values, metric values and product models","https:\u002F\u002Fapi.akeneo.com\u002Fconcepts\u002Fproducts.html",{"title":41,"url":42},"Akeneo Help Center: What about products with variants?","https:\u002F\u002Fhelp.akeneo.com\u002Fserenity-take-the-power-over-your-products\u002Fserenity-what-about-products-with-variants",{"title":44,"url":45},"Pimcore documentation: Classification Store","https:\u002F\u002Fdocs.pimcore.com\u002Fplatform\u002FPimcore\u002FObjects\u002FObject_Classes\u002FData_Types\u002FClassification_Store\u002F",{"title":47,"url":35},"ETIM International: Classification",{"title":49,"url":50},"ETIM International: ETIM releases and the IXF format","https:\u002F\u002Fetim-international.com\u002F?p=754",{"title":52,"url":53},"Reddy et al.: Shopping Queries Dataset, a large-scale ESCI benchmark for improving product search (2022)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2206.06588",{"title":55,"url":56},"Amazon Science: esci-data repository","https:\u002F\u002Fgithub.com\u002Famazon-science\u002Fesci-data",{"title":58,"url":59},"Qdrant documentation: Filtering","https:\u002F\u002Fqdrant.tech\u002Fdocumentation\u002Fconcepts\u002Ffiltering\u002F",{"title":61,"url":62},"Sui et al.: Table Meets LLM, can large language models understand structured table data? (WSDM 2024)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2305.13062","\u002Fimages\u002Fblog\u002Frag-product-catalog-pim-data\u002Fcover.webp","\u002Fimages\u002Fblog\u002Frag-product-catalog-pim-data\u002Fog.jpg","b2b-ecommerce-developer",[67,68,69],"en","de","hu","RAG über Produktkataloge: aus PIM-Daten Antworten machen, die halten","Produktdaten sind strukturiert, Chunking wie bei PDFs scheitert. So serialisiert man PIM-Attribute, leitet Spezifikationsfragen an Filter und bleibt exakt.","Ein Rahmen aus neun Feldern mit kleinen Symbolen, darunter ein Trichter zu einer einzelnen Karte.","RAG über PIM-Produktdaten · Balázs Csorba",[75,76,77,78,79],"Katalogfragen haben Typen: Artikelnummern brauchen exakte Suche, Spezifikationen strukturierte Filter, und nur beschreibende Fragen passen gut zur Vektorsuche.","PIM-Werte sind typisiert und tragen Sprache, Kanal und Einheit, wie die Tripel aus locale, scope und data bei Akeneo; mit Bezeichnungen und Einheiten serialisieren, nie mit rohen Attributcodes.","Einen Text pro Produktmodell indexieren und Variantenattribute als strukturierte Payload halten, damit eine Frage nach Größe oder Gewinde nicht von einem Embedding abhängt.","Das LLM Filter in ein Schema extrahieren lassen, das gegen das Attributmodell validiert wird, dann gefilterte hybride Suche ausführen; Preise und Bestand kommen live aus dem Shop, nicht aus dem Index.","Mit erwarteten SKUs pro Anfrage evaluieren und dem Vokabular Exact, Substitute, Complement und Irrelevant aus Amazons ESCI-Datensatz.",[81,84,87,90,93],{"q":82,"a":83},"Kann ich einfach meinen Produktexport einbetten und RAG nutzen?","Ja, und beschreibende Fragen werden halbwegs beantwortet. Bei Artikelnummern, numerischen Spezifikationen und Variantenunterschieden scheitert es, weil Embeddings Zahlen und exakte Codes nicht zuverlässig vergleichen. Einen Textindex mit strukturierten Filtern auf den Attributen kombinieren.",{"q":85,"a":86},"Sollte jede Variante ein eigenes Dokument sein?","Für den Textindex meist nicht. Varianten eines Produktmodells teilen fast den ganzen Text und verdrängen sich gegenseitig aus den Top-Treffern. Das Produktmodell indexieren, Variantenattribute als Payload speichern und die genaue Variante per Filter oder Lookup auflösen.",{"q":88,"a":89},"Woher kommen Preise und Bestand?","Zum Antwortzeitpunkt aus Shop oder ERP. Im B2B sind Preise oft kundenspezifisch und der Bestand ändert sich ständig, ein Index-Schnappschuss ist also per Design falsch. Der Assistent sollte einen Preis- und Verfügbarkeitsendpunkt mit dem Kontext des angemeldeten Kunden aufrufen.",{"q":91,"a":92},"Hilft ETIM bei RAG?","Ja, wo die Daten damit klassifiziert sind. ETIM definiert Klassen mit einer einheitlichen Merkmalsliste und vordefinierten Werten. Das liefert lieferantenübergreifend konsistente Attributnamen für Filter und ein mehrsprachiges Vokabular.",{"q":94,"a":95},"Wie verhindere ich, dass der Assistent Spezifikationen erfindet?","Die Attributwerte als strukturierte Daten mit Einheiten an das Modell geben, es anweisen, nur daraus zu antworten, und ein leeres Attribut als ausdrückliches „nicht angegeben“ behandeln. Mit Fragen nach Attributen testen, von denen man weiß, dass sie fehlen.",[97,100,103,106,109,112,115,118,121,124],{"id":98,"title":99},"what-pim-data-looks-like","Wie sehen PIM-Daten tatsächlich aus?",{"id":101,"title":102},"question-types","Welche Katalogfrage braucht welches Retrieval?",{"id":104,"title":105},"document-granularity","Ein Dokument pro was: Produkt, Modell oder Variante?",{"id":107,"title":108},"serializing-attributes","Wie werden Attribute zu Text?",{"id":110,"title":111},"filters-not-embeddings","Warum gehören Spezifikationen in Filter statt in Embeddings?",{"id":113,"title":114},"prices-and-freshness","Was gehört nie in den Index?",{"id":116,"title":117},"multilingual-catalogues","Wie helfen Sprachen und Klassifikationen?",{"id":119,"title":120},"evaluating-catalogue-rag","Wie testet man einen Katalogassistenten?",{"id":122,"title":123},"where-to-start","Wo sollte man anfangen?",{"id":125,"title":126},"sources","Quellen",[128,132,146,149,179,181,184,187,188,191,243,246,247,250,253,262,263,273,302,304,307,308,327,329,337,344,345,353,356,357,365,368,369,376,398,399,407,408],{"type":129,"content":130},"paragraph",[131],"Die meisten RAG-Tutorials beginnen bei Dokumenten: PDFs, Wiki-Seiten, Handbücher. Ein Produktkatalog ist etwas anderes. In einem PIM ist das Wissen bereits strukturiert: typisierte Attribute, Einheiten, Varianten, Klassifikationen, Übersetzungen pro Sprache und Werte pro Vertriebskanal. Wer das zu Text plättet und wie ein Handbuch chunkt, wirft genau die Struktur weg, die Katalogfragen beantwortbar macht.",{"type":129,"content":133},[134,135,140,141,145],"Dieser Beitrag ist die Datenseite eines Katalogassistenten: wie PIM-Daten aussehen, wie man sie für das Retrieval serialisiert, welche Fragen zu Filtern statt zu Embeddings gehören und wie man prüft, dass die Antworten die richtige SKU nennen. Er baut auf ",{"tag":136,"to":137,"children":138},"link","\u002Fblog\u002Fsemantic-product-search-b2b",[139],"semantischer Produktsuche für B2B-Shops"," auf, wo es um Ranking geht, und setzt voraus, dass die Sync-Probleme aus ",{"tag":136,"to":142,"children":143},"\u002Fblog\u002Fpimcore-erp-delta-sync",[144],"Pimcore-ERP-Delta-Sync"," vorgelagert gelöst sind.",{"type":147,"level":148,"id":98,"text":99},"heading",2,{"type":129,"content":150},[151,152,156,157,160,161,164,165,168,169,160,172,164,175,178],"Nehmen wir Akeneo als Beispiel. Die ",{"tag":153,"children":154},"code",[155],"values"," eines Produkts sind nach Attributcode geordnet, und jeder Code verweist auf ein Array von Wertobjekten mit ",{"tag":153,"children":158},[159],"locale",", ",{"tag":153,"children":162},[163],"scope"," und ",{"tag":153,"children":166},[167],"data",". Ein lokalisierbares Attribut hat einen Wert pro Sprache, ein kanalabhängiges einen pro Kanal, und eines, das beides ist, einen pro Kombination aus Sprache und Kanal. Ein metrischer Wert ist keine Zahl, sondern ein Objekt mit ",{"tag":153,"children":170},[171],"amount",{"tag":153,"children":173},[174],"unit",{"tag":153,"children":176},[177],"symbol",", wobei das Symbol aus der Maßeinheitenfamilie stammt.",{"type":153,"code":180},"\"values\": {\n  \"name\":        [{ \"locale\": \"de_DE\", \"scope\": null, \"data\": \"Sechskantschraube DIN 933\" }],\n  \"length\":      [{ \"locale\": null, \"scope\": null,\n                    \"data\": { \"amount\": \"50\", \"unit\": \"MILLIMETER\", \"symbol\": \"mm\" } }],\n  \"material\":    [{ \"locale\": null, \"scope\": null, \"data\": \"stainless_a2\" }],\n  \"description\": [{ \"locale\": \"de_DE\", \"scope\": \"ecommerce\", \"data\": \"...\" },\n                  { \"locale\": \"de_DE\", \"scope\": \"print\",     \"data\": \"...\" }]\n}",{"type":129,"content":182},[183],"Varianten fügen eine zweite Ebene hinzu. In Akeneo legt eine Familienvariante ein oder zwei Variantenebenen fest, die Achsen pro Ebene und welche Attribute gemeinsam sind und welche variieren, mit bis zu drei Anreicherungsebenen: Wurzel-Produktmodell, Unter-Produktmodell und Variantenprodukt. Nur das Variantenprodukt hat eine SKU, das Produktmodell hat einen Code. Pimcore geht mit dem Classification Store einen anderen Weg: Schlüssel mit Datentypen, zu Gruppen zusammengefasst, Gruppen an Objekten, optionale Lokalisierung und Mengenwerte, die eine Zahl mit einer Einheit verbinden.",{"type":129,"content":185},[186],"Viele technische B2B-Kataloge sind zusätzlich nach ETIM klassifiziert, laut Herausgeber dem internationalen Klassifikationsstandard für technische Produkte: Klassen mit einer einheitlichen Merkmalsliste und vordefinierten Werten, verfügbar in 17 Sprachen. ETIM 10.0 erschien im Dezember 2024 und wird als IXF ausgeliefert, einem XML-Format. Liefern die Lieferanten ETIM-Daten, gibt es bereits ein markenübergreifendes Attributvokabular, und das ist für Filter Gold wert.",{"type":147,"level":148,"id":101,"text":102},{"type":129,"content":189},[190],"Der nützlichste Designschritt ist, die erwarteten Fragen nach der Art des nötigen Retrievals zu sortieren. Bei einem B2B-Katalog ist mit einer ganz anderen Mischung als bei einem Support-Wiki zu rechnen: viele Fragen sind Lookups oder Einschränkungen, weniger sind offen.",{"type":192,"head":193,"rows":200},"table",[194,196,198],[195],"Frage",[197],"Beispiel",[199],"Weg",[201,208,215,222,229,236],[202,204,206],[203],"Kennung",[205],"Habt ihr 4711-050?",[207],"Exakter Lookup auf SKU, EAN, Lieferantennummer",[209,211,213],[210],"Spezifikation",[212],"M8-Edelstahlschrauben, mindestens 50 mm",[214],"Strukturierter Filter, dann Ranking",[216,218,220],[217],"Vergleich",[219],"Unterschied zwischen X200 und X300?",[221],"Beide Datensätze holen, Attribute vergleichen",[223,225,227],[224],"Beschreibend",[226],"Etwas für draußen in Meeresnähe",[228],"Hybride Suche über Text",[230,232,234],[231],"Beziehung",[233],"Welche Mutter passt zu dieser Schraube?",[235],"PIM-Verknüpfungen, dann Lookup",[237,239,241],[238],"Kaufmännisch",[240],"Was kostet es mich, ist es lagernd?",[242],"Live-Aufruf an Shop oder ERP, nie der Index",{"type":129,"content":244},[245],"Amazons Shopping Queries Dataset ist eine nützliche Referenz für das Vokabular. Seine rund 130.000 Anfragen und 2,6 Millionen menschlichen Relevanzurteile kennzeichnen jedes Paar aus Anfrage und Produkt als Exact (erfüllt alle Vorgaben der Anfrage), Substitute (verfehlt einige Aspekte, taugt aber als Ersatz), Complement (erfüllt die Anfrage nicht, passt aber zu einem exakten Artikel) oder Irrelevant. Ein Katalogassistent sollte wissen, welche der vier Kategorien er anbietet, und es sagen: einen Ersatz so zu präsentieren, als wäre er exakt, ist der klassische Weg, das Vertrauen eines B2B-Einkäufers zu verlieren.",{"type":147,"level":148,"id":104,"text":105},{"type":129,"content":248},[249],"Der erste Reflex ist ein Dokument pro SKU. Bei Katalogen mit Varianten funktioniert das im Textindex schlecht. Vierzig Längen derselben Schraube teilen Name, Beschreibung und die meisten Attribute, also füllt eine beschreibende Anfrage die Top-Treffer mit Beinahe-Duplikaten eines Produkts und drängt jede Alternative hinaus. Vierzig fast identische Texte einzubetten kostet außerdem Speicher und Indexierungszeit ohne Gewinn.",{"type":129,"content":251},[252],"Besser funktioniert es, den Datensatz zu teilen. Der Textindex erhält ein Dokument pro Produktmodell, gebaut aus den gemeinsamen Attributen und einer kompakten Zusammenfassung der Variantenachsen, etwa Längen 20 bis 120 mm, Edelstahl A2 und A4. Die Variantenattribute liegen als strukturierte Payload vor, entweder am selben Punkt im Vektorspeicher oder in einer eigenen Tabelle mit dem Modellcode als Schlüssel. Das Retrieval findet das Modell über die Bedeutung, ein Filter oder Lookup wählt die Variante. Einfache Produkte ohne Varianten sind ihr eigenes Modell.",{"type":254,"attrs":255,"inner":259,"caption":260},"diagram",{"viewBox":256,"role":257,"aria-labelledby":258},"0 0 720 170","img","pim1-t pim1-d","\u003Ctitle id=\"pim1-t\">Einen PIM-Datensatz für das Retrieval aufteilen\u003C\u002Ftitle>\u003Cdesc id=\"pim1-d\">Ein PIM-Export wird pro Produktmodell und Sprache zu Text für den hybriden Index serialisiert, Variantenattribute mit Einheiten gehen in einen strukturierten Speicher. Bei der Frage extrahiert ein Parser Filter, gefilterte hybride Suche findet Kandidaten, und die Antwort nennt SKUs mit Live-Preisen.\u003C\u002Fdesc>\u003Cdefs>\u003Cmarker id=\"pim1-ah\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\">\u003Cpath d=\"M0 0L10 5L0 10z\" class=\"d-head\" \u002F>\u003C\u002Fmarker>\u003C\u002Fdefs>\u003Crect x=\"20\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"79\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">PIM-Export\u003C\u002Ftext>\u003Ctext x=\"79\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">Werte, Varianten\u003C\u002Ftext>\u003Cpath d=\"M138 85H158\" class=\"d-line\" marker-end=\"url(#pim1-ah)\" \u002F>\u003Crect x=\"160\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-accent\" \u002F>\u003Ctext x=\"220\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Serialisierer\u003C\u002Ftext>\u003Ctext x=\"220\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">Labels + Einheiten\u003C\u002Ftext>\u003Cpath d=\"M279 85H299\" class=\"d-line\" marker-end=\"url(#pim1-ah)\" \u002F>\u003Crect x=\"301\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-sky\" \u002F>\u003Ctext x=\"360\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Textindex\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">eins pro Modell\u003C\u002Ftext>\u003Cpath d=\"M419 85H439\" class=\"d-line\" marker-end=\"url(#pim1-ah)\" \u002F>\u003Crect x=\"441\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-gold\" \u002F>\u003Ctext x=\"500\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Payload\u003C\u002Ftext>\u003Ctext x=\"500\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">typisierte Varianten\u003C\u002Ftext>\u003Cpath d=\"M560 85H580\" class=\"d-line\" marker-end=\"url(#pim1-ah)\" \u002F>\u003Crect x=\"582\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-mint\" \u002F>\u003Ctext x=\"641\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Antwort\u003C\u002Ftext>\u003Ctext x=\"641\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">SKU + Live-Preis\u003C\u002Ftext>",[261],"Text beantwortet, was ein Produkt ist; Struktur beantwortet, welche Variante es ist.",{"type":147,"level":148,"id":107,"text":108},{"type":129,"content":264},[265,266,164,269,272],"Der Serialisierer ist das am meisten unterschätzte Teil einer Katalog-RAG-Pipeline. Embedding-Modelle und LLMs lesen Bezeichnungen, keine Codes: ",{"tag":153,"children":267},[268],"stainless_a2",{"tag":153,"children":270},[271],"MILLIMETER"," sagen wenig, Material: Edelstahl A2 und Länge: 50 mm sagen viel. Ein paar Regeln, die ich anwende:",{"type":274,"items":275},"list",[276,282,287,292,297],[277,281],{"tag":278,"children":279},"strong",[280],"Jeden Code in seine Bezeichnung auflösen",", in der Zielsprache: Attributnamen, Auswahloptionen, Einheiten über ihr Symbol.",[283,286],{"tag":278,"children":284},[285],"Einen Kanal wählen."," Kanalabhängige Werte unterscheiden sich; den E-Commerce-Scope indexieren, nicht den Text des Druckkatalogs.",[288,291],{"tag":278,"children":289},[290],"Ein Text pro Sprache,"," mit einer ausdrücklichen Fallback-Regel, damit eine deutsche Anfrage nie versehentlich einen halb englischen Datensatz findet.",[293,296],{"tag":278,"children":294},[295],"Leere und interne Attribute weglassen:"," Einkaufspreise, Workflow-Flags, Importzeitstempel. Sie erzeugen Rauschen und leaken manchmal.",[298,301],{"tag":278,"children":299},[300],"Kennungen auch in den Text:"," SKU, EAN und Lieferantennummern gehören ins BM25-Feld, weil Nutzer sie einfügen.",{"type":153,"code":303},"def serialize(model, variants, locale, labels, channel=\"ecommerce\"):\n    def val(values, code):\n        for v in values.get(code, []):\n            if v[\"locale\"] in (locale, None) and v[\"scope\"] in (channel, None):\n                d = v[\"data\"]\n                if isinstance(d, dict) and \"amount\" in d:      # metric value\n                    return f'{d[\"amount\"]} {d[\"symbol\"]}'\n                return labels.option(code, d, locale) if isinstance(d, str) else d\n        return None\n\n    lines = [f'# {val(model[\"values\"], \"name\")}']\n    for code in labels.common_attributes(model[\"family\"]):\n        v = val(model[\"values\"], code)\n        if v not in (None, \"\", []):\n            lines.append(f'{labels.attribute(code, locale)}: {v}')\n    # summarise the variant axes instead of repeating every variant\n    for axis in labels.axes(model[\"family_variant\"]):\n        seen = sorted({str(val(x[\"values\"], axis)) for x in variants})\n        lines.append(f'{labels.attribute(axis, locale)} (variants): {\", \".join(seen)}')\n    lines.append(\"SKUs: \" + \" \".join(x[\"identifier\"] for x in variants))\n    return \"\\n\".join(lines)",{"type":129,"content":305},[306],"Ob man die Attribute als Schlüssel-Wert-Zeilen, Markdown-Tabelle oder JSON darstellt, sollte man testen statt glauben. Die Studie Table Meets LLM fand, dass die Leistung von LLMs bei Tabellenaufgaben mit Eingabeentscheidungen wie Format und Reihenfolge des Inhalts schwankt; das eigene Embedding-Modell und die eigenen Anfragen entscheiden, welches Format am besten gefunden wird. Ich beginne mit Zeilen der Form Bezeichnung: Wert, weil sie für BM25, Embeddings und das LLM gleichermaßen funktionieren.",{"type":147,"level":148,"id":110,"text":111},{"type":129,"content":309},[310,311,314,315,318,319,322,323,326],"Ein dichtes Embedding komprimiert einen Text zu einer Richtung, die erfasst, worum es geht. Es ist nicht dafür gebaut, 48 mm von 50 mm zu unterscheiden oder zu wissen, dass mindestens 50 die 48 ausschließt. BM25 trifft das Token 50, hat aber ebenso keine Ahnung von Bereichen oder Einheiten. Einschränkungen sollten daher aus der Frage extrahiert und als Filter auf typisierte Felder angewendet werden. Vektordatenbanken unterstützen das direkt; in Qdrant erledigt das eine ",{"tag":153,"children":312},[313],"must","-Klausel mit einer ",{"tag":153,"children":316},[317],"range","-Bedingung und den Grenzen ",{"tag":153,"children":320},[321],"gte"," oder ",{"tag":153,"children":324},[325],"lte",", und die Dokumentation empfiehlt Payload-Indizes für jedes Feld, auf das gefiltert wird.",{"type":153,"code":328},"{\n  \"query\": \"\u003Cembedding of: stainless hex screw for outdoor use>\",\n  \"filter\": {\n    \"must\": [\n      { \"key\": \"thread\",        \"match\": { \"value\": \"M8\" } },\n      { \"key\": \"material\",      \"match\": { \"any\": [\"stainless_a2\", \"stainless_a4\"] } },\n      { \"key\": \"length_mm\",     \"range\": { \"gte\": 50 } },\n      { \"key\": \"locale\",        \"match\": { \"value\": \"de_DE\" } }\n    ]\n  },\n  \"limit\": 20\n}",{"type":129,"content":330},[331,332,336],"Die Filterextraktion ist ein kleiner LLM-Aufruf mit strukturierter Ausgabe: dem Modell die Liste der filterbaren Attribute mit Typen, erlaubten Optionen und kanonischen Einheiten geben und ein JSON-Objekt zurückgeben lassen. Dann im Code validieren. Unbekannte Attributcodes fallen weg, Optionswerte müssen existieren, und Einheiten werden vor dem Vergleich normalisiert, aus 5 cm wird 50 mm. Das ist dieselbe Disziplin wie bei ",{"tag":136,"to":333,"children":334},"\u002Fblog\u002Ftext-to-sql-llm-guardrails",[335],"Text-to-SQL mit Leitplanken",": Das Modell schlägt vor, ein Schema entscheidet. Lässt sich eine Einschränkung nicht abbilden, bleibt sie in der Textanfrage, statt still zu verschwinden, und der Nutzer erfährt, welche Filter angewendet wurden.",{"type":338,"variant":339,"title":340,"body":341},"callout","warn","Ein leeres Attribut ist kein Nein",[342],[343],"Katalogdaten sind unvollständig, bei Longtail-Artikeln oft stark. Bekommt der Assistent einen Datensatz ohne Korrosionsklasse und wird gefragt, ob die Schraube für Salzwasser taugt, lautet die ehrliche Antwort, dass die Daten das nicht sagen. Fehlende Werte ausdrücklich als nicht angegeben übergeben, das Modell anweisen, nie einen technischen Wert aus dem Produktnamen oder ähnlichen Produkten abzuleiten, und mit Fragen nach bekannten Lücken testen. Eine falsche Tragfähigkeit ist im B2B eine Haftungsfrage, kein UX-Fehler.",{"type":147,"level":148,"id":113,"text":114},{"type":129,"content":346},[347,348,352],"Preise, Bestand und Liefertermine. In B2B-Shops sind Preise häufig kundenspezifisch, mit Kontraktpreisen, Staffeln und Rabatten, und der Bestand bewegt sich minütlich. Ein Index-Schnappschuss dieser Werte ist per Design falsch und zeigt schlimmstenfalls einem Kunden die Konditionen eines anderen. Sie gehören weder in den Text noch in die Payload. Braucht die Antwort sie, ruft der Assistent den Preis- und Verfügbarkeitsendpunkt des Shops mit der Sitzung des angemeldeten Kunden auf, so wie es die Storefront tut. Die Werkzeugseite dazu habe ich in ",{"tag":136,"to":349,"children":350},"\u002Fblog\u002Fai-assistant-b2b-shop-customer-support",[351],"einem KI-Assistenten für den B2B-Shop-Support"," behandelt.",{"type":129,"content":354},[355],"Für den Rest ist Aktualität ein Sync-Problem. Ein Produktmodell neu serialisieren und einbetten, wenn sich eines seiner gemeinsamen Attribute oder Labels ändert, und nur die Payload aktualisieren, wenn sich ein Variantenattribut ändert. Das ist günstig, weil kein Embedding beteiligt ist. Ein geändertes Options-Label, etwa ein im Deutschen umbenanntes Material, betrifft jedes Modell, das es nutzt; deshalb die Änderungserkennung am Hash des serialisierten Texts festmachen, nicht allein am Änderungszeitstempel des PIM.",{"type":147,"level":148,"id":116,"text":117},{"type":129,"content":358},[359,360,364],"Katalogdaten sind oft besser übersetzt als jedes Wiki, weil das PIM Übersetzungen pro Attribut erzwingt. Das nutzen: ein serialisierter Text pro Sprache, bei der Anfrage nach Sprache gefiltert, mit dokumentiertem Fallback bei fehlender Übersetzung. Optionen und Einheiten sind in der Payload sprachneutral, Filter funktionieren also auf Deutsch, Englisch und Ungarisch gleich, und nur der Textindex ist sprachspezifisch. Die allgemeinen Abwägungen beim sprachübergreifenden Retrieval stehen in ",{"tag":136,"to":361,"children":362},"\u002Fblog\u002Fmultilingual-rag-german-hungarian",[363],"mehrsprachigem RAG für Deutsch und Ungarisch",".",{"type":129,"content":366},[367],"Klassifikationen wie ETIM bringen einen zweiten Vorteil. Weil eine Klasse eine einheitliche Merkmalsliste hat, kann der Prompt zur Filterextraktion pro Klasse gebaut werden: Ist die Frage etwa einer Schraubenklasse zugeordnet, werden nur deren Merkmale als Filter angeboten. Das hält den Prompt kurz und die extrahierten Filter gültig, auch über Lieferanten hinweg, deren eigene Attributnamen sich unterscheiden.",{"type":147,"level":148,"id":119,"text":120},{"type":129,"content":370},[371,372,364],"Katalog-RAG hat gegenüber Dokument-RAG einen Vorteil: Die Ground Truth ist eindeutig. Für jede Testanfrage lassen sich die richtigen SKUs oder Produktmodelle notieren, was die Retrieval-Evaluation zu Trefferquote und Recall at k auf IDs macht, statt Passagen zu beurteilen. Ich baue das Set aus Suchlogs und Vertriebsfragen auf, gruppiert nach den Fragetypen aus der Tabelle oben, und kennzeichne die erwarteten Ergebnisse mit den ESCI-Kategorien, damit ein Ersatz nicht als Treffer zählt. Die Metriken selbst behandelt ",{"tag":136,"to":373,"children":374},"\u002Fblog\u002Frag-evaluation-metrics",[375],"RAG evaluieren",{"type":274,"items":377},[378,383,388,393],[379,382],{"tag":278,"children":380},[381],"Kennungsanfragen:"," 100 % exakte Treffer erwarten; alles darunter ist ein Tokenizer- oder Feldmapping-Fehler, kein Modellproblem.",[384,387],{"tag":278,"children":385},[386],"Spezifikationsanfragen:"," den extrahierten Filter gegen einen handgeschriebenen erwarteten Filter prüfen, bevor man auf Ergebnisse schaut.",[389,392],{"tag":278,"children":390},[391],"Anfragen zu fehlenden Daten:"," Die richtige Antwort ist nicht angegeben; erfundene Werte zählen als Fehler.",[394,397],{"tag":278,"children":395},[396],"Kaufmännische Anfragen:"," prüfen, dass der Preis aus dem Live-Aufruf kommt, indem man mit zwei Kunden mit unterschiedlichen Konditionen testet.",{"type":147,"level":148,"id":122,"text":123},{"type":129,"content":400},[401,402,406],"Mit dem Serialisierer und dem Kennungspfad beginnen, weil sie günstig sind und die peinlichsten Fehler beseitigen. Dann Filterextraktion für die fünf bis zehn Attribute ergänzen, die in echten Fragen am häufigsten vorkommen, nicht für alle. Erst danach Textindex, Chunkgrößen und Reranker abstimmen. Wird der Katalog auch mit strukturierten Daten veröffentlicht, kann dasselbe Attribut-Mapping beides speisen, wie in ",{"tag":136,"to":403,"children":404},"\u002Fblog\u002Fschema-org-structured-data-b2b-shop",[405],"Schema.org-Strukturdaten für B2B-Shops"," beschrieben. Das Muster darunter ist einfach: Das PIM hat die harte Arbeit der Strukturierung schon erledigt, und ein guter Katalogassistent bewahrt diese Struktur bis zur Antwort.",{"type":147,"level":148,"id":125,"text":126},{"type":274,"ordered":409,"items":410},true,[411,415,418,421,424,427,430,433,436],[412],{"tag":413,"href":39,"children":414},"a",[38],[416],{"tag":413,"href":42,"children":417},[41],[419],{"tag":413,"href":45,"children":420},[44],[422],{"tag":413,"href":35,"children":423},[47],[425],{"tag":413,"href":50,"children":426},[49],[428],{"tag":413,"href":53,"children":429},[52],[431],{"tag":413,"href":56,"children":432},[55],[434],{"tag":413,"href":59,"children":435},[58],[437],{"tag":413,"href":62,"children":438},[61],[440,515,572,630],{"slug":441,"published":5,"minutes":442,"category":7,"tags":443,"keywords":448,"about":461,"sources":471,"cover":508,"og":509,"expertise":510,"locales":511,"lang":68,"title":512,"description":513,"coverAlt":514},"embedding-model-selection-2026",9,[444,9,445,446,447],"Embeddings","MTEB","Vector search","Model selection",[449,450,451,452,453,454,455,456,457,458,459,460],"best embedding model 2026","how to choose an embedding model","embedding model comparison","MTEB leaderboard explained","RTEB benchmark","open source embedding model","multilingual embedding model","voyage-4 vs openai embeddings","Qwen3-Embedding","EmbeddingGemma","embedding model for RAG","switching embedding models re-embed",[462,465,468],{"name":463,"url":464},"Word embedding","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWord_embedding",{"name":466,"url":467},"Information retrieval","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FInformation_retrieval",{"name":469,"url":470},"Discounted cumulative gain","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDiscounted_cumulative_gain",[472,475,478,481,484,487,490,493,496,499,502,505],{"title":473,"url":474},"Enevoldsen et al.: MMTEB, Massive Multilingual Text Embedding Benchmark (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2502.13595",{"title":476,"url":477},"Hugging Face: Introducing RTEB, a new standard for retrieval evaluation (Oct 2025)","https:\u002F\u002Fhuggingface.co\u002Fblog\u002Frteb",{"title":479,"url":480},"OpenAI: Vector embeddings guide","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fembeddings",{"title":482,"url":483},"OpenAI: API pricing","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fpricing",{"title":485,"url":486},"Voyage AI: The Voyage 4 model family, shared embedding space with MoE architecture (Jan 2026)","https:\u002F\u002Fblog.voyageai.com\u002F2026\u002F01\u002F15\u002Fvoyage-4\u002F",{"title":488,"url":489},"Voyage AI: Text embeddings documentation","https:\u002F\u002Fdocs.voyageai.com\u002Fdocs\u002Fembeddings",{"title":491,"url":492},"Voyage AI: Pricing","https:\u002F\u002Fdocs.voyageai.com\u002Fdocs\u002Fpricing",{"title":494,"url":495},"Google: Gemini API embeddings documentation","https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Fembeddings",{"title":497,"url":498},"Google: Gemini API pricing","https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Fpricing",{"title":500,"url":501},"Cohere: Embed models documentation","https:\u002F\u002Fdocs.cohere.com\u002Fdocs\u002Fcohere-embed",{"title":503,"url":504},"Qwen: Qwen3-Embedding-8B model card","https:\u002F\u002Fhuggingface.co\u002FQwen\u002FQwen3-Embedding-8B",{"title":506,"url":507},"Google Developers Blog: Introducing EmbeddingGemma (Sep 2025)","https:\u002F\u002Fdevelopers.googleblog.com\u002Fen\u002Fintroducing-embeddinggemma\u002F","\u002Fimages\u002Fblog\u002Fembedding-model-selection-2026\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fembedding-model-selection-2026\u002Fog.jpg","ai-engineer",[67,68,69],"Embedding-Modell wählen 2026: Leaderboards, Kosten und ein Vergleichstest mit eigenen Daten","Wie man 2026 ein Embedding-Modell für RAG wählt: was MTEB und RTEB aussagen, API oder offene Gewichte, Preise, Dimensionen und ein einwöchiger Vergleichstest.","Drei Säulen aus gestapelten Blöcken, die mittlere am höchsten, jede mit kurzem Balken und weiter Klammer.",{"slug":516,"published":5,"minutes":6,"category":7,"tags":517,"keywords":521,"about":533,"sources":541,"cover":566,"og":567,"expertise":510,"locales":568,"lang":68,"title":569,"description":570,"coverAlt":571},"contextual-retrieval-late-chunking",[9,518,444,519,520],"Chunking","Contextual retrieval","Late chunking",[522,523,524,525,526,527,528,529,530,531,532],"contextual retrieval","anthropic contextual retrieval","late chunking","contextual chunk embeddings","contextual embeddings rag","contextual bm25","chunk context rag","voyage-context-3","voyage-context-4","late chunking vs contextual retrieval","rag chunking context loss",[534,535,538],{"name":31,"url":32},{"name":536,"url":537},"Okapi BM25","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOkapi_BM25",{"name":539,"url":540},"Sentence embedding","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSentence_embedding",[542,545,548,551,554,557,560,563],{"title":543,"url":544},"Anthropic: Introducing Contextual Retrieval (Sep 2024)","https:\u002F\u002Fwww.anthropic.com\u002Fnews\u002Fcontextual-retrieval",{"title":546,"url":547},"Günther et al.: Late Chunking, Contextual Chunk Embeddings Using Long-Context Embedding Models (2024, rev. 2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2409.04701",{"title":549,"url":550},"Jina AI: Late Chunking in Long-Context Embedding Models (Aug 2024)","https:\u002F\u002Fjina.ai\u002Fnews\u002Flate-chunking-in-long-context-embedding-models\u002F",{"title":552,"url":553},"Voyage AI: Introducing voyage-context-3 (Jul 2025)","https:\u002F\u002Fblog.voyageai.com\u002F2025\u002F07\u002F23\u002Fvoyage-context-3\u002F",{"title":555,"url":556},"Voyage AI: voyage-context-4 (Jun 2026)","https:\u002F\u002Fblog.voyageai.com\u002F2026\u002F06\u002F29\u002Fvoyage-context-4\u002F",{"title":558,"url":559},"Voyage AI: Contextualized chunk embeddings documentation","https:\u002F\u002Fdocs.voyageai.com\u002Fdocs\u002Fcontextualized-chunk-embeddings",{"title":561,"url":562},"Anthropic: Claude API pricing","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fabout-claude\u002Fpricing",{"title":564,"url":565},"Qu, Tu and Bao: Is Semantic Chunking Worth the Computational Cost? (2024)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2410.13070","\u002Fimages\u002Fblog\u002Fcontextual-retrieval-late-chunking\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fcontextual-retrieval-late-chunking\u002Fog.jpg",[67,68,69],"Contextual Retrieval und Late Chunking: RAG-Chunks ihren Kontext zurückgeben","Chunks verlieren ihr Dokument. Wie Contextual Retrieval, Late Chunking und kontextuelle Embeddings das beheben, was sie kosten, wann man verzichtet.","Vier lose Quadrate, unten von einer breiten Klammer gebündelt und je nach oben mit einer großen Fläche verbunden.",{"slug":573,"published":5,"minutes":442,"category":7,"tags":574,"keywords":578,"about":591,"sources":599,"cover":624,"og":625,"expertise":510,"locales":626,"lang":68,"title":627,"description":628,"coverAlt":629},"rag-access-control-permissions",[9,575,576,577,446],"Access control","Security","Multi-tenancy",[579,580,581,582,583,584,585,586,587,588,589,590],"rag access control","permission aware rag","document level security rag","rag multi tenancy","vector database access control","pgvector row level security","security trimming azure ai search","openfga rag authorization","qdrant multitenancy","pinecone namespaces multitenancy","owasp llm08 vector and embedding weaknesses","rag data leakage",[592,595,598],{"name":593,"url":594},"Access-control list","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAccess-control_list",{"name":596,"url":597},"Multitenancy","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMultitenancy",{"name":31,"url":32},[600,603,606,609,612,615,618,621],{"title":601,"url":602},"OWASP GenAI Security Project: LLM08:2025 Vector and Embedding Weaknesses","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm082025-vector-and-embedding-weaknesses\u002F",{"title":604,"url":605},"PostgreSQL documentation: Row Security Policies","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fddl-rowsecurity.html",{"title":607,"url":608},"pgvector README: filtering and iterative index scans","https:\u002F\u002Fgithub.com\u002Fpgvector\u002Fpgvector",{"title":610,"url":611},"Qdrant: Multitenancy and partitions guide","https:\u002F\u002Fqdrant.tech\u002Fdocumentation\u002Fguides\u002Fmultiple-partitions\u002F",{"title":613,"url":614},"Pinecone: Implement multitenancy using namespaces","https:\u002F\u002Fdocs.pinecone.io\u002Fguides\u002Findex-data\u002Fimplement-multitenancy",{"title":616,"url":617},"Microsoft Learn: Document-level access control in Azure AI Search","https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fsearch\u002Fsearch-document-level-access-overview",{"title":619,"url":620},"OpenFGA: RAG authorization use case","https:\u002F\u002Fopenfga.dev\u002Fdocs\u002Fuse-cases\u002Frag-authorization",{"title":622,"url":623},"Morris et al.: Text Embeddings Reveal (Almost) As Much As Text (EMNLP 2023)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2310.06816","\u002Fimages\u002Fblog\u002Frag-access-control-permissions\u002Fcover.webp","\u002Fimages\u002Fblog\u002Frag-access-control-permissions\u002Fog.jpg",[67,68,69],"Zugriffskontrolle für RAG: berechtigungsbewusstes Retrieval ohne Datenlecks","Wie RAG-Assistenten Dokumente preisgeben und wie man das stoppt: ACLs an jedem Chunk, Vorfilter, Row-Level Security in pgvector, Rechte-Sync und Lecktests.","Sieben Karten in einer Reihe, sechs mit Schloss, eine leere Karte schickt einen Pfeil nach außen.",{"slug":631,"published":5,"minutes":632,"category":7,"tags":633,"keywords":638,"about":649,"sources":657,"cover":691,"og":692,"expertise":510,"locales":693,"lang":68,"title":694,"description":695,"coverAlt":696},"conversational-search-query-rewriting",12,[634,635,9,636,637],"Conversational search","Query rewriting","HyDE","E-commerce",[639,640,641,642,643,644,645,646,647,648],"conversational search query rewriting","coreference resolution search query","HyDE hypothetical document embeddings","multi-query expansion RAG","LLM filter extraction","B2B product search assistant","conversational product search","query rewriting latency","recall@k evaluation","standalone query generation",[650,653,656],{"name":651,"url":652},"Query expansion","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FQuery_expansion",{"name":654,"url":655},"Coreference","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCoreference",{"name":536,"url":537},[658,661,664,667,670,673,676,679,682,685,688],{"title":659,"url":660},"Gao et al.: Precise Zero-Shot Dense Retrieval without Relevance Labels, ACL 2023","https:\u002F\u002Faclanthology.org\u002F2023.acl-long.99\u002F",{"title":662,"url":663},"UTokyo-Hitotsubashi at TREC 2025 RAG Track: HyDE-Enhanced Sparse-Dense Retrieval Fusion with LLM Reranking","https:\u002F\u002Ftrec.nist.gov\u002Fpubs\u002Ftrec34\u002Fpapers\u002FUTokyo.rag.pdf",{"title":665,"url":666},"Hypothetical Documents or Knowledge Leakage? Rethinking LLM-based Query Expansion","https:\u002F\u002Faclanthology.org\u002F2025.findings-acl.980.pdf",{"title":668,"url":669},"ConvSearch-R1: Enhancing Query Reformulation for Conversational Search with Reasoning via Reinforcement Learning","https:\u002F\u002Faclanthology.org\u002F2025.emnlp-main.1349\u002F",{"title":671,"url":672},"CFDA and CLIP at TREC iKAT 2025: Query Reformulation and Rank Fusion","https:\u002F\u002Farxiv.org\u002Fabs\u002F2509.15588",{"title":674,"url":675},"MiniELM: A Lightweight and Adaptive Query Rewriting Framework for E-Commerce Search Optimization","https:\u002F\u002Faclanthology.org\u002F2025.findings-acl.363\u002F",{"title":677,"url":678},"Microsoft Learn: Rewrite queries with semantic ranker in Azure AI Search (preview)","https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fsearch\u002Fsemantic-how-to-query-rewrite",{"title":680,"url":681},"Microsoft Learn: Agentic retrieval overview in Azure AI Search","https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fsearch\u002Fagentic-retrieval-overview",{"title":683,"url":684},"Microsoft Tech Community: Generative query rewriting and a new semantic ranker","https:\u002F\u002Ftechcommunity.microsoft.com\u002Fblog\u002Fazure-ai-services-blog\u002Fraising-the-bar-for-rag-excellence-query-rewriting-and-new-semantic-ranker\u002F4302729\u002F",{"title":686,"url":687},"Amazon Bedrock User Guide: Configure and customize queries and response generation","https:\u002F\u002Fdocs.aws.amazon.com\u002Fbedrock\u002Flatest\u002Fuserguide\u002Fkb-test-config.html",{"title":689,"url":690},"Ragas documentation: List of available metrics","https:\u002F\u002Fdocs.ragas.io\u002Fen\u002Fstable\u002Fconcepts\u002Fmetrics\u002Favailable_metrics\u002F","\u002Fimages\u002Fblog\u002Fconversational-search-query-rewriting\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fconversational-search-query-rewriting\u002Fog.jpg",[67,68,69],"Query Rewriting für die konversationelle Suche: Kontext, HyDE und Filter","Wie Follow-up-Fragen in einem B2B-Shop-Assistenten umgeschrieben werden: Koreferenz, HyDE, Multi-Query, Filter, Latenz und Evaluation.","Eine Sprechblase, eine umgeschriebene Karte, dann ein Trichter über Ergebnissen, mit Pfeilen verbunden.",1792245342498]