Files
SuperBizAgent-java/openspec/specs/rag-knowledge-retrieval/spec.md
T
zhuyongxin ac1f831903 feat(rag): chunk evidence identity, dedup, and search port
Preserve same-document multi-chunk evidence with evidenceKey identity,
per-document caps, retrieve-k/return-n split, and a dense KnowledgeSearchPort.
Archives Delivery 1 OpenSpec change as the foundation for hybrid retrieval.
2026-07-27 18:26:15 +08:00

15 KiB

rag-knowledge-retrieval Specification

Purpose

Define the runtime contract for the explicit lookup_knowledge Agent tool, including how L0 keyword/frontmatter hints cooperate with L1 semantic retrieval while preserving metadata filters, fallback evidence, and traceable retrieval details.

Requirements

Requirement: Knowledge retrieval SHALL keep L0 as a hint provider

The lookup_knowledge retrieval flow SHALL retain L0 keyword/frontmatter matching but use it only as query understanding, filtering, rerank, and explainability hint data rather than as a final evidence retrieval decision.

Scenario: L0 produces traceable hint data

  • WHEN L0 matches one or more indexed knowledge entries
  • THEN the retrieval flow SHALL expose matched titles, matched keywords, domains or categories, and entity terms as structured hint data

Scenario: L0 does not bypass semantic retrieval

  • WHEN L0 returns exactly one match
  • THEN the retrieval flow SHALL still attempt semantic L1 retrieval unless L1 is explicitly disabled by configuration

Scenario: L0 hints do not become normal evidence

  • WHEN L1 retrieval returns no usable evidence
  • THEN L0 matched documents SHALL NOT be returned as fact evidence blocks
  • AND L0 hint data MAY still be recorded in retrieval trace details

Requirement: Knowledge retrieval SHALL use L0 domain as optional L1 filter

The retrieval flow SHALL use L0 domain/category information as an optional metadata filter for L1 retrieval when the domain is unambiguous.

Scenario: Single domain filter

  • WHEN L0 hint data contains exactly one nonblank domain or category
  • THEN the L1 retrieval request SHALL include that category as a metadata filter

Scenario: Ambiguous domain fallback

  • WHEN L0 hint data contains zero domains or multiple domains
  • THEN the L1 retrieval request SHALL run without an L0-derived category filter

Requirement: Knowledge retrieval SHALL persist L0 hints

The system SHALL persist L0 hint details in tool_invocation.retrieval_details for lookup_knowledge calls.

Scenario: Retrieval details include L0 hints

  • WHEN a lookup_knowledge call records a tool invocation
  • THEN retrieval_details SHALL include L0 matched keywords, domains, entities, and titles when available

Scenario: Retrieval layer reflects cooperating retrieval

  • WHEN both L0 hint data and L1 candidates participate in a lookup
  • THEN the recorded retrieval layer SHALL be L0+L1

Requirement: Knowledge retrieval SHALL return structured evidence blocks

The lookup_knowledge retrieval flow SHALL expose retrieved evidence as structured evidence blocks.

Scenario: Evidence block contains source metadata

  • WHEN a lookup_knowledge call returns evidence
  • THEN each evidence block SHALL include source, title when available, breadcrumb when available, retrieval layer, content, and hit reasons

Scenario: Evidence blocks are the primary evidence contract

  • WHEN evidence blocks are returned
  • THEN Agent-facing knowledge content SHALL be derived from evidence blocks and context pack
  • AND the result SHALL NOT rely on legacy primary or supplement fields for L0/L1 meaning

Requirement: Knowledge retrieval SHALL deduplicate evidence blocks

The retrieval flow SHALL remove duplicate evidence blocks before returning them to the Agent. Duplicates are defined by chunk-level evidenceKey identity, not by document source alone.

Scenario: Chunk-level deduplication keeps distinct chunks

  • WHEN L1 produces multiple candidates with the same source but different chunk identities
  • THEN the retrieval flow SHALL keep separate evidence blocks for those chunk identities subject to per-document caps
  • AND SHALL NOT collapse them solely because source is equal

Scenario: Same evidenceKey collapses

  • WHEN two candidates share the same evidenceKey
  • THEN the retrieval flow SHALL keep a single evidence block for that identity
  • AND the evidence block SHALL preserve hit reasons from both paths when available

Scenario: Postprocess count tracking

  • WHEN evidence post-processing completes
  • THEN the tool invocation details SHALL record candidate count and final evidence block count

Requirement: Knowledge retrieval SHALL persist evidence block summaries

The system SHALL persist compact evidence block summaries in tool_invocation.retrieval_details.

