跳到主要内容

学习模块 - 高级特性

1. 多种学习触发方式

Agent 执行后学习

spring:
ai:
alibaba:
codeact:
extension:
learning:
online:
after-agent:
enabled: true
learning-types:
- experience # 提取经验
- pattern # 提取模式
- error # 提取错误信息

模型调用后学习

spring:
ai:
alibaba:
codeact:
extension:
learning:
online:
after-model:
enabled: true
learning-types:
- prompt_pattern # 提取 Prompt 模式

工具执行后学习

spring:
ai:
alibaba:
codeact:
extension:
learning:
online:
tool-interceptor:
enabled: true
included-tools: # 只学习这些工具
- search
- query_database
excluded-tools: [] # 排除这些工具

2. 异步学习

避免学习过程阻塞主流程:

spring:
ai:
alibaba:
codeact:
extension:
learning:
async:
enabled: true
core-pool-size: 2
max-pool-size: 4
queue-capacity: 100

3. 离线批量学习

处理历史数据进行批量学习:

spring:
ai:
alibaba:
codeact:
extension:
learning:
offline:
enabled: true
tasks:
- name: daily_learning
cron: "0 0 2 * * ?" # 每天凌晨2点执行
source: session_logs
learning-types:
- experience
- name: weekly_summary
cron: "0 0 3 ? * SUN" # 每周日凌晨3点
source: error_logs
learning-types:
- error_pattern

手动触发离线学习

@Component
public class OfflineLearningTrigger {

private final LearningExecutor learningExecutor;

public void triggerBatchLearning(List<LearningContext> contexts) {
for (LearningContext context : contexts) {
learningExecutor.execute(context);
}
}
}

4. 条件学习

在 Extractor 中实现复杂的学习条件:

@Component
public class QualityFilteredExtractor implements LearningExtractor<Experience> {

@Override
public boolean shouldLearn(LearningContext context) {
// 1. 通过 customData 判断执行是否成功
Object isSuccess = context.getCustomData().get("success");
if (!Boolean.TRUE.equals(isSuccess)) {
return false;
}

// 2. 通过 customData 检查执行时间(可能是简单任务)
Long durationMs = (Long) context.getCustomData().get("durationMs");
if (durationMs != null && durationMs < 1000) {
return false;
}

// 3. 必须有工具调用(有实际操作)
if (context.getToolCallRecords() == null || context.getToolCallRecords().isEmpty()) {
return false;
}

// 4. 通过 customData 检查输出不能为空
String output = (String) context.getCustomData().get("output");
if (output == null || output.isEmpty()) {
return false;
}

return true;
}

@Override
public List<Experience> extract(LearningContext context) {
// 提取高质量经验
// ...
}
}

5. 去重策略

避免重复学习相似内容:

@Component
public class DeduplicatedExtractor implements LearningExtractor<Experience> {

private final ExperienceProvider experienceProvider;

@Override
public List<Experience> extract(LearningContext context) {
List<Experience> extracted = doExtract(context);

// 检查是否已有相似经验
return extracted.stream()
.filter(exp -> !hasSimilarExperience(exp))
.collect(Collectors.toList());
}

private boolean hasSimilarExperience(Experience exp) {
ExperienceQuery query = new ExperienceQuery(exp.getType());
query.setLimit(5);

ExperienceQueryContext ctx = new ExperienceQueryContext();
ctx.setUserQuery(exp.getTitle());

List<Experience> existing = experienceProvider.query(query, ctx);

// 使用相似度检测
for (Experience e : existing) {
if (calculateSimilarity(e.getContent(), exp.getContent()) > 0.8) {
return true;
}
}

return false;
}
}

6. 学习记录类型扩展

定义自定义学习记录类型:

// 自定义学习记录
public class ErrorPattern {
private String errorType;
private String errorMessage;
private String solution;
private int occurrenceCount;
// ...
}

// 对应的 Extractor
@Component
public class ErrorPatternExtractor implements LearningExtractor<ErrorPattern> {

@Override
public String getSupportedLearningType() {
return "error_pattern";
}

@Override
public Class<ErrorPattern> getRecordType() {
return ErrorPattern.class;
}

@Override
public List<ErrorPattern> extract(LearningContext context) {
if (context.getError() == null) {
return Collections.emptyList();
}

ErrorPattern pattern = new ErrorPattern();
pattern.setErrorType(context.getError().getClass().getSimpleName());
pattern.setErrorMessage(context.getError().getMessage());
// 从成功的重试中提取解决方案
pattern.setSolution(extractSolution(context));

return List.of(pattern);
}
}

// 对应的 Repository
@Component
public class ErrorPatternRepository implements LearningRepository<ErrorPattern> {

@Override
public Class<ErrorPattern> getSupportedRecordType() {
return ErrorPattern.class;
}

// ... 实现存储方法
}

7. 学习回调

监听学习过程:

@Component
public class LearningCallback implements LearningEventListener {

@Override
public void onLearningStarted(LearningContext context) {
log.info("LearningCallback#onLearningStarted - reason=开始学习, sessionId={}",
context.getSessionId());
}

@Override
public void onLearningCompleted(LearningContext context, List<?> records) {
log.info("LearningCallback#onLearningCompleted - reason=学习完成, recordCount={}",
records.size());

// 发送通知、更新统计等
metricsService.recordLearning(records.size());
}

@Override
public void onLearningFailed(LearningContext context, Exception e) {
log.error("LearningCallback#onLearningFailed - reason=学习失败", e);

// 告警处理
alertService.sendAlert("Learning failed: " + e.getMessage());
}
}

8. 存储策略

内存存储(测试/开发)

spring:
ai:
alibaba:
codeact:
extension:
learning:
storage:
type: memory
max-records: 1000

Store 存储(生产)

spring:
ai:
alibaba:
codeact:
extension:
learning:
storage:
type: store
namespace-prefix: learning

自定义存储

实现 LearningRepository 接口连接任意存储系统。


9. 学习指标监控

@Component
public class LearningMetrics {

private final MeterRegistry meterRegistry;

public void recordExtraction(String type, int count) {
meterRegistry.counter("learning.extraction.count",
"type", type).increment(count);
}

public void recordLatency(String type, long durationMs) {
meterRegistry.timer("learning.extraction.latency",
"type", type).record(Duration.ofMillis(durationMs));
}
}

10. 与经验模块集成

学习模块产出的经验自动进入经验库:

@Component
public class ExperienceLearningRepository implements LearningRepository<Experience> {

private final ExperienceDataInitializer initializer;

@Override
public void save(String namespace, String key, Experience record) {
// 保存到经验库
initializer.initialize(List.of(record));
}

@Override
public void saveBatch(String namespace, List<Experience> records) {
initializer.initialize(records);
}

@Override
public Class<Experience> getSupportedRecordType() {
return Experience.class;
}
}

Spring AI Alibaba 开源项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。