第 6 章 · Spring AI中的Advisors

AI 实战篇:Spring-AI再更新!细细讲下Advisors Spring AI Advisor的核心功能在于拦截并可能修改AI应用程序中聊天请求和响应流的组件。在这个系统中,AroundAdvisor是关键参与者,它允许开发人员在这些交互过程中动态地转换或利用信息。重复任务的封装:能够将常见的生成式AI模式打包成可重用的单元,简化开发过程。数据转换:增强发送给语言模型(LLM)的数据,并优化返回给客户端的响应格式,以提高交互质量。可移植性:创建可跨不同模型和用例工作的可重用转换组件,提升代码的灵活性和适应性。 阅读详情

版本:Spring AI 2.0.1

目标:弄清 ChatClient 上的 Advisor 链——契约、挂法、内置门牌、顺序语义,以及如何自定义。 本章只讲「链」本身;会话记忆、RAG、Tool 等具体装配不在这里展开。

上图按「由外到内」画出一条完整示意链:安全 → 记忆 → 检索/缓存(可选)→ 工具循环 → 结构化校验(可选)→ ChatModel → 响应。不是每次请求都挂满;检索与结构化校验按场景选配。

可以把 Around 链理解成:

请求进入
  → Advisor 链(按 getOrder(),数字越小越靠外)
      → 前置 before:改请求 / 注入上下文 / 安全检查 / 读记忆 / 检索 / 日志 …
      → 末端:ChatModelCallAdvisor / ChatModelStreamAdvisor 真正调模型
      → 后置 after:写回记忆 / 结构化校验 / 累加 Usage / 写外部系统 …
响应离开

ToolCallingAdvisor 比较特殊:模型一旦要求调工具,它会在链内循环,直到不再需要工具,或触达调用上限。多轮 tool 的 Usage 通常按整次 ChatClient 调用累计。谁先谁后看 getOrder(),默认数值见后文顺序图。

本章顺序:契约与挂法 → 内置门牌 → 顺序与栈语义 → 自定义与调试 → 常见坑。


6.1 Advisor 是什么

Advisor 是 ChatClient 请求链上的可插拔环节。一次 call() / stream() 不会直接落到 ChatModel,而是先穿过这条链。

常见分层:

类型作用
CallAdvisor / StreamAdvisor同步与流式两条路径上的顾问接口
BaseAdvisor提供默认的 adviseCall / adviseStream,你只需实现 before / after
MemoryAdvisor / ToolAdvisor记忆类、工具类的标记与契约
DefaultAroundAdvisorChain默认链式实现

挂法在 ChatClient 上很直接:

// Builder 默认:对该 Client 的所有请求生效
.defaultAdvisors(new SimpleLoggerAdvisor(), safeGuardAdvisor)
​
// 单次请求追加挂载
.advisors(anotherAdvisor)
​
// 单次请求传上下文参数(键由具体 Advisor 约定)
.advisors(a -> a
        .advisors(someAdvisor)
        .param("my.context.key", value))

defaultAdvisors 与单次 advisors(...) 会一起进入本次请求的链;真正谁先谁后,仍看各自的 getOrder(),不是「谁后写谁更外」。

先记住四点:

  1. Advisor 改的是「这一次请求」的前后处理,不是另一套协议;底下仍是 Message / Prompt / ChatResponse。

  2. 同步与流式是分开的路径;只实现 Call 或只实现 Stream,另一条路径不会自动带上。自定义优先用 BaseAdvisor 一次覆盖两边。

  3. 顺序由 getOrder() 决定,不要依赖 Bean 注册顺序碰运气。

  4. 上下文参数走 advisors(a -> a.param(...)),键名由具体 Advisor 约定(例如记忆类会约定会话键)。

BaseAdvisor 的执行骨架:

before(request)
  → chain.next...(request)
  → after(response)

6.2 常见内置 Advisor

