axiom / core /context_builder.py
Nithish-05's picture
chore: completed global codebase rebranding to Axiom
eb31fdf
Raw
History Blame Contribute Delete
1.84 kB
import logging
from typing import List
logger = logging.getLogger("axiom.context")
class ContextBuilder:
"""
Assembles retrieved chunks into a structured context string
for the LLM, with document source tracking.
"""
MAX_CONTEXT_WORDS = 1500
def __init__(self):
logger.info("Ready.")
def _build_context(self, chunks: List[dict]) -> tuple[str, List[str]]:
context_parts = []
sources = []
word_count = 0
for chunk in chunks:
chunk_words = chunk["text"].split()
if word_count + len(chunk_words) > self.MAX_CONTEXT_WORDS:
remaining = self.MAX_CONTEXT_WORDS - word_count
if remaining > 20:
truncated = " ".join(chunk_words[:remaining])
context_parts.append(truncated)
title = chunk["metadata"].get("title", "Unknown")
if title not in sources:
sources.append(title)
break
context_parts.append(chunk["text"])
word_count += len(chunk_words)
title = chunk["metadata"].get("title", "Unknown")
if title not in sources:
sources.append(title)
context_text = " ".join(context_parts)
return context_text, sources
def build(self, query: str, chunks: List[dict]) -> dict:
context_text, sources = self._build_context(chunks)
prompt = f"""Use the context below to answer the question accurately.
Context: {context_text}
Question: {query}
Provide a factual answer based strictly on the context above:"""
return {
"prompt": prompt,
"context_text": context_text,
"sources": sources,
"word_count": len(context_text.split())
}