feat(ai-ops): Prompt 配置化 & 集成 LookupKnowledgeTool

## 主要改动

1. Prompt 配置化
   - 从硬编码改为独立 Markdown 文件管理
   - 新增 AiOpsPromptProperties 配置类,使用 @PostConstruct 加载
   - 创建 prompts/{planner,executor,supervisor}-prompt.md

2. 集成 LookupKnowledgeTool
   - 在 AiOpsService 中注入 LookupKnowledgeTool
   - 添加到工具数组,只给 Executor Agent 使用
   - 符合 3-Agent 协同分析模式

3. Executor Prompt 增强
   - 添加工具选择指南(精确关键词 vs 模糊概念)
   - 明确降级策略(lookup_knowledge 未找到时降级到 queryInternalDocs)

## 优势

- 易于维护:Prompt 修改不需重新编译
- 格式友好:Markdown 原生支持代码块和表格
- 性能优化:精确关键词查询 < 10ms(L0 匹配)

## 文件变更

- 新增:AiOpsPromptProperties.java
- 新增:prompts/planner-prompt.md
- 新增:prompts/executor-prompt.md
- 新增:prompts/supervisor-prompt.md
- 修改:AiOpsService.java(-136 行硬编码,+5 行配置引用)
This commit is contained in:
zhuyongxin
2026-06-24 18:29:24 +08:00
parent 125e8281e7
commit c4d23c3bd8
7 changed files with 518 additions and 143 deletions
@@ -0,0 +1,233 @@
# AI Ops Prompt 配置化 & LookupKnowledgeTool 集成
**日期**: 2026-06-24
**类型**: 功能增强 + 架构优化
**影响范围**: AI Ops 服务
---
## 一、变更背景
### 1.1 问题
- **硬编码 Prompt**:Planner、Executor、Supervisor 的系统提示词硬编码在 `AiOpsService.java` 中,难以维护和版本控制
- **缺少知识库精确检索**:现有 `InternalDocsTools` 只支持 L1 语义检索(200-500ms),对于错误码、配置项等精确关键词查询效率较低
### 1.2 解决方案
1. **Prompt 配置化**:将所有 Agent 的 Prompt 抽取到 `prompts/ai-ops-prompts.yml` 配置文件
2. **集成 L0+L1 混合检索**:引入 `LookupKnowledgeTool`,支持精确关键词匹配(< 10ms)+ 语义检索补充
---
## 二、架构变更
### 2.1 Prompt 配置化架构
```
AiOpsService
↓ 注入
AiOpsPromptProperties (配置类)
↓ @PostConstruct 加载
ClassPathResource 读取 Markdown 文件
↓ 读取
prompts/
├── planner-prompt.md
├── executor-prompt.md
└── supervisor-prompt.md
```
**优点**:
- 易于维护:Prompt 修改不需要重新编译
- 格式友好:Markdown 格式支持代码块、表格,无 YAML 转义问题
- 版本控制:配置文件独立管理
- 易于扩展:后续可按环境区分(dev/prod)
### 2.2 工具层增强
```
原有工具:
- queryInternalDocs (纯 L1 语义检索,200-500ms)
新增工具:
- lookup_knowledge (L0 精确匹配 + L1 补充,< 10ms 高置信度)
```
**使用策略**:
- 精确关键词(错误码、配置项)→ `lookup_knowledge`,未找到时降级到 `queryInternalDocs`
- 模糊概念、故障流程 → 直接使用 `queryInternalDocs`
---
## 三、核心改动
### 3.1 新增文件
#### `AiOpsPromptProperties.java`
```java
@Configuration
public class AiOpsPromptProperties {
private String planner;
private String executor;
private String supervisor;
@PostConstruct
public void loadPrompts() {
planner = loadPromptFromFile("prompts/planner-prompt.md");
executor = loadPromptFromFile("prompts/executor-prompt.md");
supervisor = loadPromptFromFile("prompts/supervisor-prompt.md");
}
private String loadPromptFromFile(String path) throws IOException {
ClassPathResource resource = new ClassPathResource(path);
return new String(resource.getInputStream().readAllBytes(), StandardCharsets.UTF_8);
}
}
```
#### `prompts/*.md`
三个独立的 Markdown 文件,包含 Agent 的完整系统提示词:
- `planner-prompt.md` - Planner Agent 系统提示词
- `executor-prompt.md` - Executor Agent 系统提示词(含工具选择指南)
- `supervisor-prompt.md` - Supervisor Agent 系统提示词
### 3.2 修改文件
#### `AiOpsService.java`
**注入新组件**:
```java
@Autowired
private LookupKnowledgeTool lookupKnowledgeTool;
@Autowired
private AiOpsPromptProperties promptProperties;
```
**使用配置化 Prompt**:
```java
// 原来
.systemPrompt(buildPlannerPrompt())
// 改为
.systemPrompt(promptProperties.getPlanner())
```
**添加工具到工具数组**:
```java
return new Object[]{
dateTimeTools,
internalDocsTools,
queryMetricsTools,
lookupKnowledgeTool // 新增
};
```
**删除方法**:
- `buildPlannerPrompt()`
- `buildExecutorPrompt()`
- `buildSupervisorSystemPrompt()`
---
## 四、Executor Prompt 变更详情
### 4.1 新增工具选择指南
```yaml
- 根据查询内容选择合适的工具:
* 精确关键词(错误码、配置项名称)→ 优先使用 lookup_knowledge,未找到时降级到 queryInternalDocs
* 模糊概念、故障流程 → 直接使用 queryInternalDocs
* 告警数据 → queryPrometheusAlerts
* 日志数据 → queryLogs
```
### 4.2 降级策略
关键改进:明确了 `lookup_knowledge` 未找到时的降级策略。
**流程**:
```
1. Planner: "查询 ERR_TIMEOUT 定义"
2. Executor: 调用 lookup_knowledge("ERR_TIMEOUT")
3a. 如果 found=true, confidence=high → 使用 primary.content
3b. 如果 found=false → 自动降级到 queryInternalDocs("ERR_TIMEOUT 超时错误")
4. 返回 feedback 给 Planner
```
---
## 五、兼容性说明
### 5.1 向后兼容
✅ **完全兼容**:
- 现有工具调用逻辑不变
- 3-Agent 协同模式不变
- Planner/Executor/Supervisor 的职责边界不变
### 5.2 新增依赖
- `LookupKnowledgeTool` 依赖 `KnowledgeIndexService` 和 `VectorSearchService`
- 需要 `knowledge_base/` 目录存在(已在 `application.yml` 中配置)
---
## 六、验证清单
### 6.1 编译验证
```bash
mvn clean compile -DskipTests
```
✅ **结果**: BUILD SUCCESS
### 6.2 运行时验证(待完成)
- [ ] 启动应用,验证 Prompt 配置加载成功
- [ ] 触发 AI Ops 流程,验证 `lookup_knowledge` 工具可调用
- [ ] 测试精确关键词查询(如 "ERR_TIMEOUT")
- [ ] 测试降级策略(查询不存在的关键词)
---
## 七、后续工作
### 7.1 知识库内容准备
当前 `knowledge_base/` 目录需要补充文档:
- 错误码定义(支付网关、订单系统等)
- 配置最佳实践(Redis、HikariCP、Flyway 等)
- 故障排查流程
**文档格式示例**:
```markdown
---
title: 支付网关错误码定义
keywords: [ERR_TIMEOUT, 超时, 支付网关]
summary: 记录了支付网关所有核心错误码的含义及排查方向
category: api
---
# 支付网关错误码定义
## ERR_TIMEOUT
...
```
### 7.2 Prompt 优化
基于实际运行反馈,持续优化 `prompts/ai-ops-prompts.yml` 中的提示词。
### 7.3 可观测性增强
- 监控 `lookup_knowledge` 的调用频率和命中率
- 记录降级场景(L0 未找到 → L1 补充)
---
## 八、参考文档
- [知识库检索架构说明](../mvp/architecture/knowledge-retrieval-architecture.md)
- [AI Ops 核心设计 Essence 报告](../docs/learning/01-AI-Ops-核心设计-Essence报告.md)
+100
View File
@@ -0,0 +1,100 @@
# Prompt 配置化改进总结
**日期**: 2026-06-24
**改进**: 从 YAML 配置改为 Markdown 文件
---
## 改进原因
YAML 格式存在以下问题:
1. **多行字符串缩进敏感**:容易出现格式错误
2. **转义字符复杂**:代码块、表格需要转义处理
3. **可读性差**:长文本在 YAML 中难以阅读和维护
Markdown 格式优势:
- ✅ 原生支持代码块、表格、列表
- ✅ 无需转义,所见即所得
- ✅ 版本控制 diff 更清晰
- ✅ 编辑器语法高亮支持好
---
## 最终方案
### 文件结构
```
src/main/resources/prompts/
├── planner-prompt.md # Planner Agent 系统提示词
├── executor-prompt.md # Executor Agent 系统提示词
└── supervisor-prompt.md # Supervisor Agent 系统提示词
```
### 加载方式
```java
@Configuration
public class AiOpsPromptProperties {
@PostConstruct
public void loadPrompts() {
planner = loadPromptFromFile("prompts/planner-prompt.md");
executor = loadPromptFromFile("prompts/executor-prompt.md");
supervisor = loadPromptFromFile("prompts/supervisor-prompt.md");
}
private String loadPromptFromFile(String path) throws IOException {
ClassPathResource resource = new ClassPathResource(path);
return new String(resource.getInputStream().readAllBytes(), StandardCharsets.UTF_8);
}
}
```
### 使用方式
```java
@Autowired
private AiOpsPromptProperties promptProperties;
// 直接使用
.systemPrompt(promptProperties.getPlanner())
```
---
## 编译验证
```bash
mvn clean compile -DskipTests
```
✅ **结果**: BUILD SUCCESS
---
## 完整改动清单
| 文件 | 改动 |
|------|------|
| `AiOpsService.java` | 注入 `LookupKnowledgeTool` + `AiOpsPromptProperties` |
| `AiOpsPromptProperties.java` | 从 Markdown 文件加载 Prompt(使用 `@PostConstruct`)|
| `prompts/planner-prompt.md` | 新增:Planner 系统提示词 |
| `prompts/executor-prompt.md` | 新增:Executor 系统提示词(含工具选择指南)|
| `prompts/supervisor-prompt.md` | 新增:Supervisor 系统提示词 |
| ~~`YamlPropertySourceFactory.java`~~ | 已删除(不再需要)|
| ~~`prompts/ai-ops-prompts.yml`~~ | 已删除(改用 Markdown)|
---
## Executor Prompt 关键改进
新增工具选择指南:
```markdown
- 根据查询内容选择合适的工具:
* 精确关键词(错误码、配置项名称)→ 优先使用 lookup_knowledge,未找到时降级到 queryInternalDocs
* 模糊概念、故障流程 → 直接使用 queryInternalDocs
* 告警数据 → queryPrometheusAlerts
* 日志数据 → queryLogs
```
降级策略:
- `lookup_knowledge` 未找到 → 自动降级到 `queryInternalDocs`
- 确保查询不会因为知识库缺少内容而失败