德州网站网站建设沈阳做网站的地方

张小明 2026/1/14 20:25:02
德州网站网站建设,沈阳做网站的地方,装修设计软件酷家乐,美食介绍网站模板引子 在上一篇文章中#xff0c;我们通过集成 SearXNG#xff0c;成功让大模型“睁眼看世界”#xff0c;具备了获取互联网实时信息的能力。然而#xff0c;无论是 RAG#xff08;检索增强生成#xff09;还是联网搜索#xff0c;本质上都是让 AI “读” 更多的书#…引子在上一篇文章中我们通过集成 SearXNG成功让大模型“睁眼看世界”具备了获取互联网实时信息的能力。然而无论是 RAG检索增强生成还是联网搜索本质上都是让 AI“读”更多的书获取更多的信息。但一个真正的智能助手不仅要能“读”还要能“写”和“做”。试想这样一个场景你希望 AI 帮你整理今天的股市数据并生成一份 Excel 报表保存到桌面或者你希望 AI 帮你给客户发送一封会议邀请邮件。在目前的架构下大模型只能告诉你“邮件内容写好了请你复制粘贴去发送”它就像一个被困在罐子里的“超级大脑”虽然博学却无法触碰现实世界。为了打破这个次元壁我们需要引入MCPModel Context Protocol模型上下文协议。关于它的概念不多赘述概念网上相关的文章已经很多了有需要了解请看MCP中文文档https://docs.mcpcn.org/introduction。本文将分为两个部分实战 MCP作为客户端Client调用现成的 MCP 服务。作为服务端Server开发我们自己的 MCP 服务。调用 MCP 服务操作本地文件Spring AI 提供了spring-ai-mcp-client允许我们的应用连接到任何遵循 MCP 标准的服务器。这里我们以官方提供的文件系统 MCP 服务器为例让 AI 具备在本地创建和读取文件的能力。前提条件由于文件系统 MCP 服务是基于 Node.js 的请确保你的本地环境已安装 Node.js (v18)。1.添加依赖在pom.xml中引入 MCP Client 相关的依赖dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-mcp-client/artifactId/dependencydependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-mcp/artifactId/dependency2. 配置 MCP Server 连接MCP 支持两种连接模式stdio标准输入输出适用于本地进程和sseServer-Sent Events适用于网络服务。对于本地文件系统服务我们使用stdio模式。在resources目录下新建mcp-server.json文件定义如何启动文件系统服务{mcpServers:{filesystem:{command:D:\\devolop\\node\\npx.cmd,args:[-y,modelcontextprotocol/server-filesystem,D:\\devolop]}}}配置解析command: 指向你的npx可执行文件路径Windows 下通常是npx.cmd。args:-y: 自动确认安装。modelcontextprotocol/server-filesystem: 官方的文件系统 MCP 服务包。D:\\devolop:这是允许 AI 访问的根目录。为了安全起见AI 只能操作这个目录及其子目录下的文件。接着在application.yml中启用 MCP Client 并加载上述配置spring:ai:mcp:client:enabled:truename:spring-ai-mcp-clienttype:ASYNC# 推荐使用异步非阻塞模式stdio:servers-configuration:classpath:mcp-server.json3.代码改造我们需要在ChatService初始化时将 MCP Client 发现的工具注册到ChatClient中。publicChatServiceImpl(ChatClient.BuilderchatClientBuilder,ToolCallbackProvidertools){// tools 会自动注入所有配置好的 MCP 工具this.chatClientchatClientBuilder.defaultToolCallbacks(tools).build();}4.效果测试启动项目观察控制台日志可以看到MCP工具已经连接成功。现在我们在对话框中输入这些内容打开我们配置的D:\devolop目录可以看到文件已经被成功创建。开发 MCP 服务邮件与时间工具除了调用现有的工具更常见的场景是将我们自己的业务逻辑如查询内部系统、发送通知封装成 MCP 工具供大模型调用。为了演示我们创建一个新的模块mcp-server实现“获取当前时间”和“发送邮件”两个功能。在mcp-server模块的pom.xml中添加必要的依赖。除了 WebFluxMCP Server 常用底层我们还需要spring-boot-starter-mail来发送邮件以及flexmark用于将 AI 生成的 Markdown 内容转换为邮件友好的 HTML。?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.cc/groupIdartifactIdSpringAI-MCP-RAG-Dev/artifactIdversion1.0-SNAPSHOT/version/parentartifactIdmcp-server/artifactIdpropertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependencyManagementdependenciesdependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-bom/artifactIdversion1.0.0/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementdependencies!-- MCP Server 依赖 --dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-mcp-server-webflux/artifactId/dependency!-- 邮件发送依赖 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-mail/artifactId/dependency!-- Markdown 转 HTML 工具 --dependencygroupIdcom.vladsch.flexmark/groupIdartifactIdflexmark-all/artifactIdversion0.64.8/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.apache.commons/groupIdartifactIdcommons-lang3/artifactIdversion3.17.0/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactId/dependency/dependencies/project1.添加配置在application.yml中配置 OpenAI Key、Redis用于向量存储或缓存以及 SMTP 邮件服务信息。spring:application:name:spring-ai-mcp-serverdata:redis:host:127.0.0.1port:9379password:123456ai:mcp:server:name:spring-ai-mcp-server-sseversion:1.0.0sse-endpoint:/ssetype:asyncmail:host:smtp.163.comport:465username:123163.compassword:123456# 注意这里通常是邮箱授权码不是登录密码protocol:smtpdefault-encoding:UTF-8properties:mail:smtp:socketFactory:port:465class:javax.net.ssl.SSLSocketFactoryssl:enable:truelogging:level:root:infoserver:port:6080启动项目访问http://localhost:6080/sse如果能正常启动说明配置无误。2. 开发时间查询工具大模型本身对“现在是几点”没有概念我们需要提供一个工具。packagecom.cc.mcp.tool;importlombok.extern.slf4j.Slf4j;importorg.springframework.ai.tool.annotation.Tool;importorg.springframework.stereotype.Component;importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;ComponentSlf4jpublicclassDateTool{// Tool 注解将方法暴露为 MCP 工具// description 非常重要大模型根据它来判断何时调用此工具Tool(description获取当前时间)publicStringgetCurrentTime(){log.info(调用MCP工具获取当前时间);returnString.format(当前的时间是 %s,LocalDateTime.now().format(DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss)));}}3. 开发邮件发送工具这是一个稍微复杂一点的工具需要定义参数结构。packagecom.cc.mcp.tool;importcom.vladsch.flexmark.html.HtmlRenderer;importcom.vladsch.flexmark.parser.Parser;importcom.vladsch.flexmark.util.data.MutableDataSet;importjakarta.mail.MessagingException;importjakarta.mail.internet.MimeMessage;importlombok.*;importlombok.extern.slf4j.Slf4j;importorg.springframework.ai.tool.annotation.Tool;importorg.springframework.ai.tool.annotation.ToolParam;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.mail.javamail.JavaMailSender;importorg.springframework.mail.javamail.MimeMessageHelper;importorg.springframework.stereotype.Component;ComponentSlf4jpublicclassEmailTool{privatefinalJavaMailSendermailSender;privatefinalStringfrom;AutowiredprivateEmailTool(JavaMailSendermailSender,Value(${spring.mail.username})Stringfrom){this.mailSendermailSender;this.fromfrom;}// 定义请求参数类大模型会自动填充这些字段DataToStringNoArgsConstructorAllArgsConstructorpublicstaticclassEmailRequest{ToolParam(description收件人邮箱地址)privateStringemail;ToolParam(description发送邮件的标题/主题)privateStringsubject;ToolParam(description发送邮件的消息/正文内容)privateStringmessage;ToolParam(description发送邮件的内容类型1为HTML格式2为普通文本格式)privateIntegercontentType;}Tool(description给指定邮箱发送邮件信息。)publicStringsendEmail(EmailRequestemailRequest){log.info(调用MCP工具sendEmail);log.info(请求详情: {},emailRequest);IntegercontentTypeemailRequest.getContentType();try{MimeMessagemimeMessagemailSender.createMimeMessage();MimeMessageHelpermimeMessageHelpernewMimeMessageHelper(mimeMessage);mimeMessageHelper.setFrom(from);mimeMessageHelper.setTo(emailRequest.getEmail());mimeMessageHelper.setSubject(emailRequest.getSubject());// 智能处理如果是 Markdown 格式自动转 HTMLif(contentType!nullcontentType1){mimeMessageHelper.setText(convertMarkdownToHtml(emailRequest.getMessage()),true);}elseif(contentType!nullcontentType2){mimeMessageHelper.setText(emailRequest.getMessage(),true);}else{// 默认处理mimeMessageHelper.setText(emailRequest.getMessage());}mailSender.send(mimeMessage);return邮件发送成功;}catch(MessagingExceptione){log.error(发送邮件失败,e);return发送邮件失败: e.getMessage();}}/** * 将Markdown格式的字符串转换为HTML格式 */publicstaticStringconvertMarkdownToHtml(StringmarkdownStr){MutableDataSetdataSetnewMutableDataSet();ParserparserParser.builder(dataSet).build();HtmlRendererhtmlRendererHtmlRenderer.builder(dataSet).build();returnhtmlRenderer.render(parser.parse(markdownStr));}}4. 注册工具最后在启动类或配置类中将我们编写的 Tool Bean 注册到ToolCallbackProvider中。package com.cc.mcp; import com.cc.mcp.tool.DateTool; import com.cc.mcp.tool.EmailTool; import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.ai.tool.method.MethodToolCallbackProvider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } /** * 注册自定义 MCP 工具 * 这样 ChatClient 就能感知到这些工具的存在 */ Bean public ToolCallbackProvider registerMCPTools(DateTool dateTool, EmailTool emailTool) { return MethodToolCallbackProvider.builder() .toolObjects(dateTool, emailTool) .build(); } }5. 综合测试启动项目观察日志确认工具已加载。测试时间查询测试邮件发送增加记忆功能让对话更连贯在实际使用中我们可能会分多轮对话来完成任务。但默认情况下ChatClient是无状态的它记不住上一句说了什么为了解决这个问题我们需要引入Chat Memory。在ChatServiceImpl中注入ChatMemory并将其配置到ChatClient中privatefinalChatClientchatClient;// 注入 ChatMemorypublicChatServiceImpl(ChatClient.BuilderchatClientBuilder,ToolCallbackProvidertools,ChatMemorychatMemory){this.chatClientchatClientBuilder// 添加记忆 Advisor.defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build()).defaultToolCallbacks(tools).build();}配置完成后模型就具备了上下文记忆能力能够流畅地处理多轮意图确认。小结通过本篇文章我们实现了 Spring AI 应用功能的重大飞跃从单纯的“信息获取者”进化为了“任务执行者”。利用MCP Client我们轻松集成了现有的文件系统服务。利用Spring AI Tool我们开发了自定义的邮件和时间服务。利用Chat Memory我们赋予了 AI 记忆使其交互更加自然。现在我们的 AI 已经可以操作文件、发送邮件了。但在企业级应用中最核心的数据往往存储在数据库中。如何让大模型安全、准确地查询和操作数据库下一篇我们将探讨基于 MCP 的大模型与数据库交互开发。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

