当前位置: 首页 > news >正文

java 使用 spring AI 实战MCP

最近在腾讯云edgeone的直播中了解到了MCP,随着了解发现MCP确实是一个未来发展的趋势
MCP :全称 Model Context Protocol 是一种专为人工智能模型设计的通信协议,于2024年11月由Anthropic推出的开放标准。它旨在解决复杂AI系统中多个模型或组件之间的协同、状态管理和资源优化问题,以及AI应用与外部数据源和工具集成中的挑战。
MCP 是一个开放协议,用于标准化应用程序向大语言模型提供上下文的方式。它类似 AI 应用的 USB–C 端口,MCP 连接 AI 模型与不同数据源和工具,能帮助构建基于大语言模型的智能体和复杂工作流,。MCP 具有一系列预构建的集成、可灵活切换 LLM 提供商和遵循客户端 – 服务器架构等特点。

访问地址:https://modelcontextprotocol.io/introduction

在这里插入图片描述
github :https://github.com/modelcontextprotocol

在这里插入图片描述
解决了什么问题:传统上,AI模型与外部数据源的集成需要为每个数据源开发自定义接口,既耗时又容易出错。MCP通过提供一个统一协议,简化了这一过程,开发者可以轻松连接到多个数据源,而无需重复编写代码。这减少了开发复杂性,并降低了维护和安全风险。

功能

  • 上下文状态管理
  • 动态上下文传递:允许模型在处理请求时保留和共享关键信息(如用户历史对话、当前任务状态),确保连贯性。
  • 版本控制:管理不同模型版本的上下文兼容性,避免因升级导致的逻辑冲突。
  • 分布式处理:支持跨服务器、跨设备并行处理,降低延迟并提高吞吐量。
  • 数据隔离:通过加密通道和访问控制确保敏感数据(如用户隐私信息)仅在授权范围内流动。
  • 审计日志:记录模型交互轨迹,便于合规性检查和责任追溯。
  • 缓存机制:对高频查询结果进行缓存,减少重复计算。
  • 模块化设计:支持插件式扩展(如新增自定义指令处理器或集成特定工具API)。
  • 多模态支持:原生适配文本、图像、音频等多种数据格式,简化多模态应用开发。
  • 上下文融合:将物流结果与用户历史偏好(如偏爱快递公司A)结合,生成个性化回复。
  • 反馈闭环:记录用户对回复的满意度,动态优化后续响应策略。

组件

  • ContextManager:管理用户会话上下文(历史消息、订单号、偏好等)。
  • IntentClassifier:自然语言理解模型,识别用户意图(如查询订单、投诉建议)。
  • ServiceRouter:根据意图路由到对应服务(如订单查询API、天气查询模型)。
  • DialoguePolicy:对话策略模型,决定回复策略(如确认信息、追问细节)。

源码:https://github.com/modelcontextprotocol/java-sdk
在这里插入图片描述
源码大家可以拉下来看看做了解,这里偶遇一篇讲MCP Java SDK源码的文章:https://www.51cto.com/article/810408.html

MCP Server 平台 : https://mcp.so/zh

案例:10分钟搞定高德地图MCP!我用AI解决了约会地点选择难题 ,这个案例虽然不是java实现的,但是也很值得大家了解和学习,这个类似的demo我在腾讯云edgeone的直播中有看到相似的案例

在了解MCP信息浏览github时发现一个项目有记录MCP相关
https://github.com/punkpeye/awesome-mcp-servers/blob/main/README-zh.md
在这里插入图片描述
检索java相关发现有个 spring-ai-mcp
在这里插入图片描述
在这里插入图片描述
点进来就到了spring ai 文档中了,原先用过spring ai 调用本地大模型进行聊天,刚好有所了解
在这里插入图片描述
开始 spring aimcp
首先电脑需要有 npx 环境 ,如果没有自行百度进行安装
在这里插入图片描述

在 MCP Server 平台。找一个现成的server进行使用
在这里插入图片描述
找一个操作文件的server
在这里插入图片描述
找到 NPX 留着备用

在这里插入图片描述

初始化项目
在这里插入图片描述

pom文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.yxy</groupId>
  <artifactId>spring-ai-mcp</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>spring-ai-mcp</name>
  <url>http://maven.apache.org</url>

  <properties>
    <java.version>17</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <version>3.2.4</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.ai</groupId>
      <artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>
      <version>1.0.0-M6</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.ai</groupId>
      <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
      <version>3.2.4</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>8</source>
          <target>8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-bom</artifactId>
        <version>1.0.0-M6</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>


