南昌网站忧化南昌网站建设哪家强

张小明 2026/1/10 13:50:48
南昌网站忧化,南昌网站建设哪家强,网站建设方案 doc,小程序游戏开发平台引子 在上一篇文章中#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进行投诉反馈,一经查实,立即删除!

北京猎梦网站建设网站推广宜选刺盾云下拉

国家自然科学基金数据查询利器:NSFC工具全面解析与应用指南 【免费下载链接】nsfc 国家自然科学基金查询 项目地址: https://gitcode.com/gh_mirrors/nsf/nsfc 还在为繁琐的科研数据查询而烦恼吗?想快速获取国家自然科学基金项目的精准信息吗&…

张小明 2026/1/10 6:41:08 网站建设

包头网站建设价格安徽专业网站制作公司

如何用一个“缩放魔法”解决大屏适配的千年难题?你有没有遇到过这样的场景:团队加班一个月,终于把数据大屏做出来了——图表精美、动效流畅、领导看了都说好。结果一到客户现场,投影仪一接,满屏错位、文字模糊、图表被…

张小明 2026/1/10 6:41:09 网站建设

水处理网站模板网易企业邮箱收费吗

寒武纪MLU优化方案:在国产硬件上高效执行向量计算 在政务、金融和科研机构日益强调数据自主可控的今天,如何构建一个既高效又安全的大模型本地化系统,已成为AI落地的关键命题。大语言模型(LLM)虽已普及,但其…

张小明 2026/1/10 7:07:56 网站建设

宿迁网站建设多少钱最开放的浏览器

文章目录一、初识生态二、环境搭建三、权重转换四、格式转换五、开始微调六、推理部署多模态大模型正在改变AI的应用边界,从文生图到文生视频,从图像理解到全模态交互,这些能力的背后离不开强大的算力支持和高效的推理框架。最近我在昇腾平台…

张小明 2026/1/10 3:09:36 网站建设

网站页面格式品牌网站建设福州

Netty 一、Netty 原理概述 (一)Netty 是什么 Netty 是一个高性能的网络编程框架,它提供了异步的、事件驱动的网络应用程序框架和工具,用于快速开发可维护的高性能和高可靠性的网络服务器和客户端程序。 (二&#xff09…

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

自媒体可做外链网站网络营销的四种形式

一、系统概述​ 基于 Python 和 AES(Advanced Encryption Standard,高级加密标准)算法开发的文件夹加密解密系统,是一款专注于文件夹级数据安全保护的工具。该系统通过 AES 对称加密算法对文件夹中的所有文件(包括子文…

张小明 2026/1/10 6:07:35 网站建设