- 博客(203)
- 收藏
- 关注
原创 MCP 协议 2025-11-25 版本新功能:任务、url 模式 Elicitation、取样时的工具调用和认证机制
在服务器的认证方面,为了方便客户端发现服务器的认证机制,MCP 协议之前仅提供了对 OAuth 2.0 Authorization Server Metadata 的支持。生成的结果,经过用户的审核之后,发送回服务器,完成整个取样的流程。在之前的协议版本中,服务器发送的 elicit 请求中,包含了期望客户端提供的数据的格式。第一种是动态客户端注册,使用的是 OAuth 2.0 Dynamic Client Registration Protocol,这也是早期版本的 MCP 规范中支持的注册机制。
2025-12-12 13:42:19
540
原创 Chat Agent UI,类似 ChatGPT 的聊天界面,Spring AI 应用的测试工具
目前的很多 AI 应用,提供的是类似 ChatGPT 的聊天机器人界面。在后端 API 的开发过程中,能够进行测试是非常重要的。不管是流式还是非流式,REST API 的请求类型是 ChatAgentRequest,返回值类型是 Flux<ServerSentEvent<ChatAgentResponse>>。考虑到大部分聊天机器人在界面上都是相似的,我开发了一个独立的界面,可以直接与 API 交互。它的功能是为 AI 应用的后端程序提供一个简易的测试界面,对 Spring AI 提供了更简单的集成方式。
2025-12-08 12:41:08
671
原创 Toon,面向 Token 的对象表示,比 JSON 更节省 Token 的数据编码格式
如果输入的 token 数量过大,不仅可能遇到模型的上下文窗口的上限,还可能由于提示中的内容过多,反而影响大模型的输出质量。在下面的测试中,输入的查询是“居住在新西兰的用户的名字”,与用户的数据一同发送给大模型。在发送给大模型的提示中,除了自然语言的指令之外,占据大头是其中的结构化数据,表示需要由模型来处理的输入数据。数组中包含的元素的类型通常是相同的,具有相似的结构。如果希望大模型产生结构化的输出,可以在提示中描述 Toon 的格式,并要求大模型给出 Toon 格式的输出,再使用类库解析即可。
2025-12-02 15:27:35
512
原创 链式工作流(Chain Workflow)【智能体开始模式】
内部的第一个 agent.execute 表示的是生成初始的文章的智能体的执行。第二个 agent.execute 表示的是优化文章内容的链条的执行过程。该链条内部有 3 个智能体的执行,分别对应于链条中的 3 个步骤。使用链式工作流的一个示例是优化文章内容的质量。最后一个智能体的输出是最终的任务执行结果。第一个步骤的输入是原始的任务输入。最后一个步骤的输出是整个任务的输出。每个步骤使用上一个步骤的输出作为该步骤的输入。下面是这些步骤使用的提升文章质量的建议。最后一个步骤产生的文章是任务的最终输出。
2025-11-25 18:46:56
230
原创 路由工作流(Routing Workflow)【智能体开发模式】
使用路由工作流模式的一个示例是,为客户服务的查询选择最合适的子系统。所有目标路由的信息,加上原始的任务输入,被发送给大模型,由大模型来进行选择。任务输入被传递给目标路由所对应的智能体来执行,该智能体的输出作为原始任务的输出。在最简单的情况下,目标路由的名称和描述是必须的。该模式的实现中包含了一个路由任务和一系列的目标任务。选择路由目标的逻辑,通常使用大模型来实现,也可以基于某些规则来实现路由的选择。路由工作流模式,对于一个任务的输入,从一个候选智能体的列表中选择最合适的目标,把任务的输入转发给该智能体。
2025-11-24 18:05:25
596
原创 并行工作流(Parallelization Workflow)【智能体开发模式】
这个智能体使用并行的子任务生成代码示例,每个任务负责生成一种编程语言的代码示例。sample_code 表示生成的代码示例,其值来自并行运行的子任务的结果。模式中介绍的代码生成的例子,智能体可以并行执行 3 个子任务来使用 3 个不同的模型评估代码。作为示例的智能体编写关于算法的文章。在这种情况下,在执行子任务之前,需要把原始的任务输入转换成子任务需要的类型。每个子任务负责收集不同领域的信息,最后把子任务的结果组装起来,得到最终的报告。如果所有的子任务返回相同类型的结果,它们通常使用相同类型的输入。
2025-11-23 18:24:32
620
原创 Spring AI 1.1 正式发布,新功能介绍
从实现的层次来说,CallAdvisorChain 中新增了一个新的方法 copy,其作用是复制当前 CallAdvisorChain 中,从指定的 CallAdvisor 之后的其余 CallAdvisor,返回一个仅包含这些 CallAdvisor 的新链条。Advisor 是 Spring AI 中的一个重要功能,可以对发送给大模型的请求和大模型的响应进行处理。这次版本升级包含的内容比较多,这里进行一下具体的介绍。新的模型,包括不同服务提供商推出的新模型,比如 OpenAI 的 GPT-5 系列等。
2025-11-22 18:29:12
763
原创 【Java 25】紧凑对象头,减少内存消耗,提升性能
已经有很多的试验可以证明,启用紧凑对象头可以提升应用的性能,包括减少 heap 的使用,减少 CPU 时间,和减少 GC 的次数。从 Java 24 开始,紧凑对象头这个功能在生产环境上得到了验证,证明了该功能的稳定性,也确实可以提升系统的性能。类指针的压缩必须被启用,并且压缩之后的类指针的尺寸从 32 比特减少到 22 比特。紧凑对象头(Compact Object Headers)使得 JVM 中对象头的大小,从目前的 96 或 128 比特,减少到在 64 位平台上的 64 比特。
2025-11-19 17:14:33
303
原创 【Java 25】实例 main 方法和紧凑源代码,极简 Hello World 程序
在之前的 Java 版本中,入口类的 main 方法的声明必须是 public static void main(String[] args)。如果是非 static 的实例 main 方法,则要求入口类有一个非私有的,不带任何参数的构造方法。这个简单的程序中,其实所包含的元素很多,包括 public,static,还有 main 方法的 String[] 参数,以及 System.out 的使用。作为一个入门的程序,其中的复杂度还是太高了,包含了很多不必要的概念。里面包含了最少的元素,适合于初学者。
2025-10-21 14:21:49
256
原创 【Java 25】Class-File API,解析、生成和转换 Java 字节码的标准 API
比如构建类的 ClassBuilder, 构建方法的 MethodBuilder,和构建字段的 FieldBuilder 等。比如,表示类的 ClassModel,表示方法的 MethodModel,和表示字段的 FieldModel 等。在 Java 相关的开发中,对字节码(byte code)的操作,一直以来被认为是比较高级的技巧。在下面的代码中,对于方法中的调用指令,检查所调用方法的所有者,是否为 OldService。在下面的代码中,被解析的是当前的 Java 类的字节码,输出全部方法的名称。
2025-10-15 16:38:42
403
原创 【Java 25】稳定值(Stable Value)
首次调用该 Supplier 的 get 方法时,会调用所封装的 Supplier 的 get 方法来产生值,并设置到 StableValue 中。在这些新的内容中,我个人认为最实用的是 Stable Value(稳定值),因为 Stable Value 解决了一个开发中由来已久的问题,那就是如何延迟设置不可变的值。多次调用 stable 方法返回的 Supplier 的 get 方法,会发现只输出一条消息到控制台,表明被封装的 Supplier 的 get 方法,只被调用了一次。这可以提升系统的性能。
2025-10-13 17:21:49
349
原创 MCP 工具,2025-06-18 版本的更新
该工具的 annotations 的声明如下,其中 readOnlyHint 的值是 true,destructiveHint 的值是 false,idempotentHint 的值是 true,openWorldHint 的值是 false。为了保证向后兼容性,如果工具的调用结果中包含了结构化的内容,也同时应该把 JSON 对象序列化之后的 JSON 文本包含在 content 中。提到 MCP 中的工具,最被大家熟悉的是工具的三要素,分别是工具的名称、描述和输入参数的schema。
2025-09-01 19:08:06
382
原创 服务器推送事件(Server-sent Events,SSE),大模型流式输出与 MCP
比如,如果大模型的响应中,包含了调用自定义函数的名称和参数。这就要求响应的处理方,缓存已经接收到的部分参数值,聚合成完整的参数值之后,再进行实际的函数调用。SSE 最大的优势在于,构建在已有的 HTTP 基础设施之上,实现和维护的成本低,学习的成本也低。随着 AI 大模型和 MCP 相关开发的流行,服务器推送事件(Server-sent Events,SSE),这个相对小众的技术又一次出现在大家的面前。随着应用的发展,产生了服务器主动发送数据给客户端的需求,比如,最典型的场景是服务器主动推送通知给客户端。
2025-08-27 19:00:41
986
原创 大模型的工具调用与 MCP
在获取到大模型的响应之后,从响应中提取到要调用的函数名称和输入参数,同样根据函数名称找到对应的 ToolCallback 对象,调用 ToolCallback 的 call 方法完成函数的调用,把得到的调用结果发送回大模型。对于大模型的响应中包含的函数调用的信息,根据函数名称,使用 MCP 客户端把调用请求发送给提供该工具的 MCP 服务器,并获取调用结果。工具是从大模型的角度来的。作为大模型的使用者,我们既可以直接使用模型内置的工具,也可以提供自定义的函数定义,由大模型推导出调用函数的实际参数值。
2025-08-24 17:13:41
392
原创 DeepSeek V3.1 发布
其他的推理模型,比如 OpenAI 的 GPT-5 和 o3,以及 Anthropic 的 Claude,都支持函数调用。如果使用 DeepSeek 的 API,可以使用的模型仍然是 deepseek-chat 和 deepseek-reasoner。deepseek-chat 对应的是 DeepSeek V3.1 的非思考模式,deepseek-reasoner 对应的则是思考模式。在严格模式下,模型的输出会严格遵守函数的输入参数的 JSON Schema 的要求。
2025-08-22 20:05:42
418
原创 MCP 传输方式,stdio、HTTP SSE 和 Streamable HTTP
POST 请求的内容可以是单个 JSON-RPC 的请求、通知或响应,或多个请求或通知组成的数组,或多个响应组成的数组。如果 POST 请求的内容中包含了任意数量的JSON-RPC 请求,服务器可以返回一个SSE流,或是 JSON 格式的响应。HTTP 传输方式增加了服务器的部署难度,但是对客户端来说简化了很多,只需要一个连接服务器的 URL 即可,服务器可以部署在云端。客户端控制服务器的生命周期。stdio 传输方式最大的优势是可以访问用户的本地环境,尤其是用户的私有文件,适合于个人使用的场景。
2025-08-20 19:22:15
535
原创 MCP 网关,MCP 服务器的集中式管理
Docker MCP 网关使用的是简单的聚合策略。使用了 MCP 网关之后,应用的 MCP 客户端连接到 MCP 网关,MCP 网关连接到实际的 MCP 服务器。网关可以提供 MCP 服务器的集中管理,包括 MCP 服务器的添加和删除,工具的过滤,服务器和工具的权限控制等。客户端所连接的是一个虚拟的 MCP 服务器,该服务器所包含的提示模板,资源和工具,由网关从多个MCP服务器聚合而来。网关可以采用不同的聚合策略,既可以简单地聚合全部 MCP 服务器的工具,也可以根据用户的权限来控制工具的可见性。
2025-08-19 16:36:24
710
原创 《MCP Java 开发实战》课程介绍
一个 Java 开发的 AI 应用,集成了 Java MCP客户端之后,可以使用 JavaScript 或 Python 编写的 MCP 服务器中的外挂知识。这一部分介绍了 4 个相对完整的实战项目,分别是文件系统MCP服务器,文本转SQL的MCP服务器,实现了检索增强生成的MCP服务器,以及一个通用的MCP测试客户端。由于 MCP 的重要性,现在的 AI 应用开发,离不开对 MCP 的了解。通过这五个部分的介绍,可以对 MCP 有完整的了解,从而学会如何开发自己的 MCP 服务器和客户端。
2025-08-18 20:38:38
316
原创 MCP(Model Context Protocol)是什么?
MCP Java 开发实战》是本人录制的付费课程,对 MCP 开发进行了详细的介绍,包括 MCP 协议的细节,MCP 服务器和客户端的开发详解,提供了 3 个 MCP 服务器的实战案例,分别是文件系统 MCP 服务器、文本转 SQL MCP 服务器、以及实现了检索增强生成的 MCP 服务器,最后是一个集成了大模型和 MCP 客户端的测试 MCP 服务器的通用工具。就是引入一个标准的协议,把外挂知识的提供和使用划分为服务器和客户端两个角色,服务器和客户端之间使用标准的协议进行交互。文本是最基础的模态。
2025-06-30 17:49:45
515
原创 评估者-优化者 (Evaluator-Optimizer) 【智能体开发模式】
与并行工作流模式共同使用时,可以执行多个并行的评估,取这些评估值的平均值,作为最终的评估结果。当达到了最大的执行次数之后,即便评估的结果是不通过,最后一次生成的结果仍然会被返回。如果评估的结果是不通过,代码可以基于评估的反馈进行优化。评估者-优化者模式通过评估者的反馈来优化前一次生成的结果,从而提高最终生成结果的质量。如果评估不通过,feedback 中包含的是评估者的反馈。生成了初始的结果之后,可以对生成的代码进行评估。优化之后的代码会被再次评估,直到通过评估,或者达到了最大的评估次数。
2025-04-06 16:11:55
1063
原创 任务执行模式【智能体开发模式】
在执行任务时,智能体会准备这些变量的值,填充到模板之后,得到实际的提示内容。任务执行是最特殊的模式。推理模型很强大,但是任务执行智能体所执行的任务,应该是简单和直接的。这里介绍的任务执行模式是狭义上的概念,也是最小的任务单元。任务在执行时,发送请求给大模型,以大模型的结构化输出作为任务的执行结果。模板中对生成的用户进行了清晰的限制,给出了 User 中的每个字段的要求。实际上,现在的大模型的能力很强,可以执行很复杂的任务。如果预期的大模型输出有相对固定的长度,可以设置大模型的输出 token 的数量上限。
2025-04-01 16:40:39
861
原创 Java 24 中,synchronized 不再导致虚拟线程被锁定
Java 21 引入的虚拟线程,对 Java 的多线程开发产生了深远的影响。下面首先简单回顾一下 Java 中的虚拟线程。Java 中的线程分成平台线程和虚拟线程。平台线程是重量级的,与操作系统的原生线程一一对应,由操作系统进行调度。应用所能创建的平台线程数量受限。虚拟线程是轻量级的,由 Java 运行时负责创建和调度。虚拟线程所耗费的资源很少。可创建的虚拟线程的数量,在理论上仅受限于系统的内存大...
2024-11-24 18:38:27
1175
原创 文本转SQL(Text-to-SQL),场景介绍与 Spring AI 实现
在众多的 AI 大模型的应用场景中,Text-to-SQL,也就是文本转 SQL,是其中实用性很高的一个。Text-to-SQL 充分利用了大模型的优势,把用户提供的自然语言描述转换成 SQL 语句,还可以执行生成的 SQL 语句,再把查询结果返回给用户。在实际的业务系统中,绝大部分数据都保存在数据库中,其中以关系数据库为主流。这使得 SQL 成为了很多人的必备技能,除了程序员之外,还包括大量非技...
2024-11-06 08:02:10
2570
原创 AI 大模型中的 Token,不同模型对 Token 的处理
在进行 AI 大模型应用开发时,很多人接触到的第一个相对陌生的概念,就是 token。但是 token 又是绕不开的名词,token 是大模型输入和输出的计量单位,更重要的,token 也是使用大模型时的计费单位。token 是大模型对文本进行编码的一种方式。计算机理解的不是文本,而是数值。不管是文本,还是图像和视频,在计算机内部的编码方式都是数值。更具体的来说,是数值的数组,也就是向量。以文本来...
2024-11-01 16:21:19
1664
原创 鸟的分类,Java AI 图像分类应用的开发,使用 ONNX Runtime
当提到 AI 应用开发,大部分人第一时间想到的应该是大模型应用开发。目前的大模型应用开发确实是最热的。AI 应用还有很多其他的应用场景,包括图像分类,文本分类和对象识别等。目前来说,运行不同 AI 任务的难度降低了很多,不再是机器学习专家才能完成的。这得益于很多类似 Hugging Face 这样的开发平台,以及 Transformers 这样的开源库。我们只需要在开放平台上找到合适的模型,利用开...
2024-10-31 15:36:47
1077
原创 使用 llamafile 以单个文件运行本地大模型
在开发 GenAI 应用时,有一个在本地运行的大模型是非常重要的,可以很方便地进行开发和测试。目前有几个流行的在本地运行大模型的选项,包括 Ollama 和 LM Studio。这里介绍的是 llamafile。llamafile 是 Mozilla 支持的开源项目。llamafile 的目标是以单个文件来分发和运行大模型。每个大模型对应一个文件。这个文件可以直接运行。不需要安装,也不需要运行额...
2024-10-06 17:01:59
770
原创 使用 Jupyter Notebook 运行 Spring AI 代码示例
在使用 Spring AI 开发 GenAI 应用时,经常会参考 Python 相关的代码。没办法,在 GenAI 上的支持,Python 比 Java 要好不少。LangChain,LlamaIndex 这些Python 库,很多 GenAI 应用开发都在用。在 GitHub 上可以找到很多的代码示例。很多代码示例都是用Jupyter Notebook 写的。Jupyter Notebook ...
2024-10-04 09:00:21
567
原创 广智救我!RAG 技术让 AI 大模型知道广智是谁
《黑神话:悟空》这个游戏有多火,不用我多说了。如果你问这些天命人,当没血快死的时候怎么办?大喊一声:广智救我。广智是《黑神话:悟空》里面的一个小boss,玩家击败它之后,可以获得变身为广智的能力。变身之后有新的血条,非常适合于没血的时候来保命和反杀。连西游记电视剧的弹幕,都是广智救我。那么,广智到底是谁?估计很多人第一时间都想不起来这个人物。广智出自西游记第十六回:“观音院僧谋宝贝 黑风山怪窃袈裟...
2024-10-02 11:01:40
1149
原创 JDK HttpClient - Java 11 可用的 JDK 内置的 HTTP 客户端
在 Java 应用的开发中,发送 HTTP 请求是一个常见的需求。应用在开发时,通常会使用流行的开源第三方库作为 HTTP 客户端,如 Apache HttpClient 或 OkHttp 等。这里介绍的是 JDK 自带的 HttpClient 实现,Java 11 可用。说到这里,还在用 Java 8 的朋友不用着急划走,Java 8 的下一个 LTS 版本就是 Java 11 了,没准什么时候...
2024-07-22 17:59:18
2640
原创 Spring AI 应用开发中设置访问 Ollama 的超时时间
使用 Spring AI 开发 AI 应用时,Ollama 通常在本地开发和测试时使用,用来在本地运行大模型。由于本地开发机器的资源限制,当使用 Ollama 运行较大的模型时,大模型给出响应的时间会比较长。Spring AI 提供的 OllamaChatModel 与 Ollama 服务器交互时,默认的超时时间是 30 秒。也就是说,如果 Ollama 服务器无法在 30 秒内给出响应,Spri...
2024-07-12 23:01:42
4450
1
原创 OpenJDK 23 新特性介绍
OpenJDK 23 将于 2024 年 9 月 17 号正式发布。目前 JDK 23 处于 Rampdown Phase One 阶段。在这个阶段,JDK 23 的功能集已经被冻结,不再添加新的 JEP。GitHub 上已经创建了 JDK 23 的分支,接受 bug 修复。JDK 23 的 Early-Access 版本也已经提供了下载。下面介绍一下 JDK 23 中的新特性。作为一个非 LTS...
2024-07-11 11:14:26
2198
原创 字符串模板被噶了,JDK 23 删除了预览功能“字符串模板”
之前出了一个视频,介绍 JDK 23 中的新特性。之后我才发现,在 JDK 21 和 22 中的预览功能“字符串模板(String Templates)”,在 JDK 23 中已经没有了。字符串模板的相关代码,已经被全部删除了。字符串模板的功能,Java 社区已经期待太久了。其他主流的编程语言,都提供了字符串插值的功能。Java 语言一直没有,也确实说不过去。JDK 21 中字符串模板的出现,解决...
2024-07-10 10:38:01
3001
1
原创 通义千问 2,大模型应用开发时的新选择
我在进行 AI 相关的开发中,最常用的模型是通义千问。本地开发的时候,使用 Ollama 来运行 qwen 模型。集成测试和线上环境,使用阿里云模型服务灵积上的通义千问模型。使用阿里云的好处是:模型服务的获取方便,稳定性好,可以及时获取到服务支持。现在通义千问出了新的版本,qwen2。qwen2 有 4 种参数尺寸:0.5b、1.5b、7b 和 72b。qwen2 的 0.5b 和 1.5b 的上...
2024-07-04 17:17:19
1552
原创 Spring AI 1.0.0 新变化,从 0.8.1 如何升级
Spring AI 1.0.0-M1 版本已经发布,距离 1.0.0正式版又更近了一步。同时这也意味着,Spring AI 1.0.0的 API 已经基本确定,不会发生大的改动。这里介绍一下,相对于上一个发布版本0.8.1,Spring AI 1.0.0的一些重要的变化。首先是把与 AI 模型进行交互的ModelClient拆分成了两个接口。Model 接口负责与模型进行交互,承接了之...
2024-07-02 10:46:14
2049
原创 模块导入声明 - Java 23 新特性
作为 Java 程序员,对 import 声明肯定并不陌生。通过 import 声明,可以导入单个类型,也可以使用通配符来按需导入。举例来说,如果需要使用 Java 集合框架中的 List 类型,可以使用 import 导入 java.util.List,也可以使用通配符来导入 java.util.*。每个 Java 源文件都会默认导入 java.lang 包。实际上,很多常用的类并不包含在 ja...
2024-06-30 12:09:02
505
原创 2024 New Relic Java 生态系统报告
New Relic 发布了 2024 年度 Java 生态系统报告,数据来源于使用 New Relic 监控的线上 Java 应用。从这个报告中,我们可以看到 Java 发展的一些趋势。在 Java 版本方面,新版本的使用率越来越高。Java 11 的使用率是 32.9%,Java 17 的使用率是 35.4%,Java 8 的使用率降到了 28.8%。值得一提的是,最新的 LTS 版本 Java...
2024-06-11 23:37:18
859
原创 Spring AI 进阶开发实战
随着 AI 技术和大模型的流行,AI 应用开发成为了时下的热点。很多开发者开始学习 AI 应用开发。对广大 Java 开发人员来说,Spring AI 是开发 AI 应用最好的选择。作为 Spring 的子项目,Spring AI 在扩展性上做得很好,可以很方便地集成到已有的 Spring 项目中。Spring AI 的发展,类似于现在的 Spring Cloud,会出现越来越多的集成,包括聊天...
2024-05-22 12:16:29
651
1
原创 AI 大模型的检索增强生成 - Spring AI 实现
Retrieval Augmented Generation,简称 RAG 技术,在构建知识库类型的应用中有着广泛的使用。RAG 技术可以弥补基座大模型,数据缺失和过时的问题,不需要进行模型微调,适用的范围广,在实现上的成本更低。RAG 技术弥补了大模型信息不完整和过时的问题。大模型训练完成之后,其中所包含的信息不再变化。如果大模型训练时的材料中不包含某些方面的信息,在生成相关的内容时,就会输出一...
2024-05-21 12:20:35
1045
原创 深入理解 Java 虚拟线程
作为主流的服务器端开发语言之一,开发高并发的应用一直是 Java 核心的应用场景。线程是 Java 中并发的基本单元。开发高并发的应用,离不开对线程的高效使用。很多人一听到多线程开发,就有种头大的感觉。但是,在日常开发中都会直接或间接地与线程打交道。线程是绕不开的难题。多线程开发确实不容易。如果可以选择,大家肯定都会选择同步单线程的方式,而不是异步多线程。同步单线程的方式对开发人员很友好。代码可读...
2024-05-20 13:09:26
469
原创 AI 大模型智能体,人设、记忆、规划与行动
提到大模型相关的应用,就肯定会听过一个词,叫智能体,也就是 Agent。打开通义千问的 APP,就有一个“智能体”的标签页,里面有各种智能体。这里我们说到的智能体,全称是 Large Language Model based Autonomous Agent,简称为 LLM Agent,或直接叫 Agent,指的是以大模型作为推理引擎的智能体。智能体之所以受到关注,是因为借助大模型的推理能力,智...
2024-04-24 08:00:22
1514
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