标准网站建设价格深圳网站建设服务哪些便宜

ICDAR数据集测试得分:公开榜单上的实际排名查询 在文档数字化进程不断加速的今天,如何让机器“读懂”图像中的文字,早已不再是一个简单的技术问题。从银行柜台的身份核验到跨境电商的商品说明翻译,从发票自动录入到视频字幕提取&a…

张小明 2026/1/11 7:04:36 网站建设

自己做网站用什么app电商网站建设合同

在移动办公和数字娱乐日益普及的今天,如何将安卓设备屏幕无缝投射到电脑并实现精准控制,已成为众多用户的核心需求。QtScrcpy作为一款开源免费的安卓投屏工具,凭借其超低延迟和流畅体验,彻底解决了传统投屏软件的诸多痛点。本文将…

张小明 2026/1/11 20:43:06 网站建设

网站设计主题有哪些安徽网站开发哪家好

量子物理中的势能与能级研究 1. 自旋 - 轨道耦合与简并能级 在量子物理中,简并的各向同性振子能级会受到自旋 - 轨道耦合的影响。例如,到 $n = 3$ 的简并能级会因自旋 - 轨道耦合而分裂,这种分裂机制有助于解释原子核的壳层结构。自旋 - 轨道耦合的“强”表现为其引起的能…