Scenario: Evidence summaries are persisted

  • WHEN a lookup_knowledge call records a tool invocation
  • THEN retrieval_details SHALL include evidence block summaries containing source, title, retrieval layer, score when available, and hit reasons

Scenario: Full content is not duplicated into retrieval details

  • WHEN evidence block summaries are persisted
  • THEN full evidence content SHALL be omitted or truncated so the trace record remains compact

Requirement: Knowledge retrieval SHALL support a disabled-by-default Spring AI sidecar

The retrieval system SHALL allow a Spring AI VectorStore retrieval path to be wired as a sidecar without changing the default lookup_knowledge runtime path.

Scenario: Sidecar disabled by default

  • WHEN the application starts without explicit sidecar enablement
  • THEN lookup_knowledge SHALL continue using the existing retrieval path
  • AND Chat and AIOps runtime behavior SHALL not depend on the sidecar

Scenario: Sidecar failure does not break main retrieval

  • WHEN the Spring AI sidecar is enabled but cannot initialize or query successfully
  • THEN the existing retrieval path SHALL remain usable
  • AND the failure SHALL be reported as sidecar status rather than as a main retrieval failure

Requirement: Knowledge retrieval SHALL normalize sidecar results for comparison

The sidecar retrieval path SHALL expose results in a comparable structure aligned with the current retrieval result shape.

Scenario: Comparable result metadata

  • WHEN sidecar retrieval returns candidates
  • THEN each comparable result SHALL include source or doc id, title when available, breadcrumb when available, category when available, rank, content preview, and the sidecar score label/value

Scenario: Score semantics are explicit

  • WHEN current retrieval and sidecar retrieval scores are compared
  • THEN the report SHALL label score semantics by path instead of assuming direct numeric equivalence

Requirement: Knowledge retrieval SHALL prefer Spring AI VectorStore when configured

The retrieval service SHALL support Spring AI VectorStore as the preferred vector retrieval abstraction without changing the lookup_knowledge tool contract.

Scenario: VectorStore mode uses Spring AI

  • WHEN retrieval vector store mode is configured as spring-ai
  • THEN semantic retrieval SHALL query through Spring AI VectorStore
  • AND the returned candidates SHALL be normalized into the existing vector search result shape

Scenario: Auto mode prefers VectorStore

  • WHEN retrieval vector store mode is configured as auto
  • AND a Spring AI VectorStore bean is available
  • THEN semantic retrieval SHALL attempt Spring AI VectorStore before the SDK path

Requirement: Knowledge retrieval SHALL preserve SDK fallback

The retrieval service SHALL keep the existing Milvus SDK retrieval implementation available.

Scenario: SDK mode bypasses VectorStore

  • WHEN retrieval vector store mode is configured as sdk
  • THEN semantic retrieval SHALL use the existing Milvus SDK path

Scenario: Auto fallback uses SDK

  • WHEN retrieval vector store mode is auto
  • AND Spring AI VectorStore is unavailable or fails
  • THEN semantic retrieval SHALL fall back to the existing Milvus SDK path

Requirement: Knowledge retrieval SHALL keep score semantics explicit

The retrieval service SHALL preserve score semantics when results come from different retrieval implementations.

Scenario: SDK score remains L2 distance

  • WHEN a candidate is returned by the SDK path
  • THEN its score semantics SHALL remain compatible with existing L2 distance normalization

Scenario: VectorStore score is mapped without changing tool contract

  • WHEN a candidate is returned by Spring AI VectorStore
  • THEN it SHALL be mapped into the existing result shape
  • AND trace or comparison code SHALL be able to distinguish it as a VectorStore similarity score when needed

Requirement: Knowledge retrieval SHALL reuse the existing Milvus collection

Spring AI Milvus integration SHALL be configured to use the existing collection schema unless explicitly changed.

Scenario: Existing field mapping

  • WHEN Spring AI Milvus VectorStore is configured
  • THEN it SHALL use the existing id, content, vector, and metadata field names
  • AND it SHALL use the configured embedding dimension and metric type compatible with existing vectors

Requirement: Knowledge retrieval SHALL use a modular RAG pipeline

The lookup_knowledge tool SHALL route each request through explicit query transformation, vector retrieval, post-retrieval processing, context packing, result assembly, and trace recording components.

Scenario: Pipeline components execute in order

  • WHEN lookup_knowledge receives a query
  • THEN the system SHALL transform the query before retrieval
  • AND it SHALL retrieve vector candidates before post-processing
  • AND it SHALL build evidence blocks before context packing
  • AND it SHALL record trace details after result assembly

Scenario: Tool boundary remains explicit

  • WHEN the modular pipeline is used
  • THEN the Agent SHALL still call the explicit lookup_knowledge tool with the same query argument
  • AND the implementation SHALL NOT require an implicit Advisor to inject knowledge into every chat response

Requirement: Knowledge retrieval SHALL retry without L0 filter when filtered L1 is low quality

The retrieval flow SHALL treat L0-derived category filtering as an optimization, not as a hard dependency for final recall.

Scenario: Filtered retrieval succeeds

  • WHEN L0 provides an unambiguous category filter
  • AND filtered L1 retrieval returns usable evidence at or above the configured reference threshold
  • THEN the tool SHALL use the filtered L1 candidates without running an unfiltered retry

Scenario: Filtered retrieval returns no evidence

  • WHEN L0 provides a category filter
  • AND filtered L1 retrieval returns no candidates or no final evidence blocks
  • THEN the tool SHALL retry L1 retrieval with the raw query and no L0-derived category filter
  • AND the retrieval trace SHALL record fallback reason filtered_vector_no_evidence

Scenario: Filtered retrieval is below reference quality

  • WHEN L0 provides a category filter
  • AND filtered L1 retrieval returns candidates whose top normalized similarity is below the configured reference threshold
  • THEN the tool SHALL retry L1 retrieval with the raw query and no L0-derived category filter
  • AND the retrieval trace SHALL record fallback reason filtered_vector_low_quality

Scenario: Both retrieval attempts fail

  • WHEN filtered L1 retrieval and unfiltered L1 retry both produce no usable evidence
  • THEN the tool SHALL return found=false
  • AND the tool SHALL set evidence status to no_evidence
  • AND the tool SHALL NOT return L0 documents as fact evidence

Requirement: Knowledge retrieval SHALL return an evidence-first result contract

The lookup_knowledge result SHALL expose structured evidence and packed context as the preferred contract.

Scenario: Evidence result contains context and traces

  • WHEN lookup_knowledge returns usable evidence
  • THEN the result SHALL include evidenceBlocks
  • AND it SHALL include contextPack
  • AND it SHALL include retrievalTrace
  • AND it SHALL include rerankTrace
  • AND it SHALL include relevanceLevel and completenessHint

Scenario: No-evidence result keeps traceability

  • WHEN lookup_knowledge returns no usable evidence
  • THEN the result SHALL include found=false
  • AND it SHALL include a message explaining that no knowledge evidence was found
  • AND it SHALL include retrieval trace details for attempted retrieval paths

Requirement: Knowledge retrieval SHALL pack evidence context for Agent consumption

The post-retrieval flow SHALL convert final evidence blocks into a compact context package for the Agent.

Scenario: Context pack preserves source metadata

  • WHEN evidence blocks are packed
  • THEN the packed context SHALL preserve source, title when available, breadcrumb when available, and hit reasons for included evidence

Scenario: Context pack respects budget

  • WHEN final evidence content exceeds the configured context budget
  • THEN the packer SHALL truncate content rather than source metadata
  • AND it SHALL record included and omitted sources in the context pack summary

Requirement: Knowledge retrieval SHALL rerank evidence with traceable rule signals

The post-retrieval flow SHALL rerank vector candidates using deterministic rule-based signals and expose the explanation.

Scenario: Rerank trace records score contributions

  • WHEN candidates are reranked
  • THEN the rerank trace SHALL record final rank, source, base retrieval score when available, and major boost reasons for top evidence blocks

Scenario: Query hints influence rerank without becoming evidence

  • WHEN L0 query hints match candidate metadata or content
  • THEN the reranker MAY boost the candidate
  • AND the evidence block SHALL record the hint as a hit reason
  • AND the system SHALL NOT treat the L0 hint itself as fact evidence

Requirement: Lookup knowledge SHALL persist modular RAG trace details

The lookup_knowledge tool SHALL persist modular RAG pipeline details in tool_invocation.retrieval_details for every new lookup invocation.

Scenario: Evidence lookup persists modular detail keys

  • WHEN lookup_knowledge returns usable evidence
  • THEN retrieval_details SHALL include query_transform
  • AND it SHALL include retrieval_trace
  • AND it SHALL include context_pack_summary
  • AND it SHALL include rerank_trace
  • AND it SHALL include evidence_blocks

Scenario: Fallback lookup persists fallback reason

  • WHEN lookup_knowledge performs an unfiltered retry after filtered retrieval fails or is low quality
  • THEN retrieval_details.retrieval_trace SHALL include the selected attempt
  • AND retrieval_details.fallback_reason SHALL preserve the fallback reason

Scenario: No-evidence lookup still preserves trace

  • WHEN lookup_knowledge returns no usable evidence
  • THEN retrieval_details SHALL still include retrieval trace information for attempted retrieval paths
  • AND it SHALL not include full evidence content as duplicated trace data