Align prompts and strengthen validation context
This commit is contained in:
75
internal/framework/validators/llm_context_test.go
Normal file
75
internal/framework/validators/llm_context_test.go
Normal file
@@ -0,0 +1,75 @@
|
||||
package validators
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"gitea.maximumdirect.net/eric/audita/internal/core/chunking"
|
||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
||||
)
|
||||
|
||||
func TestValidationContextCarriesAdjacentEvidenceAndRelevantDefinitions(t *testing.T) {
|
||||
req := makeReq([]proposals.EnrichedCorrectionProposal{mk(7, "gestures", "Jesters")})
|
||||
req.WorkingTranscript = &schema.Transcript{Segments: []schema.Segment{
|
||||
{ID: 1, Text: "The performers arrived."},
|
||||
{ID: 2, Text: "Those gestures are back."},
|
||||
{ID: 3, Text: "Lyra recognized the troupe."},
|
||||
{ID: 4, Text: "Elsewhere."},
|
||||
}}
|
||||
req.CandidateProposal[0].TargetSegmentID = 2
|
||||
req.Glossary = &schema.Glossary{Entries: []schema.GlossaryEntry{
|
||||
{Name: "Jesters", Summary: "A traveling troupe"},
|
||||
{Name: "Lyra", Summary: "The host"},
|
||||
{Name: "Unrelated", Summary: "Not mentioned"},
|
||||
}}
|
||||
payload, immediate := BuildLLMValidationRequest("spoken_form_plausibility", LLMValidatorTypeSpokenFormPlausibility, req)
|
||||
if len(immediate) != 0 || len(payload.Items) != 1 {
|
||||
t.Fatalf("payload: %+v immediate: %+v", payload, immediate)
|
||||
}
|
||||
item := payload.Items[0]
|
||||
if len(item.NeighboringSegments) != 2 || item.NeighboringSegments[0].ID != 1 || item.NeighboringSegments[1].ID != 3 || len(item.GlossaryEntries) != 2 || item.GlossaryEntries[0].Name != "Jesters" || item.GlossaryEntries[1].Name != "Lyra" {
|
||||
t.Fatalf("context: %+v", item)
|
||||
}
|
||||
variables, err := BuildValidationVariables(payload.Items, "")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var rendered []LLMValidationItem
|
||||
if err := json.Unmarshal([]byte(variables["PayloadJSON"]), &rendered); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(rendered[0].NeighboringSegments) != 2 || rendered[0].GlossaryEntries[0].Summary != "A traveling troupe" {
|
||||
t.Fatalf("rendered context: %+v", rendered)
|
||||
}
|
||||
// The context-free endpoint must not reach beyond the current chunk.
|
||||
req.WorkingTranscript.Segments = req.WorkingTranscript.Segments[1:2]
|
||||
req.Glossary = nil
|
||||
isolated, _ := BuildLLMValidationRequest("editorial_review", LLMValidatorTypeEditorialReview, req)
|
||||
if len(isolated.Items[0].NeighboringSegments) != 0 || len(isolated.Items[0].GlossaryEntries) != 0 {
|
||||
t.Fatalf("unexpected external context: %+v", isolated)
|
||||
}
|
||||
}
|
||||
|
||||
func TestValidationContextFitsBudgetWithoutDiscardingCandidate(t *testing.T) {
|
||||
estimator := chunking.NewSimpleTokenEstimator()
|
||||
base := LLMValidationItem{CorrectionIndex: 7, SegmentID: 1, OriginalText: "teh", CorrectedText: "the", OriginalSegmentText: "teh cat", CorrectedSegmentText: "the cat"}
|
||||
required, err := estimateBatchTokens(estimator, []LLMValidationItem{base})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
enriched := base
|
||||
enriched.NeighboringSegments = []schema.Segment{{ID: 2, Text: strings.Repeat("long context ", 300)}}
|
||||
enriched.GlossaryEntries = []schema.GlossaryEntry{{Name: "cat", Summary: strings.Repeat("long definition ", 300)}}
|
||||
fitted := fitValidationContext(enriched, required, estimator)
|
||||
tokens, err := estimateBatchTokens(estimator, []LLMValidationItem{fitted})
|
||||
if err != nil || tokens > required || fitted.OriginalSegmentText != base.OriginalSegmentText || fitted.CorrectedSegmentText != base.CorrectedSegmentText {
|
||||
t.Fatalf("fitted: %+v tokens=%d err=%v", fitted, tokens, err)
|
||||
}
|
||||
full, _ := estimateBatchTokens(estimator, []LLMValidationItem{enriched})
|
||||
batches, err := ChunkLLMValidationItems([]LLMValidationItem{enriched, enriched}, full, estimator)
|
||||
if err != nil || len(batches) != 2 {
|
||||
t.Fatalf("context must count toward batch budget: %+v %v", batches, err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user