张小明 2026/1/12 21:01:26 网站建设

网站重新建设的申请书软件app开发需要多少钱

第一章:Agent驱动的智慧物流概述在现代物流系统中,智能化与自动化已成为提升效率、降低成本的核心驱动力。Agent驱动的智慧物流通过引入自主决策的智能体(Intelligent Agent),实现对运输、仓储、配送等环节的动态感知、…

张小明 2026/1/11 9:42:36 网站建设

wordpress 网站维护响应式网络网站源码

12 月 30 日,雷军的一场 “硬核预告” 直接点燃了数码科技圈的热情——小米创始人雷军通过微博官宣,12 月 31 日晚 8 点将开启跨年直播,核心环节竟是邀请工程师现场拆解小米 YU7。这场跳出常规的直播形式,给追求观众准备了一份充满…

张小明 2026/1/7 15:13:43 网站建设

网站的优化排名怎么做济南seo公司案例

Java核心技术栈大厂面试实战:面试官vs谢飞机,笑料中学技术 前言 互联网大厂的Java面试总是充满紧张与挑战。今天,我们用故事的形式——严肃的面试官与幽默的水货程序员谢飞机——带你逐步剖析Java核心技术栈。看似搞笑的对话背后,…

张小明 2026/1/11 15:49:44 网站建设