Skip to content

AI 对话缺少当前时间上下文,导致时间相关意图理解不准确 #259

Description

@xuyiwenak

问题描述

在 internal/ai/chat.go 的 BuildMessages 函数里,组装发给 AI 模型的消息列表时,system_prompt 是原样插入的静态文本,整个函数里没有任何地方往对话里注入"当前时间":

var messages []Message
if cfg.SystemPrompt != "" {
    messages = append(messages, Message{Role: "system", Content: cfg.SystemPrompt})
}

也就是说,DeepSeek(或其他接入的模型)在每一轮对话里,除了固定的系统提示词文字和历史消息,完全不知道现在是几点、今天是哪天。

影响

实际使用中遇到的具体问题:

  1. 用户说"5分钟后提醒我",模型必须自己反问用户现在几点,无法自主换算出目标时间
  2. 用户说一个未来时间点(比如"19:41 提醒我"),模型对"这是相对当前时刻多久之后"没有概念,容易误判成别的意图
  3. 涉及 create_push_job 这类需要计算 cron 表达式初始 next_run 的场景,模型给用户展示的"下次触发时间"文案,跟它自己实际生成的 cron 表达式经常对不上,因为它不知道当前是几点,只能凭对话里用户报的时间"猜"

建议的解决方向

在 BuildMessages 组装消息时,往 system 消息(或者单独一条 system 消息)里注入当前时间,例如:

now := time.Now() // 或者按 bot 所在时区
messages = append(messages, Message{
    Role:    "system",
    Content: fmt.Sprintf("当前时间:%s", now.Format("2006-01-02 15:04:05 周一")),
})

或者支持在 system_prompt 里写一个 {{now}} 占位符,请求组装时做字符串替换,这样管理员可以自己决定要不要用、放在提示词的哪个位置。

时区建议按 bot 所属账号配置的时区来(如果目前没有这个概念,退而求其次用服务器本地时区/UTC+8 也可以,但最好可配置)。

环境

  • Hub 版本:0.1.36(构建于 2026-06-18)
  • 通过阅读源码定位(internal/ai/chat.go 的 BuildMessages),未在现有 issue/PR 中找到相关讨论;PR feat: 自动续期 clock 注入 + 提醒时间展示 #109「clock 注入」是 Go 层面测试用的 store.Clock 接口,跟这个问题无关,特此说明避免混淆。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions