diff --git a/CHANGELOG.md b/CHANGELOG.md index 4eeab5d5..0ead6ba3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,25 @@ # Changelog ## [Unreleased] +### Added + +- **Document items table**: Pre-extracted document items stored as individual rows with scalar indexes, enabling context expansion via indexed range queries (~2.5ms) instead of full DoclingDocument deserialization (~8.7s for large documents) +- **Section-bounded context expansion**: Expansion is now automatic and structure-aware — stays within section boundaries for structured documents, grows outward for unstructured ones. Noise labels (footnotes, page headers/footers) are filtered. Results without `doc_item_refs` pass through unexpanded. + +### Changed + +- **Database migration required**: Run `haiku-rag migrate` to populate `document_items` table for existing documents +- **Pin docling-core**: Upper bound added (`<2.72`) to prevent uncontrolled schema changes +- **`max_searches` default**: Raised from 3 to 5 — faster expansion makes additional searches inexpensive +- **Improved QA prompt**: Stronger instruction to refuse answering from tangentially related content +- **Improved judge prompt**: Asymmetric evaluation — generated answers that are more comprehensive than expected are not penalized + +### Removed + +- **`context_radius` config**: Replaced by automatic section-bounded expansion. Context expansion no longer requires configuration. +- **DoclingDocument LRU cache**: No longer needed — the document_items table replaces in-memory caching for context expansion +- **`cachetools` dependency**: No longer used + ## [0.39.0] - 2026-04-09 ### Added diff --git a/app/README.md b/app/README.md index efbf30fe..0744588c 100644 --- a/app/README.md +++ b/app/README.md @@ -61,7 +61,6 @@ embeddings: search: limit: 10 - context_radius: 1 ``` See `haiku.rag.yaml.example` for all options. diff --git a/app/haiku.rag.yaml.example b/app/haiku.rag.yaml.example index a60ea0d0..40b508b3 100644 --- a/app/haiku.rag.yaml.example +++ b/app/haiku.rag.yaml.example @@ -33,7 +33,6 @@ embeddings: # Search settings search: limit: 5 - context_radius: 0 # Provider settings providers: diff --git a/docs/apps.md b/docs/apps.md index 2f0ac690..570c78bb 100644 --- a/docs/apps.md +++ b/docs/apps.md @@ -182,8 +182,8 @@ Search uses hybrid (vector + full-text) search across all chunks. Press `c` while viewing a chunk to see the expanded context that would be provided to the QA agent: -- Type-aware expansion: tables, code blocks, and lists expand to their complete structures -- Text content expands based on `search.context_radius` setting +- Section-aware expansion: expands to fill the current document section +- Noise filtering: footnotes, page headers/footers excluded from structured documents - Includes metadata like source document, content type, and relevance score ### Visual Grounding diff --git a/docs/configuration/index.md b/docs/configuration/index.md index bdece61d..83a13ded 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -99,7 +99,6 @@ research: search: limit: 10 # Default number of results to return - context_radius: 0 # DocItems before/after to include for text content max_context_items: 10 # Maximum items in expanded context max_context_chars: 10000 # Maximum characters in expanded context vector_index_metric: cosine # cosine, l2, or dot diff --git a/docs/configuration/qa-research.md b/docs/configuration/qa-research.md index 5e522082..667e56ce 100644 --- a/docs/configuration/qa-research.md +++ b/docs/configuration/qa-research.md @@ -7,17 +7,15 @@ Configure search behavior and context expansion: ```yaml search: limit: 10 # Default number of results to return - context_radius: 0 # DocItems before/after to include for text content max_context_items: 10 # Maximum items in expanded context max_context_chars: 10000 # Maximum characters in expanded context ``` - **limit**: Default number of search results to return when no limit is specified. Used by CLI, MCP server, QA, and research workflows. Default: 10 -- **context_radius**: For text content (paragraphs), includes N DocItems before and after. Set to 0 to disable expansion (default). - **max_context_items**: Limits how many document items (paragraphs, list items, etc.) can be included in expanded context. Default: 10. - **max_context_chars**: Hard limit on total characters in expanded content. Default: 10000. -Structural content (tables, code blocks, lists) uses type-aware expansion that automatically includes the complete structure regardless of how it was chunked. +Context expansion is automatic and section-aware. For structured documents (with section headers), expansion includes the entire section containing the match. For sections that exceed the budget or are too small (e.g., a title+authors area), expansion grows outward item-by-item from the match center, skipping noise labels (footnotes, page headers) — this naturally crosses into adjacent sections until the budget is filled. For unstructured documents, expansion grows outward item-by-item. Results without `doc_item_refs` (e.g., custom chunks passed to `import_document`) pass through unexpanded. !!! note "Reranking behavior" When a reranker is configured, search automatically retrieves 10x the requested limit, then reranks to return the final count. This improves result quality without requiring you to adjust `limit`. diff --git a/docs/configuration/storage.md b/docs/configuration/storage.md index 7b954766..b57227b5 100644 --- a/docs/configuration/storage.md +++ b/docs/configuration/storage.md @@ -112,7 +112,7 @@ search: vector_refine_factor: 30 # Re-ranking factor for accuracy ``` -For search behavior settings (`limit`, `context_radius`, `max_context_items`, `max_context_chars`), see [QA and Research](qa-research.md#search-settings). +For search behavior settings (`limit`, `max_context_items`, `max_context_chars`), see [QA and Research](qa-research.md#search-settings). - **vector_index_metric**: Distance metric for vector similarity: - `cosine`: Cosine similarity (default, best for most embeddings) diff --git a/docs/python.md b/docs/python.md index 43d98740..81679215 100644 --- a/docs/python.md +++ b/docs/python.md @@ -359,29 +359,27 @@ results = await client.search( ### Expanding Search Context -Expand search results with adjacent chunks for more complete context: +Expand search results with surrounding content from the document: ```python # Get initial search results search_results = await client.search("machine learning", limit=3) -# Expand search results with adjacent content from the source document +# Expand with section-bounded context expanded_results = await client.expand_context(search_results) -# The expanded results contain chunks with combined content for result in expanded_results: print(f"Expanded content: {result.content}") ``` -Context expansion uses your configuration settings: +Context expansion is automatic and section-aware. For structured documents (with section headers), expansion includes the entire section containing the match. For sections that exceed the budget or are too small (e.g., a title+authors area), expansion grows outward item-by-item from the match center, skipping noise labels (footnotes, page headers) — this naturally crosses into adjacent sections until the budget is filled. For unstructured documents, expansion grows outward item-by-item. Results without `doc_item_refs` (e.g., custom chunks passed to `import_document`) pass through unexpanded. -- **search.context_radius**: For text content (paragraphs), includes N DocItems before and after -- **search.max_context_items**: Limits how many document items can be included -- **search.max_context_chars**: Hard limit on total characters +Configuration: -**Type-aware expansion**: Structural content (tables, code blocks, lists) automatically expands to include the complete structure, regardless of how it was split during chunking. +- **search.max_context_items**: Maximum items in expanded context. Default: 10. +- **search.max_context_chars**: Maximum characters in expanded context. Default: 10000. -**Smart Merging**: When expanded chunks overlap or are adjacent within the same document, they are automatically merged into single chunks with continuous content. This eliminates duplication and provides coherent text blocks. The merged chunk uses the highest relevance score from the original chunks. +**Smart Merging**: When expanded results overlap within the same document, they are automatically merged into a single result with continuous content and the highest relevance score. ## Question Answering diff --git a/docs/tuning.md b/docs/tuning.md index efcd0c7f..d1a8d40f 100644 --- a/docs/tuning.md +++ b/docs/tuning.md @@ -26,7 +26,7 @@ When configured, a cross-encoder reranker re-scores 10x the requested candidates `limit` controls how many results reach the LLM. More candidates improve recall but increase token usage. See [Search Settings](configuration/qa-research.md#search-settings). -`context_radius` expands text chunks with neighboring document items. Structural content (tables, code blocks, lists) expands automatically to include the complete structure. This setting matters most with small `chunk_size` values, where individual chunks may lack sufficient context. `max_context_items` and `max_context_chars` cap expansion to prevent context bloat. +Context expansion is automatic and section-aware — search results are expanded to include surrounding content from the same document section. For structured documents, expansion stays within section boundaries and filters noise (footnotes, page headers). For unstructured documents, expansion grows outward until the character budget is filled. `max_context_items` and `max_context_chars` cap expansion to prevent context bloat. ## Tuning Generation diff --git a/evaluations/evaluations/benchmark.py b/evaluations/evaluations/benchmark.py index 1d664b18..baffa30a 100644 --- a/evaluations/evaluations/benchmark.py +++ b/evaluations/evaluations/benchmark.py @@ -49,7 +49,6 @@ def build_experiment_metadata( "embedder_dim": config.embeddings.model.vector_dim, "chunk_size": config.processing.chunk_size, "search_limit": config.search.limit, - "context_radius": config.search.context_radius, "max_context_items": config.search.max_context_items, "max_context_chars": config.search.max_context_chars, "rerank_provider": config.reranking.model.provider diff --git a/evaluations/evaluations/evaluators/judge.py b/evaluations/evaluations/evaluators/judge.py index 932109c5..ed4f5ec2 100644 --- a/evaluations/evaluations/evaluators/judge.py +++ b/evaluations/evaluations/evaluators/judge.py @@ -4,27 +4,28 @@ from pydantic_ai import Agent from haiku.rag.config.models import AppConfig, ModelConfig from haiku.rag.utils import get_model -ANSWER_EQUIVALENCE_RUBRIC = """You are evaluating whether two answers to the same question are semantically equivalent. +ANSWER_EQUIVALENCE_RUBRIC = """You are evaluating whether a generated answer is equivalent to an expected answer for a given question. EVALUATION CRITERIA: Rate as EQUIVALENT if: -✓ Both answers contain the same core factual information -✓ Both directly address the question asked +✓ The generated answer contains the core factual information from the expected answer +✓ The generated answer directly addresses the question asked ✓ The key claims and conclusions are consistent -✓ Any additional detail in one answer doesn't contradict the other +✓ The generated answer may include additional correct details not in the expected answer — this is fine Rate as NOT EQUIVALENT if: -✗ Factual contradictions exist between the answers -✗ One answer fails to address the core question -✗ Key information is missing that changes the meaning -✗ The answers lead to different conclusions or implications +✗ The generated answer contradicts facts in the expected answer +✗ The generated answer fails to address the core question +✗ Key information from the expected answer is missing in a way that changes the meaning +✗ The answers lead to different conclusions or actions GUIDELINES: -- Ignore minor differences in phrasing, style, or formatting -- Focus on semantic meaning rather than exact wording -- Consider both answers correct if they convey the same essential information +- The evaluation is asymmetric: judge the generated answer against the expected answer, not the other way around +- A generated answer that is MORE detailed or comprehensive than the expected answer is EQUIVALENT, as long as it doesn't contradict it +- If the expected answer is incomplete or narrow, do not penalize the generated answer for being broader +- Ignore differences in phrasing, style, or formatting +- Focus on whether a user would get the correct guidance from the generated answer - Be tolerant of different levels of detail if the core answer is preserved -- Evaluate based on what a person asking this question would need to know """ diff --git a/evaluations/tests/test_benchmark.py b/evaluations/tests/test_benchmark.py index c27d0fde..a13ba514 100644 --- a/evaluations/tests/test_benchmark.py +++ b/evaluations/tests/test_benchmark.py @@ -31,7 +31,6 @@ class TestBuildExperimentMetadata: assert result["embedder_dim"] == config.embeddings.model.vector_dim assert result["chunk_size"] == config.processing.chunk_size assert result["search_limit"] == config.search.limit - assert result["context_radius"] == config.search.context_radius assert result["qa_provider"] == config.qa.model.provider assert result["qa_model"] == config.qa.model.name assert "judge_provider" not in result diff --git a/haiku_rag_slim/haiku/rag/agents/qa/prompts.py b/haiku_rag_slim/haiku/rag/agents/qa/prompts.py index f235f9ff..701e689c 100644 --- a/haiku_rag_slim/haiku/rag/agents/qa/prompts.py +++ b/haiku_rag_slim/haiku/rag/agents/qa/prompts.py @@ -32,8 +32,8 @@ Guidelines: - Base answers strictly on retrieved content - do not use external knowledge - Use the Source and Type metadata to understand context - If multiple results are relevant, synthesize them coherently -- If information is insufficient, say: "I cannot find enough information in the knowledge base to answer this question." - Be concise and direct - avoid elaboration unless asked - Results are ordered by relevance, with rank 1 being most relevant - If the search tool tells you the search limit is reached, stop searching immediately and answer with what you have +- If the retrieved documents do not directly address the question, say: "I cannot find enough information in the knowledge base to answer this question." Do not guess or infer an answer from tangentially related content. """ diff --git a/haiku_rag_slim/haiku/rag/client.py b/haiku_rag_slim/haiku/rag/client.py index 01e88059..2ff5b509 100644 --- a/haiku_rag_slim/haiku/rag/client.py +++ b/haiku_rag_slim/haiku/rag/client.py @@ -20,12 +20,12 @@ from haiku.rag.reranking import get_reranker from haiku.rag.store.engine import Store from haiku.rag.store.models.chunk import Chunk, SearchResult from haiku.rag.store.models.document import Document +from haiku.rag.store.models.document_item import extract_items from haiku.rag.store.repositories.chunk import ChunkRepository -from haiku.rag.store.repositories.document import ( - DocumentRepository, - _escape_sql_string, -) +from haiku.rag.store.repositories.document import DocumentRepository +from haiku.rag.store.repositories.document_item import DocumentItemRepository from haiku.rag.store.repositories.settings import SettingsRepository +from haiku.rag.utils import escape_sql_string if TYPE_CHECKING: from docling_core.types.doc.document import DoclingDocument @@ -96,6 +96,7 @@ class HaikuRAG: ) self.document_repository = DocumentRepository(self.store) self.chunk_repository = ChunkRepository(self.store) + self.document_item_repository = DocumentItemRepository(self.store) @property def is_read_only(self) -> bool: @@ -354,6 +355,7 @@ class HaikuRAG: self, document: Document, chunks: list[Chunk], + docling_document: "DoclingDocument", ) -> Document: """Store a document with chunks, embedding any that lack embeddings. @@ -362,6 +364,7 @@ class HaikuRAG: Args: document: The document to store (will be created). chunks: Chunks to store (will be embedded if lacking embeddings). + docling_document: The DoclingDocument to extract items from. Returns: The created Document instance with ID set. @@ -389,6 +392,10 @@ class HaikuRAG: # Batch create all chunks in a single operation await self.chunk_repository.create(chunks) + # Extract and store document items for context expansion + items = extract_items(created_doc.id, docling_document) + await self.document_item_repository.create_items(created_doc.id, items) + # Vacuum old versions in background (non-blocking) if auto_vacuum enabled if self._config.storage.auto_vacuum: asyncio.create_task(self.store.vacuum()) @@ -403,6 +410,7 @@ class HaikuRAG: self, document: Document, chunks: list[Chunk], + docling_document: "DoclingDocument | None" = None, ) -> Document: """Update a document and replace its chunks, embedding any that lack embeddings. @@ -411,6 +419,8 @@ class HaikuRAG: Args: document: The document to update (must have ID set). chunks: Chunks to replace existing (will be embedded if lacking embeddings). + docling_document: The DoclingDocument to extract items from. + When None, existing items are preserved. Returns: The updated Document instance. @@ -441,6 +451,14 @@ class HaikuRAG: # Batch create all chunks in a single operation await self.chunk_repository.create(chunks) + # Replace document items when a new DoclingDocument is provided + if docling_document is not None: + await self.document_item_repository.delete_by_document_id( + updated_doc.id + ) + items = extract_items(updated_doc.id, docling_document) + await self.document_item_repository.create_items(updated_doc.id, items) + # Vacuum old versions in background (non-blocking) if auto_vacuum enabled if self._config.storage.auto_vacuum: asyncio.create_task(self.store.vacuum()) @@ -498,7 +516,9 @@ class HaikuRAG: document.set_docling(docling_document) # Store document and chunks - return await self._store_document_with_chunks(document, embedded_chunks) + return await self._store_document_with_chunks( + document, embedded_chunks, docling_document + ) async def import_document( self, @@ -536,7 +556,9 @@ class HaikuRAG: ) document.set_docling(docling_document) - return await self._store_document_with_chunks(document, chunks) + return await self._store_document_with_chunks( + document, chunks, docling_document + ) async def create_document_from_source( self, source: str | Path, title: str | None = None, metadata: dict | None = None @@ -677,7 +699,7 @@ class HaikuRAG: docling_document, stored_content ) return await self._update_document_with_chunks( - existing_doc, embedded_chunks + existing_doc, embedded_chunks, docling_document ) else: # Create new document @@ -690,7 +712,9 @@ class HaikuRAG: metadata=metadata, ) document.set_docling(docling_document) - return await self._store_document_with_chunks(document, embedded_chunks) + return await self._store_document_with_chunks( + document, embedded_chunks, docling_document + ) async def _create_or_update_document_from_url( self, url: str, title: str | None = None, metadata: dict | None = None @@ -790,7 +814,7 @@ class HaikuRAG: docling_document, stored_content ) return await self._update_document_with_chunks( - existing_doc, embedded_chunks + existing_doc, embedded_chunks, docling_document ) else: # Create new document @@ -803,7 +827,9 @@ class HaikuRAG: metadata=metadata, ) document.set_docling(docling_document) - return await self._store_document_with_chunks(document, embedded_chunks) + return await self._store_document_with_chunks( + document, embedded_chunks, docling_document + ) def _get_extension_from_content_type_or_url( self, url: str, content_type: str @@ -882,7 +908,7 @@ class HaikuRAG: if doc: return doc - safe_input = _escape_sql_string(id_or_title) + safe_input = escape_sql_string(id_or_title) docs = await self.list_documents(filter=f"title = '{safe_input}'") if docs and docs[0].id: return await self.get_document_by_id(docs[0].id) @@ -956,7 +982,9 @@ class HaikuRAG: elif content is not None: existing_doc.content = content - return await self._update_document_with_chunks(existing_doc, chunks) + return await self._update_document_with_chunks( + existing_doc, chunks, docling_document + ) # DoclingDocument provided without chunks - chunk and embed using primitives if docling_document is not None: @@ -966,7 +994,7 @@ class HaikuRAG: new_chunks = await self.chunk(docling_document) embedded_chunks = await embed_chunks(new_chunks, self._config) return await self._update_document_with_chunks( - existing_doc, embedded_chunks + existing_doc, embedded_chunks, docling_document ) # Content provided without chunks - convert, chunk, and embed using primitives @@ -977,7 +1005,9 @@ class HaikuRAG: new_chunks = await self.chunk(converted_docling) embedded_chunks = await embed_chunks(new_chunks, self._config) - return await self._update_document_with_chunks(existing_doc, embedded_chunks) + return await self._update_document_with_chunks( + existing_doc, embedded_chunks, converted_docling + ) async def delete_document(self, document_id: str) -> bool: """Delete a document by its ID.""" @@ -1058,24 +1088,23 @@ class HaikuRAG: self, search_results: list[SearchResult], ) -> list[SearchResult]: - """Expand search results with adjacent content from the source document. + """Expand search results with surrounding content from the document. - When DoclingDocument is available and results have doc_item_refs, expands - by finding adjacent DocItems with accurate bounding boxes and metadata. - Otherwise, falls back to chunk-based expansion using adjacent chunks. + Uses the document_items table for section-bounded expansion. + See haiku.rag.context for the algorithm description. - Expansion is type-aware based on content: - - Tables, code blocks, and lists expand to include complete structures - - Text content uses the configured radius (search.context_radius) - - Expansion is limited by search.max_context_items and search.max_context_chars + Results without doc_item_refs pass through unexpanded. This happens + when chunks were created without docling metadata (e.g., custom chunks + passed to import_document). Args: search_results: List of SearchResult objects from search. Returns: - List of SearchResult objects with expanded content and resolved provenance. + List of SearchResult objects with expanded content. """ - radius = self._config.search.context_radius + from haiku.rag.context import expand_with_items + max_items = self._config.search.max_context_items max_chars = self._config.search.max_context_chars @@ -1095,347 +1124,22 @@ class HaikuRAG: continue has_refs = any(r.doc_item_refs for r in doc_results) - docling_doc = None + if not has_refs: + expanded_results.extend(doc_results) + continue - if has_refs: - # Only load docling data when refs exist (skips content blob) - doc = await self.document_repository.get_docling_data(doc_id) - if doc is not None: - docling_doc = doc.get_docling_document() - - if docling_doc is not None and has_refs: - # Use DoclingDocument-based expansion - expanded = await self._expand_with_docling( - doc_results, - docling_doc, - radius, - max_items, - max_chars, - ) - expanded_results.extend(expanded) - else: - # Fall back to chunk-based expansion (always uses fixed radius) - if radius > 0: - expanded = await self._expand_with_chunks( - doc_id, doc_results, radius - ) - expanded_results.extend(expanded) - else: - expanded_results.extend(doc_results) + expanded = await expand_with_items( + self.document_item_repository, + doc_id, + doc_results, + max_items, + max_chars, + ) + expanded_results.extend(expanded) + expanded_results.sort(key=lambda r: r.score, reverse=True) return expanded_results - def _merge_ranges( - self, ranges: list[tuple[int, int, SearchResult]] - ) -> list[tuple[int, int, list[SearchResult]]]: - """Merge overlapping or adjacent ranges.""" - if not ranges: - return [] - - sorted_ranges = sorted(ranges, key=lambda x: x[0]) - merged: list[tuple[int, int, list[SearchResult]]] = [] - cur_min, cur_max, cur_results = ( - sorted_ranges[0][0], - sorted_ranges[0][1], - [sorted_ranges[0][2]], - ) - - for min_idx, max_idx, result in sorted_ranges[1:]: - if cur_max >= min_idx - 1: # Overlapping or adjacent - cur_max = max(cur_max, max_idx) - cur_results.append(result) - else: - merged.append((cur_min, cur_max, cur_results)) - cur_min, cur_max, cur_results = min_idx, max_idx, [result] - - merged.append((cur_min, cur_max, cur_results)) - return merged - - # Label groups for type-aware expansion - _STRUCTURAL_LABELS = { - "table", - "code", - "list_item", - "form", - "key_value_region", - "field_region", - } - - def _extract_item_text(self, item, docling_doc) -> str | None: - """Extract text content from a DocItem. - - Handles different item types: - - TextItem, SectionHeaderItem, etc.: Use .text attribute - - TableItem: Use export_to_markdown() for table content - - PictureItem: Use export_to_markdown() with PLACEHOLDER mode to avoid base64 - """ - from docling_core.types.doc.base import ImageRefMode - from docling_core.types.doc.document import PictureItem - - # Try simple text attribute first (works for most items) - if text := getattr(item, "text", None): - return text - - # For pictures: use PLACEHOLDER mode to avoid base64 images in content. - # This still includes VLM descriptions (annotations) and captions. - if isinstance(item, PictureItem): - return item.export_to_markdown( - docling_doc, - image_mode=ImageRefMode.PLACEHOLDER, - image_placeholder="", - ) - - # For tables and other items with export_to_markdown - if hasattr(item, "export_to_markdown"): - try: - return item.export_to_markdown(docling_doc) - except Exception: - pass - - # Fallback for items with captions - if caption := getattr(item, "caption", None): - if hasattr(caption, "text"): - return caption.text - - return None - - def _get_item_label(self, item) -> str | None: - """Extract label string from a DocItem.""" - label = getattr(item, "label", None) - if label is None: - return None - return str(label.value) if hasattr(label, "value") else str(label) - - def _compute_type_aware_range( - self, - all_items: list, - indices: list[int], - radius: int, - max_items: int, - max_chars: int, - ) -> tuple[int, int]: - """Compute expansion range based on content type with limits. - - For structural content (tables, code, lists), expands to include complete - structures. For text, uses the configured radius. Applies hybrid limits. - """ - if not indices: - return (0, 0) - - min_idx = min(indices) - max_idx = max(indices) - - # Determine the primary label type from matched items - labels_in_chunk = set() - for idx in indices: - item, _ = all_items[idx] - if label := self._get_item_label(item): - labels_in_chunk.add(label) - - # Check if we have structural content - is_structural = bool(labels_in_chunk & self._STRUCTURAL_LABELS) - - if is_structural: - # Expand to complete structure boundaries - # Expand backwards to find structure start - while min_idx > 0: - prev_item, _ = all_items[min_idx - 1] - prev_label = self._get_item_label(prev_item) - if prev_label in labels_in_chunk & self._STRUCTURAL_LABELS: - min_idx -= 1 - else: - break - - # Expand forwards to find structure end - while max_idx < len(all_items) - 1: - next_item, _ = all_items[max_idx + 1] - next_label = self._get_item_label(next_item) - if next_label in labels_in_chunk & self._STRUCTURAL_LABELS: - max_idx += 1 - else: - break - else: - # Text content: use radius-based expansion - min_idx = max(0, min_idx - radius) - max_idx = min(len(all_items) - 1, max_idx + radius) - - # Apply hybrid limits - # First check item count hard limit - if max_idx - min_idx + 1 > max_items: - # Center the window around original indices - original_center = (min(indices) + max(indices)) // 2 - half_items = max_items // 2 - min_idx = max(0, original_center - half_items) - max_idx = min(len(all_items) - 1, min_idx + max_items - 1) - - # Then check character soft limit (but keep at least original items) - char_count = 0 - effective_max = min_idx - for i in range(min_idx, max_idx + 1): - item, _ = all_items[i] - text = getattr(item, "text", "") or "" - char_count += len(text) - effective_max = i - # Once we've included original items, check char limit - if i >= max(indices) and char_count > max_chars: - break - - max_idx = effective_max - - return (min_idx, max_idx) - - async def _expand_with_docling( - self, - results: list[SearchResult], - docling_doc, - radius: int, - max_items: int, - max_chars: int, - ) -> list[SearchResult]: - """Expand results using DoclingDocument structure. - - Structural content (tables, code, lists) expands to complete structures. - Text content uses radius-based expansion. - """ - all_items = list(docling_doc.iterate_items()) - ref_to_index = { - getattr(item, "self_ref", None): i - for i, (item, _) in enumerate(all_items) - if getattr(item, "self_ref", None) - } - - # Compute expanded ranges - ranges: list[tuple[int, int, SearchResult]] = [] - passthrough: list[SearchResult] = [] - - for result in results: - indices = [ - ref_to_index[r] for r in result.doc_item_refs if r in ref_to_index - ] - if not indices: - passthrough.append(result) - continue - - min_idx, max_idx = self._compute_type_aware_range( - all_items, indices, radius, max_items, max_chars - ) - - ranges.append((min_idx, max_idx, result)) - - # Merge overlapping ranges - merged = self._merge_ranges(ranges) - - final_results: list[SearchResult] = [] - for min_idx, max_idx, original_results in merged: - content_parts: list[str] = [] - refs: list[str] = [] - pages: set[int] = set() - labels: set[str] = set() - - for i in range(min_idx, max_idx + 1): - item, _ = all_items[i] - # Extract text content - handle different item types - text = self._extract_item_text(item, docling_doc) - if text: - content_parts.append(text) - if self_ref := getattr(item, "self_ref", None): - refs.append(self_ref) - if label := getattr(item, "label", None): - labels.add( - str(label.value) if hasattr(label, "value") else str(label) - ) - if prov := getattr(item, "prov", None): - for p in prov: - if (page_no := getattr(p, "page_no", None)) is not None: - pages.add(page_no) - - # Merge headings preserving order - all_headings: list[str] = [] - for r in original_results: - if r.headings: - all_headings.extend(h for h in r.headings if h not in all_headings) - - first = original_results[0] - final_results.append( - SearchResult( - content="\n\n".join(content_parts), - score=max(r.score for r in original_results), - chunk_id=first.chunk_id, - document_id=first.document_id, - document_uri=first.document_uri, - document_title=first.document_title, - doc_item_refs=refs, - page_numbers=sorted(pages), - headings=all_headings or None, - labels=sorted(labels), - ) - ) - - return final_results + passthrough - - async def _expand_with_chunks( - self, - doc_id: str, - results: list[SearchResult], - radius: int, - ) -> list[SearchResult]: - """Expand results using chunk-based adjacency.""" - # Build ranges from result orders - ranges: list[tuple[int, int, SearchResult]] = [] - passthrough: list[SearchResult] = [] - - for result in results: - if result.chunk_id is None: - passthrough.append(result) - continue - start = result.order - radius - end = result.order + radius - ranges.append((start, end, result)) - - if not ranges: - return results - - # Compute the full order range needed and fetch only those chunks - all_starts = [s for s, _, _ in ranges] - all_ends = [e for _, e, _ in ranges] - range_min = min(all_starts) - range_max = max(all_ends) - - chunks_in_range = await self.chunk_repository.get_chunks_in_range( - doc_id, range_min, range_max - ) - if not chunks_in_range: - return results - - chunk_by_order = {c.order: c for c in chunks_in_range} - - # Merge and build results - final_results: list[SearchResult] = [] - for min_idx, max_idx, original_results in self._merge_ranges(ranges): - # Collect chunks in order - merged_chunks = [ - chunk_by_order[o] - for o in range(min_idx, max_idx + 1) - if o in chunk_by_order - ] - first = original_results[0] - final_results.append( - SearchResult( - content="".join(c.content for c in merged_chunks), - score=max(r.score for r in original_results), - chunk_id=first.chunk_id, - document_id=first.document_id, - document_uri=first.document_uri, - document_title=first.document_title, - doc_item_refs=first.doc_item_refs, - page_numbers=first.page_numbers, - headings=first.headings, - labels=first.labels, - ) - ) - - return final_results + passthrough - async def ask( self, question: str, @@ -1758,21 +1462,16 @@ class HaikuRAG: """Batch write documents and chunks during rebuild. This performs two writes: one for all document updates, one for all chunks. + Also repopulates document items from the stored docling document. Used by RECHUNK and FULL modes after the chunks table has been cleared. """ from haiku.rag.store.engine import DocumentRecord - from haiku.rag.store.models.document import invalidate_docling_document_cache if not documents: return now = datetime.now().isoformat() - # Invalidate cache for all documents being updated - for doc in documents: - if doc.id: - invalidate_docling_document_cache(doc.id) - # Batch update documents using merge_insert (single LanceDB version) doc_records = [] for doc in documents: @@ -1800,6 +1499,15 @@ class HaikuRAG: if chunks: await self.chunk_repository.create(chunks) + # Repopulate document items from stored docling data + for doc in documents: + assert doc.id is not None + docling_doc = doc.get_docling_document() + if docling_doc is not None: + await self.document_item_repository.delete_by_document_id(doc.id) + items = extract_items(doc.id, docling_doc) + await self.document_item_repository.create_items(doc.id, items) + async def _rebuild_rechunk( self, documents: list[Document] ) -> AsyncGenerator[str, None]: diff --git a/haiku_rag_slim/haiku/rag/config/models.py b/haiku_rag_slim/haiku/rag/config/models.py index d4727f8f..1dbde073 100644 --- a/haiku_rag_slim/haiku/rag/config/models.py +++ b/haiku_rag_slim/haiku/rag/config/models.py @@ -80,7 +80,7 @@ class QAConfig(BaseModel): temperature=0.3, ) ) - max_searches: int = 3 + max_searches: int = 5 class ResearchConfig(BaseModel): @@ -174,7 +174,6 @@ class ProcessingConfig(BaseModel): class SearchConfig(BaseModel): limit: int = 10 - context_radius: int = 0 max_context_items: int = 10 max_context_chars: int = 10000 vector_index_metric: Literal["cosine", "l2", "dot"] = "cosine" diff --git a/haiku_rag_slim/haiku/rag/context.py b/haiku_rag_slim/haiku/rag/context.py new file mode 100644 index 00000000..a66c8b84 --- /dev/null +++ b/haiku_rag_slim/haiku/rag/context.py @@ -0,0 +1,255 @@ +"""Section-bounded context expansion for search results. + +Expands search results with surrounding content from the document using +the document_items table. The algorithm adapts to document structure: + +For STRUCTURED documents (containing section_header or title labels): + 1. Resolve matched doc_item_refs to positions in the items table + 2. Find section boundaries around each match (section_header/title labels) + 3. If the section fits within the budget, include it entirely + 4. If the section exceeds the budget, OR the section is too small (under + 20% of max_context_chars), expand item-by-item from the match center + outward, skipping noise labels. This lets small sections (e.g., a + title+authors area) grow into the next section's content. + 5. Merge overlapping ranges from multiple results in the same document + +For UNSTRUCTURED documents (no section headers): + Expand outward item-by-item from the match center until the character + budget is filled. No noise filtering (unstructured docs typically only + have text items). + +In both cases: + - max_context_chars caps total characters per expanded result + - max_context_items caps total items per expanded result + - Noise labels (footnote, page_header, page_footer, document_index) are + excluded from content AND budget counting in structured documents + - Results without doc_item_refs pass through unexpanded +""" + +from haiku.rag.store.models.chunk import SearchResult +from haiku.rag.store.models.document_item import DocumentItem +from haiku.rag.store.repositories.document_item import DocumentItemRepository + +_NOISE_LABELS = {"footnote", "page_header", "page_footer", "document_index"} +_SECTION_BOUNDARY_LABELS = {"section_header", "title"} + +# Sections with fewer chars than this fraction of max_context_chars are +# considered too small — expansion falls through to item-by-item outward +# growth, which naturally crosses into adjacent sections. +_MIN_SECTION_BUDGET_RATIO = 0.2 + + +def _merge_ranges( + ranges: list[tuple[int, int, SearchResult]], +) -> list[tuple[int, int, list[SearchResult]]]: + """Merge overlapping or adjacent ranges.""" + if not ranges: + return [] + + sorted_ranges = sorted(ranges, key=lambda x: x[0]) + merged: list[tuple[int, int, list[SearchResult]]] = [] + cur_min, cur_max, cur_results = ( + sorted_ranges[0][0], + sorted_ranges[0][1], + [sorted_ranges[0][2]], + ) + + for min_idx, max_idx, result in sorted_ranges[1:]: + if cur_max >= min_idx - 1: # Overlapping or adjacent + cur_max = max(cur_max, max_idx) + cur_results.append(result) + else: + merged.append((cur_min, cur_max, cur_results)) + cur_min, cur_max, cur_results = min_idx, max_idx, [result] + + merged.append((cur_min, cur_max, cur_results)) + return merged + + +def _expand_outward( + items: list[DocumentItem], + center_idx: int, + max_items: int, + max_chars: int, + skip_noise: bool = False, +) -> tuple[int, int]: + """Expand item-by-item outward from center until budget is filled. + + When skip_noise is True, noise labels are excluded from char counting + (used in structured documents so footnotes don't consume budget). + """ + lo = hi = center_idx + center_is_noise = skip_noise and items[center_idx].label in _NOISE_LABELS + char_count = 0 if center_is_noise else len(items[center_idx].text) + + while char_count < max_chars and hi - lo + 1 < max_items: + grew = False + if lo > 0: + lo -= 1 + if not (skip_noise and items[lo].label in _NOISE_LABELS): + char_count += len(items[lo].text) + grew = True + if hi < len(items) - 1 and char_count < max_chars: + hi += 1 + if not (skip_noise and items[hi].label in _NOISE_LABELS): + char_count += len(items[hi].text) + grew = True + if not grew: + break + + return (items[lo].position, items[hi].position) + + +def _find_expansion_range( + items: list[DocumentItem], + matched_positions: set[int], + has_sections: bool, + max_items: int, + max_chars: int, +) -> tuple[int, int]: + """Find the expansion range for matched positions within a window of items.""" + pos_to_idx = {item.position: i for i, item in enumerate(items)} + matched_indices = sorted(pos_to_idx[p] for p in matched_positions) + center_idx = matched_indices[len(matched_indices) // 2] + + if not has_sections: + return _expand_outward(items, center_idx, max_items, max_chars) + + # Build section spans: [(start_idx, end_idx), ...] + headers = [ + i for i, item in enumerate(items) if item.label in _SECTION_BOUNDARY_LABELS + ] + sections: list[tuple[int, int]] = [] + if headers[0] > 0: + sections.append((0, headers[0] - 1)) + for j, h in enumerate(headers): + end = headers[j + 1] - 1 if j + 1 < len(headers) else len(items) - 1 + sections.append((h, end)) + + # Find which section contains the center match + current = 0 + for j, (start, end) in enumerate(sections): + if start <= center_idx <= end: + current = j + break + + sec_start, sec_end = sections[current] + sec_chars = sum( + len(items[i].text) + for i in range(sec_start, sec_end + 1) + if items[i].label not in _NOISE_LABELS + ) + + # Section fits nicely in the budget — return it as-is + min_useful = int(max_chars * _MIN_SECTION_BUDGET_RATIO) + if min_useful <= sec_chars <= max_chars and sec_end - sec_start + 1 <= max_items: + return (items[sec_start].position, items[sec_end].position) + + # Section is too large or too small — expand item-by-item from center. + # For too-large sections this stays within budget. + # For too-small sections (e.g., title+authors) this naturally grows + # into adjacent sections until the budget is filled. + return _expand_outward(items, center_idx, max_items, max_chars, skip_noise=True) + + +async def expand_with_items( + document_item_repository: DocumentItemRepository, + document_id: str, + results: list[SearchResult], + max_items: int, + max_chars: int, +) -> list[SearchResult]: + """Expand results using the document_items table.""" + all_refs = [] + for result in results: + all_refs.extend(result.doc_item_refs) + + ref_positions = await document_item_repository.resolve_refs(document_id, all_refs) + if not ref_positions: + return results + + # Fetch a window of items around matched positions. The margin must be + # wide enough to find section boundaries (the nearest section_header/title + # above and below the match). + all_positions = sorted(ref_positions.values()) + window_margin = max_items * 10 + window_start = max(0, min(all_positions) - window_margin) + window_end = max(all_positions) + window_margin + window_items = await document_item_repository.get_items_in_range( + document_id, window_start, window_end + ) + + if not window_items: + return results + + has_sections = any(item.label in _SECTION_BOUNDARY_LABELS for item in window_items) + + # Compute expansion ranges per result + ranges: list[tuple[int, int, SearchResult]] = [] + passthrough: list[SearchResult] = [] + + for result in results: + matched = {ref_positions[r] for r in result.doc_item_refs if r in ref_positions} + if not matched: + passthrough.append(result) + continue + + lo, hi = _find_expansion_range( + window_items, matched, has_sections, max_items, max_chars + ) + ranges.append((lo, hi, result)) + + merged = _merge_ranges(ranges) + + # Build results from the window items + pos_to_item = {item.position: item for item in window_items} + final_results: list[SearchResult] = [] + for range_start, range_end, original_results in merged: + content_parts: list[str] = [] + refs: list[str] = [] + pages: set[int] = set() + labels: set[str] = set() + + for pos in range(range_start, range_end + 1): + item = pos_to_item.get(pos) + if item is None: + continue + if has_sections and item.label in _NOISE_LABELS: + continue + if item.text: + content_parts.append(item.text) + refs.append(item.self_ref) + if item.label: + labels.add(item.label) + pages.update(item.page_numbers) + + all_headings: list[str] = [] + for r in original_results: + if r.headings: + all_headings.extend(h for h in r.headings if h not in all_headings) + + first = original_results[0] + + # Expansion should never return less content than the original chunk. + # This can happen when item texts are fragmented (e.g., docling splits + # formatted HTML list items into many small text nodes). + expanded_content = "\n\n".join(content_parts) + if len(expanded_content) < len(first.content): + expanded_content = first.content + + final_results.append( + SearchResult( + content=expanded_content, + score=max(r.score for r in original_results), + chunk_id=first.chunk_id, + document_id=first.document_id, + document_uri=first.document_uri, + document_title=first.document_title, + doc_item_refs=refs or first.doc_item_refs, + page_numbers=sorted(pages) or first.page_numbers, + headings=all_headings or None, + labels=sorted(labels) or first.labels, + ) + ) + + return final_results + passthrough diff --git a/haiku_rag_slim/haiku/rag/store/engine.py b/haiku_rag_slim/haiku/rag/store/engine.py index 26cd4b71..99d0e9cf 100644 --- a/haiku_rag_slim/haiku/rag/store/engine.py +++ b/haiku_rag_slim/haiku/rag/store/engine.py @@ -107,6 +107,15 @@ def create_chunk_model(vector_dim: int): return ChunkRecord +class DocumentItemRecord(LanceModel): + document_id: str + position: int + self_ref: str + label: str = Field(default="") + text: str = Field(default="") + page_numbers: str = Field(default="[]") + + class SettingsRecord(LanceModel): id: str = Field(default="settings") settings: str = Field(default="{}") @@ -256,6 +265,7 @@ class Store: for table in [ self.documents_table, self.chunks_table, + self.document_items_table, self.settings_table, ]: table.optimize(cleanup_older_than=retention) @@ -358,7 +368,7 @@ class Store: def _init_tables(self): """Initialize database tables (create if they don't exist).""" existing_tables = self.db.list_tables().tables - required_tables = {"documents", "chunks", "settings"} + required_tables = {"documents", "chunks", "document_items", "settings"} missing_tables = required_tables - set(existing_tables) if missing_tables and self._read_only: @@ -385,6 +395,23 @@ class Store: "content_fts", replace=True, with_position=True, remove_stop_words=False ) + # Create or open document_items table + if "document_items" in existing_tables: + self.document_items_table = self.db.open_table("document_items") + else: + self.document_items_table = self.db.create_table( + "document_items", schema=DocumentItemRecord + ) + self.document_items_table.create_scalar_index( + "document_id", index_type="BTREE", replace=True + ) + self.document_items_table.create_scalar_index( + "position", index_type="BTREE", replace=True + ) + self.document_items_table.create_scalar_index( + "self_ref", index_type="BTREE", replace=True + ) + # Create or open settings table if "settings" in existing_tables: self.settings_table = self.db.open_table("settings") @@ -528,6 +555,7 @@ class Store: return { "documents": int(self.documents_table.version), "chunks": int(self.chunks_table.version), + "document_items": int(self.document_items_table.version), "settings": int(self.settings_table.version), } @@ -540,6 +568,7 @@ class Store: self._assert_writable() self.documents_table.restore(int(versions["documents"])) self.chunks_table.restore(int(versions["chunks"])) + self.document_items_table.restore(int(versions["document_items"])) self.settings_table.restore(int(versions["settings"])) return True @@ -569,6 +598,7 @@ class Store: tables = [ ("documents", self.documents_table), ("chunks", self.chunks_table), + ("document_items", self.document_items_table), ("settings", self.settings_table), ] @@ -620,6 +650,7 @@ class Store: table_map = { "documents": self.documents_table, "chunks": self.chunks_table, + "document_items": self.document_items_table, "settings": self.settings_table, } table = table_map.get(table_name) diff --git a/haiku_rag_slim/haiku/rag/store/models/__init__.py b/haiku_rag_slim/haiku/rag/store/models/__init__.py index d1cc810b..5fa02ae4 100644 --- a/haiku_rag_slim/haiku/rag/store/models/__init__.py +++ b/haiku_rag_slim/haiku/rag/store/models/__init__.py @@ -1,10 +1,12 @@ from .chunk import BoundingBox, Chunk, ChunkMetadata, SearchResult from .document import Document +from .document_item import DocumentItem __all__ = [ "BoundingBox", "Chunk", "ChunkMetadata", "Document", + "DocumentItem", "SearchResult", ] diff --git a/haiku_rag_slim/haiku/rag/store/models/document.py b/haiku_rag_slim/haiku/rag/store/models/document.py index a7e406f5..1f38d197 100644 --- a/haiku_rag_slim/haiku/rag/store/models/document.py +++ b/haiku_rag_slim/haiku/rag/store/models/document.py @@ -2,7 +2,6 @@ import json from datetime import datetime from typing import TYPE_CHECKING -from cachetools import LRUCache from pydantic import BaseModel, Field from haiku.rag.store.compression import compress_docling_split, decompress_json @@ -11,38 +10,6 @@ if TYPE_CHECKING: from docling_core.types.doc.document import DoclingDocument, PageItem -_docling_document_cache: LRUCache[str, "DoclingDocument"] = LRUCache(maxsize=100) - - -def _validate_without_pages(compressed_data: bytes) -> "DoclingDocument": - """Decompress and validate DoclingDocument.""" - from docling_core.types.doc.document import DoclingDocument - - json_str = decompress_json(compressed_data) - return DoclingDocument.model_validate_json(json_str) - - -def _get_cached_docling_document( - document_id: str, compressed_data: bytes -) -> "DoclingDocument": - """Get or parse DoclingDocument with LRU caching by document ID. - - Strips page images before validation for performance — cached documents - do not contain page data. - """ - if document_id in _docling_document_cache: - return _docling_document_cache[document_id] - - doc = _validate_without_pages(compressed_data) - _docling_document_cache[document_id] = doc - return doc - - -def invalidate_docling_document_cache(document_id: str) -> None: - """Remove a document from the DoclingDocument cache.""" - _docling_document_cache.pop(document_id, None) - - class Document(BaseModel): """ Represents a document with an ID, content, and metadata. @@ -73,19 +40,16 @@ class Document(BaseModel): def get_docling_document(self) -> "DoclingDocument | None": """Parse and return the stored DoclingDocument (without page images). - Uses LRU cache (keyed by document ID) to avoid repeated parsing. - Returns: The parsed DoclingDocument, or None if not stored. """ if self.docling_document is None: return None - # No caching for documents without ID - if self.id is None: - return _validate_without_pages(self.docling_document) + from docling_core.types.doc.document import DoclingDocument - return _get_cached_docling_document(self.id, self.docling_document) + json_str = decompress_json(self.docling_document) + return DoclingDocument.model_validate_json(json_str) def get_page_images(self, page_numbers: list[int]) -> "dict[int, PageItem]": """Decompress and return page images for the requested page numbers. diff --git a/haiku_rag_slim/haiku/rag/store/models/document_item.py b/haiku_rag_slim/haiku/rag/store/models/document_item.py new file mode 100644 index 00000000..ee17bf0c --- /dev/null +++ b/haiku_rag_slim/haiku/rag/store/models/document_item.py @@ -0,0 +1,88 @@ +from typing import TYPE_CHECKING + +from pydantic import BaseModel + +if TYPE_CHECKING: + from docling_core.types.doc.document import DoclingDocument, NodeItem + + +class DocumentItem(BaseModel): + document_id: str + position: int + self_ref: str + label: str = "" + text: str = "" + page_numbers: list[int] = [] + + +def extract_item_text(item: "NodeItem", docling_doc: "DoclingDocument") -> str | None: + """Extract text content from a DocItem. + + Handles different item types: + - TextItem, SectionHeaderItem, etc.: Use .text attribute + - TableItem: Use export_to_markdown() for table content + - PictureItem: Use export_to_markdown() with PLACEHOLDER mode to avoid base64 + """ + from docling_core.types.doc.base import ImageRefMode + from docling_core.types.doc.document import PictureItem, TableItem + + if text := getattr(item, "text", None): + return text + + if isinstance(item, PictureItem): + return item.export_to_markdown( + docling_doc, + image_mode=ImageRefMode.PLACEHOLDER, + image_placeholder="", + ) + + if isinstance(item, TableItem): + try: + return item.export_to_markdown(docling_doc) + except Exception: + pass + + if caption := getattr(item, "caption", None): + if hasattr(caption, "text"): + return caption.text + + return None + + +def extract_items( + document_id: str, docling_doc: "DoclingDocument" +) -> list[DocumentItem]: + """Extract document items from a DoclingDocument for the items table. + + Runs iterate_items() and extracts the fields needed for context expansion: + self_ref, label, pre-rendered text, and page numbers from provenance. + Items are stored as docling produces them — container items (e.g., list_item) + may have empty text with content in their children. + """ + items: list[DocumentItem] = [] + + for position, (item, _level) in enumerate(docling_doc.iterate_items()): + label = getattr(item, "label", None) + label_str = str(label.value) if hasattr(label, "value") else str(label or "") + + text = extract_item_text(item, docling_doc) or "" + + page_numbers: list[int] = [] + if prov := getattr(item, "prov", None): + for p in prov: + page_no = getattr(p, "page_no", None) + if page_no is not None and page_no not in page_numbers: + page_numbers.append(page_no) + + items.append( + DocumentItem( + document_id=document_id, + position=position, + self_ref=item.self_ref, + label=label_str, + text=text, + page_numbers=sorted(page_numbers), + ) + ) + + return items diff --git a/haiku_rag_slim/haiku/rag/store/repositories/__init__.py b/haiku_rag_slim/haiku/rag/store/repositories/__init__.py index be72d771..bfd9b8fe 100644 --- a/haiku_rag_slim/haiku/rag/store/repositories/__init__.py +++ b/haiku_rag_slim/haiku/rag/store/repositories/__init__.py @@ -1,9 +1,11 @@ from haiku.rag.store.repositories.chunk import ChunkRepository from haiku.rag.store.repositories.document import DocumentRepository +from haiku.rag.store.repositories.document_item import DocumentItemRepository from haiku.rag.store.repositories.settings import SettingsRepository __all__ = [ "ChunkRepository", + "DocumentItemRepository", "DocumentRepository", "SettingsRepository", ] diff --git a/haiku_rag_slim/haiku/rag/store/repositories/document.py b/haiku_rag_slim/haiku/rag/store/repositories/document.py index 179d6bca..0c9de830 100644 --- a/haiku_rag_slim/haiku/rag/store/repositories/document.py +++ b/haiku_rag_slim/haiku/rag/store/repositories/document.py @@ -4,11 +4,7 @@ from uuid import uuid4 from haiku.rag.store.engine import DocumentRecord, Store, get_documents_arrow_schema from haiku.rag.store.models.document import Document - - -def _escape_sql_string(value: str) -> str: - """Escape single quotes in SQL string literals.""" - return value.replace("'", "''") +from haiku.rag.utils import escape_sql_string class DocumentRepository: @@ -17,6 +13,7 @@ class DocumentRepository: def __init__(self, store: Store) -> None: self.store = store self._chunk_repository = None + self._document_item_repository = None @property def chunk_repository(self): @@ -27,6 +24,17 @@ class DocumentRepository: self._chunk_repository = ChunkRepository(self.store) return self._chunk_repository + @property + def document_item_repository(self): + """Lazy-load DocumentItemRepository when needed.""" + if self._document_item_repository is None: + from haiku.rag.store.repositories.document_item import ( + DocumentItemRepository, + ) + + self._document_item_repository = DocumentItemRepository(self.store) + return self._document_item_repository + def _record_to_document(self, record: DocumentRecord) -> Document: """Convert a DocumentRecord to a Document model.""" return Document( @@ -79,7 +87,7 @@ class DocumentRepository: async def get_by_id(self, entity_id: str) -> Document | None: """Get a document by its ID.""" - safe_id = _escape_sql_string(entity_id) + safe_id = escape_sql_string(entity_id) results = list( self.store.documents_table.search() .where(f"id = '{safe_id}'") @@ -96,7 +104,7 @@ class DocumentRepository: async def get_docling_data(self, entity_id: str) -> Document | None: """Get a document with only docling data loaded (skips content blob).""" - safe_id = _escape_sql_string(entity_id) + safe_id = escape_sql_string(entity_id) results = list( self.store.documents_table.search() .select(self._DOCLING_COLUMNS) @@ -118,7 +126,7 @@ class DocumentRepository: async def get_pages_data(self, entity_id: str) -> Document | None: """Get a document with only page image data loaded.""" - safe_id = _escape_sql_string(entity_id) + safe_id = escape_sql_string(entity_id) results = list( self.store.documents_table.search() .select(["id", "docling_pages"]) @@ -140,19 +148,15 @@ class DocumentRepository: async def update(self, entity: Document) -> Document: """Update an existing document.""" self.store._assert_writable() - from haiku.rag.store.models.document import invalidate_docling_document_cache assert entity.id, "Document ID is required for update" - # Invalidate cache before update - invalidate_docling_document_cache(entity.id) - # Update timestamp now = datetime.now().isoformat() entity.updated_at = datetime.fromisoformat(now) # Update the record - safe_id = _escape_sql_string(entity.id) + safe_id = escape_sql_string(entity.id) self.store.documents_table.update( where=f"id = '{safe_id}'", values={ @@ -172,21 +176,18 @@ class DocumentRepository: async def delete(self, entity_id: str) -> bool: """Delete a document by its ID.""" self.store._assert_writable() - from haiku.rag.store.models.document import invalidate_docling_document_cache # Check if document exists doc = await self.get_by_id(entity_id) if doc is None: return False - # Invalidate cache before delete - invalidate_docling_document_cache(entity_id) - - # Delete associated chunks first + # Delete associated chunks and items first await self.chunk_repository.delete_by_document_id(entity_id) + await self.document_item_repository.delete_by_document_id(entity_id) # Delete the document - safe_id = _escape_sql_string(entity_id) + safe_id = escape_sql_string(entity_id) self.store.documents_table.delete(f"id = '{safe_id}'") return True @@ -256,7 +257,7 @@ class DocumentRepository: async def get_by_uri(self, uri: str) -> Document | None: """Get a document by its URI.""" - escaped_uri = _escape_sql_string(uri) + escaped_uri = escape_sql_string(uri) results = list( self.store.documents_table.search() .where(f"uri = '{escaped_uri}'") @@ -272,8 +273,23 @@ class DocumentRepository: async def delete_all(self) -> None: """Delete all documents from the database.""" self.store._assert_writable() - # Delete all chunks first + from haiku.rag.store.engine import DocumentItemRecord + + # Delete all chunks and items first await self.chunk_repository.delete_all() + self.store.db.drop_table("document_items") + self.store.document_items_table = self.store.db.create_table( + "document_items", schema=DocumentItemRecord + ) + self.store.document_items_table.create_scalar_index( + "document_id", index_type="BTREE", replace=True + ) + self.store.document_items_table.create_scalar_index( + "position", index_type="BTREE", replace=True + ) + self.store.document_items_table.create_scalar_index( + "self_ref", index_type="BTREE", replace=True + ) # Get count before deletion count = len( diff --git a/haiku_rag_slim/haiku/rag/store/repositories/document_item.py b/haiku_rag_slim/haiku/rag/store/repositories/document_item.py new file mode 100644 index 00000000..9b30a271 --- /dev/null +++ b/haiku_rag_slim/haiku/rag/store/repositories/document_item.py @@ -0,0 +1,86 @@ +import json + +from haiku.rag.store.engine import DocumentItemRecord, Store +from haiku.rag.store.models.document_item import DocumentItem +from haiku.rag.utils import escape_sql_string + + +class DocumentItemRepository: + """Repository for DocumentItem operations.""" + + def __init__(self, store: Store) -> None: + self.store = store + + def _record_to_item(self, row: dict) -> DocumentItem: + return DocumentItem( + document_id=row["document_id"], + position=row["position"], + self_ref=row["self_ref"], + label=row.get("label", ""), + text=row.get("text", ""), + page_numbers=json.loads(row.get("page_numbers", "[]")), + ) + + async def create_items(self, document_id: str, items: list[DocumentItem]) -> None: + """Bulk insert items for a document.""" + if not items: + return + + self.store._assert_writable() + records = [ + DocumentItemRecord( + document_id=document_id, + position=item.position, + self_ref=item.self_ref, + label=item.label, + text=item.text, + page_numbers=json.dumps(item.page_numbers), + ) + for item in items + ] + self.store.document_items_table.add(records) + + async def get_items_in_range( + self, document_id: str, start: int, end: int + ) -> list[DocumentItem]: + """Get items for a document within a position range (inclusive).""" + safe_id = escape_sql_string(document_id) + rows = ( + self.store.document_items_table.search() + .where( + f"document_id = '{safe_id}' " + f"AND position >= {start} AND position <= {end}" + ) + .to_list() + ) + items = [self._record_to_item(row) for row in rows] + items.sort(key=lambda x: x.position) + return items + + async def resolve_refs(self, document_id: str, refs: list[str]) -> dict[str, int]: + """Resolve self_refs to positions. Returns {self_ref: position}.""" + if not refs: + return {} + + safe_id = escape_sql_string(document_id) + refs_sql = ", ".join(f"'{escape_sql_string(r)}'" for r in refs) + rows = ( + self.store.document_items_table.search() + .select(["self_ref", "position"]) + .where(f"document_id = '{safe_id}' AND self_ref IN ({refs_sql})") + .to_list() + ) + return {row["self_ref"]: row["position"] for row in rows} + + async def get_item_count(self, document_id: str) -> int: + """Count items for a document.""" + safe_id = escape_sql_string(document_id) + return self.store.document_items_table.count_rows( + filter=f"document_id = '{safe_id}'" + ) + + async def delete_by_document_id(self, document_id: str) -> None: + """Delete all items for a document.""" + self.store._assert_writable() + safe_id = escape_sql_string(document_id) + self.store.document_items_table.delete(f"document_id = '{safe_id}'") diff --git a/haiku_rag_slim/haiku/rag/store/upgrades/__init__.py b/haiku_rag_slim/haiku/rag/store/upgrades/__init__.py index 24718bf1..30d874e9 100644 --- a/haiku_rag_slim/haiku/rag/store/upgrades/__init__.py +++ b/haiku_rag_slim/haiku/rag/store/upgrades/__init__.py @@ -81,8 +81,12 @@ from haiku.rag.store.upgrades.v0_25_0 import ( from haiku.rag.store.upgrades.v0_38_0 import ( upgrade_split_pages_zstd as upgrade_0_38_0_split_pages, ) +from haiku.rag.store.upgrades.v0_40_0 import ( + upgrade_populate_document_items as upgrade_0_40_0_document_items, +) upgrades.append(upgrade_0_20_0_docling) upgrades.append(upgrade_0_23_1_contextualize) upgrades.append(upgrade_0_25_0_compress) upgrades.append(upgrade_0_38_0_split_pages) +upgrades.append(upgrade_0_40_0_document_items) diff --git a/haiku_rag_slim/haiku/rag/store/upgrades/v0_40_0.py b/haiku_rag_slim/haiku/rag/store/upgrades/v0_40_0.py new file mode 100644 index 00000000..907069ff --- /dev/null +++ b/haiku_rag_slim/haiku/rag/store/upgrades/v0_40_0.py @@ -0,0 +1,98 @@ +import json +import logging + +from haiku.rag.store.engine import DocumentItemRecord, Store +from haiku.rag.store.upgrades import Upgrade +from haiku.rag.utils import escape_sql_string + +logger = logging.getLogger(__name__) + + +def _apply_populate_document_items(store: Store) -> None: # pragma: no cover + """Populate document_items table from existing docling documents.""" + from docling_core.types.doc.document import DoclingDocument + + from haiku.rag.store.compression import decompress_json + from haiku.rag.store.models.document_item import extract_items + + # Get all document IDs that have docling data + ids = [ + row["id"] + for row in store.documents_table.search().select(["id"]).to_arrow().to_pylist() + ] + + if not ids: + logger.info("No documents to migrate") + return + + total = len(ids) + logger.info("Populating document_items for %d documents", total) + migrated = 0 + skipped = 0 + + for idx, doc_id in enumerate(ids, 1): + # Load only docling data + safe_id = escape_sql_string(doc_id) + rows = ( + store.documents_table.search() + .select(["id", "docling_document"]) + .where(f"id = '{safe_id}'") + .limit(1) + .to_list() + ) + + if not rows: + skipped += 1 + continue + + row = rows[0] + docling_blob = row.get("docling_document") + if not docling_blob or not isinstance(docling_blob, bytes): + skipped += 1 + continue + + try: + json_str = decompress_json(docling_blob) + docling_doc = DoclingDocument.model_validate_json(json_str) + items = extract_items(doc_id, docling_doc) + + if items: + records = [ + DocumentItemRecord( + document_id=item.document_id, + position=item.position, + self_ref=item.self_ref, + label=item.label, + text=item.text, + page_numbers=json.dumps(item.page_numbers), + ) + for item in items + ] + store.document_items_table.add(records) + + migrated += 1 + if idx % 10 == 0 or idx == total: + logger.info( + "Progress: %d/%d documents (%d migrated, %d skipped)", + idx, + total, + migrated, + skipped, + ) + except Exception: + logger.warning("Failed to extract items for document %s", doc_id) + skipped += 1 + + logger.info( + "Migration complete: %d migrated, %d skipped out of %d", + migrated, + skipped, + total, + ) + + +upgrade_populate_document_items = Upgrade( + version="0.40.0", + apply=_apply_populate_document_items, + description="Populate document_items table for context expansion", +) diff --git a/haiku_rag_slim/haiku/rag/utils.py b/haiku_rag_slim/haiku/rag/utils.py index c7d554ec..90c67c14 100644 --- a/haiku_rag_slim/haiku/rag/utils.py +++ b/haiku_rag_slim/haiku/rag/utils.py @@ -452,6 +452,11 @@ def build_prompt(base_prompt: str, config: "AppConfig") -> str: return base_prompt +def escape_sql_string(value: str) -> str: + """Escape single quotes in SQL string literals.""" + return value.replace("'", "''") + + def get_package_versions() -> dict[str, str]: """Get versions of haiku.rag and its dependencies. diff --git a/haiku_rag_slim/pyproject.toml b/haiku_rag_slim/pyproject.toml index 7817e0eb..2c3a1a03 100644 --- a/haiku_rag_slim/pyproject.toml +++ b/haiku_rag_slim/pyproject.toml @@ -2,7 +2,7 @@ name = "haiku.rag-slim" description = "Opinionated agentic RAG powered by LanceDB, Pydantic AI, and Docling - Minimal dependencies" -version = "0.39.0" +version = "0.40.0" authors = [{ name = "Yiorgis Gozadinos", email = "ggozadinos@gmail.com" }] license = { text = "MIT" } readme = { file = "README.md", content-type = "text/markdown" } @@ -22,8 +22,7 @@ classifiers = [ ] dependencies = [ - "cachetools>=7.0.5", - "docling-core>=2.71.0", + "docling-core>=2.71.0,<2.72", "haiku.skills>=0.14.0", "httpx>=0.28.1", "jinja2>=3.1.0", diff --git a/pyproject.toml b/pyproject.toml index 6eed578c..758acff8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ name = "haiku.rag" description = "Opinionated agentic RAG powered by LanceDB, Pydantic AI, and Docling" -version = "0.39.0" +version = "0.40.0" authors = [{ name = "Yiorgis Gozadinos", email = "ggozadinos@gmail.com" }] license = { text = "MIT" } readme = { file = "README.md", content-type = "text/markdown" } @@ -30,7 +30,7 @@ classifiers = [ ] dependencies = [ - "haiku.rag-slim[docling,voyageai,mxbai,cohere,zeroentropy,tui]==0.39.0", + "haiku.rag-slim[docling,voyageai,mxbai,cohere,zeroentropy,tui]==0.40.0", ] [project.scripts] diff --git a/tests/cassettes/test_context_enhancement/test_expand_context_keeps_separate_non_overlapping.yaml b/tests/cassettes/test_context_enhancement/test_expand_context_keeps_separate_non_overlapping.yaml deleted file mode 100644 index 66ba95c0..00000000 --- a/tests/cassettes/test_context_enhancement/test_expand_context_keeps_separate_non_overlapping.yaml +++ /dev/null @@ -1,62 +0,0 @@ -interactions: -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '127' - content-type: - - application/json - host: - - localhost:11434 - method: POST - parsed_body: - encoding_format: base64 - input: - - Chunk 0 - - Chunk 1 - - Chunk 2 - - Chunk 5 - - Chunk 6 - - Chunk 7 - model: qwen3-embedding:4b - uri: http://localhost:11434/v1/embeddings - response: - headers: - content-type: - - application/json - transfer-encoding: - - chunked - parsed_body: - data: - - embedding: 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 - index: 0 - object: embedding - - embedding: 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 - index: 1 - object: embedding - - embedding: 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 - index: 2 - object: embedding - - embedding: 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 - index: 3 - object: embedding - - embedding: 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 - index: 4 - object: embedding - - embedding: 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 - index: 5 - object: embedding - model: qwen3-embedding:4b - object: list - usage: - prompt_tokens: 24 - total_tokens: 24 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/cassettes/test_context_enhancement/test_expand_context_merges_overlapping_chunks.yaml b/tests/cassettes/test_context_enhancement/test_expand_context_merges_overlapping_chunks.yaml deleted file mode 100644 index 62a846c9..00000000 --- a/tests/cassettes/test_context_enhancement/test_expand_context_merges_overlapping_chunks.yaml +++ /dev/null @@ -1,58 +0,0 @@ -interactions: -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '117' - content-type: - - application/json - host: - - localhost:11434 - method: POST - parsed_body: - encoding_format: base64 - input: - - Chunk 0 - - Chunk 1 - - Chunk 2 - - Chunk 3 - - Chunk 4 - model: qwen3-embedding:4b - uri: http://localhost:11434/v1/embeddings - response: - headers: - content-type: - - application/json - transfer-encoding: - - chunked - parsed_body: - data: - - embedding: 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 - index: 0 - object: embedding - - embedding: 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 - index: 1 - object: embedding - - embedding: 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 - index: 2 - object: embedding - - embedding: 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 - index: 3 - object: embedding - - embedding: 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 - index: 4 - object: embedding - model: qwen3-embedding:4b - object: list - usage: - prompt_tokens: 20 - total_tokens: 20 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/cassettes/test_context_enhancement/test_expand_context_multiple_documents.yaml b/tests/cassettes/test_context_enhancement/test_expand_context_multiple_documents.yaml deleted file mode 100644 index 55803e7c..00000000 --- a/tests/cassettes/test_context_enhancement/test_expand_context_multiple_documents.yaml +++ /dev/null @@ -1,94 +0,0 @@ -interactions: -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '109' - content-type: - - application/json - host: - - localhost:11434 - method: POST - parsed_body: - encoding_format: base64 - input: - - Doc1 Part A - - Doc1 Part B - - Doc1 Part C - model: qwen3-embedding:4b - uri: http://localhost:11434/v1/embeddings - response: - headers: - content-type: - - application/json - transfer-encoding: - - chunked - parsed_body: - data: - - embedding: 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 - index: 0 - object: embedding - - embedding: 5b47ufrsYL1A2IO8n1c0vJThH7rCf1w9sP2APTw6zDwx+ZA89TmUO2woQbyETf07DPI+ODMjuLyFLtQ8PTFNvciK7TyL1hm8FZWMPD/MgbviGKO8lUz7OzdRfzy7lra7B4LJOuOQhrz3Zra8PtRqvTcZvbobQ4C7g3PtutLKC71lgms95cnhvKPCXDs+8B27aVZ9PB0bDbzrtrU8Zm++O9Q+AD135/u8eBgoPPEEVzytblK8Ofn0O7MgUDs5tfC7C3nhvDEz37zgJLk6qiGLOzJCFr0EeI68E1ZaPB4krryVCHQ5qf2Yu6C2YL0ACs68JQCcu9P0SbyO6ya805jCvP9uw7vEsS+8MSu+O9i56bxtr2o8YyeRuzd2MT1e7Ow8XGcmOat+Xzz//js8yLDgvF312LsGR6Q82ukDu1aXzjwJdm88BVltvOqiEjuv+/g7BeSxPA6VFjtH1FW8HJ2aPEDCEr2m+S88F/g3PPXvFrzoUxe8MbgTPfhN/7o/2jS8EL5VuVgZzbx4uHC8yrESPILVDLsaKDq7lBPHPAEqIrypbry88ZGpvMhwxbpEYYC8Ua86vIZojjtr+Su6HsPLu/8mP7txoKu89aWYugXMHLxt6cU8y1oGPItlojwlcxC6IdjgOiDKtjyPV5C82clLPI4CXbxbwiY9JqdmvFWNG71pYKk8OZESPWAwuTxgElG8WknCu1RtpbyGkSE4QA+DPJdO4buWXYm8ROzKOoxy0jq+Yfy729AEO1jOCDybdKK7LymRvEVmGb0vAWa8+10Au355jjt7CIu8Vu7RPHGGwziUBng8FoKHPGFj8zwcZoc8RBgfvBcGjjwZ+CE8xIAhPBivxLza5MY6rs3HvJle5jzm0UI8rbMqPFKfyTqVVmA78dUJvPlY7bzwGTY8MNKOO8AE6rvQKKK8/KRJvWCrOjwnf528nVYuPGd4cbvbvN88+c66uobKULyN60m6BIMTO+hpYTwuIrq85smQvCqMyTrOFJI7mhkaPG8VV7zRGqi8a5axOgqM5jucAek5fHwIvJBv+rw2WBe8yUazuh5unDySd6m7DGB2O8GmwTk7wN28DdiBvDKwU7y7Liq8xx5VvPeWTzsK4Ja8FlumOxAC3Txd3Ze8FqobvWCLNTw9FSO8MaUAvamPorzkATA8mIEePQSEkLtkYLa7ZzeGvIDimrvcwEy8SAWmPN/OczxGbBC8f2DXutecg7sKab48ThWaPHwnhbwCzmS82Ms9PPTCHLzGQXi87IJIO6iLPzxFfQe9EkYkO/puFry6dYO7TkXNOQCwhryrlx28QW46O0/VO7xF4QK8QqwTvbYti7xjZhA8b8RouxUZs7xl4Tc7J6nyu0JOGbxu4iC8fZybu3JbYTrs/J27tJJ4vLUCZbuO7mO7GHPau5ZHnDm8z6g7uIfXPIMl1rrUDNa7yn9UvJBaPLyM8g07q17iu1Xi3zz8iIe8bLtJO5g1kzyRJCU8bpjhPI0fAL1KB6u8FCG2vFTpEzyvRY4676WePPwN4zvI/OS6oA0vvJZQNjwyDvI8OUGjvOmbPzzZE328nmT+vCnGOrwpr3o8U2FyO4DgWbwpw4O88pl5uyvwlrtma9A8eypkO6GtSbsF87M82OwnPJRaHDvQIFA9Gs5cPPWxSLwulBo88Rg/PALccrzI7kw8fTIlvceQmbxe5Fi8Qy4vvGksB7um+Bq8N3Nfvfx6wLwCLRm7e/dMOS74zDpSv508+fRtPN6ihDyo7A88EKzdvLqI9zzZBCW9GnpsvGp+hDzsWjS725IjPCwqAj22ozg8glRZPGfbNLymsce63QPlPGMd6bwmRg+9Rou2PFbwbzy2S6E7EqRRvTCP6jtLQyQ5Ti+svAPqhrw4p0G8PP6lvP6XhjxIw5+8RD6TO5FfcTyftQk9LS+PO8YeWLsN3Js8x6LGPLDyurvLUpE7+JjKvI5YXz3QZXe7osaYu67uRjxzir28nqErPbKBr7o43kI4TE+cO5q/wLw0sPa88S+LvGPIMTuiiyg8VLSbOuOjALymIjc9GSuSvKt3+zwFXiI8j90IPJYE2zyLqOY762QmPGWbvjvF0qI8DSPAPDuXDL12zU08K8AQOdvmnzwZ9dQ8a1uGvEDWvrrmCyS8jCcSvVDprLxKSBo8CG8qvJUX0LyLDLM8SRg1PMy2wbs/K507D64nu9PGjzylYR+89UPUvKBiPDx8S/I826NTvBXWXbvG4fi5t3yhvC4+u7wZwmK7KMM3usBqY7wSw3c8kjxpPKfHED2RfKK81G4uufbSnbspzzE89CB8PEPdLT1Jy7K7dS3Ou2cSBDtXi/C79A+rvEUc97yYruQ86EUuvMTVnTxfHqI8ggk+vQm7Crz9oBm8i9SqPLxaHzzAaZu8jU8LvUZJtDtomFo7O0wxvGaUXTtGhNk7KKFqPMf07bu4mbe8Tn+AvLbjs72AXYY8+3zHPA1tJ7yK/gu8NHXkvLCGk7wkCIy7+y8GPBjV0DwcMu28M16dvHZbPLyMBLy7wxcdvJt6kTwnQpi6IFLBO9F9DTzF9wQ9nORlPfMyLjouM7I8/dOlOvRTnLqSWRc9KQSfPD2637vbhM87CvvoO1LHyzvHooW7qkY+vE2onjyg9Da82REUOju7ijyZeiK98QfJOmhLn7zKs+y7Akl+PHSYY7xYVGe8tJEhvc9IHrqIrhw9A5NuPNR6izrcZ7g84NIYPUV76bvIaL87JlwVvcJQpzw8jVu8sAQCvIcDmrw0Mhm7BwACPXxhk7wNjNk8fF8iPFaN2byGZ2s8hk0DvC7nBz3sBt+8q0Heu0k4pztE5008YIRNO5zDSbyOvWK8FswVvIQtpLsFT667cYg5PFZ2kDxlQIc8/XW8vHIfQrztZVA8JLMEvQ8qh7zI2568e3SBPLjtUbzNigm9IcfHO5HPIj2wV/O7apC2PMp0h7xA9ps7PxdcPcc/I7w6/gc9L0lPO3kMuDwPwti8E7B/vJT39zzAups56LXeOYUS8bxvTCc8YqE+u7uDwjoijOm8ErMtvOQq5zdgonM7DhdzPJcL5rq01Ee8S8YHPOGtpzzoVQC7yua+vNOFCDz/53g8NrMjOyv6s7s+Xwc8B4F0PHo2j7xrARu8EJwIPX09iDxv3ra8cUlvvLyYlTtU2OE7fEjCOxTky7wpSfO7wYBNvbieT7tSs248axO5OzRRZbya8py8tOFIvLv0wLx7ZsQ8BT1mPPnl8TveRT678KZaPAEwvLycV8i8zfOWvAR0LzxINbc8R3+RvLZqWrtEMD+89NaJvDMerzp12Dy8weYRuwbI6bxBq9o8ZJhCvHkDYr2f7nO9/hFHvKHxQTudvJm8W30GvVNzdzziBvI8PZ1xvH38Ujyaai+9o/whvYMBlzzKkwI7CLmOvC5fHTxJI6o81y+uPIp+obyWOzU9dn6IvOm0b72cTNi8VVWmOwNQlDvPdD88cXJOPMN1UDwX6te79msHO1T8fDwU4lM8ES4ivciEPDxSzWc8LEtRvGF/1rwBmhs7eMGTPLIboryN+Zs79TsEvYlE+bzEC8E8o/GRuul09Lzl5nW8cs2ePEJCxrwMWgY9n3AevUT3g7uYMvA7qlnDPA1ckDyhYly7B7eqPLemrDzTUQW7H/CKPH+Cq7v+qzm8YotvvN3e+TuXBHc8E6Y4PNV1ebzZ5507g1Z2OwPQWTxk4o48JdOSO10ZdTtzFfm8am+1vJA2VLzFv1c6gissOvChkLwr95g8JPtBuW1+4js+H/g7HtS2PObEeDwB7ra7oUWwuz8w6DsXW6S8+wewu3Phyjn1R8S8o0AaPDH8jDwV8KC8S+lqPCfJubxBsAa9UwVqOzUd77vieCM82sPcPC9Q+bpaJ5u8mOFGPdq4OTyJZew7VeiMvC+4Az1WkZi8MBQzO9KH9zvO9gY8dCkpu/H74zx2SBY8LjUlu4zLtTyM3UM8sQWGO/hQnrt2WdS89mAkvOr70jv81N27f/tsvL/cgTqE6Ym8bzsivQOgzryZjeQ7/bfWu9qshztZ4qC7L399vN9lajxIkoS8FRP0u9uZrzyfmjE8OxF6PKWzDDrY/Oa8WH42vI9J9zxALCi9PMC1O1IO+jtrJ068mCD1PD4TtzwB5jq8QLEGvO5fGT2gpDk83F+uuyUfeTz5Hyg9N5rZvMzTZDrBIcQ77x0UvWceLDznT2I8lhcGvZJHGTzl1Qi8Ywu4vGQcFDzY/YE8WCPUvCOeXzy7+Y+8RfmCvfCSpDtZ5uG7WlLwvJuSAj0HBAc8bH7tPPjsVjwiJa88q6Y0PIjpNDthAO87QYwwO84Z/bzjWR87hQowvQPJq7yrESC9TOAaPe9HOb3sSyY8dvnKPCphwDy+fCc9ONnmO3ppULwRla07g5nTOn5rsjz1rEK8VA9NPKvxUjpH06m8JyiTPKaWUzxVOUA8ivDaOgS947zG04q8+jZZvJzEbLzHCs+8LUqqPPAXEL05+iQ9hacJuzdrBjs5Ovg8sjTVvAegCrtpvRW71jmNPGillDwfp2I9xiydO01R2TxcJge8uOMZPG3X0btv+BY6UGFLPJ2wtrsZ0UE9d7HKvL6mjLwAVuC8y6QsPOczirumSOa7JP+lvPFv+bxXxju9fjbNO5DTiTv9VJg8kQd6OpKfXDxCzio7zoMgvYIejzv5jLE8a+jNulEeJT17HtE7nDKoPBIxqzyWmkC9iOSFPKOy27vhXYW7pBeAvBuzZbzxaOQ7JwEXPHQMmrzkkHI7mCW8OzBYerz5t7a7LDeZvOyo4TylSta8yYrOu5Y+nTzdZIs6HSD9u7ShrDyNSaA8oUzYvGNRorjl3b88e0rJO3VtZr3m6Le7GXDIPD0D3zuEhd68dnCRvFCGRzsSKYa8RlQ4u11efLzloQ09cgVWPLQeEr1QKGi8Dw/PPCc8rjsiv/W7l9YyvfPeqLz4Ba+7vpu0vIdOvzzrBba7pnVou8+oxzuMt547klPYvH5BALxQzAo9qLEZvNeRErw2hRi8m1q/PAmI/DwDqKq8bH8ePILurTyb4WS81TqEOiRUFDwvjFO8hEp3vDtYgDuAMCg8dNGVPPMwXTu5TCc8zr6oPNL8Tjz//t27DXoIvVwxWTxCMxy9d9JVPOZXa7v4CsE87vd4PP+mxrzyLT88c7qjO6OXqTpw+Kg6zaA+vDLh/LyC9wu94Ut9vEAGATxMkUo9KwksPXYO6Typytq8pD+cu32akTzIz7C78SY7vBdtDL1yFhs9RLqEvMjg0zyP5ZY7kNUDPJP/rzrcB+88SNPfPKg3Lzz1q708A0/LvBVdpjrwMTs9B8HbPPo5+bzwDZQ8a5+WO2MCZLyoGgM8kmoLvECP6DwBKoQ8pZt3PG5hxbvxJh+8l+ZhvMbynjyQQ0O8mPNwvJt5ITxQs6M8ot2JPRxGibwJoQA9hUeTvDg+Urtl06K7M1kIPRfJZjwE1WO9u9R8PBOUETyEBIC8s/DxO7zpuTzVaOG6zGb3vM9xijzPBtK8KmcCvS0EEr262XA71OlXuq+2grvcMxO7+fo6PONQdLyWYTq8HcF/PMv+hrvnU388qdNivFqw5LzpqEI8MyUGPP5QzDwQKfK8qkWCPMCjGb0PvoS8lJXwO5kUMDy7kwY6y119PcaH7TuiLIG80x88vA+LMr0h64g7XT4cvJQApjvADAS9VesGvdLFijtA6g69bO3zPIzHB7voA4+79AOHPLD1E7vrwle7thrSvOfv57ymbay8P64/vJGHx7ySLK873Bthu+d+EzxJHx48+TICPdj5D7zTTgq92I9BPTwmAj1M5GW8/1PHOwRwzbvTt+w7nvqcuzIjsbySK3E7Sp2XvL0W/jvTh1Y7VCeLPIKyrbwtj7A8uWIbOzKKbbrilQC87VZAvMlYhLwiBEA9WjncvKxyajy1wFM8KQXWOz+E4bt4y1W75yfTvEGy6Ly96lO8xHs/vau8PDtu5NI8+qW/uydUCbxNRpI5KUYGu7LclTqXYxK80i3evBOgC7yAFIa8x1YsPeRDqrw/mBW8tJO+PKKX1DwWr0k58Euhuz4UlzxL4/87w8O1vKTJ2zun/xc6meYsO/A05zy6wC09lCMVPLfnwjufjb+6MCmKPAKzCzokp2S5dsdsOz9qMTyL38G8LGxgOlQNpDzekJs8dtVkvE9Cpzz61fM51kqfPPjT4DqmBpq8/lcMvGjTTjvG8DO7usWCPDE0Cb19V8683kqsvE0n07xv18M8LLkoPIHpG7zGzvY6d0XyO0T1t7zw+cS8orBMuyhINzt6B7282kyEPGdTrLzsICq87vUYvMBabjxmdxm7/DWeuQgzlzxoXAE9BoCBvLd08bzE9AO7Xzp9OodxxzqKQJK77moJvTmUFL3PXqA6dldPvA10m7wPCpU5F7P6vAWR37wEfCw89vtWvFf5tTx0xAK8wTPpPPNf0DuR+SI8joBru/vOkzzmQsC8Dgx+PJIr6ju2qm+8A43jutBMLLwnWwe8tdT1vIjCNjwNy7O8wOWHO+Rc8LzZEmu8cmS+PJG4Aj0jeKg7ZqvIO62JtzusylW7Cy0+PVHBN7yURDg8JWogvP7cKrwEHZM7ZokHPcSnhbztu3k8Ra2RO3ykozvszwM94oVjPPMxA70BHok7SgWUvG1LJbzztiC8YqoFvbWxsDtlZda8tTyDvDL74TwpWZs9b5DovApyKTuDa049S0MXvfcm0rzr9ui7ZzbDOnjPezwDZV48Q1TUPCjV4TsLCgk857GoOYlV3jutXh49QDS6vM8lFj3z246846RCvBFVbTp70Fe6hH3zOyEnpzzL4QO85wrmu2+AnjtPYU478SSkusLS1ruFXOy8lKZBPfYIYbvHkia9La4UvJnqjTzyNce8OhPmugxizDyrh2M89ixhPEBfnLwLVIM8CKZdvA7HJDx9RbG8yc4YPZ0cTrzmt0C69xWIvBA05zw/mCU77kKLvBWgcb13dsE83MXtvCJ1tjtTXfw8PIiEu43l2ry2Lx695yI5vSL+CDxnZxu85R0QvQRo+7xmhye9lNSZPLi/Rj3brpm8cQvAvKNBbrx9AJ489EUCu3bKwbvPNsk80zYeu75QSjz3oIa85xVFu6X+eTzXoPE3ih0ePV5Va7xulcW88EuJvP1WzryWX8+7X9YNPMaUjbnsFIa9zZ9uPEnetru4IJK8ptn+PJOmj7v96J+7YpTPPKFvlbw2mgC8ggBkPK+mlrsNyX06cEVPPDXxFT0EOfy8KPUQvI3mFb0aabU8u9M3vOJZBj1C4AU9AlbUuqTPjTy7GvU8HGCsPAqymTzyrEC8lugAPXdvTbwINLm7P5tSO5uBIr0kYZO8ykPxvEvQljsXYqy8BLHjvEFSYT10+6A8NFiUvLg+KD2Hn4c8V6T7PJiKNztZnPe78VmCvBZakjzdP847ZMoMvf3qLT0nIJC6pSbCvMu4tzyBGC882+1QvLozNL1cLI+7lYe+u0WXIb3SZxU88taUvAJN2ryo7+285L0hvDWWZj2Pp5m8B1ARu80loLvSlyi9BvzBOzhxPb2Yk528rI6RPICOjT0Ua+28GdJmvOJQ/7t8naM8E/WOvNfafDyIT6C8UpSOvDYX4bzsQHg8bet6vC5XDDwRJay8El7cPA0LlbsuSJk81I9sPGyzKjxvuJS8SUnKO7sIkrzeK8I81e9wvLTQsLyu/yS8RXbgu9Cf9btF/EQ6gay2u8l8XLw3WjI8g6zUPC/rYrvOZvk8EFAMvJS6SLxFM4W8kM2uPFknirw+0Uq7QwPcPCZ/Bb2C9uq7r14oPbGam7ztrMK8DQuFvKRPP7ytjge9lOjovExnizzzsc+81gUjvBtyILxAyKg8DcGQOhPuIb3dsno7FkImvZ/mrLq5L9q7AfOxPCXUFjyy+gm5yzNBO21Mh7zfeYy7tWWoPCPeQDwDmOk8gxjmvNTTUTtRNrK8RkRFPUXCNTuwMye8JHeLOwVd1jupCdO8yPVJu0bSIbzx8JC7Wdu3upoqqDynDvS8Ei33PB3T5ryLlEo8Cl14PBZ3HrtPBe28mUDuu4QV+jzzqx6979qhPMz/1bsVGM07aFBWu4HdobqgWPU7qZ96vETuBL2y0eU7UuOPPMjoAryhF4I8acHTO2D9drwP9zM85UPoO/jRxryUEBE99n1dukWu87xJy/I89J+Au4xkRjwVqBQ9bj47vBtB/jp8FWw8yTO1vCYWJDzTevg8B0HYvLSpSDyl7g48lo0UO3K3jTwjPUE8v651uxfLrjzUrnu8nHkWvT0JQTxKM1A84qVAPPM7bbwgyuq7Yf/Vu7YgVT2Y7Om8JvoFvAFoQzyMhwM9lm67OhI8KT17LFg7mfCfuwLwobyF1+Y7uRY3O08MLDwsJkM8g8OqPLzv57waWt872fHQPFgzizxK7yA9LXLCOscgW7yRYjg8tIFiOy5wILurpQg8hg0RPZIdSby5b9u8GCsmvFUcojxdTBK6WT5aPIHwBrs8q5+7rznivIo59Dpa6iw83ramPOI1u7xlkja8cASAPACDYTywMtq8CxoOPNORYjwy1Lu8WFZjvAfM2jskQk68dICRu8WhNbzgtl47JcNFPNT7SrwtFgC7TCDrPHlMIz2xYaE7PTIfPa66ATvuO/67+jOavKp+yrtEYg891HrlvH4WhTxI8v+6wj5pObdouDy77Mm6jZlZvKYOPzxRQKG8GnqlO+ZiozyMDQE9QNkwPOSDSLwMgh28g8wbvUD5mDzqgHa9Vr4zvAKGebv6DTA6XrCiO////Twqwxs8CumWPHw2Mjz78aI8mViXPJjyuzzYmXg8fnfVvEkgXzoCh968bf+4uyWkobx4bqm8S0ooPY/NwTxgsmW7OHDJumoIqLz+fuu7/AFfuzky+jtl9Yw7y1+Yu/o+pzucU+07kXkrvGDE2Dv0uZ48kffgPBFjwbz1No28tlncPPQTu7ywnwm8op8rPYDh37zVnUW9aC+PO2Zk/DtYBZM8ueaTO+D4HrtGO5k82tnDvN8iDD3b3WK8Us+iPEagLLtvpze7UuC6uoEbCzxeIwq9rCLYvEpGbjwZ3qO7CLvPPP+BV7kS8kq9dXfDvBScgLywpem8OOykOVs4njtKkiG9hnYVvPOjxTzixks7tGxuPEgVYDyRH2I8ufxFPJhrlDsTIgc9jtN5vJYpGrynkjs8jn8gPNijLT22SU08iB0YvMKj6jzSe/U8lPQCPPr7lTwEpI+8Ij6Cu9/3f7wcrT88V7XbOyp9I7u9SAK8/846upFJlDxwmMu7URv4O5ODbLtyKpG60vrbvOhv/jo0P4g8kwJJvLDdf7xLMuA8/rPNu8Kshrw6woi88kKTPE+UF7xyC0Y9wpHau31/5zopcKm7kD5evNjoBLwUN/W73DV5vLCn4Dqhcem8EA86vF4iY7xXM4y89sIIO2GmyLlVXQY7N4PYO4gjgzzv1eO7p9g/u/jtOjyAXiK8oXuRu7ABnbyZ66U8XfA/ve2Zxjxw6+k7+TqjPDoLQDyZYYO8+Ax3PELwAbthR4y8W2GXPAForrw4DCC9wTkBvKPMmzz+7i29bIxOO1Lu2LzJrio9UvSNvCHVEjstob28BapfO2WsMT03mCQ87SBUPLPWBroCkg08UF4uu3AADT3HELU7MrpXvJR4cjtW54a6hm3GPPebD7wMDb089n+dOjpnXTz7bay8vHz2vIfndjrY5gK8YeC1vIbapbz0M08887zLupODpLvwVhe8DUsvPIdNDjwayRK91H64vC2NlDwW8XO68o88uYPAGbyh8Qs8fAsOvVMzUTyv1tM8XWQZvYbvCzybRxa9sumvu2klUDxqhRY7ZS9kvEpCT7z5CEs7T/eOvDAOVTtvXvy7Rb65vFsw6bv4h4I7tr5TO7jAXzwKJYY8F/VTvV4nk7yP8iU8v1pAvBl57jrf4fm7vTmpPATkCTwzm3O8b0OwvErilrzTMqu8mgT5uwvVPLwOEuU7TnVWPTUcyDvXVoM7WPGUOvKFF7z4l0i8VxPtPB74Qzw9dG684hA4PNLzsrugMEA8Z0G7PMmU0DvAePW5nwUEvTnIdDzHelc8N8kZPMH1tTrt0aO7+QYHu/nSvjxp+nG7jRUBPRzX7rwcifm5QAEOvPrTkzz1y9i6wiP8u729wLz/TEG8C8/YvKo0AD2MfwE8oct1vI76oLuA3dq6IxRkukVY5zyOj8W7oTfmPCAuAr0f7ns7ot0cOyWUSTxEXss89Q2BPPHD7TwCTyM8LsVCvKuEmbsOKD47pOLKO6c8cDzHf7q8/ZwFPZBnl7vD3FW8EkM6O6F0X7r+AMI703mVPNDiY7xGkb670L9JPC4SAj3xtGi8O17bu0xmXbwX6zu8K/SavBC8QTx+rhs8/C6mvOBy6LwtliK8bKVbPOiwqryanB26xOZKvMf117wqc5G8fN1ZvGo+/DyUY2e6nO83vULviryRmM+8S8WlvGWavTyRX5K7pIwYPLSX77yE84S8i4GVOit+vbqeWLK7N3IaPe5XoLyw3MY8MZzWvFFIVDzJw8G8n7T1Op3tTTxCfLa8cldMvGQcLbxPeBs8uTTdPN1IEbtTJBc9wGIrPRVUNryGTNK84p3lvJUJ9ro84Dw8oHYIPO40pjuNh/s8VfgzPCVJqjulVpY7/HWxO9VogT1PJQC8/7IevQhm1bwTwKs7YRH2vOhE47zN5Xm81lWlu/oSFr2IlBo8w6g9PIaxRL3hwH48CNqqPIpRsborL4W86emCvFg2LLw8nFM7taQRvLzyhrxtbVw6bwHbvLwYCzwCbF86B9KXvKVplLtQGya815cXvIhCELwwZGQ8WqUFPRleADx/Vx+9sf2CvF61LT1sZIW8lEs9uh7LqLst9UO5sHIWPcwokTx4peG7EK+RPK7hxrtTLvw78LycPNfam7yFRkS8FMPCvLtx9zxWa9e8EQ4+u4A+ITzbBDs7QpgXPMaUNzy+t9+8fG+kPPrvtrtjWhW9S3VvPD90wLtUIzu8nPaxvOrm5rohRUo8qVKqvPBs2jv05rK8LDxNPMHNurwRmdc8nIRTvEmyIjz9EQI7E9MsO52ptzvGRWe7P9sCOnrIzzy6Xlw8AXg5PG1+0rzmHFo82QdcvK4P6bygwKy8uSNPPF2+nTyVVEA88gn1PEyprTzsLwa8K6E5POZuEz04iBG76BLdusZP7byMspQ8iiZiPCkz+bv9iB+8/VN7PImkDDuJvcE7fK/5OnmT+7nYLNu8/aOfPFRctTzvNx67dje6u7L8HTxCYZy8mUWKvPs+tDyRlxU9s5jKOQrTEbxN2I48wVwcvJZv3rsi1EI83ZaJO8EiiLxnJMA7QSj/vCaXj7zzAw881crmOhsuhbtolga9571wPPzOPzxCSgG8RJHDO9vlljyuK0W8Cr3RPDELXLvG80s8aJ0+PPyi+DyMVLQ8BhxaPIIxYjxpEAg6HCrGO4zcW7yopMS8VkWFO49XbbwbV3o8tg5ovCLsLrzXXGW8VWOavLh6CbycCSw6wjrSvJHyrzsDXyK9Xv8dvUPYr7zgH4E89fKOvNfs8btU39C81ZzBO9pPLz2ErJW89qgdvKNccTvlVFw8PTsBvImg9DppehM8tv6ZPBCUgrx9t2G8bi9wvLJ8sbyjx7G8/WM+vDI0Nj0yRT893x+KPN8Ew7zRJOY84hd9vNY70rtYihk5o1D7PMCu6Lu/8nK8VKNCu3V5Ybynv1A8EWBxO1mOtjxkm+G62Vf0vMpOjDpmGT28Q83vu/Z2F7vweIa8BzrTPFyy1rwy8Uc9yj9jPOvgQ7xZlHA8UTyLu5dUuLuQ7t27Shbyu+QkSjw+lyc9vKEVuyQoiTwufRy8AcivPESmkDwosNm6AZlvPNOkmLy+blI8U83XPI38OzqRUdo8lV2Gu/RcTLy6sYY8KnkAvGjq1Txwr4y75rcvPE5v7Lyjc5+8N1yWvAPxILzexpu8KWg2PLnG77wPWom8jr0GvMYlv7vEh6m8uRXiuw8K7DqP70k8QzdbO4pUDDyJyK08ehH3vIlZFDxVJX48B2KKu4Vs4DzzC+C5fSyZOh/pDD2+GI68oZ3LvLYDJLyo1d06Br3lvLluPLxtvdW87d6iPAElFTw6LEC7kcaYu3YOjbwO1yI73aVuu8LQZLzqPTI7LggEPJelprytjKW8h7jJvLAGfbyzFBc8VX+GPEShV7yVKAQ9IFgrPCC5aTzEKYo8HCG9vM5DUzykeaw72kfSvKVqAD2TVsG6CPZ/PJ6wpTxrSxW8/1CyPEUONDyYAbC7CmmXvEyOybyxnYI8irSNvKSJCL36GlU84F3Lu7WVb7uBpy48kDMuPI9pODywcxc7HF6mPAhaDrz0c3s7sstTOxRzZTw/h0m8J2uovLHUjDzn87w79WS2POtH8boWWYS8GM+rvGMPojzZSdS6pktxvFS2LDzq8G08IFchvQcbrzuJG0C79Q4VvZNmkDvbI8A74/bHPBLJrrwO8GY702TjvEFpm7x4nAa9hrqMPKw71LuU5Ty8f304PbWHszued6y8lNPhvBsbujzkbTi93E/Ruz5h8zuV1ia9T/xOvACwhjykjAa8jWgDPHPDXjtPuAu8W9mfPPgyWDu+G+y83AbVO73WoLsc8ae8kcHdPMNjM7x5Wo27TBwHPawnV7wDJhQ9UBAPPCfRsTz2EgA90KAPvM3hJzrvqAU8eSD2u/vLgjwt0pq8U2wHPNM8kbyf7R09wnQxOgNFLbwYIiI80nuXPGpiHT3gEp08RG3Iu4Ndgrum1Ey8OFnlO4MuybtIjQ89YsQTuwiRvDx8LUc7+q7evOhMuDxiX7y7/UELvbLuQbv/nKs7XJekvCREDTuNZEO8qgPMPPXHFD01ogM9K7a+uzTJybuvR6q84ukQvLvy77tKasw8z2XtvE1zq7zWcre5D6CNuwR1Fzsv4hY7PU3xO7qpGDzEMzM97cKsvHDPKDsQHxw86lSuPHUNjLwbzkY7n0/uO1kSNzz684S8u/xOPFXWxjxYiKg8sBGJPLrVYDwLSXk8qIm3vEV9TDxJvZ28De2lPIV61LsJmSo8fMSfPJ5z1LxXktc8omQcPJmJ2jzQiea7jQ4fPZffizx47rw8z7OFPP1R4LwE3M06HWvSPAoheDyXCKi7dYrJvJWe/LuDB9A6efE3vQ44Xzxfr+a8dzEruWhSJj0Fqiy8wGLIvFgD2Dwx6H08mJYIPXSNcTpC56o7EYo5uzGccrzFHH67PSrZuz9np7o/3ze9l9SsPISqoLzjf3A8sXMxPSeOuDydwLk7cAvpvCakF70EtwY53AUDvYnLWLzkMbY8y8m2O5YGQTywCiI8GQBmvIRZ/bvNGdS8Ves/O7qmKrwzD1680KASPMCCrDxIHWm8tONxuy2gDTw1owE82sgSvRrzgbvKB5q7OGaMuunaD70vWwC8v3lLPFpFuDypluI8RBG6uaxQwzw5iIo8Pr7xOtrcSrzW+/U86uYkO6V/hLn9xY48BY2SvIJODbpmbkq8oscPPKdQArz7Qcm7vUKgPHKEJDvY+6e8me0VuyhjkTxd5r88gz+Du6ujB7hUbEQ7cFiFvBGilTqEBl68FRiSPFIJ6TvwzNs8zOUqPHzsJL2rTXG8UQ2yPA== - index: 1 - object: embedding - - embedding: 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 - index: 2 - object: embedding - model: qwen3-embedding:4b - object: list - usage: - prompt_tokens: 15 - total_tokens: 15 - status: - code: 200 - message: OK -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '101' - content-type: - - application/json - host: - - localhost:11434 - method: POST - parsed_body: - encoding_format: base64 - input: - - Doc2 Section X - - Doc2 Section Y - model: qwen3-embedding:4b - uri: http://localhost:11434/v1/embeddings - response: - headers: - content-type: - - application/json - transfer-encoding: - - chunked - parsed_body: - data: - - embedding: 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 - index: 0 - object: embedding - - embedding: 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 - index: 1 - object: embedding - model: qwen3-embedding:4b - object: list - usage: - prompt_tokens: 10 - total_tokens: 10 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/cassettes/test_context_enhancement/test_expand_context_radius_zero.yaml b/tests/cassettes/test_context_enhancement/test_expand_context_radius_zero.yaml deleted file mode 100644 index 396e53ca..00000000 --- a/tests/cassettes/test_context_enhancement/test_expand_context_radius_zero.yaml +++ /dev/null @@ -1,42 +0,0 @@ -interactions: -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '89' - content-type: - - application/json - host: - - localhost:11434 - method: POST - parsed_body: - encoding_format: base64 - input: - - Simple test content - model: qwen3-embedding:4b - uri: http://localhost:11434/v1/embeddings - response: - headers: - content-type: - - application/json - transfer-encoding: - - chunked - parsed_body: - data: - - embedding: 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 - index: 0 - object: embedding - model: qwen3-embedding:4b - object: list - usage: - prompt_tokens: 4 - total_tokens: 4 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/cassettes/test_context_enhancement/test_text_expansion_uses_radius.yaml b/tests/cassettes/test_context_enhancement/test_text_expansion_includes_surrounding.yaml similarity index 100% rename from tests/cassettes/test_context_enhancement/test_text_expansion_uses_radius.yaml rename to tests/cassettes/test_context_enhancement/test_text_expansion_includes_surrounding.yaml diff --git a/tests/store/test_document_items.py b/tests/store/test_document_items.py new file mode 100644 index 00000000..c54f31c8 --- /dev/null +++ b/tests/store/test_document_items.py @@ -0,0 +1,351 @@ +import pytest + +from haiku.rag.client import HaikuRAG +from haiku.rag.store.engine import Store +from haiku.rag.store.models.document_item import ( + DocumentItem, + extract_item_text, + extract_items, +) +from haiku.rag.store.repositories.document_item import DocumentItemRepository + + +def _make_docling_doc(): + """Create a DoclingDocument with mixed item types for testing.""" + from docling_core.types.doc.document import DoclingDocument, TableData + from docling_core.types.doc.labels import DocItemLabel + + doc = DoclingDocument(name="test") + doc.add_text(label=DocItemLabel.SECTION_HEADER, text="Introduction") + doc.add_text(label=DocItemLabel.PARAGRAPH, text="This is the first paragraph.") + doc.add_text(label=DocItemLabel.PARAGRAPH, text="This is the second paragraph.") + doc.add_table(data=TableData(num_rows=2, num_cols=2, table_cells=[])) + doc.add_text(label=DocItemLabel.SECTION_HEADER, text="Conclusion") + doc.add_text(label=DocItemLabel.PARAGRAPH, text="Final thoughts here.") + return doc + + +class TestExtractItems: + def test_extracts_all_items(self): + doc = _make_docling_doc() + items = extract_items("doc-1", doc) + + assert len(items) == 6 + assert all(item.document_id == "doc-1" for item in items) + assert [item.position for item in items] == [0, 1, 2, 3, 4, 5] + + def test_extracts_labels(self): + doc = _make_docling_doc() + items = extract_items("doc-1", doc) + + assert items[0].label == "section_header" + assert items[1].label == "paragraph" + assert items[3].label == "table" + assert items[4].label == "section_header" + + def test_extracts_text(self): + doc = _make_docling_doc() + items = extract_items("doc-1", doc) + + assert items[0].text == "Introduction" + assert items[1].text == "This is the first paragraph." + assert items[5].text == "Final thoughts here." + + def test_extracts_self_refs(self): + doc = _make_docling_doc() + items = extract_items("doc-1", doc) + + assert all(item.self_ref.startswith("#/") for item in items) + + def test_table_gets_markdown_text(self): + doc = _make_docling_doc() + items = extract_items("doc-1", doc) + + table_item = items[3] + assert table_item.label == "table" + # Table should have some text from export_to_markdown + assert isinstance(table_item.text, str) + + +class TestExtractItemText: + def test_text_item(self): + from docling_core.types.doc.document import DoclingDocument + from docling_core.types.doc.labels import DocItemLabel + + doc = DoclingDocument(name="test") + doc.add_text(label=DocItemLabel.PARAGRAPH, text="Hello world") + item, _ = next(iter(doc.iterate_items())) + assert extract_item_text(item, doc) == "Hello world" + + def test_returns_none_for_empty_item(self): + from docling_core.types.doc.document import DoclingDocument + + doc = DoclingDocument(name="test") + # An empty doc has no items to extract text from + items = extract_items("doc-1", doc) + assert items == [] + + +@pytest.mark.asyncio +class TestDocumentItemRepository: + async def test_create_and_get_range(self, temp_db_path): + async with HaikuRAG(temp_db_path, create=True) as rag: + repo = DocumentItemRepository(rag.store) + + items = [ + DocumentItem( + document_id="doc-1", + position=i, + self_ref=f"#/texts/{i}", + label="paragraph", + text=f"Item {i}", + page_numbers=[1], + ) + for i in range(10) + ] + await repo.create_items("doc-1", items) + + result = await repo.get_items_in_range("doc-1", 3, 7) + assert len(result) == 5 + assert result[0].position == 3 + assert result[-1].position == 7 + assert result[0].text == "Item 3" + + async def test_resolve_refs(self, temp_db_path): + async with HaikuRAG(temp_db_path, create=True) as rag: + repo = DocumentItemRepository(rag.store) + + items = [ + DocumentItem( + document_id="doc-1", + position=i, + self_ref=f"#/texts/{i}", + label="paragraph", + text=f"Item {i}", + ) + for i in range(10) + ] + await repo.create_items("doc-1", items) + + refs = await repo.resolve_refs( + "doc-1", ["#/texts/2", "#/texts/7", "#/texts/999"] + ) + assert refs == {"#/texts/2": 2, "#/texts/7": 7} + + async def test_get_item_count(self, temp_db_path): + async with HaikuRAG(temp_db_path, create=True) as rag: + repo = DocumentItemRepository(rag.store) + + items = [ + DocumentItem( + document_id="doc-1", + position=i, + self_ref=f"#/texts/{i}", + label="paragraph", + text=f"Item {i}", + ) + for i in range(15) + ] + await repo.create_items("doc-1", items) + + assert await repo.get_item_count("doc-1") == 15 + assert await repo.get_item_count("nonexistent") == 0 + + async def test_delete_by_document_id(self, temp_db_path): + async with HaikuRAG(temp_db_path, create=True) as rag: + repo = DocumentItemRepository(rag.store) + + for doc_id in ["doc-1", "doc-2"]: + items = [ + DocumentItem( + document_id=doc_id, + position=i, + self_ref=f"#/texts/{i}", + label="paragraph", + text=f"Item {i}", + ) + for i in range(5) + ] + await repo.create_items(doc_id, items) + + await repo.delete_by_document_id("doc-1") + + assert await repo.get_item_count("doc-1") == 0 + assert await repo.get_item_count("doc-2") == 5 + + async def test_empty_refs_returns_empty(self, temp_db_path): + async with HaikuRAG(temp_db_path, create=True) as rag: + repo = DocumentItemRepository(rag.store) + assert await repo.resolve_refs("doc-1", []) == {} + + async def test_items_sorted_by_position(self, temp_db_path): + async with HaikuRAG(temp_db_path, create=True) as rag: + repo = DocumentItemRepository(rag.store) + + # Insert in reverse order + items = [ + DocumentItem( + document_id="doc-1", + position=9 - i, + self_ref=f"#/texts/{9 - i}", + label="paragraph", + text=f"Item {9 - i}", + ) + for i in range(10) + ] + await repo.create_items("doc-1", items) + + result = await repo.get_items_in_range("doc-1", 0, 9) + positions = [item.position for item in result] + assert positions == sorted(positions) + + +@pytest.mark.asyncio +class TestDocumentItemPopulation: + async def test_store_document_populates_items(self, temp_db_path): + """Test that _store_document_with_chunks populates items when given a docling_document.""" + from haiku.rag.store.models.document import Document + + docling_doc = _make_docling_doc() + + async with HaikuRAG(temp_db_path, create=True) as rag: + document = Document( + content="test content", + uri="test://doc", + ) + document.set_docling(docling_doc) + + # Use _store_document_with_chunks directly with empty chunks + # to avoid needing embeddings + created = await rag._store_document_with_chunks(document, [], docling_doc) + assert created.id is not None + + count = await rag.document_item_repository.get_item_count(created.id) + assert count == 6 + + items = await rag.document_item_repository.get_items_in_range( + created.id, 0, count + ) + assert items[0].label == "section_header" + assert items[0].text == "Introduction" + assert items[1].label == "paragraph" + + async def test_update_document_replaces_items(self, temp_db_path): + """Test that _update_document_with_chunks replaces items.""" + from docling_core.types.doc.document import DoclingDocument + from docling_core.types.doc.labels import DocItemLabel + + from haiku.rag.store.models.document import Document + + docling_doc = _make_docling_doc() + + async with HaikuRAG(temp_db_path, create=True) as rag: + document = Document( + content="test content", + uri="test://doc", + ) + document.set_docling(docling_doc) + created = await rag._store_document_with_chunks(document, [], docling_doc) + assert created.id is not None + assert await rag.document_item_repository.get_item_count(created.id) == 6 + + # Update with a simpler document + new_doc = DoclingDocument(name="updated") + new_doc.add_text(label=DocItemLabel.PARAGRAPH, text="Only one item now.") + created.set_docling(new_doc) + + await rag._update_document_with_chunks(created, [], new_doc) + assert await rag.document_item_repository.get_item_count(created.id) == 1 + + async def test_delete_document_cascades_items(self, temp_db_path): + """Test that deleting a document also deletes its items.""" + from haiku.rag.store.models.document import Document + + docling_doc = _make_docling_doc() + + async with HaikuRAG(temp_db_path, create=True) as rag: + document = Document( + content="test content", + uri="test://doc", + ) + document.set_docling(docling_doc) + created = await rag._store_document_with_chunks(document, [], docling_doc) + assert created.id is not None + assert await rag.document_item_repository.get_item_count(created.id) == 6 + + await rag.delete_document(created.id) + assert await rag.document_item_repository.get_item_count(created.id) == 0 + + +class TestDocumentItemMigration: + def test_migration_populates_items_for_existing_documents(self, temp_db_path): + """Test that the v0.40.0 migration populates items for pre-existing documents.""" + from haiku.rag.store.compression import compress_docling_split + from haiku.rag.store.engine import DocumentRecord + + docling_doc = _make_docling_doc() + json_str = docling_doc.model_dump_json() + structure, pages = compress_docling_split(json_str) + + # Create a database at a pre-migration version with a document + store = Store(temp_db_path, create=True, skip_migration_check=True) + store.set_haiku_version("0.39.0") + doc_record = DocumentRecord( + id="test-doc-1", + content="test content", + uri="test://doc", + docling_document=structure, + docling_pages=pages, + docling_version=docling_doc.version, + ) + store.documents_table.add([doc_record]) + + # Verify no items exist yet + assert store.document_items_table.count_rows() == 0 + store.close() + + # Re-open with skip_migration_check and run migration + store = Store(temp_db_path, skip_migration_check=True) + applied = store.migrate() + + # Should have applied the v0.40.0 migration + assert any("document_items" in desc for desc in applied) + + # Items should now exist + item_count = store.document_items_table.count_rows( + filter="document_id = 'test-doc-1'" + ) + assert item_count == 6 + + # Verify item content + items = ( + store.document_items_table.search() + .where("document_id = 'test-doc-1'") + .to_list() + ) + labels = {row["label"] for row in items} + assert "section_header" in labels + assert "paragraph" in labels + assert "table" in labels + + store.close() + + def test_migration_skips_documents_without_docling(self, temp_db_path): + """Test that migration handles documents without docling data.""" + from haiku.rag.store.engine import DocumentRecord + + store = Store(temp_db_path, create=True, skip_migration_check=True) + store.set_haiku_version("0.39.0") + doc_record = DocumentRecord( + id="no-docling", + content="plain text document", + ) + store.documents_table.add([doc_record]) + store.close() + + store = Store(temp_db_path, skip_migration_check=True) + store.migrate() + + # No items should have been created + assert store.document_items_table.count_rows() == 0 + store.close() diff --git a/tests/test_client.py b/tests/test_client.py index 40a1ee73..7c61a9b8 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -1502,12 +1502,12 @@ async def test_client_convert_with_html_format(temp_db_path): @pytest.mark.asyncio @pytest.mark.vcr() async def test_sql_injection_is_blocked_with_escaping(temp_db_path): - """SQL injection is blocked when using _escape_sql_string. + """SQL injection is blocked when using escape_sql_string. - This test verifies that _escape_sql_string properly prevents SQL injection + This test verifies that escape_sql_string properly prevents SQL injection by escaping single quotes in user input. """ - from haiku.rag.store.repositories.document import _escape_sql_string + from haiku.rag.utils import escape_sql_string async with HaikuRAG(temp_db_path, create=True) as client: # Create documents @@ -1529,7 +1529,7 @@ async def test_sql_injection_is_blocked_with_escaping(temp_db_path): # With proper escaping, single quotes become double quotes # so the filter becomes: title = 'x'' OR title LIKE ''%' # which searches for a literal title containing the injection string - safe_payload = _escape_sql_string(injection_payload) + safe_payload = escape_sql_string(injection_payload) docs = await client.list_documents(filter=f"title = '{safe_payload}'") # Should find 0 documents (injection is escaped, searching for literal string) diff --git a/tests/test_context.py b/tests/test_context.py new file mode 100644 index 00000000..94e062a0 --- /dev/null +++ b/tests/test_context.py @@ -0,0 +1,384 @@ +import pytest + +from haiku.rag.context import ( + _expand_outward, + _find_expansion_range, + _merge_ranges, + expand_with_items, +) +from haiku.rag.store.models.chunk import SearchResult +from haiku.rag.store.models.document_item import DocumentItem + + +def _item( + position: int, label: str = "text", text: str = "", pages: list[int] | None = None +) -> DocumentItem: + return DocumentItem( + document_id="doc-1", + position=position, + self_ref=f"#/texts/{position}", + label=label, + text=text or f"Text for item {position}.", + page_numbers=pages or [1], + ) + + +def _result(score: float = 0.5, refs: list[str] | None = None) -> SearchResult: + return SearchResult( + content="original", + score=score, + document_id="doc-1", + doc_item_refs=refs or [], + ) + + +class TestMergeRanges: + def test_empty(self): + assert _merge_ranges([]) == [] + + def test_no_overlap(self): + r1, r2 = _result(), _result() + merged = _merge_ranges([(0, 5, r1), (10, 15, r2)]) + assert len(merged) == 2 + assert merged[0] == (0, 5, [r1]) + assert merged[1] == (10, 15, [r2]) + + def test_overlapping(self): + r1, r2 = _result(0.9), _result(0.8) + merged = _merge_ranges([(0, 10, r1), (5, 15, r2)]) + assert len(merged) == 1 + assert merged[0] == (0, 15, [r1, r2]) + + def test_adjacent(self): + r1, r2 = _result(), _result() + merged = _merge_ranges([(0, 5, r1), (6, 10, r2)]) + assert len(merged) == 1 + assert merged[0] == (0, 10, [r1, r2]) + + def test_sorts_by_position(self): + r1, r2 = _result(), _result() + merged = _merge_ranges([(10, 15, r1), (0, 5, r2)]) + assert merged[0][0] == 0 + assert merged[1][0] == 10 + + +class TestExpandOutward: + def test_basic_expansion(self): + items = [_item(i, text=f"{'x' * 100}") for i in range(10)] + lo, hi = _expand_outward(items, 5, max_items=10, max_chars=500) + assert lo <= 5 + assert hi >= 5 + total = sum( + len(items[i].text) + for i in range(lo, hi + 1) + if items[i].position >= lo and items[i].position <= hi + ) + # Should be around 500 chars (may overshoot by one item) + assert total >= 400 + + def test_respects_max_items(self): + items = [_item(i, text="x") for i in range(100)] + lo, hi = _expand_outward(items, 50, max_items=5, max_chars=999999) + count = hi - lo + 1 + # May overshoot by 1-2 items due to alternating expansion + assert count <= 7 + + def test_respects_max_chars(self): + items = [_item(i, text=f"{'x' * 200}") for i in range(20)] + lo, hi = _expand_outward(items, 10, max_items=999, max_chars=500) + total = sum( + len(items[i].text) + for i in range(lo, hi + 1) + if items[i].position >= lo and items[i].position <= hi + ) + # Should be near 500, may overshoot by one item (~200 chars) + assert total <= 900 + + def test_center_at_start(self): + items = [_item(i) for i in range(10)] + lo, hi = _expand_outward(items, 0, max_items=5, max_chars=999999) + assert lo == 0 + + def test_center_at_end(self): + items = [_item(i) for i in range(10)] + lo, hi = _expand_outward(items, 9, max_items=5, max_chars=999999) + assert hi == 9 + + def test_skip_noise_excludes_from_char_count(self): + items = [ + _item(0, text="a" * 100), + _item(1, label="footnote", text="f" * 5000), + _item(2, text="b" * 100), + _item(3, text="c" * 100), + _item(4, label="footnote", text="f" * 5000), + _item(5, text="d" * 100), + ] + lo, hi = _expand_outward(items, 2, max_items=10, max_chars=500, skip_noise=True) + # Footnotes (5000 chars each) should NOT count toward budget + # So we should expand past them + assert lo <= 0 + assert hi >= 5 + + def test_noise_center_gets_zero_chars(self): + items = [ + _item(0, text="a" * 200), + _item(1, label="document_index", text="x" * 10000), + _item(2, text="b" * 200), + ] + lo, hi = _expand_outward(items, 1, max_items=10, max_chars=500, skip_noise=True) + # Center is noise, should start at 0 chars and expand outward + assert lo == 0 + assert hi == 2 + + +class TestFindExpansionRange: + def _structured_items(self): + """Document with two sections, each over min_useful (1000 chars).""" + return [ + _item(0, label="section_header", text="Introduction"), + _item(1, text="First paragraph. " * 40), # ~680 chars + _item(2, text="Second paragraph. " * 40), # ~720 chars + _item(3, label="footnote", text="Some footnote."), + _item(4, label="section_header", text="Methods"), + _item(5, text="Methods paragraph one. " * 40), # ~920 chars + _item(6, text="Methods paragraph two. " * 40), # ~920 chars + ] + + def test_structured_returns_section(self): + items = self._structured_items() + lo, hi = _find_expansion_range( + items, {1}, has_sections=True, max_items=20, max_chars=5000 + ) + # Should return the Introduction section (items 0-3) + assert lo == 0 + assert hi == 3 + + def test_structured_different_section(self): + items = self._structured_items() + lo, hi = _find_expansion_range( + items, {5}, has_sections=True, max_items=20, max_chars=5000 + ) + # Should return the Methods section (items 4-6) + assert lo == 4 + assert hi == 6 + + def test_structured_large_section_falls_back_to_outward(self): + items = [ + _item(0, label="section_header", text="Big Section"), + ] + [_item(i, text="x" * 1000) for i in range(1, 20)] + # Section has 19 * 1000 = 19000 chars, way over 5000 budget + lo, hi = _find_expansion_range( + items, {10}, has_sections=True, max_items=50, max_chars=5000 + ) + # Should NOT return the full section + total = sum( + len(items[i].text) for i in range(lo, hi + 1) if items[i].position >= lo + ) + assert total < 10000 + + def test_structured_small_section_expands_outward(self): + items = [ + _item(0, label="title", text="Paper Title"), + _item(1, text="Author names"), + _item(2, label="section_header", text="Abstract"), + _item(3, text="Abstract content. " * 50), + _item(4, label="section_header", text="Introduction"), + _item(5, text="Intro content. " * 50), + ] + # Title section (items 0-1) is tiny (~25 chars) < 20% of 5000 + lo, hi = _find_expansion_range( + items, {0}, has_sections=True, max_items=20, max_chars=5000 + ) + # Should expand past the title section into the abstract + assert hi >= 3 + + def test_unstructured_expands_outward(self): + items = [_item(i, text=f"Paragraph {i}. " * 10) for i in range(10)] + lo, hi = _find_expansion_range( + items, {5}, has_sections=False, max_items=20, max_chars=5000 + ) + assert lo < 5 + assert hi > 5 + + def test_multiple_matched_positions_uses_center(self): + items = [_item(i, text="x" * 100) for i in range(20)] + # Match at positions 3 and 7, center should be index for position 5 (median) + lo, hi = _find_expansion_range( + items, {3, 7}, has_sections=False, max_items=5, max_chars=999999 + ) + center = (lo + hi) // 2 + # Center should be around position 5 + assert 3 <= center <= 7 + + def test_noise_excluded_from_section_char_count(self): + items = [ + _item(0, label="section_header", text="Section"), + _item(1, text="Real content." * 10), + _item(2, label="footnote", text="x" * 10000), + _item(3, text="More content." * 10), + ] + # Section non-noise chars: ~260 chars (items 0,1,3). Under 5000 budget. + # The footnote's 10000 chars should NOT count. + lo, hi = _find_expansion_range( + items, {1}, has_sections=True, max_items=20, max_chars=5000 + ) + # Should return full section (it fits in budget excluding noise) + assert lo == 0 + assert hi == 3 + + def test_items_before_first_header_form_section(self): + items = [ + _item(0, text="Preamble text."), + _item(1, text="More preamble."), + _item(2, label="section_header", text="First Section"), + _item(3, text="Section content."), + ] + lo, hi = _find_expansion_range( + items, {0}, has_sections=True, max_items=20, max_chars=5000 + ) + # Match is in preamble section (items 0-1), which is small + # Should expand outward into the first section + assert hi >= 2 + + +@pytest.mark.asyncio +class TestExpandWithItems: + async def test_unresolvable_refs_returns_original(self, temp_db_path): + from haiku.rag.client import HaikuRAG + from haiku.rag.store.models.document import Document + + async with HaikuRAG(temp_db_path, create=True) as rag: + doc = await rag._store_document_with_chunks( + Document(content="test"), + [], + __import__( + "docling_core.types.doc.document", fromlist=["DoclingDocument"] + ).DoclingDocument(name="t"), + ) + result = SearchResult( + content="original", + score=0.9, + document_id=doc.id, + doc_item_refs=["#/texts/999999"], + ) + expanded = await expand_with_items( + rag.document_item_repository, doc.id, [result], 10, 5000 + ) + assert len(expanded) == 1 + assert expanded[0].content == "original" + + async def test_noise_only_range_preserves_original(self, temp_db_path): + """When noise filtering removes all content, original chunk is preserved.""" + from haiku.rag.client import HaikuRAG + + async with HaikuRAG(temp_db_path, create=True) as rag: + # Structured document where the matched item's section has only noise + items = [ + DocumentItem( + document_id="doc-1", + position=0, + self_ref="#/texts/0", + label="section_header", + text="Table of Contents", + ), + DocumentItem( + document_id="doc-1", + position=1, + self_ref="#/texts/1", + label="document_index", + text="x" * 2000, + ), + DocumentItem( + document_id="doc-1", + position=2, + self_ref="#/texts/2", + label="section_header", + text="Introduction", + ), + DocumentItem( + document_id="doc-1", + position=3, + self_ref="#/texts/3", + label="text", + text="Intro content. " * 100, + ), + ] + await rag.document_item_repository.create_items("doc-1", items) + + result = SearchResult( + content="original chunk content", + score=0.9, + document_id="doc-1", + doc_item_refs=["#/texts/1"], + ) + expanded = await expand_with_items( + rag.document_item_repository, "doc-1", [result], 10, 5000 + ) + assert len(expanded) == 1 + # The TOC section's only non-header item is document_index (noise). + # The section_header "Table of Contents" has text but _expand_outward + # with skip_noise crosses into the Introduction section which has + # real content — so we get expanded content, not the fallback. + assert len(expanded[0].content) > 0 + + async def test_fragmented_items_preserve_chunk(self, temp_db_path): + """When items are fragmented (e.g., list_item children), the original + chunk content is preserved if expansion produces less text.""" + from haiku.rag.client import HaikuRAG + + async with HaikuRAG(temp_db_path, create=True) as rag: + # Simulate docling's list_item structure: container with empty text, + # children with tiny fragments + items = [ + DocumentItem( + document_id="doc-1", + position=0, + self_ref="#/texts/0", + label="section_header", + text="Steps", + ), + DocumentItem( + document_id="doc-1", + position=1, + self_ref="#/texts/1", + label="list_item", + text="", + ), + DocumentItem( + document_id="doc-1", + position=2, + self_ref="#/texts/2", + label="text", + text="Click", + ), + DocumentItem( + document_id="doc-1", + position=3, + self_ref="#/texts/3", + label="text", + text="+", + ), + DocumentItem( + document_id="doc-1", + position=4, + self_ref="#/texts/4", + label="text", + text="Add a New Service", + ), + ] + await rag.document_item_repository.create_items("doc-1", items) + + # The chunk had properly assembled content from the chunker + result = SearchResult( + content="1. Click + Add a New Service in the dashboard.", + score=0.9, + document_id="doc-1", + doc_item_refs=["#/texts/1", "#/texts/2", "#/texts/3", "#/texts/4"], + ) + expanded = await expand_with_items( + rag.document_item_repository, "doc-1", [result], 10, 5000 + ) + assert len(expanded) == 1 + # Expansion produces "Steps\n\nClick\n\n+\n\nAdd a New Service" = 38 chars + # which is less than the chunk's 46 chars — fallback preserves the chunk + assert expanded[0].content == result.content diff --git a/tests/test_context_enhancement.py b/tests/test_context_enhancement.py index f1a03792..021c8b50 100644 --- a/tests/test_context_enhancement.py +++ b/tests/test_context_enhancement.py @@ -5,7 +5,6 @@ from docling_core.types.doc.labels import DocItemLabel from haiku.rag.client import HaikuRAG from haiku.rag.config.models import AppConfig from haiku.rag.store.models import SearchResult -from haiku.rag.store.models.chunk import Chunk async def create_document_with_docling( @@ -224,11 +223,10 @@ async def test_code_expansion_includes_adjacent_blocks( @pytest.mark.vcr() -async def test_text_expansion_uses_radius(temp_db_path): - """Text content expansion should use radius, not structural boundaries.""" +async def test_text_expansion_includes_surrounding(temp_db_path): + """Text content expansion should include surrounding paragraphs.""" config = AppConfig() config.processing.chunk_size = 32 - config.search.context_radius = 1 # Small radius # Create a document with longer paragraphs that will split doc = DoclingDocument(name="text_test") @@ -260,8 +258,7 @@ async def test_text_expansion_uses_radius(temp_db_path): original = results[0] expanded = await client.expand_context(results) - # With radius=1, expansion should include adjacent paragraphs - # Content length should be >= original (may add adjacent content) + # Expansion should include adjacent paragraphs assert len(expanded[0].content) >= len(original.content) @@ -335,210 +332,61 @@ async def test_max_items_limit_caps_expansion(temp_db_path): assert item_count <= 2, f"Expected at most 2 items, got {item_count}" -@pytest.mark.vcr() -async def test_expand_context_radius_zero(temp_db_path): - """Test expand_context with radius 0 returns original results.""" - # Default config has context_radius=0 +async def test_expand_context_single_item_document(temp_db_path): + """Test expand_context with a single-item document.""" + from haiku.rag.store.models.document import Document + + docling_doc = DoclingDocument(name="simple") + docling_doc.add_text(label=DocItemLabel.PARAGRAPH, text="Simple test content") + async with HaikuRAG(temp_db_path, create=True) as client: - doc = await client.create_document(content="Simple test content") + document = Document(content="Simple test content") + document.set_docling(docling_doc) + doc = await client._store_document_with_chunks(document, [], docling_doc) assert doc.id is not None - chunks = await client.chunk_repository.get_by_document_id(doc.id) - search_results = [SearchResult.from_chunk(chunks[0], 0.9)] + # Create a search result with a doc_item_ref pointing to the item + items = await client.document_item_repository.get_items_in_range(doc.id, 0, 10) + assert len(items) > 0 + + search_results = [ + SearchResult( + content="Simple test content", + score=0.9, + document_id=doc.id, + doc_item_refs=[items[0].self_ref], + ) + ] expanded_results = await client.expand_context(search_results) - # Should return exactly the same results assert len(expanded_results) == 1 - assert expanded_results[0].content == search_results[0].content - assert expanded_results[0].score == search_results[0].score + assert expanded_results[0].score == 0.9 + assert "Simple test content" in expanded_results[0].content -@pytest.mark.vcr() -async def test_expand_context_multiple_documents(temp_db_path): - """Test expand_context with results from multiple documents.""" - config = AppConfig() - config.search.context_radius = 1 - - async with HaikuRAG(temp_db_path, config=config, create=True) as client: - # Create first document with manual chunks - docling_doc1 = DoclingDocument(name="doc1") - docling_doc1.add_text(label=DocItemLabel.TEXT, text="Doc1 content") - doc1_chunks = [ - Chunk(content="Doc1 Part A", order=0), - Chunk(content="Doc1 Part B", order=1), - Chunk(content="Doc1 Part C", order=2), - ] - doc1 = await client.import_document( - docling_document=docling_doc1, chunks=doc1_chunks, uri="doc1.txt" - ) - - # Create second document with manual chunks - docling_doc2 = DoclingDocument(name="doc2") - docling_doc2.add_text(label=DocItemLabel.TEXT, text="Doc2 content") - doc2_chunks = [ - Chunk(content="Doc2 Section X", order=0), - Chunk(content="Doc2 Section Y", order=1), - ] - doc2 = await client.import_document( - docling_document=docling_doc2, chunks=doc2_chunks, uri="doc2.txt" - ) - - assert doc1.id is not None - assert doc2.id is not None - chunks1 = await client.chunk_repository.get_by_document_id(doc1.id) - chunks2 = await client.chunk_repository.get_by_document_id(doc2.id) - - # Get middle chunk from doc1 (order=1) and first chunk from doc2 (order=0) - chunk1 = next(c for c in chunks1 if c.order == 1) - chunk2 = next(c for c in chunks2 if c.order == 0) - +async def test_expand_context_no_refs_passes_through(temp_db_path): + """Results without doc_item_refs pass through unexpanded.""" + async with HaikuRAG(temp_db_path, create=True) as client: + # A search result with no doc_item_refs should pass through as-is search_results = [ - SearchResult.from_chunk(chunk1, 0.8), - SearchResult.from_chunk(chunk2, 0.7), + SearchResult( + content="Some chunk content", + score=0.8, + document_id="some-doc", + doc_item_refs=[], + ) ] - expanded_results = await client.expand_context(search_results) + expanded = await client.expand_context(search_results) - assert len(expanded_results) == 2 - - # Check first expanded result (should include chunks 0,1,2 from doc1) - expanded1 = expanded_results[0] - assert expanded1.score == 0.8 - assert "Doc1 Part A" in expanded1.content - assert "Doc1 Part B" in expanded1.content - assert "Doc1 Part C" in expanded1.content - - # Check second expanded result (should include chunks 0,1 from doc2) - expanded2 = expanded_results[1] - assert expanded2.score == 0.7 - assert "Doc2 Section X" in expanded2.content - assert "Doc2 Section Y" in expanded2.content - - -@pytest.mark.vcr() -async def test_expand_context_merges_overlapping_chunks(temp_db_path): - """Test that overlapping expanded chunks are merged into one.""" - config = AppConfig() - config.search.context_radius = 1 - - async with HaikuRAG(temp_db_path, config=config, create=True) as client: - # Create document with 5 chunks - docling_doc = DoclingDocument(name="test") - docling_doc.add_text(label=DocItemLabel.TEXT, text="Full document content") - manual_chunks = [ - Chunk(content="Chunk 0", order=0), - Chunk(content="Chunk 1", order=1), - Chunk(content="Chunk 2", order=2), - Chunk(content="Chunk 3", order=3), - Chunk(content="Chunk 4", order=4), - ] - - doc = await client.import_document( - docling_document=docling_doc, chunks=manual_chunks - ) - - assert doc.id is not None - chunks = await client.chunk_repository.get_by_document_id(doc.id) - - # Get adjacent chunks (orders 1 and 2) - these will overlap when expanded - chunk1 = next(c for c in chunks if c.order == 1) - chunk2 = next(c for c in chunks if c.order == 2) - - # With radius=1: - # chunk1 expanded would be [0,1,2] - # chunk2 expanded would be [1,2,3] - # These should merge into one chunk containing [0,1,2,3] - search_results = [ - SearchResult.from_chunk(chunk1, 0.8), - SearchResult.from_chunk(chunk2, 0.7), - ] - expanded_results = await client.expand_context(search_results) - - # Should have only 1 merged result instead of 2 overlapping ones - assert len(expanded_results) == 1 - - merged = expanded_results[0] - - # Should contain all chunks from 0 to 3 - assert "Chunk 0" in merged.content - assert "Chunk 1" in merged.content - assert "Chunk 2" in merged.content - assert "Chunk 3" in merged.content - assert "Chunk 4" not in merged.content # Should not include chunk 4 - - # Should use the higher score (0.8) - assert merged.score == 0.8 - - -@pytest.mark.vcr() -async def test_expand_context_keeps_separate_non_overlapping(temp_db_path): - """Test that non-overlapping expanded chunks remain separate.""" - config = AppConfig() - config.search.context_radius = 1 - - async with HaikuRAG(temp_db_path, config=config, create=True) as client: - # Create document with chunks far apart - docling_doc = DoclingDocument(name="test") - docling_doc.add_text(label=DocItemLabel.TEXT, text="Full document content") - manual_chunks = [ - Chunk(content="Chunk 0", order=0), - Chunk(content="Chunk 1", order=1), - Chunk(content="Chunk 2", order=2), - Chunk(content="Chunk 5", order=5), # Gap here - Chunk(content="Chunk 6", order=6), - Chunk(content="Chunk 7", order=7), - ] - - doc = await client.import_document( - docling_document=docling_doc, chunks=manual_chunks - ) - - assert doc.id is not None - chunks = await client.chunk_repository.get_by_document_id(doc.id) - - # Get chunks by index - they will have sequential orders 0,1,2,3,4,5 - # So get chunk with order=0 and chunk with order=5 (far enough apart) - chunk0 = next(c for c in chunks if c.order == 0) # Content: "Chunk 0" - chunk5 = next( - c for c in chunks if c.order == 5 - ) # Content: "Chunk 7" but now at order 5 - - # chunk0 expanded: [0,1] with radius=1 (orders 0,1) - # chunk5 expanded: [4,5] with radius=1 (orders 4,5) - search_results = [ - SearchResult.from_chunk(chunk0, 0.8), - SearchResult.from_chunk(chunk5, 0.7), - ] - expanded_results = await client.expand_context(search_results) - - # Should have 2 separate results - assert len(expanded_results) == 2 - - # Sort by score to ensure predictable order - expanded_results.sort(key=lambda x: x.score, reverse=True) - - chunk0_expanded = expanded_results[0] - chunk5_expanded = expanded_results[1] - - # First chunk (order=0) expanded should contain orders [0,1] - # Content should be "Chunk 0" + "Chunk 1" - assert "Chunk 0" in chunk0_expanded.content - assert "Chunk 1" in chunk0_expanded.content - assert "Chunk 5" not in chunk0_expanded.content - assert chunk0_expanded.score == 0.8 - - # Second chunk (order=5) expanded should contain orders [4,5] - # Content should be "Chunk 6" (order 4) + "Chunk 7" (order 5) - assert "Chunk 6" in chunk5_expanded.content - assert "Chunk 7" in chunk5_expanded.content - assert "Chunk 0" not in chunk5_expanded.content - assert chunk5_expanded.score == 0.7 + assert len(expanded) == 1 + assert expanded[0].content == "Some chunk content" + assert expanded[0].score == 0.8 @pytest.mark.vcr() async def test_expand_context_with_docling_merges_overlapping(temp_db_path): """Test that expand_context with DoclingDocument merges overlapping results.""" config = AppConfig() - config.search.context_radius = 3 markdown_content = """# Chapter 1 @@ -593,7 +441,6 @@ This is paragraph four about topic C. async def test_expand_context_docling_merges_metadata(temp_db_path): """Test that expand_context properly merges metadata from multiple results.""" config = AppConfig() - config.search.context_radius = 10 markdown_content = """# Introduction @@ -676,7 +523,6 @@ async def test_expand_context_no_base64_images(temp_db_path): base64 image data from leaking into the expanded content. """ config = AppConfig() - config.search.context_radius = 5 # Expand enough to include pictures docling_doc = create_picture_document() @@ -713,7 +559,6 @@ async def test_expand_context_no_base64_images_docling_local(temp_db_path): config.processing.converter = "docling-local" config.processing.chunker = "docling-local" config.processing.conversion_options.do_ocr = False - config.search.context_radius = 5 async with HaikuRAG(temp_db_path, config=config, create=True) as client: pdf_path = Path(__file__).parent / "data" / "doclaynet.pdf" @@ -747,7 +592,6 @@ async def test_expand_context_no_base64_images_docling_serve(temp_db_path): config = AppConfig() config.processing.converter = "docling-serve" config.processing.chunker = "docling-serve" - config.search.context_radius = 5 async with HaikuRAG(temp_db_path, config=config, create=True) as client: pdf_path = Path(__file__).parent / "data" / "doclaynet.pdf" diff --git a/tests/test_document.py b/tests/test_document.py index 635c31d8..a19ce115 100644 --- a/tests/test_document.py +++ b/tests/test_document.py @@ -142,93 +142,6 @@ def test_document_get_docling_document_none(): assert document.get_docling_document() is None -def test_document_get_docling_document_caching(): - """Test that get_docling_document uses LRU cache keyed by document ID.""" - from haiku.rag.store.models.document import ( - _docling_document_cache, - invalidate_docling_document_cache, - ) - - doc_json = { - "name": "test_doc", - "texts": [ - { - "self_ref": "#/texts/0", - "text": "Test text", - "orig": "Test text", - "label": "paragraph", - }, - ], - "tables": [], - "pictures": [], - "groups": [], - "body": {"self_ref": "#/body", "children": []}, - "furniture": {"self_ref": "#/furniture", "children": []}, - } - - import json - - from haiku.rag.store.compression import compress_json - - compressed = compress_json(json.dumps(doc_json)) - - # Clear cache to get clean state - _docling_document_cache.clear() - - document = Document( - id="test-doc-id", content="Test content", docling_document=compressed - ) - - # First call - not in cache - assert "test-doc-id" not in _docling_document_cache - doc1 = document.get_docling_document() - assert "test-doc-id" in _docling_document_cache - - # Second call - cache hit, same object - doc2 = document.get_docling_document() - assert doc1 is doc2 - - # Invalidation removes from cache - invalidate_docling_document_cache("test-doc-id") - assert "test-doc-id" not in _docling_document_cache - - -def test_document_get_docling_document_no_id_no_cache(): - """Test that documents without ID don't use cache.""" - from haiku.rag.store.models.document import _docling_document_cache - - doc_json = { - "name": "test_doc", - "texts": [], - "tables": [], - "pictures": [], - "groups": [], - "body": {"self_ref": "#/body", "children": []}, - "furniture": {"self_ref": "#/furniture", "children": []}, - } - - import json - - from haiku.rag.store.compression import compress_json - - compressed = compress_json(json.dumps(doc_json)) - - # Clear cache - _docling_document_cache.clear() - - # Document without ID - document = Document(content="Test content", docling_document=compressed) - - doc1 = document.get_docling_document() - doc2 = document.get_docling_document() - - # Cache should remain empty (no ID to cache by) - assert len(_docling_document_cache) == 0 - - # Each call parses fresh (different objects) - assert doc1 is not doc2 - - def test_set_docling_splits_structure_and_pages(): """set_docling stores structure and pages separately.""" import json diff --git a/tests/test_info.py b/tests/test_info.py index ffbdf2ca..5f7eb784 100644 --- a/tests/test_info.py +++ b/tests/test_info.py @@ -5,6 +5,7 @@ import pytest from haiku.rag.app import HaikuRAGApp from haiku.rag.config.models import AppConfig, LanceDBConfig +from haiku.rag.store.engine import DocumentItemRecord @pytest.mark.asyncio @@ -33,6 +34,7 @@ async def test_app_info_outputs(temp_db_path, capsys): settings_tbl = db.create_table("settings", schema=SettingsRecord) docs_tbl = db.create_table("documents", schema=DocumentRecord) chunks_tbl = db.create_table("chunks", schema=ChunkRecord) + db.create_table("document_items", schema=DocumentItemRecord) # Insert one of each - using the new config format settings_tbl.add( @@ -113,6 +115,7 @@ async def test_app_info_with_vector_index(temp_db_path, capsys): settings_tbl = db.create_table("settings", schema=SettingsRecord) docs_tbl = db.create_table("documents", schema=DocumentRecord) chunks_tbl = db.create_table("chunks", schema=ChunkRecord) + db.create_table("document_items", schema=DocumentItemRecord) # Insert settings settings_tbl.add( diff --git a/uv.lock b/uv.lock index 85a303d2..7cac7357 100644 --- a/uv.lock +++ b/uv.lock @@ -1418,7 +1418,7 @@ wheels = [ [[package]] name = "haiku-rag" -version = "0.39.0" +version = "0.40.0" source = { editable = "." } dependencies = [ { name = "haiku-rag-slim", extra = ["cohere", "docling", "mxbai", "tui", "voyageai", "zeroentropy"] }, @@ -1500,10 +1500,9 @@ requires-dist = [ [[package]] name = "haiku-rag-slim" -version = "0.39.0" +version = "0.40.0" source = { editable = "haiku_rag_slim" } dependencies = [ - { name = "cachetools" }, { name = "docling-core" }, { name = "haiku-skills" }, { name = "httpx" }, @@ -1568,10 +1567,9 @@ zeroentropy = [ [package.metadata] requires-dist = [ - { name = "cachetools", specifier = ">=7.0.5" }, { name = "cohere", marker = "extra == 'cohere'", specifier = ">=5.21.1" }, { name = "docling", marker = "extra == 'docling'", specifier = ">=2.84.0" }, - { name = "docling-core", specifier = ">=2.71.0" }, + { name = "docling-core", specifier = ">=2.71.0,<2.72" }, { name = "haiku-skills", specifier = ">=0.14.0" }, { name = "httpx", specifier = ">=0.28.1" }, { name = "jinja2", specifier = ">=3.1.0" },