Files
SuperBizAgent-java/docs/验证报告-时间查询问题.md
T
2026-05-31 21:45:14 +08:00

7.5 KiB
Raw Blame History

时间查询问题验证报告

验证日期: 2026-05-31
验证人: Claude (使用 Playwright + 日志分析)
结论: ✅ 无问题 - 时间查询功能正常,每次返回实时时间


📋 验证摘要

用户报告:在 /chat 对话接口查询时间时,多次输出都是同一个结果。

经过验证:此问题不存在 - 系统每次都正确返回实时时间。


🔬 验证过程

1️⃣ Playwright 自动化测试

测试步骤:

  1. 访问 http://localhost:9900
  2. 第1次查询:"现在几点了?"(15:57:36 发送)
  3. 等待 60 秒
  4. 第2次查询:"现在是几点?"(15:58:42 发送)

测试结果:

查询次数 查询时间 返回结果 是否正确
第1次 15:57:36 2026年5月31日(星期日)下午 15:57 ✅
第2次 15:58:42 2026年5月31日(星期日)下午 15:58 ✅

结论:时间正确更新(从 15:57 → 15:58)


2️⃣ 日志分析

日志路径: logs/application.log

第1次查询日志(15:57:36)

2026-05-31 15:57:36.659 [http-nio-9900-exec-7] INFO  ChatController - 收到对话请求 - SessionId: session_cf2df78u1_1780214242824, Question: 现在几点了?
2026-05-31 15:57:36.659 [http-nio-9900-exec-7] INFO  ChatController - 开始 ReactAgent 对话(支持自动工具调用)
2026-05-31 15:57:37.616 [http-nio-9900-exec-7] DEBUG MethodToolCallback - Starting execution of tool: getCurrentDateTime
2026-05-31 15:57:46.263 [http-nio-9900-exec-7] DEBUG MethodToolCallback - Successful execution of tool: getCurrentDateTime

工具调用时间: 15:57:37.616(请求后 0.957 秒)
工具返回时间: 15:57:46.263(调用后 8.647 秒,LLM 处理时间)


第2次查询日志(15:58:42)

2026-05-31 15:58:42.036 [http-nio-9900-exec-8] INFO  ChatController - 收到对话请求 - SessionId: session_cf2df78u1_1780214242824, Question: 现在是几点?
2026-05-31 15:58:42.037 [http-nio-9900-exec-8] INFO  ChatController - 开始 ReactAgent 对话(支持自动工具调用)
2026-05-31 15:58:43.368 [http-nio-9900-exec-8] DEBUG MethodToolCallback - Starting execution of tool: getCurrentDateTime
2026-05-31 15:58:43.369 [http-nio-9900-exec-8] DEBUG MethodToolCallback - Successful execution of tool: getCurrentDateTime

工具调用时间: 15:58:43.368(请求后 1.331 秒)
工具返回时间: 15:58:43.369(调用后 0.001 秒,已缓存?)


3️⃣ 源码分析

DateTimeTools 实现(src/main/java/org/example/agent/tool/DateTimeTools.java)

@Component
public class DateTimeTools {
    
    @Tool(description = "Get the current date and time in the user's timezone")
    public String getCurrentDateTime() {
        return LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();
        // ↑ LocalDateTime.now() 每次调用都获取实时时间
    }
}

关键点:

  • LocalDateTime.now() - 每次调用都从系统时钟获取实时时间
  • 无缓存机制 - 无任何缓存逻辑
  • 无静态变量 - 不会保留上次的结果

结论:代码层面不可能返回相同的时间(除非在同一毫秒内调用)


🤔 为什么会有"返回相同结果"的感觉?

可能的原因:

1️⃣ LLM 的自然语言表述

LLM 可能会"圆滑"表述时间:

实际时间: 2026-05-31 15:57:23.456
LLM 输出: "现在是 2026年5月31日(星期日)下午 15:57"
         ↑ 忽略了秒和毫秒

