Files
AI-Health/backend/tests/Health.Tests/prompt_manager_tests.cs
MingNian b4bc15b9b9 feat: AI 意图路由/草稿存储 + Prompts 模块化 + UI 视觉统一 + AI 同意门 + 资源更新
后端:
- 新增 ai_intent_router 意图路由
- 新增 AiEntryDraft 草稿存储 + EF 迁移
- 新增 Prompts 模块化(global/modules/rag/router)
- AI Agent handlers 扩展

前端:
- 新增 AI 同意门 (ai_consent_gate/provider/details_page)
- HealthMetricVisuals 视觉统一
- 设备扫描/管理页面优化
- agent 插图替换 + 趋势指标图标

配置:
- DeepSeek 模型改 deepseek-v4-flash
- .gitignore 加 artifacts/audit
- build.gradle.kts 签名配置调整
2026-07-28 15:03:38 +08:00

70 lines
2.9 KiB
C#

using Health.Infrastructure.AI;
namespace Health.Tests;
public sealed class PromptManagerTests
{
private readonly PromptManager _prompts = new();
[Fact]
public void RouterPrompt_DistinguishesEntryConsultationAndDraftContinuation()
{
var prompt = _prompts.GetIntentRouterPrompt();
Assert.Contains("只负责识别意图,不回答用户问题", prompt);
Assert.Contains("帮我记录血压 116/89", prompt);
Assert.Contains("血压 116/89 正常吗", prompt);
Assert.Contains("同时包含 health_entry 和 medical_consultation", prompt);
Assert.Contains("存在草稿不代表所有后续消息都必须继续草稿", prompt);
}
[Fact]
public void HealthEntryPrompt_RequiresWholeBatchDraftAndOneConfirmationCard()
{
var prompt = _prompts.ComposeForIntents(["health_entry"]);
Assert.Contains("113/86、113-86、113—86", prompt);
Assert.Contains("多指标属于同一录入批次", prompt);
Assert.Contains("record_health_data_batch", prompt);
Assert.Contains("每个录入批次只调用一次", prompt);
Assert.Contains("先根据后端结果追问缺失或错误部分", prompt);
Assert.Contains("全部补齐后再生成整批确认卡", prompt);
Assert.Contains("只有后端明确提供的待补充草稿", prompt);
Assert.DoesNotContain("医学知识库使用规则", prompt);
}
[Fact]
public void EntryPrompts_DoNotInventRequiredPlanFields()
{
var medication = _prompts.ComposeForIntents(["medication_entry"]);
var exercise = _prompts.ComposeForIntents(["exercise_entry"]);
Assert.Contains("药品名称、每次剂量、频率、具体服药时间、开始日期", medication);
Assert.Contains("不自行新增药品、猜测剂量", medication);
Assert.Contains("运动项目、每天运动时长、持续天数、开始日期和具体提醒时间", exercise);
Assert.Contains("当前产品不自动补默认", exercise);
}
[Fact]
public void RagRules_AreOnlyComposedForMedicalKnowledgeModules()
{
var consultation = _prompts.ComposeForIntents(["medical_consultation"]);
var query = _prompts.ComposeForIntents(["personal_query"]);
var chat = _prompts.ComposeForIntents(["general_chat"]);
Assert.Contains("医学知识库使用规则", consultation);
Assert.DoesNotContain("医学知识库使用规则", query);
Assert.DoesNotContain("医学知识库使用规则", chat);
}
[Fact]
public void MixedIntentPrompt_ComposesBothEntryAndConsultationRules()
{
var prompt = _prompts.ComposeForIntents(["health_entry", "medical_consultation"]);
Assert.Contains("健康指标录入模块", prompt);
Assert.Contains("医疗咨询与健康建议模块", prompt);
Assert.Contains("医学知识库使用规则", prompt);
}
}