[{"data":1,"prerenderedAt":826},["ShallowReactive",2],{"blog-graphrag-knowledge-graph-rag-en":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":13,"about":23,"sources":33,"cover":70,"og":71,"expertise":72,"locales":73,"lang":74,"title":77,"description":78,"coverAlt":79,"metaTitle":80,"takeaways":81,"faq":87,"toc":106,"blocks":134,"others":530},"graphrag-knowledge-graph-rag","2026-10-02",13,"rag",[9,10,11,12],"GraphRAG","Knowledge graphs","LightRAG","RAG",[9,14,15,16,17,18,19,20,21,22],"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",[24,27,30],{"name":25,"url":26},"Knowledge graph","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FKnowledge_graph",{"name":28,"url":29},"Retrieval-augmented generation","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRetrieval-augmented_generation",{"name":31,"url":32},"Leiden algorithm","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLeiden_algorithm",[34,37,40,43,46,49,52,55,58,61,64,67],{"title":35,"url":36},"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":38,"url":39},"Microsoft GraphRAG documentation: overview","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002F",{"title":41,"url":42},"Microsoft GraphRAG documentation: default dataflow","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Findex\u002Fdefault_dataflow\u002F",{"title":44,"url":45},"Microsoft GraphRAG documentation: global search","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fquery\u002Fglobal_search\u002F",{"title":47,"url":48},"Microsoft GraphRAG documentation: local search","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fquery\u002Flocal_search\u002F",{"title":50,"url":51},"Microsoft GraphRAG documentation: DRIFT search","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fquery\u002Fdrift_search\u002F",{"title":53,"url":54},"Microsoft GraphRAG documentation: getting started","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fget_started\u002F",{"title":56,"url":57},"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":59,"url":60},"Guo et al.: LightRAG: Simple and Fast Retrieval-Augmented Generation (arXiv:2410.05779)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2410.05779",{"title":62,"url":63},"HKUDS\u002FLightRAG on GitHub","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FLightRAG",{"title":65,"url":66},"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":68,"url":69},"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","ai-engineer",[74,75,76],"en","de","hu","GraphRAG and knowledge-graph RAG: when a graph beats vector search","What Microsoft GraphRAG and LightRAG really do, what indexing costs, and when a knowledge graph beats vector RAG: multi-hop, global questions, product catalogues.","Diagram: a knowledge graph hub linked to entities, communities, local search, global search and product parts.","GraphRAG: when a knowledge graph beats RAG · Balázs Csorba",[82,83,84,85,86],"GraphRAG adds an LLM-built knowledge graph, Leiden communities and community reports on top of chunking. Its headline strength is global questions about a whole corpus, not better lookup of single facts.","Indexing is the price: at least one LLM call per chunk for extraction plus summaries for every entity and community. Microsoft itself warns that GraphRAG can consume a lot of LLM resources.","Local search (entity neighbourhoods) helps with relation and multi-hop questions, global search (map-reduce over community reports) with themes and overviews. For plain fact lookup, vector RAG with reranking is usually enough.","Lighter variants exist: LightRAG for incremental updates, LazyGraphRAG with vector-RAG indexing cost, HippoRAG for cheap multi-hop retrieval. Treat the claims as paper results until you replicate them on your own data.","In B2B catalogues the relations (replaced by, part of, compatible with) already live in your PIM or ERP. Load them as a graph instead of paying an LLM to rediscover them, and use vector search for the free text.",[88,91,94,97,100,103],{"q":89,"a":90},"What is GraphRAG and how is it different from normal RAG?","Normal RAG chunks documents, embeds the chunks and retrieves the most similar ones. GraphRAG, as published by Microsoft Research, first has an LLM extract entities and relationships from the chunks, clusters the resulting graph into communities with the Leiden algorithm, and writes an LLM summary per community. Queries can then use the graph neighbourhood of an entity (local search) or the community summaries (global search) instead of only similar chunks.",{"q":92,"a":93},"What is the difference between GraphRAG local search and global search?","Local search starts from entities that match the question and pulls in their connected entities, relationships, source text and community reports. It suits questions about specific things. Global search runs a map-reduce over community reports and suits questions about the whole dataset, such as the main themes. DRIFT search combines both: it starts from community reports and refines with local search.",{"q":95,"a":96},"How expensive is GraphRAG indexing?","It is much more expensive than embedding chunks, because an LLM reads every chunk to extract entities and relationships, then writes descriptions and community reports. Microsoft states that GraphRAG can consume a lot of LLM resources and recommends starting small with cheaper models. LazyGraphRAG, a later variant, reports indexing costs identical to vector RAG and 0.1% of full GraphRAG.",{"q":98,"a":99},"When is GraphRAG better than vector RAG?","When questions depend on relationships or on the corpus as a whole: multi-hop questions, corpus-wide themes and overviews, and data with explicit relations such as product and part hierarchies. For simple fact lookup it often is not. The GraphRAG-Bench study notes that GraphRAG frequently underperforms vanilla RAG on many real-world tasks, so measure on your own questions.",{"q":101,"a":102},"Is LightRAG a good alternative to Microsoft GraphRAG?","It is a lighter, MIT-licensed graph RAG framework with dual-level (local and global) retrieval, incremental updates and several storage backends such as PostgreSQL and Neo4j. It is worth a pilot when your documents change often. Its published comparisons are the authors’ own, so test it against your baseline before committing.",{"q":104,"a":105},"Do I need a graph database for GraphRAG?","Not necessarily. Microsoft GraphRAG writes tables and embeddings, and LightRAG ships with in-memory graph storage for testing and supports PostgreSQL for production. A dedicated graph database such as Neo4j becomes useful when you traverse relations a lot or already model them, for example product-part structures.",[107,110,113,116,119,122,125,128,131],{"id":108,"title":109},"what-graphrag-does","What Microsoft GraphRAG actually does",{"id":111,"title":112},"global-local-drift","Global, local and DRIFT search",{"id":114,"title":115},"lightrag-and-friends","LightRAG, LazyGraphRAG, HippoRAG and friends",{"id":117,"title":118},"indexing-cost","The indexing bill",{"id":120,"title":121},"when-graphs-win","When graphs win, and when they do not",{"id":123,"title":124},"b2b-product-parts","A pragmatic B2B example: products and parts",{"id":126,"title":127},"checklist","A checklist before you build a graph",{"id":129,"title":130},"where-this-is-going","Where this is going",{"id":132,"title":133},"sources","Sources",[135,139,142,156,159,167,170,179,182,185,186,189,246,249,252,253,256,279,282,283,286,308,311,323,324,331,396,404,405,408,411,418,421,454,462,463,481,484,485,488,491,492],{"type":136,"content":137},"paragraph",[138],"Every few months someone shows a beautiful knowledge-graph visualisation and claims that vector RAG is obsolete. I have built enough retrieval systems to distrust both halves of that sentence. Graphs genuinely solve problems that chunk similarity cannot, and they also cost real money and add real complexity for problems that a hybrid search with a reranker already handles.",{"type":136,"content":140},[141],"This article explains what Microsoft's GraphRAG actually does under the hood, what LightRAG, LazyGraphRAG and HippoRAG change, where the indexing bill comes from, and which kinds of questions justify a graph. It ends with a pragmatic B2B example from catalogue data, where my advice is deliberately boring: use the graph you already have.",{"type":136,"content":143},[144,145,150,151,155],"If you have not built a solid baseline yet, start with ",{"tag":146,"to":147,"children":148},"link","\u002Fblog\u002Frag-pipeline-chunking-hybrid-search-reranking",[149],"chunking, hybrid search and reranking"," and the ",{"tag":146,"to":152,"children":153},"\u002Fblog\u002Frag-2026-hybrid-agentic-long-context",[154],"overview of RAG in 2026",". A graph is an add-on to a working pipeline, not a replacement for one.",{"type":157,"level":158,"id":108,"text":109},"heading",2,{"type":136,"content":160},[161,162,166],"The research behind it is the paper ",{"tag":163,"href":36,"children":164},"a",[165],"From Local to Global: A Graph RAG Approach to Query-Focused Summarization"," by Darren Edge and colleagues at Microsoft Research (April 2024). Its starting point is a limitation of ordinary RAG: it struggles with global questions about an entire corpus, such as \"What are the main themes in the dataset?\". Similarity search returns the chunks closest to the question, and a question about everything has no closest chunk.",{"type":136,"content":168},[169],"The open-source implementation documents the indexing pipeline in stages. Documents are cut into text units (1,200 tokens by default). An LLM extracts entities with a title, type and description plus the relationships between them, and optionally claims. Repeated descriptions are consolidated. The hierarchical Leiden algorithm then clusters the graph into communities at several levels of granularity. Finally the LLM writes a report for every community, and text units, entity descriptions and reports are embedded into a vector store.",{"type":171,"attrs":172,"inner":176,"caption":177},"diagram",{"viewBox":173,"role":174,"aria-labelledby":175},"0 0 720 270","img","d1-grag-t d1-grag-d","\u003Ctitle id=\"d1-grag-t\">GraphRAG: from documents to two kinds of search\u003C\u002Ftitle>\u003Cdesc id=\"d1-grag-d\">Indexing pipeline: documents become text units, an extracted entity graph, Leiden communities and community reports. Local search reads entity neighbourhoods; global search runs map-reduce over community reports.\u003C\u002Fdesc>\u003Ctext x=\"20\" y=\"28\" class=\"d-title\">GraphRAG: from documents to two kinds of search\u003C\u002Ftext>\u003Ctext x=\"700\" y=\"28\" text-anchor=\"end\" class=\"d-label\">Microsoft GraphRAG docs\u003C\u002Ftext>\u003Ctext x=\"20\" y=\"56\" text-anchor=\"start\" class=\"d-label\">INDEXING (LLM-heavy)\u003C\u002Ftext>\u003Crect x=\"20\" y=\"70\" width=\"120\" height=\"64\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"80\" y=\"98\" text-anchor=\"middle\" class=\"d-text\">Documents\u003C\u002Ftext>\u003Ctext x=\"80\" y=\"119\" text-anchor=\"middle\" class=\"d-small\">raw text\u003C\u002Ftext>\u003Cpath d=\"M140 102 H152\" class=\"d-line\" \u002F>\u003Cpath d=\"M160 102 l-9 -5 v10 z\" class=\"d-head\" \u002F>\u003Crect x=\"160\" y=\"70\" width=\"120\" height=\"64\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"220\" y=\"98\" text-anchor=\"middle\" class=\"d-text\">Text units\u003C\u002Ftext>\u003Ctext x=\"220\" y=\"119\" text-anchor=\"middle\" class=\"d-small\">1,200 tokens\u003C\u002Ftext>\u003Cpath d=\"M280 102 H292\" class=\"d-line\" \u002F>\u003Cpath d=\"M300 102 l-9 -5 v10 z\" class=\"d-head\" \u002F>\u003Crect x=\"300\" y=\"70\" width=\"120\" height=\"64\" rx=\"10\" class=\"d-sky\" \u002F>\u003Ctext x=\"360\" y=\"98\" text-anchor=\"middle\" class=\"d-text\">Graph\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"119\" text-anchor=\"middle\" class=\"d-small\">entities, links\u003C\u002Ftext>\u003Cpath d=\"M420 102 H432\" class=\"d-line\" \u002F>\u003Cpath d=\"M440 102 l-9 -5 v10 z\" class=\"d-head\" \u002F>\u003Crect x=\"440\" y=\"70\" width=\"120\" height=\"64\" rx=\"10\" class=\"d-sky\" \u002F>\u003Ctext x=\"500\" y=\"98\" text-anchor=\"middle\" class=\"d-text\">Communities\u003C\u002Ftext>\u003Ctext x=\"500\" y=\"119\" text-anchor=\"middle\" class=\"d-small\">Leiden\u003C\u002Ftext>\u003Cpath d=\"M560 102 H572\" class=\"d-line\" \u002F>\u003Cpath d=\"M580 102 l-9 -5 v10 z\" class=\"d-head\" \u002F>\u003Crect x=\"580\" y=\"70\" width=\"120\" height=\"64\" rx=\"10\" class=\"d-accent\" \u002F>\u003Ctext x=\"640\" y=\"98\" text-anchor=\"middle\" class=\"d-text\">Reports\u003C\u002Ftext>\u003Ctext x=\"640\" y=\"119\" text-anchor=\"middle\" class=\"d-small\">LLM summaries\u003C\u002Ftext>\u003Ctext x=\"20\" y=\"172\" text-anchor=\"start\" class=\"d-label\">QUERY TIME\u003C\u002Ftext>\u003Cpath d=\"M300 134 C300 160 185 160 185 176\" class=\"d-line\" \u002F>\u003Cpath d=\"M185 186 l-5 -9 h10 z\" class=\"d-head\" \u002F>\u003Cpath d=\"M580 134 C580 160 535 160 535 176\" class=\"d-line\" \u002F>\u003Cpath d=\"M535 186 l-5 -9 h10 z\" class=\"d-head\" \u002F>\u003Crect x=\"20\" y=\"186\" width=\"330\" height=\"64\" rx=\"10\" class=\"d-mint\" \u002F>\u003Ctext x=\"185\" y=\"214\" text-anchor=\"middle\" class=\"d-text\">Local search\u003C\u002Ftext>\u003Ctext x=\"185\" y=\"235\" text-anchor=\"middle\" class=\"d-small\">entity, neighbours, source text\u003C\u002Ftext>\u003Crect x=\"370\" y=\"186\" width=\"330\" height=\"64\" rx=\"10\" class=\"d-gold\" \u002F>\u003Ctext x=\"535\" y=\"214\" text-anchor=\"middle\" class=\"d-text\">Global search\u003C\u002Ftext>\u003Ctext x=\"535\" y=\"235\" text-anchor=\"middle\" class=\"d-small\">map-reduce over reports\u003C\u002Ftext>",[178],"The expensive part happens once at indexing time; the two search modes read different artefacts of the same index.",{"type":136,"content":180},[181],"Two things follow from that design. The graph is not a hand-modelled ontology but whatever the extraction prompt found, so its quality depends on prompt tuning for your domain (the documentation says so explicitly). And the community reports are a pre-computed, hierarchical summary of your corpus, which is exactly what makes global questions answerable.",{"type":136,"content":183},[184],"In the paper's experiments, on two datasets of roughly 1 million tokens each (podcast transcripts and news articles), GraphRAG variants beat a vector RAG baseline in LLM-judged comparisons: 72 to 83 per cent win rates on comprehensiveness and 62 to 82 per cent on diversity, depending on dataset and variant. Root-level community summaries also needed 9 to 43 times fewer tokens than summarising the source text. The authors are careful about scope: the evaluation covers sensemaking questions on two corpora, and they say more work is needed to see how it generalises.",{"type":157,"level":158,"id":111,"text":112},{"type":136,"content":187},[188],"The distinction between the query modes is the most useful thing to understand, because it tells you which questions justify the index.",{"type":190,"head":191,"rows":200},"table",[192,194,196,198],[193],"Mode",[195],"Question it answers",[197],"What it reads",[199],"Cost profile",[201,213,224,235],[202,207,209,211],[203],{"tag":204,"children":205},"strong",[206],"Local search",[208],"About specific things: \"What do we know about customer X and its contracts?\"",[210],"Entities matching the question, their neighbours, relationships, source text units and community reports",[212],"One retrieval and one answer, comparable to RAG with a bigger context",[214,218,220,222],[215],{"tag":204,"children":216},[217],"Global search",[219],"About the whole corpus: \"What are the main risks across all reports?\"",[221],"Community reports, processed by a map step and a reduce step",[223],"Many LLM calls; a lower community level is more thorough but slower and costlier",[225,229,231,233],[226],{"tag":204,"children":227},[228],"DRIFT search",[230],"Broad start, specific follow-up",[232],"Relevant community reports first, then local search on the follow-up questions",[234],"Between the two; documented as more comprehensive than plain local search",[236,240,242,244],[237],{"tag":204,"children":238},[239],"Vector RAG",[241],"Where is this stated?",[243],"The top-k most similar chunks",[245],"Cheapest at index and query time",{"type":136,"content":247},[248],"Global search deserves a closer look. The documentation describes a map-reduce over community reports: reports are split into chunks, each chunk yields an intermediate answer with importance ratings, and the reduce step filters and aggregates them. The choice of community level is a direct dial between depth and cost, so a production system should expose it rather than hard-code it.",{"type":136,"content":250},[251],"Local search is the mode most teams actually need, and it is also the one closest to what a classic retrieval pipeline does. It embeds the question, finds related entities, and pulls in connected entities, relationships, covariates, source chunks and community reports, trimmed to one context window.",{"type":157,"level":158,"id":114,"text":115},{"type":136,"content":254},[255],"The original design is thorough and expensive, and several projects attack exactly that. A short orientation, with the usual caveat that all numbers below come from the authors themselves:",{"type":257,"ordered":258,"items":259},"list",false,[260,266,272],[261,265],{"tag":204,"children":262},[263],{"tag":163,"href":63,"children":264},[11]," (paper from October 2024, presented at EMNLP 2025, MIT licence) builds a graph plus vector index with dual-level retrieval, supports incremental updates and document deletion, and offers local, global, hybrid, naive and mix query modes. It can run on PostgreSQL, Neo4j, MongoDB, Milvus, Qdrant or OpenSearch. The paper reports improvements in retrieval accuracy and efficiency, but I could not verify a like-for-like cost comparison with GraphRAG, so I leave that claim open. Incremental updates are the feature I care about: a rebuilt-from-scratch index is a poor fit for living document sets.",[267,271],{"tag":204,"children":268},[269],{"tag":163,"href":57,"children":270},[22]," (Microsoft Research, 25 November 2024) skips the up-front summarisation. Microsoft states that its indexing costs are identical to vector RAG and 0.1% of the costs of full GraphRAG, shifting work to query time. That is the right trade when you have a large corpus and few graph-worthy questions.",[273,278],{"tag":204,"children":274},[275],{"tag":163,"href":66,"children":276},[277],"HippoRAG"," (NeurIPS 2024) combines an LLM-built knowledge graph with Personalized PageRank. The authors report gains of up to 20% on multi-hop question answering, and single-step retrieval that matches or beats iterative retrieval while being 10 to 30 times cheaper and 6 to 13 times faster. It targets multi-hop, not global questions.",{"type":136,"content":280},[281],"My reading: \"graph RAG\" is a family, not a product. The useful question is which of the three jobs you need: global summaries, relation-aware multi-hop retrieval, or incrementally updated knowledge. Pick the variant for that job.",{"type":157,"level":158,"id":117,"text":118},{"type":136,"content":284},[285],"Microsoft's own getting-started page warns that GraphRAG can consume a lot of LLM resources and recommends trying the tutorial dataset and cheaper models first. That is the honest summary. I cannot give you a price per million tokens that stays true, because it depends on the model and your prompts, but I can show where the calls come from:",{"type":257,"ordered":258,"items":287},[288,293,298,303],[289,292],{"tag":204,"children":290},[291],"Extraction:"," at least one LLM call per text unit, more with self-reflection (\"gleaning\") passes. The paper found that extraction recall improves with extra passes and smaller chunks: with GPT-4, a 600-token chunk yielded almost twice as many entity references as a 2,400-token chunk.",[294,297],{"tag":204,"children":295},[296],"Description summarisation:"," every entity and relationship that appears in many chunks gets its descriptions merged by an LLM.",[299,302],{"tag":204,"children":300},[301],"Community reports:"," one LLM-written report per community, at every hierarchy level.",[304,307],{"tag":204,"children":305},[306],"Embeddings:"," text units, entity descriptions and report content. This is the only part a vector RAG pipeline also pays.",{"type":136,"content":309},[310],"Scale matters too. The paper's graphs for roughly 1 million tokens of text had 8,564 nodes and 20,691 edges (podcasts) and 15,754 nodes and 19,520 edges (news). Multiply that by your corpus and by every re-index. Re-indexing is where costs compound: if documents change weekly, an incremental design such as LightRAG or an on-demand design such as LazyGraphRAG changes the economics more than any prompt tuning.",{"type":312,"variant":313,"title":314,"body":315},"callout","tip","Estimate before you index",[316],[317,318,322],"Index a representative 1 to 5 per cent sample, record the tokens and cost per text unit, and extrapolate. Then add the cost of re-indexing at your real change rate. Compare the total with the value of the questions only the graph can answer. See ",{"tag":146,"to":319,"children":320},"\u002Fblog\u002Fllm-cost-latency-prompt-caching-routing",[321],"cost, latency and routing"," for the general method.",{"type":157,"level":158,"id":120,"text":121},{"type":136,"content":325},[326,327,330],"The ",{"tag":163,"href":69,"children":328},[329],"GraphRAG-Bench study"," (June 2025) starts from an uncomfortable observation: GraphRAG frequently underperforms vanilla RAG on many real-world tasks. It then evaluates fact retrieval, complex reasoning, summarisation and creative generation to find the conditions in which the graph pays off. That matches my experience. The decision depends on the shape of the question.",{"type":190,"head":332,"rows":341},[333,335,337,339],[334],"Question type",[336],"Vector RAG + reranker",[338],"Graph RAG",[340],"My call",[342,351,360,369,378,387],[343,345,347,349],[344],"Single-fact lookup (\"What is the torque for model Z?\")",[346],"Strong, cheap",[348],"Rarely better",[350],"Vector",[352,354,356,358],[353],"Multi-hop (\"Which supplier makes the part that replaced X?\")",[355],"Misses the second hop unless an agent iterates",[357],"Strong when the relation is explicit",[359],"Graph, or agentic retrieval",[361,363,365,367],[362],"Global (\"What themes recur in 5,000 tickets?\")",[364],"Weak: no closest chunk",[366],"The case GraphRAG was designed for",[368],"Graph, or summarise by clustering",[370,372,374,376],[371],"Relational catalogue (\"What fits, what replaces, what is part of?\")",[373],"Finds text, not structure",[375],"Strong, and the data is already structured",[377],"Graph from structured data",[379,381,383,385],[380],"Fast-changing documents",[382],"Easy to update",[384],"Costly unless incremental",[386],"Vector, or LightRAG-style updates",[388,390,392,394],[389],"Small corpus that fits in context",[391],"Not needed",[393],"Not worth it",[395],"Long context",{"type":136,"content":397},[398,399,403],"The pattern: graphs help when the answer is assembled from several pieces connected by relations, or from the corpus as a whole. They do not help when the answer sits in one passage. Before building one, write down twenty real user questions and label each as fact, multi-hop or global. If 80 per cent are facts, you need better chunking and reranking, not a graph. Measure the result with ",{"tag":146,"to":400,"children":401},"\u002Fblog\u002Fllm-evals-for-product-features",[402],"evals tied to your product",", not with a demo.",{"type":157,"level":158,"id":123,"text":124},{"type":136,"content":406},[407],"Here is the situation I meet in B2B e-commerce and ERP projects. A manufacturer or wholesaler sells machines, spare parts and accessories. The sales team or a customer asks: \"Our pump P-150 is discontinued. Which pump replaces it, and which seal kit do I need now?\" The answer needs three hops: the successor product, its parts list, and the current replacement of a discontinued part. Related questions are \"what is compatible with this flange?\" and \"which manual covers this variant?\".",{"type":136,"content":409},[410],"A vector search over datasheets retrieves the P-150 page and perhaps the P-200 page. It does not reliably follow \"replaced by\" to the right seal kit, because that fact is a relation between records, not a sentence similar to the question. This is a classic graph case. But notice where the graph should come from.",{"type":171,"attrs":412,"inner":415,"caption":416},{"viewBox":413,"role":174,"aria-labelledby":414},"0 0 720 316","d2-grag-t d2-grag-d","\u003Ctitle id=\"d2-grag-t\">Product and part relations as a graph\u003C\u002Ftitle>\u003Cdesc id=\"d2-grag-d\">Pump P-150 is replaced by pump P-200. P-200 has the part motor M-4 and seal kit S-17, fits flange F-80 and is documented in a manual. Seal kit S-17 is replaced by seal kit S-18.\u003C\u002Fdesc>\u003Ctext x=\"20\" y=\"28\" class=\"d-title\">Product and part relations as a graph\u003C\u002Ftext>\u003Ctext x=\"700\" y=\"28\" text-anchor=\"end\" class=\"d-label\">illustrative example\u003C\u002Ftext>\u003Crect x=\"20\" y=\"130\" width=\"130\" height=\"56\" rx=\"10\" class=\"d-gold\" \u002F>\u003Ctext x=\"85\" y=\"163\" text-anchor=\"middle\" class=\"d-text\">Pump P-150\u003C\u002Ftext>\u003Cpath d=\"M150 158 H252\" class=\"d-line\" \u002F>\u003Cpath d=\"M260 158 l-9 -5 v10 z\" class=\"d-head\" \u002F>\u003Ctext x=\"205\" y=\"148\" text-anchor=\"middle\" class=\"d-label\">replaced by\u003C\u002Ftext>\u003Crect x=\"260\" y=\"130\" width=\"160\" height=\"56\" rx=\"10\" class=\"d-accent\" \u002F>\u003Ctext x=\"340\" y=\"163\" text-anchor=\"middle\" class=\"d-text\">Pump P-200\u003C\u002Ftext>\u003Crect x=\"260\" y=\"44\" width=\"160\" height=\"44\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"340\" y=\"71\" text-anchor=\"middle\" class=\"d-text\">Motor M-4\u003C\u002Ftext>\u003Cpath d=\"M340 130 V96\" class=\"d-line\" \u002F>\u003Cpath d=\"M340 88 l-5 9 h10 z\" class=\"d-head\" \u002F>\u003Ctext x=\"352\" y=\"114\" text-anchor=\"start\" class=\"d-label\">has part\u003C\u002Ftext>\u003Crect x=\"260\" y=\"232\" width=\"160\" height=\"44\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"340\" y=\"259\" text-anchor=\"middle\" class=\"d-text\">Seal kit S-17\u003C\u002Ftext>\u003Cpath d=\"M340 186 V224\" class=\"d-line\" \u002F>\u003Cpath d=\"M340 232 l-5 -9 h10 z\" class=\"d-head\" \u002F>\u003Ctext x=\"352\" y=\"214\" text-anchor=\"start\" class=\"d-label\">has part\u003C\u002Ftext>\u003Crect x=\"20\" y=\"232\" width=\"130\" height=\"44\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"85\" y=\"259\" text-anchor=\"middle\" class=\"d-text\">Flange F-80\u003C\u002Ftext>\u003Cpath d=\"M285 186 C260 232 200 254 160 254\" class=\"d-line\" \u002F>\u003Cpath d=\"M150 254 l9 -5 v10 z\" class=\"d-head\" \u002F>\u003Ctext x=\"205\" y=\"226\" text-anchor=\"middle\" class=\"d-label\">fits\u003C\u002Ftext>\u003Crect x=\"560\" y=\"130\" width=\"140\" height=\"56\" rx=\"10\" class=\"d-sky\" \u002F>\u003Ctext x=\"630\" y=\"163\" text-anchor=\"middle\" class=\"d-text\">Manual (PDF)\u003C\u002Ftext>\u003Cpath d=\"M420 158 H552\" class=\"d-line\" \u002F>\u003Cpath d=\"M560 158 l-9 -5 v10 z\" class=\"d-head\" \u002F>\u003Ctext x=\"490\" y=\"148\" text-anchor=\"middle\" class=\"d-label\">documented in\u003C\u002Ftext>\u003Crect x=\"560\" y=\"232\" width=\"140\" height=\"44\" rx=\"10\" class=\"d-mint\" \u002F>\u003Ctext x=\"630\" y=\"259\" text-anchor=\"middle\" class=\"d-text\">Seal kit S-18\u003C\u002Ftext>\u003Cpath d=\"M420 254 H552\" class=\"d-line\" \u002F>\u003Cpath d=\"M560 254 l-9 -5 v10 z\" class=\"d-head\" \u002F>\u003Ctext x=\"490\" y=\"246\" text-anchor=\"middle\" class=\"d-label\">replaced by\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"304\" text-anchor=\"middle\" class=\"d-label\">Three hops: P-150, then P-200, then S-17, then S-18\u003C\u002Ftext>",[417],"The relations are already fields in a PIM or ERP; only the manual needs text retrieval.",{"type":136,"content":419},[420],"In a PIM or ERP such as Pimcore, Spryker or SAP, these relations already exist as structured data: successor links, bills of materials, compatibility tables. Paying an LLM to extract them again from PDFs is slower, costlier and less accurate than reading the fields. My recommended architecture is therefore:",{"type":257,"ordered":422,"items":423},true,[424,429,434,439,444],[425,428],{"tag":204,"children":426},[427],"Build the graph from structured data."," Nodes are products, parts and documents; edges are the relation types your master data already defines (replaced by, part of, compatible with, documented in). Keep the node identifiers equal to the SKU or article number.",[430,433],{"tag":204,"children":431},[432],"Use vector or hybrid search for the text."," Manuals, datasheets and tickets stay in a chunked index. Each chunk carries the product IDs it mentions, so a graph traversal can fetch exactly the relevant chunks.",[435,438],{"tag":204,"children":436},[437],"Resolve entities first, then traverse."," The agent or retrieval step maps \"P-150\" to a node (exact match beats embeddings for article numbers), walks one to three hops with a typed query, and hands the resulting records plus the linked chunks to the model.",[440,443],{"tag":204,"children":441},[442],"Add LLM extraction only for the gaps,"," for example compatibility notes that exist only in free text, and flag such edges as lower-confidence.",[445,448,449,453],{"tag":204,"children":446},[447],"Check availability from the system of record."," Stock, price and validity belong to the ERP, called as a tool at answer time, never stored in the graph. See ",{"tag":146,"to":450,"children":451},"\u002Fblog\u002Fagentic-commerce-protocols-ucp-acp-guide",[452],"agentic commerce protocols"," for where this is heading.",{"type":136,"content":455},[456,457,461],"This is graph RAG without the expensive part. It is also more auditable: every hop in the answer is a record someone can open. If you build such systems, my ",{"tag":146,"to":458,"children":459},"\u002Fexpertise\u002Fb2b-ecommerce-developer",[460],"B2B e-commerce work"," is exactly this combination of master data and retrieval.",{"type":157,"level":158,"id":126,"text":127},{"type":257,"ordered":422,"items":464},[465,467,469,471,473,475,477,479],[466],"Collect and label twenty to fifty real questions as fact, multi-hop or global.",[468],"Build and measure the baseline: hybrid search with reranking and decent chunking.",[470],"Check whether the relations already exist as structured data. If yes, import them; do not extract them.",[472],"If you need global questions, pilot GraphRAG or LazyGraphRAG on a sample and extrapolate the cost, including re-indexing.",[474],"If your documents change often, test incremental approaches such as LightRAG first.",[476],"Tune the extraction prompt for your domain and inspect a sample of extracted entities by hand.",[478],"Compare against the baseline on your own questions with an LLM judge plus human spot checks.",[480],"Expose the retrieval mode (vector, local, global) as a router decision rather than forcing every query through the graph.",{"type":136,"content":482},[483],"The last point is the one that saves money. A cheap classifier or a small model routes fact questions to vector search and sends only global or relational questions to the graph. The pipeline then costs what each question deserves.",{"type":157,"level":158,"id":129,"text":130},{"type":136,"content":486},[487],"With long context windows and agentic retrieval, an agent can iterate over a plain index and approximate multi-hop reasoning, at the price of more calls per question. Graphs move that work to indexing time. Neither wins everywhere, which is why the 2026 pattern is a router over several retrieval strategies.",{"type":136,"content":489},[490],"My recommendation is to be sceptical and stay empirical. Start with the baseline, add a graph only for the question types that need it, source its edges from structured data wherever you can, and keep the indexing bill visible. A graph that answers one class of question better, at a known price, is an asset. A graph built because it looks good in a diagram is a cost.",{"type":157,"level":158,"id":132,"text":133},{"type":257,"ordered":422,"items":493},[494,497,500,503,506,509,512,515,518,521,524,527],[495],{"tag":163,"href":36,"children":496},[35],[498],{"tag":163,"href":39,"children":499},[38],[501],{"tag":163,"href":42,"children":502},[41],[504],{"tag":163,"href":45,"children":505},[44],[507],{"tag":163,"href":48,"children":508},[47],[510],{"tag":163,"href":51,"children":511},[50],[513],{"tag":163,"href":54,"children":514},[53],[516],{"tag":163,"href":57,"children":517},[56],[519],{"tag":163,"href":60,"children":520},[59],[522],{"tag":163,"href":63,"children":523},[62],[525],{"tag":163,"href":66,"children":526},[65],[528],{"tag":163,"href":69,"children":529},[68],[531,603,687,754],{"slug":532,"published":5,"minutes":6,"category":7,"tags":533,"keywords":538,"about":549,"sources":557,"cover":597,"og":598,"expertise":72,"locales":599,"lang":74,"title":600,"description":601,"coverAlt":602},"llm-hallucination-grounding-citations",[534,12,535,536,537],"Hallucinations","Citations","Grounding","Faithfulness",[539,540,541,542,543,544,545,546,547,548],"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",[550,553,554],{"name":551,"url":552},"Hallucination (artificial intelligence)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHallucination_(artificial_intelligence)",{"name":28,"url":29},{"name":555,"url":556},"Large language model","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLarge_language_model",[558,561,564,567,570,573,576,579,582,585,588,591,594],{"title":559,"url":560},"Anthropic: Citations (Claude API documentation)","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fcitations",{"title":562,"url":563},"Anthropic: Search results (Claude API documentation)","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fsearch-results",{"title":565,"url":566},"Anthropic: Reduce hallucinations (Claude API documentation)","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Ftest-and-evaluate\u002Fstrengthen-guardrails\u002Freduce-hallucinations",{"title":568,"url":569},"Anthropic: Introducing Citations on the Anthropic API","https:\u002F\u002Fclaude.com\u002Fblog\u002Fintroducing-citations-api",{"title":571,"url":572},"Simon Willison: Anthropic's new Citations API (24 January 2025)","https:\u002F\u002Fsimonwillison.net\u002F2025\u002FJan\u002F24\u002Fanthropics-new-citations-api\u002F",{"title":574,"url":575},"OpenAI: Web search guide (url_citation annotations and display requirement)","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Ftools-web-search",{"title":577,"url":578},"Cohere: Documents and citations","https:\u002F\u002Fdocs.cohere.com\u002Fdocs\u002Fdocuments-and-citations",{"title":580,"url":581},"Google Cloud: Check grounding API","https:\u002F\u002Fdocs.cloud.google.com\u002Fgenerative-ai-app-builder\u002Fdocs\u002Fcheck-grounding",{"title":583,"url":584},"AWS: Amazon Bedrock Guardrails contextual grounding check","https:\u002F\u002Fdocs.aws.amazon.com\u002Fbedrock\u002Flatest\u002Fuserguide\u002Fguardrails-contextual-grounding-check.html",{"title":586,"url":587},"Ragas: Faithfulness metric","https:\u002F\u002Fdocs.ragas.io\u002Fen\u002Fstable\u002Fconcepts\u002Fmetrics\u002Favailable_metrics\u002Ffaithfulness\u002F",{"title":589,"url":590},"Kalai, Nachum, Vempala, Zhang: Why Language Models Hallucinate (arXiv 2509.04664)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2509.04664",{"title":592,"url":593},"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":595,"url":596},"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",[74,75,76],"Reducing LLM hallucinations in production: grounding, citations and knowing when to say no","Cut hallucinations in production RAG: citation APIs, abstention, claim-level checks, faithfulness metrics, source UI, and the failures that still slip through.","Diagram: a retrieval step feeds an evidence gate, a cited answer and a claim verifier, ending in an answer with sources, with abstain and flag paths branching off.",{"slug":604,"published":5,"minutes":6,"category":7,"tags":605,"keywords":610,"about":621,"sources":629,"cover":681,"og":682,"expertise":72,"locales":683,"lang":74,"title":684,"description":685,"coverAlt":686},"pgvector-vs-vector-databases",[606,607,12,608,609],"pgvector","Vector databases","Hybrid search","EU hosting",[611,612,613,614,615,616,617,618,619,620],"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",[622,625,628],{"name":623,"url":624},"Vector database","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FVector_database",{"name":626,"url":627},"PostgreSQL","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPostgreSQL",{"name":28,"url":29},[630,633,636,639,642,645,648,651,654,657,660,663,666,669,672,675,678],{"title":631,"url":632},"pgvector README (index limits, HNSW defaults, iterative scans, filtering, halfvec)","https:\u002F\u002Fgithub.com\u002Fpgvector\u002Fpgvector\u002Fblob\u002Fmaster\u002FREADME.md",{"title":634,"url":635},"pgvector CHANGELOG (0.4.0 to 0.8.7)","https:\u002F\u002Fgithub.com\u002Fpgvector\u002Fpgvector\u002Fblob\u002Fmaster\u002FCHANGELOG.md",{"title":637,"url":638},"pgvectorscale: StreamingDiskANN, statistical binary quantization, filtered search","https:\u002F\u002Fgithub.com\u002Ftimescale\u002Fpgvectorscale",{"title":640,"url":641},"Qdrant documentation: Filtering","https:\u002F\u002Fqdrant.tech\u002Fdocumentation\u002Fconcepts\u002Ffiltering\u002F",{"title":643,"url":644},"Qdrant documentation: Hybrid queries","https:\u002F\u002Fqdrant.tech\u002Fdocumentation\u002Fconcepts\u002Fhybrid-queries\u002F",{"title":646,"url":647},"Qdrant documentation: Create a cluster (providers, free tier, Hybrid Cloud)","https:\u002F\u002Fqdrant.tech\u002Fdocumentation\u002Fcloud\u002Fcreate-cluster\u002F",{"title":649,"url":650},"Weaviate documentation: Hybrid search","https:\u002F\u002Fdocs.weaviate.io\u002Fweaviate\u002Fconcepts\u002Fsearch\u002Fhybrid-search",{"title":652,"url":653},"Weaviate documentation: Vector index types","https:\u002F\u002Fdocs.weaviate.io\u002Fweaviate\u002Fconcepts\u002Fvector-index",{"title":655,"url":656},"Weaviate Cloud pricing and deployment options","https:\u002F\u002Fweaviate.io\u002Fpricing",{"title":658,"url":659},"Milvus documentation: Overview","https:\u002F\u002Fmilvus.io\u002Fdocs\u002Foverview.md",{"title":661,"url":662},"Pinecone documentation: Database architecture","https:\u002F\u002Fdocs.pinecone.io\u002Fguides\u002Fget-started\u002Fdatabase-architecture",{"title":664,"url":665},"Pinecone documentation: Create an index (clouds, regions, sparse and hybrid)","https:\u002F\u002Fdocs.pinecone.io\u002Fguides\u002Findex-data\u002Fcreate-an-index",{"title":667,"url":668},"OpenSearch documentation: Methods and engines","https:\u002F\u002Fdocs.opensearch.org\u002Flatest\u002Fmappings\u002Fsupported-field-types\u002Fknn-methods-engines\u002F",{"title":670,"url":671},"OpenSearch documentation: Efficient k-NN filtering","https:\u002F\u002Fdocs.opensearch.org\u002Flatest\u002Fvector-search\u002Ffilter-search-knn\u002Fefficient-knn-filtering\u002F",{"title":673,"url":674},"Elasticsearch documentation: Dense vector search","https:\u002F\u002Fwww.elastic.co\u002Fdocs\u002Fsolutions\u002Fsearch\u002Fvector\u002Fdense-vector",{"title":676,"url":677},"Elasticsearch documentation: kNN query (filter as pre-filter)","https:\u002F\u002Fwww.elastic.co\u002Fdocs\u002Freference\u002Fquery-languages\u002Fquery-dsl\u002Fquery-dsl-knn-query",{"title":679,"url":680},"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",[74,75,76],"pgvector or a vector database? How to choose vector storage in 2026","pgvector, Qdrant, Weaviate, Milvus, Pinecone, OpenSearch or Elasticsearch? A practical 2026 guide to filtering, hybrid search, scale, cost and EU hosting.","Diagram: a decision path from your data to pgvector in Postgres, a search engine with vector fields, or a dedicated vector database.",{"slug":688,"published":5,"minutes":689,"category":7,"tags":690,"keywords":696,"about":706,"sources":714,"cover":748,"og":749,"expertise":72,"locales":750,"lang":74,"title":751,"description":752,"coverAlt":753},"rag-evaluation-metrics",12,[691,692,693,694,695],"RAG evaluation","Retrieval metrics","LLM-as-judge","Golden set","Ragas",[691,697,698,699,700,701,702,703,704,705],"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",[707,708,711],{"name":28,"url":29},{"name":709,"url":710},"Discounted cumulative gain","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDiscounted_cumulative_gain",{"name":712,"url":713},"Mean reciprocal rank","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMean_reciprocal_rank",[715,718,721,724,726,729,732,735,738,741,743,745],{"title":716,"url":717},"Es et al.: RAGAS, Automated Evaluation of Retrieval Augmented Generation (arXiv 2309.15217)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2309.15217",{"title":719,"url":720},"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":722,"url":723},"Ragas documentation: available metrics","https:\u002F\u002Fdocs.ragas.io\u002Fen\u002Fstable\u002Fconcepts\u002Fmetrics\u002Favailable_metrics\u002F",{"title":725,"url":587},"Ragas documentation: faithfulness",{"title":727,"url":728},"Ragas documentation: context precision","https:\u002F\u002Fdocs.ragas.io\u002Fen\u002Fstable\u002Fconcepts\u002Fmetrics\u002Favailable_metrics\u002Fcontext_precision\u002F",{"title":730,"url":731},"Ragas documentation: context recall","https:\u002F\u002Fdocs.ragas.io\u002Fen\u002Fstable\u002Fconcepts\u002Fmetrics\u002Favailable_metrics\u002Fcontext_recall\u002F",{"title":733,"url":734},"DeepEval documentation: metrics introduction","https:\u002F\u002Fdeepeval.com\u002Fdocs\u002Fmetrics-introduction",{"title":736,"url":737},"TruLens","https:\u002F\u002Fwww.trulens.org\u002F",{"title":739,"url":740},"Arize Phoenix documentation","https:\u002F\u002Farize.com\u002Fdocs\u002Fphoenix",{"title":742,"url":710},"Wikipedia: Discounted cumulative gain",{"title":744,"url":713},"Wikipedia: Mean reciprocal rank",{"title":746,"url":747},"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",[74,75,76],"Evaluating RAG: retrieval metrics, faithfulness and how to tell which half failed","How to evaluate a RAG system: recall at k, MRR and nDCG vs faithfulness and answer relevance, a golden set from real queries, a calibrated LLM judge and evals in CI.","Diagram: a RAG answer is scored on two sides, retrieval metrics such as recall at k, MRR and nDCG, and generation metrics such as faithfulness and answer relevance, feeding a diagnosis.",{"slug":755,"published":5,"minutes":6,"category":7,"tags":756,"keywords":761,"about":772,"sources":780,"cover":819,"og":820,"expertise":821,"locales":822,"lang":74,"title":823,"description":824,"coverAlt":825},"semantic-product-search-b2b",[757,608,758,759,760],"B2B search","Semantic search","Spryker","OpenSearch",[762,763,764,765,766,767,768,769,770,771],"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",[773,775,778],{"name":758,"url":774},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSemantic_search",{"name":776,"url":777},"Elasticsearch","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FElasticsearch",{"name":760,"url":779},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOpenSearch",[781,784,787,789,792,795,798,801,804,807,810,813,816],{"title":782,"url":783},"Baymard Institute: E-commerce search query types","https:\u002F\u002Fbaymard.com\u002Fblog\u002Fecommerce-search-query-types",{"title":785,"url":786},"Elastic Search Labs: Hybrid search in Elasticsearch","https:\u002F\u002Fwww.elastic.co\u002Fsearch-labs\u002Fblog\u002Fhybrid-search-elasticsearch",{"title":788,"url":677},"Elasticsearch documentation: kNN query (pre-filters and post-filters)",{"title":790,"url":791},"Elasticsearch documentation: Semantic reranking","https:\u002F\u002Fwww.elastic.co\u002Fdocs\u002Fsolutions\u002Fsearch\u002Franking\u002Fsemantic-reranking",{"title":793,"url":794},"Elasticsearch documentation: Word delimiter graph token filter","https:\u002F\u002Fwww.elastic.co\u002Fdocs\u002Freference\u002Ftext-analysis\u002Fanalysis-word-delimiter-graph-tokenfilter",{"title":796,"url":797},"Elasticsearch documentation: Synonym graph token filter","https:\u002F\u002Fwww.elastic.co\u002Fdocs\u002Freference\u002Ftext-analysis\u002Fanalysis-synonym-graph-tokenfilter",{"title":799,"url":800},"OpenSearch documentation: Score ranker processor (RRF)","https:\u002F\u002Fdocs.opensearch.org\u002Flatest\u002Fsearch-plugins\u002Fsearch-pipelines\u002Fscore-ranker-processor\u002F",{"title":802,"url":803},"OpenSearch documentation: Normalization processor","https:\u002F\u002Fdocs.opensearch.org\u002Flatest\u002Fsearch-plugins\u002Fsearch-pipelines\u002Fnormalization-processor\u002F",{"title":805,"url":806},"Spryker documentation: Search feature overview","https:\u002F\u002Fdocs.spryker.com\u002Fdocs\u002Fpbc\u002Fall\u002Fsearch\u002Flatest\u002Fbase-shop\u002Fsearch-feature-overview\u002Fsearch-feature-overview",{"title":808,"url":809},"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":811,"url":812},"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":814,"url":815},"arXiv: M3-Embedding, multilingual, multi-functionality, multi-granularity text embeddings","https:\u002F\u002Farxiv.org\u002Fabs\u002F2402.03216",{"title":817,"url":818},"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",[74,75,76],"Semantic product search for B2B shops: part numbers, hybrid retrieval and what to measure","How to add semantic search to a B2B shop without breaking part-number search: hybrid BM25 and vectors, filters, DE\u002FEN\u002FHU, LLM query parsing, reranking and metrics.","Diagram: a search query is split into an identifier lane, lexical BM25 and vector kNN, fused, reranked and returned as results.",1791009037129]