ToolCallingAdvisor ChatClient 默认常会装配,负责工具调用循环。旧名 ToolCallAdvisor 已废弃,新代码只写这个。默认 order 约为 HIGHEST_PRECEDENCE + 300。

MessageChatMemoryAdvisor 基于 ChatMemory 的会话记忆:调用前注入历史,调用后写回本轮消息。需要会话键等上下文参数。默认 order 约为 HIGHEST_PRECEDENCE + 200(比 ToolCalling 更靠外,从而包住工具循环)。

SafeGuardAdvisor 敏感词 / 安全拦截。可与 ModerationModel 组合:一个做词表快筛,一个做模型审核。

SimpleLoggerAdvisor 调试时看最终发给模型的内容。生产环境注意脱敏。

StructuredOutputValidationAdvisor 在 Advisor 层做结构化输出校验,与 entity(...).validateSchema() 一类能力相关。默认更靠内(接近末端)。

ChatModelCallAdvisor / ChatModelStreamAdvisor 链的末端,真正执行 call / stream。order 通常是 LOWEST_PRECEDENCE。一般不用手写,理解链路时知道「最后一环是谁」即可。

另外还有辅助类,例如按 token 预算裁剪上下文的 content purger,以及工具循环场景下的 Usage 累计器。

扩展门牌(本章只认名字与职责):

Advisor大致职责
QuestionAnswerAdvisor经典向量库 RAG:检索文档并注入 Prompt
RetrievalAugmentationAdvisorModular RAG:查询改写 / 扩展 / 检索 / 拼接可组合
SemanticCacheAdvisor相似问题命中后短路模型调用(偏省钱加速,不是「补知识」)
ToolSearchToolCallingAdvisor工具很多时先搜目录再调用;小项目通常直接 defaultTools 即可
VectorStoreChatMemoryAdvisor用向量库做语义相关的历史召回(与窗口 ChatMemory 不是同一条路径)

有些示例名容易误导。例如某些 ReReading 示例可能只出现在测试代码里,不要当成生产内置 Advisor 去依赖。


6.3 顺序为什么重要

Around 链按 order 排序:数字越小越靠外;末端永远是真正调模型的 Advisor。

一个实用分层(从外到内)可以是:

  1. 安全(SafeGuard)

  2. 记忆读取 / 写回

  3. 检索或语义缓存

  4. 工具调用 / Tool Search

  5. 结构化校验

  6. ChatModel 调用

和源码默认值对齐时,至少记住这两档:

Advisor常见默认 order(约)
MessageChatMemoryAdvisorHIGHEST_PRECEDENCE + 200
ToolCallingAdvisorHIGHEST_PRECEDENCE + 300
ChatModelCallAdvisorLOWEST_PRECEDENCE

也就是说:记忆默认包在工具循环外面——工具多轮中间态由 ToolCalling 自己管,会话级历史由记忆 Advisor 在整次调用前后读写。

调试日志可插在合适位置,用来观察最终 Prompt。

再记住三个栈语义:

  1. 短路合法:例如语义缓存命中后,可以不再往内走到 RAG / Tool / 模型。

  2. 循环合法:ToolCalling、结构化校验可能多次触达模型;Usage 按整次 ChatClient 调用看。

  3. 覆盖危险:多个 Advisor 都在 before 里改 system / user 时,后执行的前置逻辑可能改掉先注入的内容。

自定义 Advisor 务必给出稳定的 getOrder()。流式路径与同步路径是分开的;某些校验重试明确不支持 streaming——要重试就走同步,要打字机就流式,结构化可另开接口。


6.4 自定义 Advisor

自定义时优先实现 BaseAdvisor。最小可运行骨架:

import java.util.HashMap;
import java.util.Map;
​
import org.springframework.ai.chat.client.ChatClientRequest;
import org.springframework.ai.chat.client.ChatClientResponse;
import org.springframework.ai.chat.client.advisor.api.AdvisorChain;
import org.springframework.ai.chat.client.advisor.api.BaseAdvisor;
import org.springframework.core.Ordered;
​
public final class TenantTagAdvisor implements BaseAdvisor {
​
    public static final String TENANT_KEY = "tenant.id";
​
    @Override
    public ChatClientRequest before(ChatClientRequest request, AdvisorChain chain) {
        Object tenantId = request.context().get(TENANT_KEY);
        if (tenantId == null) {
            return request;
        }
        // 往 context 写入(也可 mutate Prompt)
        Map<String, Object> ctx = new HashMap<>(request.context());
        ctx.put("tenant.resolved", Boolean.TRUE);
        return request.mutate().context(ctx).build();
    }
​
    @Override
    public ChatClientResponse after(ChatClientResponse response, AdvisorChain chain) {
        // 后置:写审计、补 metadata 等
        return response;
    }
​
    @Override
    public int getOrder() {
        // 比记忆(约 +200)更靠外的示例
        return Ordered.HIGHEST_PRECEDENCE + 100;
    }
}

请求时传上下文:

chatClient.prompt()
        .advisors(a -> a.param(TenantTagAdvisor.TENANT_KEY, "acme"))
        .user("你好")
        .call()
        .content();

挂到 Client:

@Bean
ChatClient chatClient(ChatClient.Builder builder, TenantTagAdvisor tenantTagAdvisor) {
    return builder
            .defaultAdvisors(tenantTagAdvisor, new SimpleLoggerAdvisor())
            .build();
}

先确认官方是否已有现成实现,再决定是否自研。

多个 Advisor 叠在一起时,上下文会被一起吃掉。实务上要同时考虑:模型上下文窗口、记忆 / 检索注入量、工具循环轮次。三项一起涨,延迟和成本通常也会一起涨。


6.5 观察与调试提示

  • 开发期可临时挂 SimpleLoggerAdvisor,确认最终 Prompt 是否符合预期。

  • 生产打开 prompt / completion 日志前,先做脱敏与采样,避免密钥与隐私落盘。

  • Advisor 层有独立 Observation 挂钩;换 Advisor 实现时,尽量不要丢掉观测约定。

  • 排查「某个 Advisor 没生效」时,先看是否挂上、getOrder() 是否被盖住、同步 / 流式是否走了对应路径。


6.6 常见坑(本章范围)

现象先查什么
Advisor「挂了但没反应」是否 defaultAdvisors / 单次 advisors 写错对象;Bean 是否注入成功
行为与注册顺序不一致是否依赖了注册顺序;getOrder() 是否稳定、是否冲突
记忆没包住工具循环记忆 order 是否仍小于 ToolCalling(默认 +200 vs +300)
流式下校验 / 写回异常该 Advisor 是否支持 streaming;是否应改走同步路径
Prompt 被后挂的 Advisor 改掉多个 Advisor 是否都改 system / user;对照 order 看谁后执行
工具循环 Usage 对不上单次 callUsage 常按整次 ChatClient 调用累计,含多轮 tool
日志里出现敏感原文SimpleLoggerAdvisor / Observation 是否记录了 prompt / completion
只实现了 CallAdvisor流式请求不会走它;需要 Stream 路径或改用 BaseAdvisor

6.7 本章小结

到这里应能:

  1. 说明 Advisor 链的前置、末端与后置,以及它与 Message / Prompt / ChatResponse 的关系

  2. 用 defaultAdvisors / advisors / param 正确挂载,并知道顺序看 getOrder()

  3. 理解记忆包住工具循环的默认 order 关系,以及短路、循环、覆盖风险

  4. 认清常见内置 Advisor 与扩展门牌各自干什么

  5. 用 BaseAdvisor 写出最小自定义实现(含 context),并分开对待同步 / 流式路径