</project>

在这里插入图片描述

application.yml
配置文件 ollama 配置的我原先本地部署的千问模型 大家自行更改
还有就是一个mcp的配置,需要指定mcpsevers的json文件

spring:
  application:
    name: spring-ai-mcp

  ai:
    ollama:
      base-url: http://localhost:11434
      chat:
        options:
          model: qwen2.5-coder:7b

  mcp:
    client:
      enabled: true
      name: mcp-client
      version: 1.0.0
      type: SYNC
      request-timeout: 30s
      stdio:
        servers-configuration: classpath:/mcp-servers-config.json

mcp-servers-config.json
我这里是使用的操作文件的server,大家想测试其他的只需要在这个配置文件进行配置
而我这里是windows上使用,所以将 MCP Server 平台 复制过来的命令做了个调整

{
  "mcpServers": {
    "filesystem": {
      "command": "cmd",
      "args": [
        "/c",
        "npx",
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "F:\\web"
      ]
    }
  }
}


OllamaController

package org.yxy.controller;

import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.mcp.SyncMcpToolCallbackProvider;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OllamaController {



    @Resource
    private OllamaChatModel ollamaChatModel;

    @Resource
    private SyncMcpToolCallbackProvider toolCallbackProvider;

    @GetMapping("/ai/ollama")
    public String ollama(@RequestParam(value = "msg") String msg) {
        ChatClient chatClient = ChatClient.builder(ollamaChatModel)
                .defaultTools(toolCallbackProvider.getToolCallbacks())
                .build();
        String content = chatClient.prompt(msg).call().content();
        System.out.println(content);
        return content;
    }



}

运行后浏览器直接访问
在这里插入图片描述

如果半天没有响应大家稍等下,本地环境有限,会有点慢
在这里插入图片描述
在这里插入图片描述
简易版demo已实现了,进行下一步
在这里插入图片描述
当我们配置的type是同步使用时就使用同步的依赖,这个可以在多client时进行使用
在这里插入图片描述
所有注册的MCP工具通过ToolCallbackProvider实例以ToolCallback列表的形式提供
在这里插入图片描述
就是我们这里的demo使用的是操作file的Server,这里可以看到其提供的工具
在这里插入图片描述
我让其帮我创建一个文件夹
在这里插入图片描述

在这里插入图片描述
在我打断点请求查看时发现创建成功了
这里的 toolCallbackProvider.getToolCallbacks()[9]是 list_allowed_directories方法所在数组中的位置,本想查看来着,结果创建成功了

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

http://www.dtcms.com/a/107675.html

相关文章:

  • centos-LLM+EmbeddingModel+VectorDB-简单模型
  • Aliee,Bengio and Theis:细胞数据上的因果机器学习
  • 代理模式-spring关键设计模式,bean的增强,AOP的实现
  • Spring SpringBoot 细节总结
  • 【ROS】 CMakeLists 文件详解
  • 大数据Spark(五十六):Spark生态模块与运行模式
  • 《 C语言中的变长数组:灵活而强大的特性》
  • 【git项目管理】长话短说
  • JVM生产环境问题定位与解决实战(六):总结篇——问题定位思路与工具选择策略
  • 如何给槽函数传递用户的参数
  • Vue3的组件通信
  • 博卡软件管理中心8:赋能美容美发行业数字化转型的智能解决方案
  • TensorFlow实现逻辑回归
  • 释义ES6中的箭头函数
  • 源码编译安装nginx和php
  • 透过 /proc 看见内核:Linux 虚拟文件系统与 systemd 初始化初探
  • 表面法线估计(Surface Normal Estimation)
  • CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例
  • 为什么 js 对象中引用本地图片需要写 require 或 import
  • Windows 实战-evtx 文件分析--笔记
  • 国标GB28181视频监控平台EasyCVR保驾护航休闲娱乐“九小场所”安全运营
  • 基于Python设计的TEQC数据质量可视化分析软件
  • JavaScript基础-移动端常用开发插件
  • 从零开始学java--常用工具类介绍
  • obsidian ios git同步
  • 【企业文化】CXO是什么?
  • arcgis jsapi 4.31调用geoserver发布/{z}/{x}/{y}.png
  • python-leetcode 63.搜索二维矩阵
  • JavaScript中Symbol详解及使用场景
  • c++:封装哈希表实现unordered_map与unordered_set