[{"data":1,"prerenderedAt":698},["ShallowReactive",2],{"blog-chroma-en":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":22,"sources":29,"cover":57,"og":58,"expertise":59,"locales":60,"lang":61,"title":64,"description":65,"coverAlt":66,"metaTitle":67,"takeaways":68,"faq":74,"toc":87,"blocks":115,"others":446},"chroma","2026-07-20",10,"rag",[9,10,11,12,13],"Vector search","Embeddings","RAG","Hybrid search","Metadata filter",[15,16,17,18,19,20,21],"chroma vector database","chroma vs qdrant","chroma vs pgvector","hybrid search reciprocal rank fusion","self-hosted vector database","chroma cloud pricing","metadata filtering vector search",[23,26],{"name":24,"url":25},"Chroma","https:\u002F\u002Fgithub.com\u002Fchroma-core\u002Fchroma",{"name":27,"url":28},"Apache License 2.0","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FApache_License",[30,33,36,39,42,45,48,51,54],{"title":31,"url":32},"Chroma documentation: introduction","https:\u002F\u002Fdocs.trychroma.com\u002Fdocs\u002Foverview\u002Fintroduction",{"title":34,"url":35},"Chroma architecture overview","https:\u002F\u002Fdocs.trychroma.com\u002Freference\u002Farchitecture\u002Foverview",{"title":37,"url":38},"Chroma: getting started with the SDK","https:\u002F\u002Fdocs.trychroma.com\u002Fdocs\u002Foverview\u002Fgetting-started",{"title":40,"url":41},"Chroma: query and get","https:\u002F\u002Fdocs.trychroma.com\u002Fdocs\u002Fquerying-collections\u002Fquery-and-get",{"title":43,"url":44},"Chroma: metadata filtering","https:\u002F\u002Fdocs.trychroma.com\u002Fdocs\u002Fquerying-collections\u002Fmetadata-filtering",{"title":46,"url":47},"Chroma Cloud: Search API overview","https:\u002F\u002Fdocs.trychroma.com\u002Fcloud\u002Fsearch-api\u002Foverview",{"title":49,"url":50},"Chroma Cloud: hybrid search with RRF","https:\u002F\u002Fdocs.trychroma.com\u002Fcloud\u002Fsearch-api\u002Fhybrid-search",{"title":52,"url":53},"Chroma Cloud: pricing","https:\u002F\u002Fwww.trychroma.com\u002Fpricing",{"title":55,"url":56},"Chroma changelog","https:\u002F\u002Fwww.trychroma.com\u002Fchangelog","\u002Fimages\u002Fblog\u002Fchroma\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fchroma\u002Fog.jpg","ai-engineer",[61,62,63],"en","de","hu","Chroma: simple vector search with one catch","Chroma is an Apache-2.0 vector database that runs embedded, single-node or as Chroma Cloud. Where it is pleasant, and where the good search features stop at the cloud boundary.","Three nested boxes on the left, a wall with one gate, and two small squares at the wall.","Chroma: simple vector search, cloud-only depth",[69,70,71,72,73],"Chroma is Apache-2.0 with about 27,000 GitHub stars and a single API across Python, TypeScript and Rust clients.","The embedded client starts inside the application process, so a first collection needs no server and no container.","Hybrid search with reciprocal rank fusion exists only in Chroma Cloud; the docs list single-node support as future work.","Cloud pricing is usage-based: $2.50 per GiB written, $0.33 per GiB stored per month, $0.0075 per TiB queried and $0.09 per GiB returned.","The honest engineering verdict: excellent default for a first retrieval layer, weak as the long-term home of a hybrid search stack.",[75,78,81,84],{"q":76,"a":77},"Is Chroma free to self-host?","Yes. The server is Apache-2.0 and runs as a local library, a single `chroma run` process or a Docker container. Chroma Cloud is the paid, managed layer on top, and the two share an API.",{"q":79,"a":80},"Does Chroma support hybrid search?","Only in Chroma Cloud. The Search API exposes reciprocal rank fusion over dense and sparse embeddings, and its documentation states plainly that single-node support is planned for a future release.",{"q":82,"a":83},"How large a corpus can one Chroma instance hold?","The architecture documentation puts single-node Chroma at fewer than 10 million records across a handful of collections. Larger workloads are meant for the distributed deployment behind Chroma Cloud.",{"q":85,"a":86},"Chroma or pgvector?","pgvector wins when the vectors already live in a Postgres row and transactional consistency matters. Chroma wins when retrieval is the product: richer search modes, multi-modal collections and a client that embeds for you.",[88,91,94,97,100,103,106,109,112],{"id":89,"title":90},"what-it-is","What it is",{"id":92,"title":93},"how-it-works","How it works",{"id":95,"title":96},"getting-started","Getting started",{"id":98,"title":99},"hybrid-search","Hybrid search and the cloud line",{"id":101,"title":102},"pricing","Pricing and what it costs per query",{"id":104,"title":105},"self-hosting","Self-hosting: what you actually run",{"id":107,"title":108},"where-it-shingles","Where it falls short",{"id":110,"title":111},"verdict","Verdict",{"id":113,"title":114},"sources","Sources",[116,120,123,126,129,145,146,149,155,158,159,162,165,168,204,205,208,210,221,222,225,293,296,297,300,312,317,318,321,388,391,392,395,409,415,416],{"type":117,"content":118},"paragraph",[119],"Chroma is an open-source vector database, Apache-2.0 licensed, that runs as an embedded library inside an application, as a single `chroma run` process, or as Chroma Cloud. The position this review takes is straightforward: it is the best default for the first retrieval layer of a RAG system, because the friction between an empty repository and a working query is close to zero, and it is a poor long-term home for a serious hybrid search stack, because the interesting parts of the query language are documented as cloud-only.",{"type":117,"content":121},[122],"In the stack it occupies one slot: storage and retrieval for embeddings. It competes with pgvector when the application already runs Postgres, with Qdrant or Milvus when retrieval needs its own service, and with Pinecone when nobody wants to operate anything. Chroma's distinctive bet is not the index but the ergonomics: an embedding function attached to a collection, a filter language that needs no index declarations, and clients for Python, TypeScript and Rust that all speak the same verbs.",{"type":124,"level":125,"id":89,"text":90},"heading",2,{"type":117,"content":127},[128],"The data model has three levels. A tenant holds databases, a database holds collections, and a collection is the unit of storage and querying: each item has an id, an embedding, and optionally a document and a metadata object. Access control, quota and billing are scoped at the tenant level, which matters for multi-tenant SaaS and is quietly absent from most single-node vector stores.",{"type":130,"ordered":131,"items":132},"list",false,[133,135,137,139,141,143],[134],"Licence: Apache 2.0, with roughly 27,000 stars on the GitHub repository and a tagged 1.5.9 release from May 2026.",[136],"Three deployment modes: an embedded library, a single node, and a distributed deployment that Chroma Cloud operates.",[138],"Three clients — Python, TypeScript and Rust — with the same collection, add, query and get shape, plus an async HTTP client.",[140],"Four search modes in one collection: dense vectors, sparse vectors, full-text and regex over documents, and metadata filtering.",[142],"Embedding functions as an interface, so a collection embeds on write and `query_texts` needs no model call in application code.",[144],"Two query APIs: the classic `query` and `get`, and a newer Search API with ranking expressions, available in Chroma Cloud.",{"type":124,"level":125,"id":92,"text":93},{"type":117,"content":147},[148],"Chroma delegates durability to subsystems it does not have to reinvent: SQLite locally, and cloud object storage in the distributed build, where hot data sits in SSD caches. The vendor's argument is economic rather than exotic — vectors are large and memory is expensive, so keeping the source of truth in object storage at a fraction of the cost of RAM is what makes the cloud price list possible.",{"type":150,"src":151,"alt":152,"wide":153,"caption":154},"image","\u002Fimages\u002Fblog\u002Fchroma\u002Fdiagram-7.webp","The Chroma retrieval path Four stages. Ingest: chunks arrive with ids, documents and metadata, and an embedding function produces the vectors. Index: one collection holds a vector index, a sparse index, a full-text index and a metadata index side by side. Query: a vector, a where filter on metadata and a where_document filter on the stored text narrow the candidate set before ranking. Rank: the classic query API returns distances, while the cloud Search API can fuse dense and sparse rankings with reciprocal rank fusion. Below them a bar: single node keeps everything in one process over SQLite, Chroma Cloud runs a distributed engine on object storage with an SSD cache.",true,"The API is identical in both modes until the Search API enters, and that is exactly where the two products stop being interchangeable.",{"type":117,"content":156},[157],"What the vendor does not publish is a public benchmark with methodology behind it. The Cloud documentation claims that production systems exceed 90 per cent recall and that the storage design makes Chroma Cloud an order of magnitude cheaper than alternatives; both are plausible and neither is reproducible from the docs. Treat them as a starting point for your own evaluation, not as a result.",{"type":124,"level":125,"id":95,"text":96},{"type":117,"content":160},[161],"The embedded client starts a server inside the process and loses everything when the program exits, which is exactly what you want for a test and exactly what you do not want for production. A minimal query needs a client, a collection, an upsert and a query — no server, no container, no index tuning.",{"type":163,"code":164},"code","import chromadb\n\nclient = chromadb.Client()\ncollection = client.get_or_create_collection(\"docs\")\n\ncollection.upsert(\n    ids=[\"d1\", \"d2\"],\n    documents=[\n        \"Refunds are issued within five business days.\",\n        \"Support answers within one working day.\",\n    ],\n    metadatas=[{\"topic\": \"billing\"}, {\"topic\": \"support\"}],\n)\n\nhits = collection.query(\n    query_texts=[\"how fast is a refund?\"],\n    where={\"topic\": \"billing\"},\n    n_results=1,\n)\n\n# Results are column-major: one list per query, one entry per result.\nprint(hits[\"documents\"][0][0])",{"type":117,"content":166},[167],"Three details in that snippet cause most of the friction later. Results come back column-major, so every consumer has to zip parallel arrays rather than iterate records. `n_results` defaults to 10, which silently returns nothing useful on a small test collection. And the filter goes in `where` against metadata, while text matching against the stored document goes in `where_document` with `$contains` or a regex.",{"type":169,"variant":170,"title":171,"body":172},"callout","note","Filter operators",[173],[174,175,178,179,182,183,178,186,189,190,178,193,196,197,178,200,203],"The metadata filter supports comparison operators, ",{"tag":163,"children":176},[177],"$gt"," and ",{"tag":163,"children":180},[181],"$lte",", membership with ",{"tag":163,"children":184},[185],"$in",{"tag":163,"children":187},[188],"$nin",", boolean composition with ",{"tag":163,"children":191},[192],"$and",{"tag":163,"children":194},[195],"$or",", and, since February 2026, ",{"tag":163,"children":198},[199],"$contains",{"tag":163,"children":201},[202],"$not_contains"," over array metadata fields. No index declaration is needed, which is convenient until a filter is slow and there is nothing to tune.",{"type":124,"level":125,"id":98,"text":99},{"type":117,"content":206},[207],"The Search API replaces `query` and `get` with a composable expression: `Search` builds the filter and the limit, `Knn` supplies a ranking, and `Rrf` fuses several rankings. Reciprocal rank fusion scores each candidate as the negative sum of weight divided by the smoothing constant plus its rank, with k defaulting to 60, which is why it works across dense and sparse results without normalising two different score scales.",{"type":163,"code":209},"from chromadb import Search, K, Knn, Rrf\n\ndense = Knn(\n    query=\"how fast is a refund?\",\n    key=\"#embedding\",\n    return_rank=True,\n    limit=200,\n)\nsparse = Knn(\n    query=\"how fast is a refund?\",\n    key=\"sparse_embedding\",\n    return_rank=True,\n    limit=200,\n)\n\nsearch = (\n    Search()\n    .where(K(\"topic\") == \"billing\")\n    .rank(Rrf(ranks=[dense, sparse], weights=[0.7, 0.3], k=60))\n    .limit(10)\n    .select(K.DOCUMENT, K.SCORE)\n)\n\nrows = collection.search(search).rows()[0]\nfor row in rows:\n    print(row[\"score\"], row[\"document\"][:60])",{"type":169,"variant":211,"title":212,"body":213},"warn","Three traps in the Search API",[214],[215,216,220],"It is documented as Chroma Cloud only, with single-node support planned for a future release, so this code does not run against a self-hosted server. ",{"tag":217,"children":218},"strong",[219],"return_rank=True"," is mandatory on every Knn inside an Rrf — omit it and the components contribute distances instead of ranks, producing a plausible, silently wrong ranking. And scores are sorted ascending, so lower is better, unlike the distances the classic API returns.",{"type":124,"level":125,"id":101,"text":102},{"type":117,"content":223},[224],"Chroma Cloud bills four separate meters, and the interesting one is not the vector store. Writes are $2.50 per GiB, storage is $0.33 per GiB per month, queries are $0.0075 per TiB, and network egress is $0.09 per GiB returned. A Starter plan costs nothing per month and includes $5 in credits, ten databases and ten team members; Team is $250 per month with $100 in credits, a hundred databases, thirty members and SOC II.",{"type":226,"head":227,"rows":247},"table",[228,233,238,243],[229,230,231,232],"Cloud plan","Price","Usage meter","Included",[234,235,236,237],"Starter","$0 per month","write, storage, query, network","$5 credits, 10 databases, 10 members",[239,240,241,242],"Team","$250 per month","same four meters","$100 credits, 100 databases, 30 members, SOC II",[244,245,241,246],"Enterprise","Custom","unlimited databases, single tenant, BYOC, SLAs",[248,257,266,275,284],[249,251,253,255],[250],"Write",[252],"per GiB written",[254],"$2.50",[256],"billed once per ingest",[258,260,262,264],[259],"Storage",[261],"per GiB per month",[263],"$0.33",[265],"vectors plus documents plus metadata",[267,269,271,273],[268],"Query",[270],"per TiB queried",[272],"$0.0075",[274],"effectively free at most corpus sizes",[276,278,280,282],[277],"Network",[279],"per GiB returned",[281],"$0.09",[283],"the meter that punishes large results",[285,287,289,291],[286],"Self-hosted",[288],"$0",[290],"your own disk",[292],"Apache-2.0, single node, no Search API",{"type":117,"content":294},[295],"The vendor's own calculator is instructive. At 1536 dimensions with 8 KiB documents across 500 collections, one million documents cost about $34 to write, six million stored documents about $27 a month, and ten million queries about $19 — roughly $79 a month for a corpus of six million chunks. Note the direction of the economics: 1 GiB of text becomes about 15 GiB of vectors, so storage is billed on the number that inflates fastest, and returning whole documents rather than short chunks is what pushes the egress meter up.",{"type":124,"level":125,"id":104,"text":105},{"type":117,"content":298},[299],"Self-hosting is not one thing. The architecture documentation separates three modes with different ceilings, and the difference between them is larger than the branding suggests.",{"type":130,"ordered":131,"items":301},[302,304,306,308,310],[303],"Embedded: `chromadb.Client()` runs in-process, keeps data in memory or on a local path, and dies with the program. Fine for tests, not for a service.",[305],"Single node: `chroma run --path` behind an `HttpClient`, documented at fewer than 10 million records across a handful of collections. Durable, simple, single point of failure.",[307],"Distributed: the deployment Chroma Cloud operates, with object storage persistence and SSD caches, pinned to a single region per database.",[309],"Data residency: Chroma Cloud runs in AWS us-east-1 and, since April 2026, GCP europe-west1. The region is fixed at creation and moving means creating a new database and reindexing.",[311],"Compliance: Chroma Cloud is SOC 2 Type II certified; customer-managed encryption keys arrived in December 2025 and private networking in January 2026.",{"type":169,"variant":170,"title":313,"body":314},"Region choice is permanent",[315],[316],"The EU region is offered on all plans and carries full API parity for collections, search and forking — but Chroma Sync, the Chroma CLI and the Search Agent are US-only at launch. If a plan depends on those, the region decision made at creation time cannot be undone.",{"type":124,"level":125,"id":107,"text":108},{"type":117,"content":319},[320],"The weaknesses come first, because they decide the choice. Hybrid ranking is cloud-only. Metadata filtering is convenient rather than tunable, and a filter that slows down gives you no index to adjust. The result shape is column-major, which adds a small but permanent tax on every consumer. And the price list punishes exactly the pattern that retrieval-augmented generation encourages: returning a large context window per query.",{"type":226,"head":322,"rows":346},[323,327,331,336,341],[324,325,12,326],"","Deployment","Lock-in profile",[24,328,329,330],"embedded, single node, cloud","RRF in Chroma Cloud only","Apache-2.0 server; the Search API is not",[332,333,334,335],"pgvector","extension inside existing Postgres","manual: vector index plus SQL full text","Postgres licence; nothing to leave",[337,338,339,340],"Qdrant","self-hosted or Cloud","native dense plus sparse","Apache-2.0; filter-heavy design to learn",[342,343,344,345],"Pinecone","managed only","native in the hosted API","no self-hosted path",[347,357,368,377],[348,350,352,354,355],[349],"Licence",[351],"Apache 2.0",[353],"PostgreSQL licence",[351],[356],"proprietary",[358,360,362,364,366],[359],"Operational cost",[361],"lowest",[363],"none, same instance",[365],"a service to run",[367],"none",[369,371,373,375,376],[370],"Dimensional limits",[372],"none documented",[374],"2,000 on vector, 4,000 on halfvec",[372],[372],[378,380,382,384,386],[379],"Best fit",[381],"first retrieval layer",[383],"vectors beside the row",[385],"filter-heavy retrieval",[387],"no operations at all",{"type":117,"content":389},[390],"The comparison that matters is with pgvector. If the corpus already lives in a Postgres table and the vectors belong in the same transaction, a dedicated vector store is an extra service to back up, secure and monitor for a capability Postgres can already provide, with the hard ceiling of 2,000 dimensions on the standard vector type and 4,000 with half-precision. Chroma earns its place when retrieval is the product: multi-modal collections, regex over stored documents, collection forking for experiments, and an embedding function that removes a model call from application code.",{"type":124,"level":125,"id":110,"text":111},{"type":117,"content":393},[394],"Chroma is a well-judged default with a specific blind spot. The ergonomics are real: three clients, one API, a filter language that needs no schema, and a path from `import chromadb` to a ranked result in about ten lines. The blind spot is equally real: the query features that separate a demo from a retrieval system are the ones you cannot self-host today. That is a reasonable trade for a first layer and a poor one for a system expected to last.",{"type":130,"ordered":153,"items":396},[397,399,401,403,405,407],[398],"Pick it when the retrieval layer is still being designed and the fastest path to a measurable baseline matters most.",[400],"Pick it when embeddings, documents and metadata must live in one collection and the team is multi-tenant from the start.",[402],"Pick it for prototyping that will later be replaced; the collection API is small enough that a rewrite is a day, not a quarter.",[404],"Skip it when hybrid search has to run inside your own network boundary today — the Search API is not available there.",[406],"Skip it when the corpus is already in Postgres and pgvector's dimension ceiling does not bite.",[408],"Reconsider it once the corpus passes a few million chunks and single-node ceilings, or once egress per GiB returned dominates the bill.",{"type":169,"variant":410,"title":411,"body":412},"tip","The one thing to get right",[413],[414],"Attach an explicit embedding function to the collection and pin the model version in your own config. The default embedding function is convenient and will change under you, and re-embedding a corpus is the one migration in this stack that is genuinely expensive.",{"type":124,"level":125,"id":113,"text":114},{"type":130,"ordered":153,"items":417},[418,422,425,428,431,434,437,440,443],[419],{"tag":420,"href":32,"children":421},"a",[31],[423],{"tag":420,"href":35,"children":424},[34],[426],{"tag":420,"href":38,"children":427},[37],[429],{"tag":420,"href":41,"children":430},[40],[432],{"tag":420,"href":44,"children":433},[43],[435],{"tag":420,"href":47,"children":436},[46],[438],{"tag":420,"href":50,"children":439},[49],[441],{"tag":420,"href":53,"children":442},[52],[444],{"tag":420,"href":56,"children":445},[55],[447,520,579,637],{"slug":448,"published":449,"minutes":450,"category":7,"tags":451,"keywords":454,"about":467,"sources":477,"cover":514,"og":515,"expertise":59,"locales":516,"lang":61,"title":517,"description":518,"coverAlt":519},"embedding-model-selection-2026","2026-10-17",9,[10,11,452,9,453],"MTEB","Model selection",[455,456,457,458,459,460,461,462,463,464,465,466],"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",[468,471,474],{"name":469,"url":470},"Word embedding","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWord_embedding",{"name":472,"url":473},"Information retrieval","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FInformation_retrieval",{"name":475,"url":476},"Discounted cumulative gain","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDiscounted_cumulative_gain",[478,481,484,487,490,493,496,499,502,505,508,511],{"title":479,"url":480},"Enevoldsen et al.: MMTEB, Massive Multilingual Text Embedding Benchmark (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2502.13595",{"title":482,"url":483},"Hugging Face: Introducing RTEB, a new standard for retrieval evaluation (Oct 2025)","https:\u002F\u002Fhuggingface.co\u002Fblog\u002Frteb",{"title":485,"url":486},"OpenAI: Vector embeddings guide","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fembeddings",{"title":488,"url":489},"OpenAI: API pricing","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fpricing",{"title":491,"url":492},"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":494,"url":495},"Voyage AI: Text embeddings documentation","https:\u002F\u002Fdocs.voyageai.com\u002Fdocs\u002Fembeddings",{"title":497,"url":498},"Voyage AI: Pricing","https:\u002F\u002Fdocs.voyageai.com\u002Fdocs\u002Fpricing",{"title":500,"url":501},"Google: Gemini API embeddings documentation","https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Fembeddings",{"title":503,"url":504},"Google: Gemini API pricing","https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Fpricing",{"title":506,"url":507},"Cohere: Embed models documentation","https:\u002F\u002Fdocs.cohere.com\u002Fdocs\u002Fcohere-embed",{"title":509,"url":510},"Qwen: Qwen3-Embedding-8B model card","https:\u002F\u002Fhuggingface.co\u002FQwen\u002FQwen3-Embedding-8B",{"title":512,"url":513},"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",[61,62,63],"Choosing an embedding model in 2026: leaderboards, costs and a bake-off on your own data","How to pick an embedding model for RAG in 2026: what MTEB and RTEB tell you, hosted vs open weights, prices, dimensions, and a one-week bake-off.","Three columns of stacked blocks, the middle tallest, each measured by a short bar and a wide bracket.",{"slug":521,"published":449,"minutes":6,"category":7,"tags":522,"keywords":526,"about":538,"sources":548,"cover":573,"og":574,"expertise":59,"locales":575,"lang":61,"title":576,"description":577,"coverAlt":578},"contextual-retrieval-late-chunking",[11,523,10,524,525],"Chunking","Contextual retrieval","Late chunking",[527,528,529,530,531,532,533,534,535,536,537],"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",[539,542,545],{"name":540,"url":541},"Retrieval-augmented generation","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRetrieval-augmented_generation",{"name":543,"url":544},"Okapi BM25","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOkapi_BM25",{"name":546,"url":547},"Sentence embedding","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSentence_embedding",[549,552,555,558,561,564,567,570],{"title":550,"url":551},"Anthropic: Introducing Contextual Retrieval (Sep 2024)","https:\u002F\u002Fwww.anthropic.com\u002Fnews\u002Fcontextual-retrieval",{"title":553,"url":554},"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":556,"url":557},"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":559,"url":560},"Voyage AI: Introducing voyage-context-3 (Jul 2025)","https:\u002F\u002Fblog.voyageai.com\u002F2025\u002F07\u002F23\u002Fvoyage-context-3\u002F",{"title":562,"url":563},"Voyage AI: voyage-context-4 (Jun 2026)","https:\u002F\u002Fblog.voyageai.com\u002F2026\u002F06\u002F29\u002Fvoyage-context-4\u002F",{"title":565,"url":566},"Voyage AI: Contextualized chunk embeddings documentation","https:\u002F\u002Fdocs.voyageai.com\u002Fdocs\u002Fcontextualized-chunk-embeddings",{"title":568,"url":569},"Anthropic: Claude API pricing","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fabout-claude\u002Fpricing",{"title":571,"url":572},"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",[61,62,63],"Contextual retrieval and late chunking: giving RAG chunks back their context","Chunks lose their document. How contextual retrieval, late chunking and contextualized embedding models fix that, what each costs, and when to skip it.","Four loose square pieces gathered by a wide bracket below, each joined upward to a large sheet.",{"slug":580,"published":449,"minutes":450,"category":7,"tags":581,"keywords":585,"about":598,"sources":606,"cover":631,"og":632,"expertise":59,"locales":633,"lang":61,"title":634,"description":635,"coverAlt":636},"rag-access-control-permissions",[11,582,583,584,9],"Access control","Security","Multi-tenancy",[586,587,588,589,590,591,592,593,594,595,596,597],"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",[599,602,605],{"name":600,"url":601},"Access-control list","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAccess-control_list",{"name":603,"url":604},"Multitenancy","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMultitenancy",{"name":540,"url":541},[607,610,613,616,619,622,625,628],{"title":608,"url":609},"OWASP GenAI Security Project: LLM08:2025 Vector and Embedding Weaknesses","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm082025-vector-and-embedding-weaknesses\u002F",{"title":611,"url":612},"PostgreSQL documentation: Row Security Policies","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fddl-rowsecurity.html",{"title":614,"url":615},"pgvector README: filtering and iterative index scans","https:\u002F\u002Fgithub.com\u002Fpgvector\u002Fpgvector",{"title":617,"url":618},"Qdrant: Multitenancy and partitions guide","https:\u002F\u002Fqdrant.tech\u002Fdocumentation\u002Fguides\u002Fmultiple-partitions\u002F",{"title":620,"url":621},"Pinecone: Implement multitenancy using namespaces","https:\u002F\u002Fdocs.pinecone.io\u002Fguides\u002Findex-data\u002Fimplement-multitenancy",{"title":623,"url":624},"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":626,"url":627},"OpenFGA: RAG authorization use case","https:\u002F\u002Fopenfga.dev\u002Fdocs\u002Fuse-cases\u002Frag-authorization",{"title":629,"url":630},"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",[61,62,63],"Access control for RAG: permission-aware retrieval without leaking documents","How RAG assistants leak documents and how to stop it: ACLs on every chunk, pre-filtering, row-level security in pgvector, permission sync and leak tests.","Seven cards in a row, six with a lock badge, one bare card sending an arrow outward.",{"slug":638,"published":449,"minutes":6,"category":7,"tags":639,"keywords":644,"about":656,"sources":664,"cover":691,"og":692,"expertise":693,"locales":694,"lang":61,"title":695,"description":696,"coverAlt":697},"rag-product-catalog-pim-data",[11,640,641,642,643],"PIM","Product data","B2B e-commerce","Metadata filtering",[645,646,647,648,649,650,651,652,653,654,655],"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",[657,660,661],{"name":658,"url":659},"Product information management","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FProduct_information_management",{"name":540,"url":541},{"name":662,"url":663},"ETIM (standard)","https:\u002F\u002Fwww.etim-international.com\u002Fclassification\u002F",[665,668,671,674,676,679,682,685,688],{"title":666,"url":667},"Akeneo API: Products, product values, metric values and product models","https:\u002F\u002Fapi.akeneo.com\u002Fconcepts\u002Fproducts.html",{"title":669,"url":670},"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":672,"url":673},"Pimcore documentation: Classification Store","https:\u002F\u002Fdocs.pimcore.com\u002Fplatform\u002FPimcore\u002FObjects\u002FObject_Classes\u002FData_Types\u002FClassification_Store\u002F",{"title":675,"url":663},"ETIM International: Classification",{"title":677,"url":678},"ETIM International: ETIM releases and the IXF format","https:\u002F\u002Fetim-international.com\u002F?p=754",{"title":680,"url":681},"Reddy et al.: Shopping Queries Dataset, a large-scale ESCI benchmark for improving product search (2022)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2206.06588",{"title":683,"url":684},"Amazon Science: esci-data repository","https:\u002F\u002Fgithub.com\u002Famazon-science\u002Fesci-data",{"title":686,"url":687},"Qdrant documentation: Filtering","https:\u002F\u002Fqdrant.tech\u002Fdocumentation\u002Fconcepts\u002Ffiltering\u002F",{"title":689,"url":690},"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",[61,62,63],"RAG over product catalogues: turning PIM data into answers that hold","Product data is structured, so chunking it like PDFs fails. How to serialize PIM attributes, route spec questions to filters and keep answers exact.","A frame of nine squares with tiny symbols, funnelling down to one card.",1792261156233]