Spring AI 生产级实战-Advisors 本文围绕 Spring AI 的 Advisors 机制,讲清楚如何把大模型调用链路里的通用能力(日志观测、会话记忆、RAG 检索、内容安全等)封装成可插拔的“中间件”,并通过 getOrder() 精确控制执行顺序:请求侧先执行、响应侧按栈语义反向回溯。文章给出一个 10–20 分钟可跑通的最小示例(挂载日志 Advisor 验证链路),并扩展到生产化改造:观测指标与 tracing、上下文共享(advise-context)、流式与非流式的不同处理方式,以及升级后 context map 不可变带来的改 阅读详情

相关推荐

05_Spring AI 干货笔记之 Advisors API

Spring AI Advisors API 提供强大的拦截与增强机制,用于优化AI交互流程。该API通过CallAdvisor和StreamAdvisor分别处理同步和流式场景,支持提示词增强、对话记忆管理等模式。文章详细解析了Advisor执行顺序、核心组件及实现方法,包含日志记录、重读技术等实践示例,并介绍内置Advisor如问答增强和内容安全模块。最后说明API版本变更,助力开发者构建可维护的AI组件。

在科技的浪潮中,我们寻找着创新的火种,在代码的海洋里,我们编织着智慧的网。腾飞开源,就是这样一个由技术精英汇聚而成的博客平台,我们致力于分享在Java、Python、IoT和人工智能等领域的最新研究成果和实战经验。 在腾飞开源的博客上,你会看到紧跟技术前 1550

Spring Ai Advisors

Advisors 中文翻译过来的意思是顾问,它是用于拦截、修改和增强AI驱动的交互。类似于Spring 的AOP,通过Advisor可以实现请求返回的日志、对敏感词的过滤、对用户问题的增强以及chatMemory的保存都可以实现。自定义Advisor需要继承,重写before、after、getOrder方法。before表示在调用大模型之前的操作。after 表示在调用大模型之后的操作。getOrder 表示多个Advisor的执行顺序,从0开始执行。

qq_38527427的博客 1111

Spring-AI Advisors 体系框架与实战

在构建AI应用时,常常需要在模型调用前后执行一些`通用逻辑`,例如:记录日志、管理对话上下文、进行安全审查、或者注入额外的知识库信息。如果把这些逻辑都写在业务代码里,不仅会造成代码混乱,也难以复用和维护。 Spring AI 框架提供了一个`优雅的解决方案——Advisors`。它借鉴了 Spring 经典的 `AOP(面向切面编程)思想`,让你可以像“插件”一样,将这些`横切关注点(Cross-Cutting Concerns)`从核心业务逻辑中剥离出来,实现高度`可扩展`和`可定制`的AI应用。

penriver的博客 713

Spring AI之 Advisors API

核心组件Advisors API 类顾问链(Advisor Chain)核心机制顾问顺序(Advisor Order)API 概览实现顾问(Implementing an Advisor)示例日志记录顾问(Logging Advisor)重新阅读(Re2)顾问Spring AI 内置顾问聊天记忆顾问(Chat Memory Advisors)问答顾问(Question Answering Advisor)内容安全顾问(Content Safety Advisor)核心机制与适用场景流式与非流式顾问最佳实践。

湖边工程师 1359

7. 深入Spring AI:刨析 Advisors 机制

Spring AI Advisor 是连接 AI 模型与业务逻辑的核心中间件,其设计理念与 Spring AOP(切面编程)深度契合。他提供了一种灵活而强大的方法来拦截、修改和增强 Spring 应用程序中的 AI 驱动的交互。通过利用 Advisors API,开发人员可以创建更复杂、可重用和可维护的 AI 组件。例如,我们可能会建立聊天记录、排除敏感词或为每个请求添加额外的上下文。其大致的处理流程如下所示:我们将提示词发送给AI大模型;

有一只柴犬的专栏 1824

Windows下Python调用D435i相机避坑指南:从SDK版本选择到RealSense Viewer报错解决

本文详细介绍了在Windows环境下使用Python调用Intel D435i相机的完整避坑指南。重点解决了SDK版本选择问题,推荐使用稳定的Intel RealSense SDK 2.54.2版本,并提供了从环境配置、常见报错解决到实际应用案例的全流程实践指导,帮助开发者高效完成相机部署与开发。

