Advisors功能增强
Advisors 是 Spring AI 中一个强大的功能,允许您在 AI 处理流程中添加拦截器,以增强和定制 AI 行为。
什么是 Advisors?
Advisors 是一种拦截器机制,可以在 AI 请求处理的不同阶段插入自定义逻辑,类似于 Spring AOP 中的 Advice。
Advisor 类型
1. RequestAdvisor
在发送请求之前修改请求内容:
@Component
public class CustomRequestAdvisor implements RequestAdvisor {
@Override
public List<Message> advise(List<Message> messages) {
// 在所有请求前添加系统提示
SystemMessage systemMessage = new SystemMessage("""
请以专业、准确的方式回答问题。
回答中不要包含任何个人意见或推测。
""");
List<Message> advisedMessages = new ArrayList<>();
advisedMessages.add(systemMessage);
advisedMessages.addAll(messages);
return advisedMessages;
}
}
2. ResponseAdvisor
在接收响应之后处理响应内容:
@Component
public class CustomResponseAdvisor implements ResponseAdvisor {
@Override
public List<Generation> advise(List<Generation> generations) {
// 对响应进行后处理
return generations.stream().map(generation -> {
String content = generation.getOutput().getContent();
// 添加引用声明
String enhancedContent = content + "\n\n*以上内容由 AI 生成,仅供参考*";
return new Generation(new AiMessage(enhancedContent), generation.getInfo());
}).collect(Collectors.toList());
}
}
配置 Advisors
在 ChatClient 中注册
@Configuration
public class AiConfiguration {
@Bean
public ChatClient chatClient(ChatModel chatModel,
List<RequestAdvisor> requestAdvisors,
List<ResponseAdvisor> responseAdvisors) {
return new DefaultChatClient(chatModel, requestAdvisors, responseAdvisors);
}
}
条件性 Advisors
@Component
public class ConditionalRequestAdvisor implements RequestAdvisor {
@Override
public List<Message> advise(List<Message> messages) {
// 只对特定类型的请求添加额外信息
if (messages.stream().anyMatch(msg ->
msg instanceof UserMessage &&
((UserMessage) msg).getContent().contains("技术问题"))) {
SystemMessage technicalContext = new SystemMessage("""
上下文:这是一个技术问题,请提供准确的技术解决方案和代码示例。
""");
List<Message> advisedMessages = new ArrayList<>();
advisedMessages.add(technicalContext);
advisedMessages.addAll(messages);
return advisedMessages;
}
return messages;
}
}
实际应用场景
1. 内容安全过滤
@Component
public class SafetyFilterAdvisor implements ResponseAdvisor {
@Override
public List<Generation> advise(List<Generation> generations) {
return generations.stream().map(generation -> {
String content = generation.getOutput().getContent();
// 过滤敏感内容
String filteredContent = content.replaceAll("\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b", "[邮箱已隐藏]");
return new Generation(new AiMessage(filteredContent), generation.getInfo());
}).collect(Collectors.toList());
}
}
2. 多语言支持
@Component
public class LanguageTranslationAdvisor implements RequestAdvisor, ResponseAdvisor {
private final TranslationService translationService;
public LanguageTranslationAdvisor(TranslationService translationService) {
this.translationService = translationService;
}
@Override
public List<Message> advise(List<Message> messages) {
// 将用户消息翻译为英文发送给模型
return messages.stream().map(message -> {
if (message instanceof UserMessage) {
String translated = translationService.translateToEnglish(
((UserMessage) message).getContent());
return new UserMessage(translated);
}
return message;
}).collect(Collectors.toList());
}
@Override
public List<Generation> advise(List<Generation> generations) {
// 将模型响应翻译回中文
return generations.stream().map(generation -> {
String content = generation.getOutput().getContent();
String translated = translationService.translateToChinese(content);
return new Generation(new AiMessage(translated), generation.getInfo());
}).collect(Collectors.toList());
}
}
最佳实践
1. 保持 Advisor 的轻量性
避免在 Advisor 中执行耗时操作,以免影响整体性能。
2. 合理组织多个 Advisors
当使用多个 Advisors 时,注意它们的执行顺序和相互影响。
3. 提供开关机制
为 Advisors 提供启用/禁用的配置选项,便于调试和维护。
通过合理使用 Advisors 功能,您可以极大地增强 Spring AI 应用的功能和灵活性。