Context precision
Context precision is a RAGAS metric that measures whether the retriever ranks the useful chunks above the useless ones, by averaging precision at each position that holds a useful chunk.
Last updated: 29 Sep, 2026 · RAGAS 0.4.3
A retriever returns chunks in order, and the model reads the top ones most carefully. Two retrievers can return the same chunks, one with the useful chunk first and one with it last. Context precision tells them apart.
Ranking and the position penalty
The video's query is "What is the minimum balance for my savings account?", and the retriever returns five ranked chunks, the top-k. You want the most relevant chunk first and the least relevant last. The judge marks each chunk relevant or noise: the urban minimum balance and the non-maintenance fee are relevant, "KYC update required every 8 years" at rank 3 is noise, and the semi-urban and rural balances at ranks 4 and 5 are relevant.
Then the penalty. Precision at each rank k is the share of relevant chunks in the top k: 1.00, 1.00, then 0.67 at the noise, 0.75 at rank 4 and 0.80 at rank 5. Only the relevant positions count, so the score is (1 + 1 + 0.75 + 0.80) / 4 = 0.89. The earlier the noise, the bigger the hit. A low context precision is the signal to add a reranker.
The ContextPrecision API
from ragas.metrics.collections import ContextPrecision
precision = ContextPrecision(llm=judge) # judges each chunk against the reference
precision.score(user_input=..., reference=..., retrieved_contexts=[...]).valueThe five ranked chunks
chunks = [
"Minimum balance is ₹10,000 for urban branches.",
"Non-maintenance fee is ₹350 + taxes if the balance falls below the minimum.",
"KYC update is required every 8 years.",
"Semi-urban branch minimum balance is ₹5,000.",
"Rural branch minimum balance is ₹2,500.",
]The reference the judge compares against
reference = ("Urban branches require a ₹10,000 minimum balance. The non-maintenance fee is ₹350 + taxes "
"when the balance falls below the limit. Semi-urban branches require ₹5,000 and rural "
"branches ₹2,500.")ContextPrecision asks the judge, for each chunk, whether it is useful for reaching the reference, the golden's answer. The chunks and the reference use the claims from the video's slides.
- written in LLM as a judge
- written in TechNest RAG app
- written in TechNest RAG app
- written in Goldens
View the code here
import os
from google import genai
from openai import AsyncOpenAI
from ragas.embeddings import GoogleEmbeddings
from ragas.llms import llm_factory
groq = AsyncOpenAI(
api_key=os.environ.get("JUDGE_GROQ", os.environ["GROQ_API_KEY"]),
base_url="https://api.groq.com/openai/v1",
)
judge = llm_factory("openai/gpt-oss-20b", provider="openai", client=groq)
class OneTextPerCall(GoogleEmbeddings):
"""gemini-embedding-2 turns a list into one embedding, so embed each text on its own."""
def embed_texts(self, texts, **kwargs):
return [self.embed_text(text) for text in texts]
async def aembed_texts(self, texts, **kwargs):
return [await self.aembed_text(text) for text in texts]
embeddings = OneTextPerCall(client=genai.Client(), model="gemini-embedding-2")
import json
import os
import numpy as np
from google import genai
from openai import OpenAI
gemini = genai.Client() # reads GOOGLE_API_KEY
groq = OpenAI(api_key=os.environ["GROQ_API_KEY"], base_url="https://api.groq.com/openai/v1")
EMBED_MODEL = "gemini-embedding-2"
CHAT_MODEL = "qwen/qwen3.8-27b"
SYSTEM_PROMPT = """You are a helpful customer support assistant for TechNest, an online electronics store.
Answer the customer's question using ONLY the information provided in the context below.
If the context does not contain enough information to answer fully, say so honestly.
Keep your answer concise, factual, and friendly. Do not invent any details not present in the context.
Reply in two or three plain sentences, with no lists or tables."""
with open("catalog.json", encoding="utf-8") as f:
CATALOG = json.load(f)
def embed(texts):
# gemini-embedding-2 turns everything in one call into one embedding, so send one text per call
vectors = np.array([gemini.models.embed_content(model=EMBED_MODEL, contents=t).embeddings[0].values for t in texts])
return vectors / np.linalg.norm(vectors, axis=1, keepdims=True)
DOC_VECTORS = embed([f"{item['title']}. {item['content']}" for item in CATALOG])
def retrieve(question, top_k=3):
scores = DOC_VECTORS @ embed([question])[0]
best = np.argsort(scores)[::-1][:top_k]
return [CATALOG[i]["content"] for i in best]
def generate(question, contexts):
context_block = "\n\n".join(f"[{i+1}] {c}" for i, c in enumerate(contexts))
messages = [
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": f"Context:\n{context_block}\n\nCustomer question: {question}"},
]
response = groq.chat.completions.create(model=CHAT_MODEL, messages=messages, temperature=0)
return response.choices[0].message.content.strip()
def answer(question, top_k=3):
contexts = retrieve(question, top_k)
return generate(question, contexts), contexts
[
{
"id": "prod_001",
"category": "product",
"title": "ProBook X1 Laptop",
"content": "The TechNest ProBook X1 is a 14-inch laptop featuring an Intel Core i7-13th Gen processor, 16GB DDR5 RAM, and a 512GB NVMe SSD. It has a battery life of 12 hours, weighs 1.4kg, and comes with a backlit keyboard. Price: $1,299. Includes a 2-year manufacturer warranty."
},
{
"id": "prod_002",
"category": "product",
"title": "PixelPhone 15",
"content": "The TechNest PixelPhone 15 is a 6.7-inch AMOLED smartphone with a 50MP triple camera system, 8GB RAM, 256GB storage, and a 5,000mAh battery supporting 65W fast charging. Available in Midnight Black and Arctic White. Price: $899. Includes a 1-year warranty."
},
{
"id": "prod_003",
"category": "product",
"title": "SoundPods Pro",
"content": "The TechNest SoundPods Pro are true wireless earbuds with active noise cancellation (ANC), 8 hours of playback per charge plus 24 hours with the case, and IPX4 water resistance. They connect via Bluetooth 5.3 and support multipoint pairing with two devices simultaneously. Price: $149."
},
{
"id": "prod_004",
"category": "product",
"title": "UltraTab S2 Tablet",
"content": "The TechNest UltraTab S2 is a 11-inch tablet powered by a Snapdragon 870 processor with 8GB RAM and 128GB storage expandable via microSD. It features a 120Hz display, a 7,500mAh battery, and supports the TechNest Stylus Pen sold separately. Price: $549. Includes a 1-year warranty."
},
{
"id": "prod_005",
"category": "product",
"title": "SmartWatch X",
"content": "The TechNest SmartWatch X features continuous heart rate monitoring, SpO2 tracking, GPS, and 7-day battery life. It is water-resistant up to 50 metres. Compatible with both Android and iOS. Price: $299. Includes a 1-year warranty and a free extra silicone band."
},
{
"id": "prod_006",
"category": "product",
"title": "ProCam 4K Action Camera",
"content": "The TechNest ProCam 4K shoots 4K video at 60fps and 20MP photos. It is waterproof up to 10 metres without a case, has built-in image stabilisation (EIS), and includes a touch screen. Battery life is 90 minutes of 4K recording. Price: $229. Includes a 1-year warranty."
},
{
"id": "prod_007",
"category": "product",
"title": "BassBuds Max Headphones",
"content": "The TechNest BassBuds Max are over-ear wireless headphones with 40-hour battery life, hybrid active noise cancellation, and a premium 40mm driver for deep bass. They fold flat for travel and include a carrying case. Price: $199. Compatible with all Bluetooth devices."
},
{
"id": "prod_008",
"category": "product",
"title": "SoundBar 360",
"content": "The TechNest SoundBar 360 is a 2.1 soundbar with a 120W output, built-in subwoofer, Dolby Atmos support, and HDMI ARC connectivity. It also supports Bluetooth streaming and has an optical audio input. Dimensions: 90cm wide. Price: $349. Includes a 2-year warranty."
},
{
"id": "policy_001",
"category": "policy",
"title": "Return Policy",
"content": "TechNest accepts returns within 30 days of the original purchase date. Items must be in their original packaging with all accessories included. Customers are responsible for return shipping costs unless the item arrives defective or damaged. Refunds are processed within 5 to 7 business days of receiving the returned item. Digital downloads and opened software are non-refundable."
},
{
"id": "policy_002",
"category": "policy",
"title": "Shipping Policy",
"content": "TechNest offers free standard shipping on all orders over $50 within the continental US. Standard shipping takes 3 to 5 business days. Expedited shipping (1 to 2 business days) is available for $9.99. Same-day delivery is available in select cities for $19.99. Orders placed before 2pm local time are dispatched the same day."
},
{
"id": "policy_003",
"category": "policy",
"title": "Warranty Policy",
"content": "All TechNest products include a minimum 1-year manufacturer warranty covering defects in materials and workmanship. The ProBook X1 and SoundBar 360 include a 2-year warranty. Warranty does not cover physical damage, water damage (unless the product is rated waterproof), or damage from unauthorised modifications. To make a warranty claim, contact support@technest.com with your order number and a description of the issue."
},
{
"id": "policy_004",
"category": "policy",
"title": "Payment Policy",
"content": "TechNest accepts Visa, Mastercard, American Express, PayPal, and Apple Pay. All transactions are encrypted using 256-bit SSL. Buy Now Pay Later is available via Klarna for orders over $100, with 0% interest for 3 monthly instalments. TechNest does not store full card details — payments are processed securely by Stripe."
},
{
"id": "faq_001",
"category": "faq",
"title": "Order Tracking",
"content": "To track your order, visit technest.com/orders and enter your order number and email address. A shipping confirmation email with a tracking link is sent within 24 hours of dispatch. If you have not received your tracking email after 48 hours, check your spam folder or contact support@technest.com."
},
{
"id": "faq_002",
"category": "faq",
"title": "International Shipping",
"content": "TechNest ships to over 40 countries. International shipping rates start at $14.99 and delivery takes 7 to 14 business days. Import duties and taxes are the responsibility of the customer and are not included in the product price. Free shipping promotions apply to US orders only."
},
{
"id": "faq_003",
"category": "faq",
"title": "Bulk and Business Orders",
"content": "TechNest offers volume discounts for businesses purchasing 10 or more units of any single product. Discounts range from 10% for 10 to 49 units up to 25% for 100 or more units. Contact business@technest.com with your requirements for a custom quote. A dedicated account manager is assigned for orders over $10,000."
}
]
[
{
"id": "g001",
"metric_focus": "faithfulness",
"user_input": "What is TechNest's return policy?",
"reference": "TechNest accepts returns within 30 days of purchase. Items must be in original packaging with all accessories. Customers pay return shipping unless the item is defective. Refunds are processed in 5 to 7 business days."
},
{
"id": "g002",
"metric_focus": "answer_relevancy",
"user_input": "What are the RAM and storage specs of the ProBook X1?",
"reference": "The ProBook X1 has 16GB DDR5 RAM and a 512GB NVMe SSD."
},
{
"id": "g003",
"metric_focus": "context_precision",
"user_input": "How long is the battery life on the SoundPods Pro?",
"reference": "The SoundPods Pro offer 8 hours of playback per charge and an additional 24 hours from the charging case, giving a total of 32 hours."
},
{
"id": "g004",
"metric_focus": "context_recall",
"user_input": "What are TechNest's shipping options and how long do returns take to process?",
"reference": "TechNest offers free standard shipping on orders over $50 (3 to 5 business days) and expedited shipping for $9.99 (1 to 2 business days). Returns are accepted within 30 days and refunds are processed in 5 to 7 business days after the item is received."
},
{
"id": "g005",
"metric_focus": "answer_correctness",
"user_input": "What is the price of the PixelPhone 15?",
"reference": "The TechNest PixelPhone 15 is priced at $899."
}
]
The video's five ranked chunks
from judge import judge
from ragas.metrics.collections import ContextPrecision
question = "What is the minimum balance for my savings account?"
reference = ("Urban branches require a ₹10,000 minimum balance. The non-maintenance fee is ₹350 + taxes "
"when the balance falls below the limit. Semi-urban branches require ₹5,000 and rural "
"branches ₹2,500.")
chunks = [
"Minimum balance is ₹10,000 for urban branches.",
"Non-maintenance fee is ₹350 + taxes if the balance falls below the minimum.",
"KYC update is required every 8 years.",
"Semi-urban branch minimum balance is ₹5,000.",
"Rural branch minimum balance is ₹2,500.",
]
precision = ContextPrecision(llm=judge)
print("video's order:", round(precision.score(user_input=question, reference=reference, retrieved_contexts=chunks).value, 4))
noise_first = [chunks[2]] + chunks[:2] + chunks[3:]
print("noise first: ", round(precision.score(user_input=question, reference=reference, retrieved_contexts=noise_first).value, 4))video's order: 0.7 noise first: 0.5333
The first line is the slide's case, noise at rank 3, and it scores 0.7, not the slide's 0.89. The arithmetic says why: 0.7 is what you get when chunks 1, 4 and 5 are marked useful and chunks 2 and 3 are not, (1 + 2/4 + 3/5) / 3. This judge decided the non-maintenance fee does not help answer a question about the minimum balance, where the slide's judge said it did. Moving the KYC chunk to rank 1 drops the score to 0.53 with the same verdicts. A judged score is always one judge's reading.
Context precision of the TechNest retriever
Now the app's real ranking for g003, the SoundPods battery question, next to the same three chunks in reverse order.
import json
from judge import judge
from ragas.metrics.collections import ContextPrecision
from technest import retrieve
golden = json.load(open("goldens.json", encoding="utf-8"))[2]
contexts = retrieve(golden["user_input"], top_k=3)
for number, chunk in enumerate(contexts, 1):
print(f"{number}. {chunk[:60]}...")
precision = ContextPrecision(llm=judge)
for label, order in [("retriever's order", contexts), ("reversed", contexts[::-1])]:
result = precision.score(user_input=golden["user_input"], reference=golden["reference"], retrieved_contexts=order)
print(f"{result.value:.4f} {label}")1. The TechNest SoundPods Pro are true wireless earbuds with ac... 2. The TechNest BassBuds Max are over-ear wireless headphones w... 3. The TechNest SoundBar 360 is a 2.1 soundbar with a 120W outp... 1.0000 retriever's order 0.3333 reversed
What the ranking scores show
- 1.0000, the retriever's order. The SoundPods Pro entry is first, so the only useful chunk is at rank 1.
- 0.3333, reversed. The same useful chunk sits at rank 3 behind two other audio products, and precision at rank 3 is one in three. Same chunks, lower score: precision grades the order, not the set.
- The rounding. RAGAS divides by a count plus a tiny epsilon, so a perfect score can print as
0.9999999999, as in the docs' example; the runs here round to four places.
Pick one to watch it run, step by step.
Context precision vs context recall
| Context precision | Context recall | |
|---|---|---|
| Asks | Are the useful chunks at the top? | Did every needed fact come back? |
| Hurt by | Noise ranked above useful chunks | A needed chunk missing |
| Fix | A reranker, better embeddings | Higher top_k, better chunking or ingestion |
When to use context precision
- When you add or tune a reranker, to measure whether it moved useful chunks up.
- When answers use the wrong product or policy even though the right one was retrieved further down.
ContextPrecision in the collections API needs a reference. Without goldens, use ContextUtilization, which judges each chunk against the app's own answer instead.Related
- Previous: Answer relevancy
- Next: Context recall
- Reference: Context precision
- Put the KYC chunk last in the bank example and predict the score before you run it.
- Score the TechNest retriever's order with
ContextUtilization, passing the app's answer asresponseinstead of a reference.
Slow is fine. Stopping is the only problem.