palm99的专栏 924

Spring AI Advisors的具体定义和用途,怎么自定义业务Advisors?

Spring AI 中的是一个关键概念,用于在模型交互过程中动态调整或增强提示词(Prompt)、控制生成过程,或注入业务逻辑。它的核心思想是,类似于 AOP(面向切面编程)中的拦截器。

危险、的博客 1819

Redhawk-SC输入件配置中的5个常见错误及解决方法

本文针对Redhawk-SC功耗与可靠性签核工具,深入剖析了输入件配置中工艺文件错配、DEF文件路径、时序文件格式、电源网络模型及宏模型处理这5个最常见且棘手的错误。文章提供了资深工程师验证过的实战解决方案与检查清单,旨在帮助用户规避风险,提升配置效率与分析准确性,确保芯片签核流程的顺利进行。

earth的博客 233

spring-ai advisors 使用与源码分析

build();

dark 1030

保姆级教程:在ESXi 8.0上为NVIDIA ConnectX-5/6网卡开启SR-IOV(从BIOS到虚拟机配置)

本文提供在ESXi 8.0上为NVIDIA ConnectX-5/6网卡开启SR-IOV的详细教程,涵盖BIOS设置、固件配置、驱动优化及虚拟机部署。通过SR-IOV技术,显著提升虚拟化环境中的网络性能,适用于高性能计算、AI训练等场景。

weixin_26934905的博客 455

告别手动复制粘贴!用Python脚本+pywinauto实现PC微信消息自动发送(附完整源码)

本文详细介绍了如何利用Python和pywinauto实现PC微信消息的自动化发送,告别繁琐的手动操作。从环境搭建、UI控件定位到构建健壮的发送流程,再到高级功能扩展和项目打包部署,全面解析了自动化办公的实现方案,显著提升工作效率。

weixin_30315723的博客 585

Spring AI 系列之一个很棒的 Spring AI 功能——Advisors

由AI驱动的应用程序已成为我们的现实。我们正在广泛地实现各种RAG应用程序、提示API,并利用大型语言模型(LLM)创建项目。借助 Spring AI,我们可以更快速地完成这些任务。,它可以为我们处理各种日常任务。Advisor 是拦截器,用于处理我们 AI 应用程序中的请求和响应。我们可以使用它们为提示处理流程设置额外的功能。例如,我们可以建立聊天记录、排除敏感词,或者为每个请求添加额外的上下文。该功能的核心组件是接口。我们通过实现这个接口,来创建一系列Advisor,它们会影响我们的请求或响应。

wuchsh123的专栏 1249

45.qt quick-qml虚拟软键盘详解(一)

1.qml虚拟键盘介绍 Qt虚拟键盘的主要功能包括: 可定制的键盘布局和风格与动态切换。 带有单词选择的预测性文本输入。 角色预览和替代角色视图。 自动大小写和空格插入。 不同分辨率的可伸缩性。 支持不同的字符集(拉丁,简体/繁体中文,印地语,日语,阿拉伯语,希伯来语,韩语和其他)。 支持大多数常见的输入语言,可以轻松扩展语言支持。 从左到右和从右到左的输入。 硬件键支持2路和5路导航。 手写支持,带有全屏输入的手势。 音频反馈。 跨平台功能。 支持多国语言,高达40多个语言 本

抵抗时间扭曲,坚持做一件有意义的事 3560

Spring AI Advisors 深度解析与应用指南

摘要:本文深入解析了Spring AI Advisors的核心功能与应用场景,介绍了其在AI交互中的关键作用。Advisors通过拦截和增强AI请求/响应流程,实现内容过滤、上下文管理等功能,支持链式处理和自定义扩展。详细阐述了三种聊天记忆实现方式(Message/Prompt/VectorStore)及其适用场景,分析了短期与长期记忆的区别。文章还探讨了会话ID管理策略和安全组件SafeGuardAdvisor的应用,为构建高效、安全的AI交互系统提供了完整解决方案。

