SpringBoot+MCP实现本地工具调用实战
写在前面前面我们学习了MCP以及其中的三个角色,包含客户端、服务端和资源端,对应的解释如下:
(1)客户端:可理解为是Ai应用层,如聊天对话框。用户输入信息后,由客户端接口接收,再由客户端调用服务端调配资源处理;
(2)服务端:可理解为注册中心,请注意所有的工具都是注册在服务端;
(3)资源端:资源端就是大模型解析之后的用户需求的服务,即实际的处理逻辑。资源端可以和服务端部署在一起,也可以单独部署。
资源端第一步,新建一个名为ai-mcp-server的SpringBoot项目,注意SpringBoot版本为3.4.2,JDK版本为17。之后pom.xml文件信息如下所示:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162<?xml version="1.0" encoding="UTF-8"?><project xmlns="http:/ ...
聊一聊最近很火的MCP协议
写在前面笔者最近在用Dify调用工具,但是发现效果非常不好,而且内部都是封装好的,不知道它是如何调用工具的。而现在公司恰好有些需求是要求让大模型直接调用本地文件,目前只能将文件上传上去,但是大模型的数据通常都是截止到某个时间点的,即训练的数据集始终是落后且固定的,无法实时获取数据。
当然我们可以使用联网搜索,也可以使用知识库,接口等方式将自己的数据上传给大模型,但是感觉使用起来还是差点意思,无法做到架构的统一化。鉴于此,MCP协议诞生了。
什么是MCPMCP全称(Model Context Protocol),即模型上下文协议,是美国一家Ai初创公司Anthropic于2024年11月推出的一种开放协议,旨在标准化大模型(LLM)与外部数据源、工具的交互方式。Anthropic也是大语言模型Claude的母公司。
MCP的主要目的在于解决当前AI模型因数据孤岛限制而无法充分发挥潜力的难题,MCP可以使AI应用能够在安全控制下,访问及操作本地和远程数据,为AI应用提供了连接万物的接口。
即MCP可直接在AI与数据(包括本地数据和互联网数据)之间架起一座桥梁,通过MCP服务器和MCP客 ...
如何在本地搭建LLM并使用
写在前面本篇来学习如何在Windows上安装属于开发者自己的大模型,主要以Ollama为例进行介绍。Ollama 是一款优秀的开源工具,让开发者可以在本地轻松运行和管理各种大型语言模型(LLMs)。
Ollama介绍Ollama 是一个简化大型语言模型(LLM)部署和使用的工具。它具有以下特点:
本地运行: 模型完全在您的本地计算机上运行,无需联网,保护您的隐私和数据安全。
简单易用: 通过简单的命令行指令,即可下载、运行和管理各种 LLM。
模型丰富: 支持 Llama 2、Deepseek、Mistral、Gemma 等多种流行的开源模型。
跨平台: 支持 macOS、Windows 和 Linux 系统。
开放API:支持与OpenAI兼容的接口,可以和其他工具集成。
安装OllamaWindows平台安装点击 Ollama官网,选择合适的版本:
之后笔者将其下载到F盘,但是笔者希望将Ollama安装到E盘的指定目录下,此时可以是以如下方式进行安装目录自定义:
执行该命令,之后就会将Ollama安装到自定义目录下。
MacOS平台安装点击 Ollama官网,选择合适的版本 ...
聊一聊常用的3种实时技术
写在前面我们知道,早期网站只展示静态内容,但是现在我们更希望实时更新、即时聊天、通知推送和动态仪表盘等功能,因此就有必要学习目前常用的3种实时技术了。
常用的有SSE、WebSocket和Long Polling这三种,下面将分别进行介绍:
(1)SSE(Server-Send Events):轻量级单向数据流;
(2)WebSocket:全双工双向通信;
(3)Long Polling(长轮询):传统过渡方案。
假设现在我们有如下三个业务场景,它们都需要实现数据实时更新:
股票交易仪表盘;
即时聊天平台;
实时新闻推送。
面对这些需求,我们该如何选择合适的方案呢?接下来我们将从实战、架构、性能和扩展性角度来进行分析。
Long Polling(长轮询)原理长轮询的原理就是客户端持续地询问服务器,有点类似于吃饭排队时,站在店门口,每隔几分钟询问是否轮到你吃饭了么,可见效率非常低下。
优点(1)实现简单,标准的REST;(2)兼容性最好。
缺点(1)高延迟;(2)浪费大量资源,存在大量的空请求;(3)扩展性差。
适用场景当系统无法使用WebSocket或者SSE,且需要支持对老旧浏览 ...
MySQL同步ES的6种方式
写在前面我们知道,在分布式系统日益发展的今天,MySQL与Elasticsearch的协同已成为解决高并发查询与复杂检索的标配组合。但是,如何实现两者间数据的高效同步,已成为架构设计中不可忽视的问题。笔者结合实际工作经验和一些参考文章,给出常用的6种可行的同步方式,以供在后续架构设计中作参考。
小批量数据同步方式同步双写【适用场景】对数据实时性要求较高,且业务逻辑较为简单的场景,如支付记录同步等。
【实现方式】在代码中同时写入MySQL和ES。
【示例代码】以下是同步双写的示例代码:
12345678910@Transactional public void createRecord(TRecord trecord) { // 写入MySQL trecordMapper.insert(trecord); // 同步写入ES IndexRequest request = new IndexRequest("records") .id(trecord.getId()) .source ...
SQL调优常用的10种方式
写在前面本篇是笔者在实际工作中总结的10种常用的SQL调优方式,这里进行总结和分享。
常用方式避免使用select *很多时候为了方便写sql语句,都喜欢直接使用select *,一次性查出表中所有列的数据,如下所示:
1select * from t_user where id=1;
而在实际业务场景中,可能只需要两三列,多查了很多数据,又不用,白白浪费了数据库资源。此外多查出来的数据,通过网络IO传输的过程中,也会增加数据传输的时间。
最重要的是select *不会走覆盖索引,会出现大量的回表操作,而从导致查询sql的性能很低。此时我们应当根据实际情况,只查询要使用的列,多余的列不需要查询:
1select name,age from user where id=1;
小表驱动大表所谓的小表驱动大表,即使用小表的数据集来驱动大表的数据集。
举个例子,现在工单表有1000万数据,而用户表只有10万条,要查询所有有效用户最近一次处理的工单明显。可以使用in关键字,对应语句如下:
1234567select * from t_orderwhere user_id in ( ...
多租户架构设计与实践
写在前面本篇是笔者一年来对智能照明SaaS平台多租户改造升级的一些实践与体会,这些内容在技术分享会上已做了介绍,下面是一些重要的概念和思想。
多租户多租户简介多租户技术,它是一种软件架构技术,用于实现多用户环境下,共用相同的系统或者程序,并确保各个用户间数据的安全隔离。即一个单独的实例,可以为多个组织提供服务。
SaaS多租户(1)SaaS是Software-as-a-Service的缩写,意为软件即服务,即通过网络提供软件服务。(2)SaaS平台供应商将应用部署到自己的服务器上,客户可根据实际需要,通过互联网向厂商订购所需的应用软件服务,按照订购的服务多少及时间长短向厂商支付费用,并通过互联网获得SaaS平台供应商提供的服务。(3)SaaS服务基于一套标准的软件系统为成百上千个不同的客户(又称为租户)提供服务。这要求SaaS服务能够支持不同租户间的数据和配置隔离,同时支持对界面、业务逻辑、数据结构等方面的个性化需求开发。(4)由于SaaS同时支持多个租户,而每个租户又有很多用户,因此对支撑软件的基础设施平台的性能、稳定性和扩展性有很高的要求。(5)多租户是SaaS领域特有的产物。对于 ...
详解MySQL中的JSON数据类型
写在前面本篇来学习MySQL中的JSON数据类型,这在某些场景下比text类型好用很多。
JSONJSON 是 JavaScript Object Notation(JavaScript 对象表示法)的缩写,是一个轻量级的,基于文本的,跨语言的数据交换格式,易于阅读和编写。
JSON基本数据类型JSON 的基本数据类型如下:(1)数值:十进制数,前面不能有0,可以为负数或小数,也可以为 e 或 E 表示的指数。(2)字符串:字符串必须用双引号括起来。(3)布尔值:true,false。(4)数组:一个由零或多个值组成的有序序列。每个值可以为任意类型。数组使用方括号[] 括起来,元素之间用逗号,分隔。举个例子,如下所示:
1[1, "abc", null, false, "10:29:06.000000", {"id": 2}]
(5)对象:一个由零或者多个键值对组成的无序集合。其中键必须是字符串,值可以为任意类型。对象使用花括号{}括起来,键值对之间使用逗号,分隔,键与值之间用冒号:分隔。举个例子,如下所示 ...
聊一聊六种常用的属性配置读取方式
写在前面本篇来学习使用SpringBoot进行日常开发过程中,经常使用到的6种读取配置文件内容的方式,掌握和熟练使用对于提升自我能力有极大帮助。使用的SpringBoot版本为 2.7.11 。
EnvironmentEnvironment简介Environment 是 SpringBoot 的核心环境配置接口,它提供了很多方法用于访问应用程序属性,包括系统属性、操作系统环境变量、命令行参数和应用程序配置文件中定义的属性等。源码如下:
123456789101112131415161718192021222324252627282930313233public interface Environment extends PropertyResolver { String[] getActiveProfiles(); String[] getDefaultProfiles(); /** @deprecated */ @Deprecated boolean acceptsProfiles(String... profiles); boolean ...
聊一聊九种常用的分布式ID生成方案
写在前面本篇来学习9种常用的分布式ID生成方案,掌握这些对于提升自身能力有极大帮助。
为什么使用分布式ID分布式ID的定义这里以MySQL数据库为例进行说明,当我们的业务数据量不大时,单库单表完全可以支撑现有业务,数据再大一点时,使用MySQL主从同步、读写分离模式也能应付。但是当数据日益增长,达到亿级别的时候,就需要对数据库进行分库分表操作,而分库分表后需要有一个唯一的ID来标识每条数据,显然数据库的自增ID无法满足需求,那么这个 全局唯一ID 就叫 分布式ID 。
分布式ID满足的条件一般来说,分布式ID需要满足如下五个要求:
全局唯一:必须保证ID是全局性唯一;
高性能:高可用低延时,ID生成响应快,否则会成为业务瓶颈;
高可用:100%可用无法做到,但是要无限接近于100%的可用;
好接入:秉承拿来即用的设计原则,在系统设计和实现上要尽可能的简单;
趋势递增:最好有趋势递增,不过要结合实际业务进行分析。分布式ID的生成方式分布式ID的生成方式有很多种,此处列举常用的9种方式,如下所示:(1)UUID;(2)数据库自增ID;(3)数据库多主模式;(4)号段模式;(5)Redis ...