报错是这么冒出来的。LangChain 0.3 的 ChatPromptTemplate 用 partial_variables 绑定一个查数据库的函数,本意是每次调用取最新时间,结果服务启动时算了一次就固定了,第二天 prompt 里的日期还是昨天,缓存相关的指标也对不上。
中间走过弯路,把「取时间的函数被 lru_cache 包住,返回值一直不变」当成主因,改完现象没变。
排查方向其实有限,先把可能性排一排。partial_variables 传的是函数返回值而不是函数本身。还有一种是模板在模块顶层构造,导入时只执行一次。
另外,变量被写进了 messages 的默认值,后续 partial 不覆盖。
动手时先看模板里变量的实际绑定值
python -c "from langchain_core.prompts import ChatPromptTemplate;p=ChatPromptTemplate.from_template('{today} {q}');print(p.partial_variables)"
随后改成传可调用对象而不是字符串
python -c "from datetime import date;f=lambda:str(date.today());print(f())"
然后把模板构造挪到请求处理函数内部
python -c "from langchain_core.prompts import ChatPromptTemplate;print(ChatPromptTemplate.from_template('{today} {q}'))"
连续两天各打一条日志验证日期变化
grep -h today app.log | tail -2
恢复的判定其实很直接。两次请求的 prompt 里日期分别是当天日期,partial_variables 打印出来是可调用对象,回答里提到的时间与系统时间一致。
容易忽略的是,partial 的语义是预先填值,填进去就不再变;需要动态内容时应该传函数或在每次请求时重新构造模板,把它当成常量缓存是这类问题的根源。这类问题最好一次改到位,反复小改反而容易把原因搅混。