Vita_min_C的博客 1242

DSP的CLA调试技巧

本文介绍了基于TMS320F28377D的CLA(Control Law Accelerator)开发实战教程,涵盖基础配置、编程、调试与优化全流程。主要内容包括:CLA核心特性及其作为实时控制协处理器的优势;开发环境搭建与工程配置要点;CLA任务调度、数据交换及编程约束;调试技巧如断点设置和性能分析方法;进阶应用案例(批量除法运算)及优化策略;以及推荐的学习资源和硬件平台。教程强调数据一致性和任务同步问题,为快速上手CLA开发提供实用指导。

1043

YOLOv8【第十章:多任务扩展深度篇·第19节】YOLOv8 与 DeepLabV3+ 对比——实时性与精度的权衡!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 1万+

Spring AI Advisors API:AI交互的灵活增强利器

Spring AI Advisors API为开发者在Spring应用程序中实现灵活、强大的AI驱动交互提供了丰富的工具和机制。通过自定义顾问以及利用内置顾问程序,我们能够轻松地封装复杂的AI逻辑、转换数据并实现各种实用功能。在使用过程中,遵循最佳实践,注意向后兼容性和API的变化,能够帮助我们更好地利用这一强大的API。无论是构建智能聊天应用,还是为其他业务场景添加AI支持,Spring AI Advisors API都能成为我们开发过程中的得力助手,助力我们打造出更具创新性和竞争力的应用程序。

-曾牛的博客 1512

精通 Android NDK/JNI:从入门到精通实战与面试精粹

在Android开发中,

郑伟强dev的专栏 144

聊聊Spring AI的Advisors

");");/***/?

go4it 971

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring AI 学习—— Advisors

实现或@Component@Override// ① 请求前处理(修改 prompt、记录日志等).withUserText("请用中文回答:" + request.userText()).build();// ② 调用下一个 Advisor 或实际 AI 模型// ③ 响应后处理(过滤内容、记录结果等)@Override@Overridereturn 0;// 数字越小,优先级越高能力说明对话记忆自动管理多轮会话上下文RAG 增强自动检索并注入相关知识日志监控。

lvtianwang的专栏 458

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【Spring AI】Advisors API—顾问(即拦截器)

Advisors API :: Spring AI 参考在官方的介绍中,Spring AI Advisors API 提供了一种灵活而强大的方式来拦截、修改和增强 Spring 应用程序中的 AI 驱动交互。通过利用 Advisors API,开发人员可以创建更复杂、可重用和可维护的 AI 组件。主要优势包括封装重复出现的生成式 AI 模式、转换与大型语言模型 (LLM) 发送和发送的数据,以及提供跨各种模型和用例的可移植性。

m0_74289770的博客 1211

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Spring AI源码解读(二):Advisors

从源码详细解读Spring AI中Advisor的运行机制,通俗易懂!

qq_42068614的博客 1618

SpringAI-Advisors

递归Advisors是一类特殊的Advisors,能够多次循环执行下游的Advisor调用链.循环执行工具调用,直至不再需要调用任何工具校验结构化输出,校验失败则自动重试实现评估逻辑,并按需修改请求内容实现可修改请求参数的重试逻辑CallAdvisorChain.copy(CallAdvisor after) 工具方法是实现递归Advisors模式的核心。它会生成一条全新的Advisors子链:仅包含原调用链中指定 advisor 之后的所有 advisor。

qq_43676797的博客 232

Spring AI之ChatClient的Advisors

创建Advisor的时候设置order值,越小越先执行,链式请求先进先出原则。

weixin_36719332的博客 394
上一篇: 第 5 章 · ChatModel 与 Provider
下一篇: 第 7 章 · AI会话中的窗口记忆与长期记忆
AI深栈
博客等级 码龄14年 1粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值