feat: add rag evidence postprocess blocks

This commit is contained in:
aruo
2026-07-05 03:03:18 +08:00
parent 4a94c14feb
commit 5197712719
12 changed files with 497 additions and 1 deletions
@@ -14,6 +14,7 @@ import org.mockito.MockitoAnnotations;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
@@ -83,6 +84,12 @@ class LookupKnowledgeToolTest {
assertTrue(content.contains("Test content"));
assertNotNull(result.getSupplement()); // L0 唯一命中仍调用 L1
assertEquals("PRECISE", result.getRelevanceLevel());
assertNotNull(result.getEvidenceBlocks());
assertEquals(2, result.getEvidenceCandidateCount());
assertEquals(2, result.getEvidenceBlockCount());
assertEquals("L0", result.getEvidenceBlocks().get(0).getRetrievalLayer());
assertTrue(result.getEvidenceBlocks().get(0).getHitReasons().stream()
.anyMatch(reason -> reason.contains("ERR_TIMEOUT")));
verify(vectorSearchService).searchSimilarDocuments("ERR_TIMEOUT", 3, null);
}
@@ -290,6 +297,41 @@ class LookupKnowledgeToolTest {
verify(vectorSearchService).searchSimilarDocuments("fallback", 3, null);
}
@Test
void testLookup_deduplicatesEvidenceBlocksBySource() throws Exception {
KnowledgeEntry entry = KnowledgeEntry.builder()
.filePath("shared.md")
.title("Shared Doc")
.keywords(List.of("shared"))
.summary("Shared summary")
.build();
VectorSearchService.SearchResult l1Result = new VectorSearchService.SearchResult();
l1Result.setContent("Shared semantic content");
String metadata = "{\"docId\":\"doc-1\",\"_source\":\"shared.md\",\"title\":\"Shared Doc\"}";
l1Result.setMetadata(metadata);
l1Result.setScore(0.2f);
when(knowledgeIndexService.analyzeQuery("shared"))
.thenReturn(hint(entry));
when(knowledgeIndexService.readDocument("shared.md", 2000))
.thenReturn("Shared content");
when(vectorSearchService.searchSimilarDocuments("shared", 3, null))
.thenReturn(List.of(l1Result));
when(objectMapper.readValue(metadata, Map.class))
.thenReturn(Map.of("docId", "doc-1", "_source", "shared.md", "title", "Shared Doc"));
LookupResult result = tool.lookupKnowledge("shared");
assertTrue(result.isFound());
assertEquals(2, result.getEvidenceCandidateCount());
assertEquals(1, result.getEvidenceBlockCount());
assertEquals("shared.md", result.getEvidenceBlocks().get(0).getSource());
assertEquals("L0+L1", result.getEvidenceBlocks().get(0).getRetrievalLayer());
assertTrue(result.getEvidenceBlocks().get(0).getHitReasons().contains("semantic_rank:1"));
assertTrue(result.getEvidenceBlocks().get(0).getHitReasons().stream()
.anyMatch(reason -> reason.startsWith("l0_keywords:")));
}
private KnowledgeIndexService.L0Hint hint(KnowledgeEntry... entries) {
List<KnowledgeEntry> matches = List.of(entries);
List<String> keywords = matches.stream()