zhuyongxin
|
58c39107c5
|
refactor(harness): freeze single-agent contracts
|
2026-07-21 17:33:25 +08:00 |
|
zhuyongxin
|
78c1477198
|
feat(trace): isolate aiops runs
|
2026-07-10 20:57:46 +08:00 |
|
zhuyongxin
|
d928a1968a
|
feat(trace): bind feedback to runs
|
2026-07-10 20:29:56 +08:00 |
|
zhuyongxin
|
027aed1eeb
|
feat(trace): add run-scoped trace reads
|
2026-07-10 20:07:23 +08:00 |
|
zhuyongxin
|
26d5529280
|
feat(trace): isolate chat runs
|
2026-07-10 19:02:04 +08:00 |
|
zhuyongxin
|
52bf0302c6
|
feat(trace): add session run isolation schema
|
2026-07-10 17:47:56 +08:00 |
|
zhuyongxin
|
9c9a0024d4
|
feat(demo): add interview quality audit
|
2026-07-09 11:18:49 +08:00 |
|
aruo
|
db0f229285
|
feat(eval): add evidence pipeline acceptance closure
|
2026-07-09 00:47:48 +08:00 |
|
aruo
|
9a84b3de34
|
feat(agent): support no-evidence references
|
2026-07-08 23:30:00 +08:00 |
|
aruo
|
7b8c75e571
|
feat(agent): harden verifier evidence references
|
2026-07-08 16:12:56 +08:00 |
|
aruo
|
a08672b31e
|
feat(eval): add executor audit closure checks
|
2026-07-08 10:21:39 +08:00 |
|
aruo
|
6015bcbf6f
|
feat(agent): add composer final answer
|
2026-07-08 09:51:07 +08:00 |
|
aruo
|
1b31e78be5
|
feat(agent): add verifier claim checks
|
2026-07-08 02:33:02 +08:00 |
|
aruo
|
c5e496e715
|
feat(agent): add executor gatekeeper hook
|
2026-07-08 02:01:49 +08:00 |
|
aruo
|
050cbc8fee
|
feat(agent): add executor evidence v2 contract
|
2026-07-08 01:37:15 +08:00 |
|
zhuyongxin
|
0ee27eb523
|
feat(trace): improve session workbench review
|
2026-07-07 19:06:18 +08:00 |
|
zhuyongxin
|
04eb50e2b4
|
feat(agent): add executor evidence output contract
|
2026-07-07 19:02:02 +08:00 |
|
aruo
|
b3315ead52
|
fix(agent): harden live diagnosis skill observability
|
2026-07-07 00:20:34 +08:00 |
|
zhuyongxin
|
ed7efc58b7
|
feat(rag): close eval pipeline with live snapshots
|
2026-07-06 21:39:27 +08:00 |
|
zhuyongxin
|
cf3333d607
|
feat(rag): modularize knowledge retrieval pipeline
|
2026-07-06 17:06:05 +08:00 |
|
zhuyongxin
|
a375daead7
|
fix: clean up aiops mojibake text
|
2026-07-06 11:38:01 +08:00 |
|
aruo
|
6ccfd33ec5
|
Add diagnosis playbook skills
|
2026-07-06 08:35:54 +08:00 |
|
aruo
|
ed267d753d
|
feat: add aiops lightweight verifier
|
2026-07-05 13:44:30 +08:00 |
|
aruo
|
72a3dbf8c5
|
feat: add aiops payload query augmentation
|
2026-07-05 12:56:20 +08:00 |
|
aruo
|
c7e2fc2ee2
|
feat: include breadcrumb in embedding text
|
2026-07-05 12:15:27 +08:00 |
|
aruo
|
f2bae0382c
|
fix: align vectorstore live retrieval
|
2026-07-05 10:53:45 +08:00 |
|
aruo
|
5c71f5fc79
|
feat: integrate spring ai vectorstore fallback
|
2026-07-05 10:20:29 +08:00 |
|
aruo
|
b9ec07de57
|
feat: add spring ai retrieval sidecar
|
2026-07-05 03:22:03 +08:00 |
|
aruo
|
5197712719
|
feat: add rag evidence postprocess blocks
|
2026-07-05 03:03:18 +08:00 |
|
aruo
|
4a94c14feb
|
feat: treat l0 retrieval as domain hint
|
2026-07-05 02:18:40 +08:00 |
|
aruo
|
79feed3314
|
Merge branch 'emdash/shy-items-fry-f4zze' into refactor/mvp1.0
# Conflicts:
# mvp/issues/README.md
|
2026-07-05 01:42:42 +08:00 |
|
aruo
|
69deb15330
|
Add diagnosis eval baseline diff
|
2026-07-05 00:59:53 +08:00 |
|
aruo
|
ca5c61fabf
|
Add diagnosis eval harness
|
2026-07-04 23:51:43 +08:00 |
|
aruo
|
23ee05c7c3
|
feat: add traceable scoped AIOps diagnosis
|
2026-07-04 22:57:28 +08:00 |
|
aruo
|
dc6cd32a67
|
Harden evidence trace semantics
|
2026-07-04 22:36:30 +08:00 |
|
zhuyongxin
|
f01866c1a2
|
refactor: use sequential agent for chat workflow
|
2026-07-03 18:03:06 +08:00 |
|
zhuyongxin
|
6919092b83
|
feat: archive mvp demo trace acceptance
|
2026-07-03 16:25:00 +08:00 |
|
zhuyongxin
|
5b827fe90e
|
fix: avoid low-confidence supervisor retry by default
|
2026-07-03 15:32:09 +08:00 |
|
zhuyongxin
|
b0f288ae36
|
use supervisor agent for complex chat
|
2026-07-03 14:10:55 +08:00 |
|
zhuyongxin
|
1ff7f09d25
|
fix chat session traces and document paths
|
2026-07-03 13:53:16 +08:00 |
|
zhuyongxin
|
9050487307
|
feat: add chat verifier agent
|
2026-07-03 10:54:33 +08:00 |
|
zhuyongxin
|
e438df4355
|
feat(knowledge): Executor 行动记忆 + 归一化质量等级解决 ISS-002 重复检索
- RetrievedDocTracker 升级为域级+文档级双层记录(Map<sessionId, Map<domain, Set<filePath>>>)
- LookupKnowledgeTool 新增 Min-Max 归一化层(BGE-M3 L2 距离→[0,1] similarity)
- 三等级 relevanceLevel:PRECISE / HIGHLY_RELEVANT / REFERENCE + completenessHint 兜底信号
- LookupResult 新增 relevanceLevel、completenessHint、retrievedDomainsThisSession
- Executor prompt 重写:4 条检索约束 + 合法出口不查全不追责,重复检索才惩罚
- 入库可观测性:V010 迁移 + retrieval_details JSON 扩展
- 归档 executor-action-memory-relevance change
|
2026-07-01 18:24:41 +08:00 |
|
zhuyongxin
|
e4f37cb9e6
|
fix(knowledge): 修复循环依赖 + 归档 session-dedup-knowledge-map + 记录 ISS-002
- KnowledgeIndexService: 域级生成从 @PostConstruct 移到 @EventListener(ApplicationReadyEvent),解决 KnowledgeIndexService ↔ KnowledgeDomainService 循环依赖
- devflow 归档: evidence.md + acceptance.md(含运行验证结果)
- devflow/index.md: session-dedup-knowledge-map 状态改为 archived
- openspec .archive-ready 标记
- mvp/issues/ISS-002: Executor 无约束重复调用 lookup_knowledge
|
2026-07-01 14:26:59 +08:00 |
|
zhuyongxin
|
354ffc1947
|
feat(feedback): 补提交 feedback 相关源码(漏提交的新建文件)
|
2026-07-01 10:57:49 +08:00 |
|
zhuyongxin
|
bb44140901
|
feat(knowledge): 会话级去重 + 知识域地图注入 Planner 解决 ISS-001 重复检索
- RetrievedDocTracker: sessionId → Set<filePath> 会话级去重,LookupKnowledgeTool Step 5 过滤已检索文档
- KnowledgeDomainService: 域级聚合,LLM 生成 when_to_retrieve,构建 knowledge map YAML
- DocumentFieldEnricher: 上传时 LLM 补全 covers + whenToRetrieve(含同域文档排除上下文)
- KnowledgeDomain entity + V009 迁移: 域级元数据持久化,避免重启重复 LLM 调用
- ChatService: 注入 knowledge map 到 Planner prompt,会话结束时清理去重状态
- KnowledgeIndexService: 手写 JSON 解析替换为 Jackson ObjectMapper,启动时补建缺失域记录
- chat-planner-prompt: 新增知识库检索规则(按域 when_to_retrieve 判断,每域最多一次检索)
- doc-field-enricher-prompt / domain-summary-prompt: 外部化 LLM 提示词
|
2026-07-01 10:47:46 +08:00 |
|
zhuyongxin
|
2a796da490
|
feat(feedback): 置信度评分与用户反馈机制 & 归档 confidence-feedback change
|
2026-06-30 18:01:06 +08:00 |
|
zhuyongxin
|
a3abe3f7a2
|
refactor(session): 清理代码 & RunnableConfig 传 sessionId
- AgentLoggingHook 改为从 config.metadata 读取 sessionId(线程安全)
- 移除 AgentLoggingHook 调试用的 metadata 日志
- TokenTrackingChatModel 日志降为 debug
- SessionContextHolder 移除未使用的 setAgentName/getAgentName
- ChatService 清理无用 import
- 修复 stream 路径下 ThreadLocal NPE
|
2026-06-26 17:28:30 +08:00 |
|
zhuyongxin
|
0d9cce75f9
|
feat(session): 会话存储体系实现 & Chat多Agent路由
- 新增诊断会话(diagnosis_session/agent_step/tool_invocation)三表
- AgentLoggingHook 持久化 agent_step,记录决策链和耗时
- LookupKnowledgeTool 写入 tool_invocation,记录L0/L1检索质量
- TokenTrackingChatModel 捕获真实token用量
- Chat接口支持意图路由:简单问题单Agent,复杂问题多Agent(Planner+Executor)
- Prompt外置到 src/main/resources/prompts/
- 删除旧 diagnosis_record 表及相关文件
- 新增SessionContextHolder(ThreadLocal传递sessionId)
- QuestionComplexity 复杂度判断工具
- 测试覆盖三张新表的Repository
|
2026-06-26 16:22:05 +08:00 |
|
zhuyongxin
|
a74ccea5be
|
feat(knowledge): breadcrumb分块上下文 & LookupKnowledgeTool日志优化
- DocumentChunk新增breadcrumb字段,分块时构建完整标题层级路径
- DocumentChunkService splitByHeadings维护标题层级栈算法
- VectorIndexService 将breadcrumb写入Milvus metadata
- LookupKnowledgeTool日志替换为结构化摘要,替代原始MD预览
- L0返回策略:唯一匹配用正文摘要,多匹配+L1有结果仅元数据(不读文件)
- 新增buildCompactSummary / buildMetadataOnlySummary方法
- 安装frontend-design skill
- 创建mvp/文档目录(架构设计+会话存储方案)
- 更新测试适配新逻辑
|
2026-06-26 13:56:10 +08:00 |
|
zhuyongxin
|
a1876286fd
|
fix(observability): 增强模型文本提取,支持多种方式并输出调试信息
## 改动内容
### 增强 extractTextContent() 方法
支持 6 种提取方式,依次尝试:
```java
// 方法 1: 反射获取 text 字段
Field textField = message.getClass().getDeclaredField("text");
// 方法 2: 反射获取 content 字段
Field contentField = message.getClass().getDeclaredField("content");
// 方法 3: 调用 getText() 方法
Method getTextMethod = message.getClass().getMethod("getText");
// 方法 4: 调用 getContent() 方法
Method getContentMethod = message.getClass().getMethod("getContent");
// 方法 5: 打印类结构信息(帮助调试)
log.warn("字段列表: ...");
log.warn("方法列表: ...");
// 方法 6: toString() 兜底
return message.toString();
```
---
## 调试信息输出
### 当提取失败时
```
[WARN] 无法提取 AssistantMessage 文本内容,打印类信息:
[WARN] 类名: org.springframework.ai.chat.messages.AssistantMessage
[WARN] 字段列表:
[WARN] - text: String
[WARN] - toolCalls: List
[WARN] - metadata: Map
[WARN] 方法列表:
[WARN] - getText(): String
[WARN] - getToolCalls(): List
[WARN] - getMetadata(): Map
```
**用途**:
- 帮助快速定位正确的字段/方法名
- 不同 Spring AI 版本可能有不同实现
- 一次调试,永久修复
---
### 当提取成功时
```
[DEBUG] 通过 text 字段提取成功
[INFO] *** [Agent 思考] 模型返回文本: 我需要查询知识库...
```
---
## 适配不同 Spring AI 版本
| 版本 | 字段/方法 | 提取方式 |
|------|----------|---------|
| **Spring AI 0.x** | `text` 字段 | 方法 1 ✅ |
| **Spring AI 1.x** | `content` 字段 | 方法 2 ✅ |
| **阿里云版本** | `getText()` 方法 | 方法 3 ✅ |
| **自定义实现** | `getContent()` 方法 | 方法 4 ✅ |
| **未知版本** | 打印类信息 | 方法 5 → 手动适配 |
---
## 错误处理
### 提取失败但不中断
```java
catch (Exception e) {
log.error("提取 AssistantMessage 文本内容时出错", e);
return null;
}
// 调用处
String textContent = extractTextContent(lastAssistant);
if (textContent != null && !textContent.isEmpty()) {
log.info("*** [Agent 思考] 模型返回文本: {}", textContent);
} else {
// 跳过,不打印
}
```
**不会中断流程**:
- 提取失败 → 返回 null
- null 检查 → 跳过日志输出
- 继续执行后续逻辑
---
## 使用场景
### 场景 1:首次运行,不确定字段名
```bash
# 启动应用
mvn spring-boot:run
# 发起请求
curl -X POST http://localhost:9900/api/chat \
-d '{"id":"test","question":"测试"}'
# 查看日志
tail -f logs/application.log | grep "模型返回文本\|字段列表\|方法列表"
```
**如果看到**:
```
[WARN] 无法提取 AssistantMessage 文本内容,打印类信息:
[WARN] 方法列表:
[WARN] - getTextContent(): String ← 找到了!
```
**修复**:在 `extractTextContent()` 中添加方法 7:
```java
// 方法 7: 尝试 getTextContent()
Method method = message.getClass().getMethod("getTextContent");
Object value = method.invoke(message);
```
---
### 场景 2:提取成功
```
[DEBUG] 通过 text 字段提取成功
[INFO] *** [Agent 思考] 模型返回文本: 我需要查询知识库来了解支付失败的具体原因
```
正常使用,无需调整。
---
## 性能考虑
### 反射开销
- 反射调用比直接调用慢 ~10-100 倍
- 但只在日志输出时使用,不在热路径
- Agent 调用频率低(秒级),性能影响可忽略
### 优化建议(可选)
缓存反射结果:
```java
private static Field cachedTextField = null;
private String extractTextContent(AssistantMessage message) {
if (cachedTextField == null) {
cachedTextField = message.getClass().getDeclaredField("text");
cachedTextField.setAccessible(true);
}
return (String) cachedTextField.get(message);
}
```
**当前未实现**,因为:
- 日志场景无性能瓶颈
- 简单实现更易维护
- 如需优化再添加
---
## 提交历史
```
当前 fix(observability): 增强模型文本提取,支持多种方式并输出调试信息
934d8ee feat(observability): 在 Hook 中输出模型返回的文本内容
7c8758d refactor(observability): 简化 ChatService 日志,避免与 Hook 重复
```
|
2026-06-25 17:41:37 +08:00 |
|