LangChain4j中如何在@UserMessage注解的提示词中条件性包含变量(空值时跳过对应段落)
LangChain4j中如何在@UserMessage注解的提示词中条件性包含变量(空值时跳过对应段落)
我刚好之前也遇到过类似的问题,LangChain4j其实内置了支持这种条件渲染的能力,不用完全放弃@UserMessage注解手动拼提示词——它支持在注解里使用**Spring Expression Language (SpEL)**来实现条件逻辑。
你可以直接在@UserMessage的字符串里嵌入SpEL表达式,通过判断变量是否为null或空字符串,来决定是否渲染对应的段落。针对你的场景,修改后的注解应该是这样的:
@UserMessage("The alert is described as follows: {{description}}\n\n" + "HTTP response evidence:\n---\n{{evidence}}\n---\n" + "#if(!#strings.isEmpty(otherinfo))\n" + "Additional context:\n---\n{{otherinfo}}\n" + "#end") Confidence review(@V("description") String description, @V("evidence") String evidence, @V("otherinfo") String otherinfo);
这里的#if(!#strings.isEmpty(otherinfo))就是核心的条件判断——#strings是LangChain4j提供的SpEL内置工具类,专门用来处理字符串的空值检查。当otherinfo为null或者空字符串时,#if块里的内容会被完全跳过,不会出现在最终的提示词里;只有当它有实际内容时,才会渲染"Additional context"这段。
如果你的变量可能出现只有空白字符(比如全是空格)的情况,可以把判断条件换成#if(!#strings.isBlank(otherinfo)),它会把全空白的情况也当成空值处理,逻辑更严谨。
当然,如果你的条件逻辑特别复杂(比如需要多个变量的组合判断、多分支逻辑),那可能需要手动构建PromptTemplate或者用PromptTemplateBuilder来拼接提示词,但对于大部分简单的空值判断场景,SpEL完全够用,而且能保留@UserMessage注解带来的简洁性,这也是LangChain4j官方推荐的最佳实践之一。
内容来源于stack exchange
相关产品推荐
相关产品推荐

