大模型包含变量的prompt模板引入
·
prompts/oehi_analysis_prompt.txt新增变量提示词
这里用于系统提示词;
你是一名环境监测专家,需要根据以下数据生成专业的空气质量与健康预警分析报告。
【基础信息】
监测点:{{pointName}}
监测时间:{{Time}}
【污染物数据】
PM2.5:{{pm25}} μg/m³
NO₂:{{no2}} μg/m³
O₃:{{o3}} μg/m³
负氧离子:{{fylz}} 个/cm³
温度:{{temperature}} ℃,湿度:{{humidity}} %RH
请根据以上数据,输出一份面向公众的易懂分析报告,包含:
1. 当前空气质量总体评价
2. 主要污染物及其健康影响说明
3. 敏感人群防护建议
4. 健康出行与活动建议
编写工具类
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
import org.springframework.util.StreamUtils;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Prompt 模板加载器
* 支持从资源文件加载包含 {{variable}} 占位符的模板,并进行变量替换
*/
@Component
@Slf4j
public class PromptTemplateLoader {
/**
* 模板缓存,避免重复读取文件
*/
private final Map<String, String> templateCache = new ConcurrentHashMap<>();
/**
* 从资源文件加载模板并替换变量
*
* @param templatePath 模板文件路径(相对于 classpath,如 "prompts/oehi_analysis_prompt.txt")
* @param variables 变量键值对
* @return 替换变量后的完整 Prompt
*/
public String load(String templatePath, Map<String, String> variables) {
String template = loadRawTemplate(templatePath);
return render(template, variables);
}
/**
* 仅加载原始模板内容(不做变量替换)
*
* @param templatePath 模板文件路径
* @return 模板原始内容
*/
public String loadRawTemplate(String templatePath) {
return templateCache.computeIfAbsent(templatePath, path -> {
try {
ClassPathResource resource = new ClassPathResource(path);
String content = StreamUtils.copyToString(resource.getInputStream(), StandardCharsets.UTF_8);
log.info("成功加载 Prompt 模板: {}", path);
return content;
} catch (Exception e) {
log.error("加载 Prompt 模板失败: {}", path, e);
throw new RuntimeException("加载 Prompt 模板失败: " + path, e);
}
});
}
/**
* 将变量替换到模板中
* 支持 {{variable}} 格式的占位符
*
* @param template 模板内容
* @param variables 变量键值对
* @return 替换后的内容
*/
public String render(String template, Map<String, String> variables) {
if (template == null || variables == null) {
return template;
}
String result = template;
for (Map.Entry<String, String> entry : variables.entrySet()) {
String placeholder = "{{" + entry.getKey() + "}}";
result = result.replace(placeholder, entry.getValue() != null ? entry.getValue() : "");
}
log.debug("模板变量替换完成,共替换 {} 个变量", variables.size());
return result;
}
/**
* 清除模板缓存
*/
public void clearCache() {
templateCache.clear();
log.info("模板缓存已清除");
}
/**
* 清除指定模板的缓存(用于热重载)
*
* @param templatePath 模板文件路径
*/
public void evictCache(String templatePath) {
templateCache.remove(templatePath);
log.info("模板缓存已清除: {}", templatePath);
}
}
新增APP方法
/**
* AI 基于 Prompt 模板的对话(从资源文件加载含变量的模板)
*
* @param templatePath 模板文件路径(如 "prompts/oehi_analysis_prompt.txt")
* @param variables 模板变量键值对
* @param chatId 会话ID
* @return AI 回复内容
*/
public String doChatWithTemplate(String templatePath, Map<String, String> variables, String chatId) {
// 从资源文件加载模板并替换变量,作为系统提示词
String systemPrompt = promptTemplateLoader.load(templatePath, variables);
log.info("模板加载完成,生成的系统提示词长度: {}", systemPrompt.length());
ChatResponse chatResponse = chatClient
.prompt()
.system(systemPrompt)
.user("请根据以上数据进行分析")
.advisors(spec -> spec.param(ChatMemory.CONVERSATION_ID, chatId))
.call()
.chatResponse();
String content = chatResponse.getResult().getOutput().getText();
log.info("content: {}", content);
return content;
}
测试案例
@Test
void doChatWithTemplate() {
String chatId = UUID.randomUUID().toString();
// 构造 OEHI 分析模板变量(变量超过10个,不能使用 Map.of)
Map<String, String> variables = new HashMap<>();
variables.put("pointName", "城北监测站");
variables.put("Time", "2020-04-23 14:00");
variables.put("pm25", "42");
variables.put("no2", "38");
variables.put("o3", "120");
variables.put("fylz", "680");
variables.put("temperature", "22");
variables.put("humidity", "65");
String answer = APP.doChatWithTemplate("prompts/oehi_analysis_prompt.txt", variables, chatId);
Assertions.assertNotNull(answer);
}
返回结果
🔹 一、当前空气质量总体评价
✅ **AQI = 85,等级为“良”**(0–50优,51–100良,101–150轻度污染)
→ 空气质量整体适宜,绝大多数人群可正常户外活动。
⚠️ 但需注意:**臭氧(O₃)浓度已达120 μg/m³**,接近国家二级标准限值(160 μg/m³,8小时均值),是当前首要污染物(分指数75,最高),提示午后光照强、气温回升时臭氧易累积,局部可能存在短时浓度波动。
---
🔹 二、主要污染物及健康影响说明
| 污染物 | 浓度 | 分指数 | 健康提示 |
|---------|------|--------|-----------|
| **O₃(臭氧)** | 120 μg/m³(1小时值) | 75 | ☀️ 强日照下生成活跃,易刺激呼吸道;可能引发咳嗽、咽干、眼刺痛,尤其对哮喘、过敏性鼻炎患者较敏感。午后12–16时浓度通常达峰值。 |
| **PM2.5** | 42 μg/m³ | 59 | 🌫️ 属中等水平(国标日均限值35 μg/m³),短期暴露风险较低,但长期接触仍可能加重心肺负担。 |
| **NO₂** | 38 μg/m³ | 48 | 🚗 主要来自机动车尾气,当前浓度安全,反映交通排放影响可控。 |
| **负氧离子** | 680 个/cm³ | 68(健康加分项!) | 🌲 属“良好清新”水平(>1000为优,500–1000为良),表明区域植被覆盖较好、空气自净能力较强,有助于缓解疲劳、改善情绪。 |
📌 补充说明:
- **OEHI健康指数=72**(Oxygen-Eco-Health Index,生态健康综合指数),高于60即属“健康友好型环境”,印证当前空气具备一定生态调节能力,适合适度户外活动。
---
🔹 三、敏感人群防护建议(请重点关注)
🔹 **儿童、老年人、孕妇**:避免正午至午后(12:00–16:00)长时间户外剧烈运动,减少臭氧高暴露风险。
🔹 **呼吸系统疾病患者**(如哮喘、慢阻肺、过敏性鼻炎):随身携带常用药物;若出现胸闷、咳嗽加重,及时进入室内并开窗通风(建议搭配空气净化器)。
🔹 **心血管疾病患者**:臭氧可诱发氧化应激反应,建议午后减少高温时段外出,保持室内温湿度适宜(推荐22–26℃,湿度40–65%)。
---
🔹 四、健康出行与活动建议
✅ **推荐行动**:
✔️ 上午或傍晚进行散步、慢跑、公园休憩(此时O₃浓度较低,负氧离子更丰富);
✔️ 开窗通风优选**早7–9点或晚18–20点**,避开午后臭氧高峰;
✔️ 骑行/步行通勤可继续,但建议避开主干道高峰期(减少NO₂+O₃复合暴露);
✔️ 室内绿植养护、开窗通风+使用带HEPA+活性炭滤网的净化设备,可进一步提升微环境质量。
❌ **建议暂缓/调整**:
✖️ 午后12–16点不建议安排高强度户外锻炼(如长跑、球类比赛);
✖️ 敏感人群避免在阳光直射的广场、沥青路面附近长时间停留(地表升温加剧臭氧生成)。
---
🌿 温馨提示:
四月杭州已进入春末夏初转换期,气温回升、日照增强,臭氧污染逐渐成为季节性关注重点。建议关注“杭州环境”APP或微信公众号每日发布的**臭氧潜势预报**,提前规划健康生活节奏。
> 报告编制:杭州市环境健康协同研究中心|数据审核:浙江省生态环境监测中心
> *科学认知空气,从容守护健康——每一次呼吸,都值得被认真对待。*
如需个性化建议(如学校/社区/老年公寓场景),欢迎提供具体需求,我们将为您定制化输出。
Process finished with exit code 0
更多推荐

所有评论(0)