106 lines
3.3 KiB
Go
106 lines
3.3 KiB
Go
package coverage
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"gitea.zheromiku.top/Weknora/dobotai-platform/internal/core"
|
|
)
|
|
|
|
func imageTurn(answer string, refs []core.Reference, searched bool) core.Turn {
|
|
return core.Turn{
|
|
ID: "img-turn",
|
|
Status: "succeeded",
|
|
MessageType: "image",
|
|
Answer: answer,
|
|
References: refs,
|
|
Media: []core.MediaAudit{{Type: "image", MIMEType: "image/jpeg"}},
|
|
KnowledgeSearched: searched,
|
|
}
|
|
}
|
|
|
|
func TestEvaluator_ImageVisualRecognitionNoSearch(t *testing.T) {
|
|
e := NewEvaluator()
|
|
turn := imageTurn("这张图片展示了一个手写的知识库数据处理与发布流程图。", nil, false)
|
|
|
|
d, err := e.Evaluate(turn)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
if d.Verdict != VerdictCovered {
|
|
t.Fatalf("verdict=%s, want covered (visual recognition is not a coverage miss)", d.Verdict)
|
|
}
|
|
if d.ReasonCode != ReasonCoveredVisualRecognition {
|
|
t.Fatalf("reason_code=%s, want %s", d.ReasonCode, ReasonCoveredVisualRecognition)
|
|
}
|
|
}
|
|
|
|
func TestEvaluator_ImageSearchButNoReferencesIsUncovered(t *testing.T) {
|
|
e := NewEvaluator()
|
|
turn := imageTurn("根据图片中的错误信息,未能在知识库中找到对应的解决方案。", nil, true)
|
|
|
|
d, err := e.Evaluate(turn)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
if d.Verdict != VerdictUncovered {
|
|
t.Fatalf("verdict=%s, want uncovered (image turn searched KB but got no refs)", d.Verdict)
|
|
}
|
|
if d.ReasonCode != ReasonUncoveredNoReferences {
|
|
t.Fatalf("reason_code=%s, want %s", d.ReasonCode, ReasonUncoveredNoReferences)
|
|
}
|
|
}
|
|
|
|
func TestEvaluator_ImageWithReferencesIsCovered(t *testing.T) {
|
|
e := NewEvaluator()
|
|
turn := imageTurn("根据知识库资料,这个是故障代码E5,请检查...", []core.Reference{{ID: "r1", Score: 0.9}}, true)
|
|
|
|
d, err := e.Evaluate(turn)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
if d.Verdict != VerdictCovered {
|
|
t.Fatalf("verdict=%s, want covered", d.Verdict)
|
|
}
|
|
if d.ReasonCode != ReasonCoveredHasReferences {
|
|
t.Fatalf("reason_code=%s, want %s", d.ReasonCode, ReasonCoveredHasReferences)
|
|
}
|
|
}
|
|
|
|
func TestEvaluator_TextTurnSearchedButNoReferencesIsUncovered(t *testing.T) {
|
|
e := NewEvaluator()
|
|
turn := core.Turn{
|
|
ID: "text-turn",
|
|
Status: "succeeded",
|
|
Answer: "这是一个正常的回答,但没有任何引用",
|
|
MessageType: "text",
|
|
References: []core.Reference{},
|
|
KnowledgeSearched: true,
|
|
}
|
|
d, err := e.Evaluate(turn)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
if d.Verdict != VerdictUncovered || d.ReasonCode != ReasonUncoveredNoReferences {
|
|
t.Fatalf("verdict=%s reason=%s, want uncovered_no_references after knowledge search", d.Verdict, d.ReasonCode)
|
|
}
|
|
}
|
|
|
|
func TestEvaluator_TextTurnWithoutKnowledgeSearchIsCovered(t *testing.T) {
|
|
e := NewEvaluator()
|
|
turn := core.Turn{
|
|
ID: "smalltalk-turn",
|
|
Status: "succeeded",
|
|
Answer: "你好,我在。",
|
|
MessageType: "text",
|
|
KnowledgeSearched: false,
|
|
}
|
|
|
|
d, err := e.Evaluate(turn)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
if d.Verdict != VerdictCovered || d.ReasonCode != ReasonCoveredNonKnowledgeResponse {
|
|
t.Fatalf("verdict=%s reason=%s, want covered_non_knowledge_response", d.Verdict, d.ReasonCode)
|
|
}
|
|
}
|