当前位置: 首页 > web >正文

SpirngAI框架 Advisor API详解

SpringAI提供了Advisors API来实现请求和响应的拦截,修改,增强Spring应用程序和AI模型的互动。

可以使用ChatClient API来配置现有的advisor,例如:

var chatClient = ChatClient.builder(chatModel)

    .defaultAdvisors(

        new MessageChatMemoryAdvisor(chatMemory), // chat-memory advisor

        new QuestionAnswerAdvisor(vectorStore)    // RAG advisor

    )

    .build();

String response = this.chatClient.prompt()

    // Set advisor parameters at runtime

    .advisors(advisor -> advisor.param("chat_memory_conversation_id", "678")

            .param("chat_memory_response_size", 100))

    .user(userText)

    .call()

.content();

Advisor中的核心组件:

包括非流式场景中的CallAroundAdvisor和CallAroundAdvisorChain构成,其中CallAroundAdvisorChain是由一系列CallAroundAdvisor构成的链。非流式场景中的StreamAroundAdvisor和StreamAroundAdvisorChain构成。

还有AdvisorRequest用于表示没有密封的Prompt请求,AdvisorResponse表示聊天完成的响应,还有上下文AdviseContext,这个上下文用于保存

AdvisorRequest和AdvisorResponse在链中的共享状态。

callAroundNext()和streamAroundNext()是关键的方法,在这个方法中对请求和响应进行响应的操作,并且可以决定是否调用下一个advisor进行后续的操作。

getOrder()提供链中advisor的访问顺序,返回值越小的在链中的位置越靠前,还有getName()方法返回advisor的名称。最后一个advisor由SpringAI框架自动添加,并把请求发送到AI模型。

在链条中越靠前的advisor先执行对AdvisorRequest的操作,越后执行对AdvisorResponse的操作。注意:如果有多个advisor的getOrder()的返回值相同,可能无法保证顺序执行,因此要避免多个相同的order值。

SpringAI框架中的Advisor接口关系:

接下来自定义实现一个advisor:

上述实现了一个问题重读的advisor,就是让AI模型把问题读两遍。

SpringAI框架也提供了一些内置的advisor,比如:

1.MessageChatMemoryAdvisor:添加历史对话为消息列表,以.message(…)的形式插入到prompt,维护完整的对话结构,适用于完整对话上下文,高级模型(部分模型不支持该advisor)

2.PromptChatMemoryAdvisor:添加历史对话为系统提示,拼接成一个字符串插入到系统提示中。适用于简单记忆,对所有模型兼容。

3.VectorStoreChatMemoryAdvisor:从vectorStore中检索相关信息添加到系统提示中,通常用于提供背景信息。

4.QuestionAnswerAdvisor:用户提问时,自动从vectorStore中检索最相关的文档,添加到用户提示中,常用于RAG的精准回答。

SafeGardAdvisor:用于防止模型生成有害或不适信息

要更新 context,需要使用 .updateContext(...) 方法,它会创建一个新的不可变 map,并包含更新后的内容,例如:

@Override

public AdvisedResponse aroundCall(AdvisedRequest advisedRequest, CallAroundAdvisorChain chain) {

    this.advisedRequest = advisedRequest.updateContext(context -> {

        context.put("aroundCallBefore" + getName(), "AROUND_CALL_BEFORE " + getName());

        context.put("lastBefore", getName());

        return context;

    });

    // 后续逻辑...

}

http://www.xdnf.cn/news/4517.html

相关文章:

  • 【无标题】如何在sheel中运行Spark
  • 基于Django框架开发的企业级IT资产管理系统
  • Topic和Partition的关系是什么?为什么需要分区? (Topic是逻辑分类,Partition是物理分片;提升并行度和扩展性)
  • 【信息系统项目管理师-论文真题】2005下半年论文详解(包括解题思路和写作要点)
  • mint系统详解详细解释
  • 开源数学推理模型DeepSeek-Prover-V2:88.9%通过率+超长推理链
  • 数造科技携 DataBuilder 亮相安徽科交会,展现“DataOps +AI”双引擎魅力
  • 机器学习之嵌入(Embeddings):从理论到实践
  • LangChain第二讲:不设置环境变量也能调用LLM大模型吗?(更简单地调用LLM)
  • LabVIEW表面粗糙度测量及算法解析
  • Python cv2视频处理基础:从入门到实战
  • 我如何在ubuntu截图和屏幕录制,有什么好用的免费的软件吗?
  • C++ 基础复习
  • 蓝牙L2CAP协议概述
  • 微机控制电液伺服拉扭疲劳试验系统
  • 004 Linux基本指令
  • C语言| 递归求两个数的最大公约数
  • 17.Three.js 光照系统之《LightProbe》详解指南(含 Vue 3示例)
  • 准确--Notepad++ 实用的插件介绍
  • 【论文阅读】HunyuanVideo: A Systematic Framework For Large Video Generative Models
  • Linux系统安装指南
  • vue2中的组件注册
  • Landsat WRS介绍 及 Polygon定位WRS算法
  • WPF MVVM入门系列教程(六、ViewModel案例演示)
  • [Windows] 蓝山看图王 1.0.3.21021
  • JGL021垃圾渗滤液小试实验装置
  • 三、大模型原理:图文解析MoE原理
  • NGINX `ngx_http_charset_module` 字符集声明与编码转换
  • 【CSS】Grid 的 auto-fill 和 auto-fit 内容自适应
  • goland无法debug