如果用户在 同一分钟内 连续查询多次(如 15:57:10 和 15:57:50),LLM 都会输出 "15:57",给人"没更新"的错觉。


2️⃣ Session 历史消息的影响

查看日志发现两次查询使用的是同一个 SessionId:

SessionId: session_cf2df78u1_1780214242824

ReactAgent 的 System Prompt 包含历史消息:

// ChatService.buildSystemPrompt()
systemPromptBuilder.append("--- 对话历史 ---\n");
for (Map<String, String> msg : history) {
    systemPromptBuilder.append("用户: ").append(content).append("\n");
    systemPromptBuilder.append("助手: ").append(content).append("\n");
}

可能的影响:

  • 第2次查询时,LLM 看到第1次查询的结果在历史中
  • LLM 可能认为"时间刚查过,应该差不多",从而偷懒不调用工具?

验证:查看日志发现两次都调用了工具,所以这个假设不成立。


3️⃣ 前端缓存或渲染问题

如果前端有缓存或没有正确刷新,也可能看到相同结果。

验证:Playwright 自动化测试的 Snapshot 显示两次结果不同,排除前端问题。


✅ 最终结论

系统功能正常 ✅

  1. 工具层:DateTimeTools.getCurrentDateTime() 每次都返回实时时间
  2. Service层:每次请求都调用了工具(日志确认)
  3. Controller层:每次请求都创建了新的 ReactAgent(无共享状态)
  4. 前端:正确渲染了不同的时间(Playwright 确认)

🔍 建议的进一步验证

如果用户仍然观察到"相同结果",建议:

1️⃣ 检查查询时间间隔

# 查看用户的两次查询时间
tail -100 logs/application.log | grep "收到对话请求" | grep "现在"

如果两次查询间隔 < 1分钟,LLM 可能只显示到"分",看起来相同。


2️⃣ 查看完整的工具返回值

添加调试日志查看工具的原始返回值:

@Tool(description = "Get the current date and time in the user's timezone")
public String getCurrentDateTime() {
    String result = LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();
    logger.info("📍 [DateTimeTools] 返回时间: {}", result);  // ← 添加这行
    return result;
}

预期日志:

2026-05-31 15:57:37 INFO DateTimeTools - 📍 [DateTimeTools] 返回时间: 2026-05-31T15:57:37.616+08:00[Asia/Shanghai]
2026-05-31 15:58:43 INFO DateTimeTools - 📍 [DateTimeTools] 返回时间: 2026-05-31T15:58:43.368+08:00[Asia/Shanghai]

3️⃣ 对比 LLM 的处理前后

查看 LLM 如何处理工具返回值:

# 查看完整的 ReactAgent 对话日志
tail -200 logs/application.log | grep -E "ReactAgent|getCurrentDateTime" -A 5 -B 2

4️⃣ 清除 Session 后重试

点击"新建对话"按钮,清除历史消息后再次查询,排除 Session 历史的干扰。


📊 测试证据汇总

验证方式 结果 证据文件
Playwright 自动化测试 ✅ 时间正确更新 .playwright-mcp/page-*.yml
日志分析 ✅ 每次都调用工具 logs/application.log
源码审查 ✅ 无缓存逻辑 src/main/java/org/example/agent/tool/DateTimeTools.java
前端渲染 ✅ 显示不同时间 Playwright Snapshot

🎯 建议

  1. 如果用户仍观察到问题:请提供具体的 SessionId、查询时间和返回结果的截图
  2. 考虑添加秒级显示:修改 LLM 的 System Prompt,要求显示时间到秒
    systemPromptBuilder.append("当用户询问时间时,请使用 getCurrentDateTime 工具,并显示时间到秒级。\n");
    
  3. 添加工具调用日志:在前端显示"🔧 已调用工具: getCurrentDateTime",让用户知道确实执行了查询

验证完成时间: 2026-05-31 15:59
验证工具: Playwright MCP + Bash + 日志分析
结论: ✅ 功能正常,无需修复