浅谈AI大模型-MCP

MCP简介

MCP(Model Context Protocol,模型上下文协议 ),24年11月初的时候Anthropic发了一篇技术博客,推出了他们的模型上下文协议MCP,介绍了一种规范:应用如何为LLM提供上下文。官网称MCP为AI应用的USB-C端口,提供一种将AI模型连接到不同数据源、工具的标准化方法。

官网:

Introduction - Model Context Protocol

MCP遵循CS(客户端-服务端)架构,一个AI应用可以连接到多个MCP服务器:

  • MCP Hosts(MCP 应用):如Claude Desktop、IDE、AI应用等,希望通过MCP访问数据或工具。
  • MCP Clients(MCP 客户端):与一对一与服务端进行连接,相当于我们应用中实现数据库交互需要实现的一个客户端。
  • MCP Servers(MCP 服务端):基于MCP协议实现特定功能的程序。
  • Local Data Sources:本地数据源,提供MCP服务器进行本地访问。
  • Remote Services:远端服务,供MCP服务器访问远端访问,例如api的方式。

MCP演变过程

MCP 框架在 AI 代理与数据源和工具的通信方式方面提供了一致性,使整个生态系统更高效、更易于构建,最终创建一个连接性更强、功能更强大的 AI 环境。这一切都始于传统的 LLM,到 RAG,再到 Agent 系统,再到 MCP。

AI两年半:模型上下文协议(MCP)的演进过程,共分为四个阶段:

第一阶段:传统大型语言模型(Traditional LLMs) 在这个阶段,用户直接与大型语言模型(LLM)进行交互。用户提出查询(Query),LLM 返回响应(Response)。这是最基础的交互模式,此阶段最明显的特点是没有使用新信息增强响应的机制,传统LLM(如早期GPT系列)依赖预训练的静态知识库,响应基于模型在训练数据中学到的模式。它们缺乏实时外部数据访问能力,输出受限于训练时的知识范围。

第二阶段:检索增强生成(RAG) 在 RAG 阶段,LLM 的能力得到了增强。除了直接处理用户查询外,LLM 还可以访问外部数据(External Data)。模型可以从文档、数据库和 API 中检索信息,这意味着 LLM 可以根据外部信息来生成更丰富、更准确的响应。

第三阶段:AI Agent 这个阶段引入了 AI Agent 的概念。用户不再直接与单个 LLM 交互,而是与一个编排器 Agent(Orchestrator Agent)交互。这个编排器 Agent 引入协调多个专用代理的 Orchestrator 代理,不同的代理处理特定任务(研究、计划、执行), 由 AI 管理的复杂工作流程,职责分散,通过专门的代理协作提高解决问题的能力,这使得系统能够处理更复杂、需要多步骤的任务。

第四阶段:模型上下文协议(MCP) 这是演进的最终阶段,引入了模型上下文协议(MCP)。用户与 MCP 进行交互,MCP 能够整合 AI Agent 和各种服务(Services),AI 模型与外部工具/服务之间的无缝集成, 改进了整个 AI 生态系统的互作性。

LLM、Prompt、RAG、Agent

LLM 与 LLM指令

大型语言模型(LLM)是一种人工智能技术,利用深度学习方法,通过在大量文本数据上进行自监督学习,理解和生成人类语言。它们可以执行多种自然语言处理任务,如问答、文档摘要、语言翻译和句子完成。

LLM通常采用Transformer神经网络架构,具有自注意力机制,能够并行处理序列数据,显著减少训练时间。它们拥有数百亿级别的参数,训练于庞大数据集如Common Crawl(500亿网页)和维基百科(5700万页面),并能自学语法、语言和知识,无需人工标注数据。

核心联系:指令是LLM的“操作界面”

  • 基础LLM(未微调):
    • 本质是一个“文本补全模型”,根据上下文预测下一个词,无法直接理解指令
    • 例如输入“法国的首都是”,它会补全“巴黎”;但若输入“告诉我法国的首都”,可能生成无关内容。
  • 指令微调的LLM(如ChatGPT):
    • 通过人工标注的指令数据(如“问:法国的首都是?答:巴黎”)进行微调,学会将用户输入解析为指令并执行
    • 此时输入“告诉我法国的首都”,它会明确识别这是问答指令,输出精准答案。

联系:指令是用户与LLM交互的“桥梁”,而指令微调让LLM从“文本生成器”升级为“任务执行者”。

Prompt提示词工程

  • 类比:像对助手说“帮我写一封辞职信”或“用Java写一个冒泡排序”,Prompt就是你对AI的“任务指令”。
  • 技术角度:Prompt是模型的输入文本,模型通过分析其语义和上下文生成后续内容。

Prompt的常见类型

类型

特点

示例

指令型

直接给出任务要求

“总结这篇文章的核心观点”

角色扮演型

指定模型身份

“假设你是莎士比亚,写一首十四行诗”

示例型

提供输入-输出样例引导

“将‘你好’翻译成法语:Bonjour → 现在翻译‘谢谢’”

链式思考

要求分步骤推理

“解方程2x+3=7,请逐步解释”

结构化输出

指定格式(JSON/表格等)

“列出中国三大城市,格式:{城市:人口}”

角色扮演

你好,就是我们的提示词,但是现实生活中,当我们和不同人聊天时,即便是完全相同的话,对方也会根据自己的经验给出不同的答案。

所以我们一般会这么会增加一个系统的prompt,作用是为了描述AI的角色与性格

RAG

RAG(Retrieval-Augmented Generation,检索增强生成)是一种将信息检索与大语言模型(LLM)生成能力结合的技术,旨在提升AI回答的准确性、时效性和可解释性。

RAG解决的核心问题

  • LLM的局限性
    • 知识固化:传统LLM依赖训练时的静态数据,无法实时获取新知识(如2024年新闻)。
    • 幻觉风险:可能生成看似合理但错误的内容。
    • 专业领域不足:对细分领域(如最新医学研究)缺乏深度知识。
  • RAG的应对:通过动态检索外部知识库,为LLM提供实时、准确的参考信息。

RAG的工作原理

流程分为两步

  1. 检索(Retrieval)
    • 用户提问后,RAG从外部知识库(数据库、文档、网页等)中检索相关片段。
    • 例如:提问“2024年诺贝尔奖得主是谁?” → 检索最新新闻或官网数据。
  1. 生成(Generation)
    • 将检索到的信息与用户问题一起输入LLM,生成最终回答。
    • 例如:模型结合检索到的“2024年诺贝尔化学奖得主:XXX”和问题,生成完整回复。

RAG的小demo

https://cloud.dify.ai/apps

AI Agent

AI Agent(人工智能代理)是指一种能够自主执行任务、与环境交互并做出决策的AI系统。例如,聊天机器人(如我,Grok)、虚拟助手或自动化工作流中的AI工具都可称为AI Agent。这些代理通常基于机器学习或大语言模型,能够处理自然语言、分析数据或执行特定任务。

  • 大语言模型是AI Agent的核心组件之一
  • 许多AI Agent以大语言模型为基础,利用其自然语言处理能力来理解用户输入、生成回复或执行任务。例如,我(Grok)是一个AI Agent,基于xAI的大语言模型技术。
  • LLM提供语义理解、对话生成和知识推理能力,使AI Agent能够与人类进行智能交互。
  • AI Agent利用LLM实现复杂功能
  • AI Agent通常结合LLM与其他技术(如强化学习、规则引擎或外部工具)来完成特定任务,比如搜索、规划、自动化工作流等。
  • 例如,LLM可以帮助AI Agent理解用户意图(如“帮我订机票”),并通过调用外部API或工具完成任务。

Function Calling

举个例子,假设我想让AI帮我打开并且管理电脑文件

与用户之间的交互,假设说我要让AI帮我找原神的安装目录

此时AI->解析用户的User prompt生成system prompt函数去调用ai agent,ai agent将调用结果返回给ai,ai再将结果进行语言组织返回给我们用户。

存在的问题

有些些Tool的功能其实挺通用的,比如说一个浏览网页的工具,可能多个Agent都需要,那我总不能在每个Agent面都拷贝一份相同的代码吧,太麻烦了,也不优雅,于是大家想到了一个办法

引出MCP

MCP模型上下文协议

MCP的几种通讯模式

Stdio(标准输入输出)

  • 描述:通过操作系统的标准输入(stdin)和标准输出(stdout)管道进行进程间通信(IPC)。客户端与服务器以JSON-RPC 2.0格式交换消息,消息以换行符(\n)分隔。
  • 适用场景:主要用于本地通信,适合客户端和服务器运行在同一台机器上的场景,例如本地命令行工具、开发环境或调试。
  • 特点
    • 优点:实现简单,低延迟,无需网络配置,适合本地批处理任务或简单工具调用。
  • 缺点:仅限于本地进程通信,不支持分布式部署或远程访问,同步阻塞式通信,发送方需等待接收方处理完毕。

SSE(Server-Sent Events,服务器发送事件)

  • 特点:基于 HTTP 的单向通信协议,服务器可主动向客户端推送数据。
    • 使用长连接(Long Polling),通过事件流(text/event-stream)传输数据。
    • 轻量级,适合实时性要求较高的场景(如状态更新、日志流)。
  • 适用场景
    • Web 应用中服务器向浏览器实时推送数据(如股票行情、聊天消息)。
    • Agent 作为服务端向监控端推送连续状态(如训练进度、传感器数据)。

Streamable HTTP(可流式传输的HTTP)

  • 特点
    • 基于 HTTP 的流式数据传输,支持分块编码(Transfer-Encoding: chunked)。
    • 允许逐步发送/接收数据,无需等待完整响应(如大文件传输、AI 生成的逐步输出)。
    • 双向或单向流式通信,兼容 RESTful 接口。
  • 适用场景
    • 大模型逐词生成文本(如 ChatGPT 的流式回复)。
    • 代理间传输大型文件或实时流数据(如视频流分析)。

Spring AI

项目要求:选JDK> 17

依赖
 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.6</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webflux</artifactId><version>${spring-ai.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency></dependencies>
Tools注册
@Configuration
public class ToolConfig {@Resourceprivate ApplicationContext applicationContext;@Beanpublic ToolCallbackProvider toolCallbackProvider() {// 获取所有工具Bean(假设都在tools包下且有ToolBean注解)Map<String, Object> toolBeans = applicationContext.getBeansWithAnnotation(ToolBean.class);return MethodToolCallbackProvider.builder().toolObjects(toolBeans.values().toArray()).build();}}
函数调用
package com.springai.mcp.jdbc;import com.springai.mcp.annotation.ToolBean;
import jakarta.annotation.Resource;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;@Component
@ToolBean
public class DBTool {@Resourceprivate JdbcTemplate jdbcTemplate;private final String sql = "SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'hwsj_activity'";private final String schemaSql = "SELECT COLUMN_NAME, DATA_TYPE, COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS " +"WHERE TABLE_SCHEMA = 'hwsj_activity' AND TABLE_NAME = ?";@Tool(name = "getTables", description = "获取所有可用的表名")public List<String> getTables() {List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);return maps.stream().map(map -> {String tableName = String.valueOf(map.get("TABLE_NAME"));String tableComment = String.valueOf(map.get("TABLE_COMMENT"));return tableName + " (" + tableComment + ")";}).collect(Collectors.toList());}@Tool(name = "getTableSchema", description = "根据表名获取Schema")public String getTableSchema(@ToolParam(description = "表名") List<String> tables) {return tables.stream().filter(t -> !t.isBlank()).map(tableName -> {List<Map<String, Object>> columns = jdbcTemplate.queryForList(schemaSql, tableName);String tablePrompt = columns.stream().map(map -> {String name = String.valueOf(map.get("COLUMN_NAME"));String type = String.valueOf(map.get("DATA_TYPE"));String comment = String.valueOf(map.get("COLUMN_COMMENT"));return String.format("%s (%s) - %s", name, type, comment);}).collect(Collectors.joining(", \n"));return String.format("Table: %s (%s)\n", tableName, tablePrompt);}).collect(Collectors.joining("\n"));}@Tool(name = "runSql", description = "执行SQL查询结果")public List<Map<String, Object>> runSql(@ToolParam(description = "sql") String sql) {if (sql.contains("DELETE") || sql.contains("UPDATE") || sql.contains("INSERT")) {throw new RuntimeException("执行SQL仅限于查询语句!");}return jdbcTemplate.queryForList(sql);}
}

MCP调试

https://github.com/modelcontextprotocol/inspector介绍

本地启动

访问

常见的MCP 客户端介绍

Claude、Cline、Cursor,Trae等,这边介绍下trae,crusor有时候会经常抽风

MCP通用配置格式

{"mcpServers": {"spring-ai-mysql": {"command": "java","args": ["-jar","/Users/taqu/IdeaProjects/spring-ai-mcp-demo/target/mcp-0.0.1-SNAPSHOT.jar"]}}
}

mcpServers服务器集合

spring-ai-mysql:mcp服务名称

command:服务器启动命令

args:启动参数

实现效果

讨论环节

参考文档

下一代企业IT架构:MCP中台和软件的进化_mcp架构-CSDN博客

10分钟讲清楚 Prompt, Agent, MCP 是什么_哔哩哔哩_bilibili

https://zhuanlan.zhihu.com/p/1903594795324118469

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/518.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ROS常用的路径规划算法介绍

在ROS中&#xff0c;常用的路径规划算法主要有以下几种&#xff1a; 全局路径规划算法 A*算法&#xff1a;在Dijkstra算法基础上加入启发式函数&#xff0c;如曼哈顿距离或欧氏距离&#xff0c;优先探索靠近目标的节点&#xff0c;效率更高。需使用可容许的启发式函数以保证最…

基于springboot+vue的数字科技风险报告管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系统展示 管理员登录 管理…

docker compose基本使用以及示例

一、docker-compose模板文件 字段含义build指定Dockerfile所在的文件夹路径image指定为镜像名称或镜像IDcontainer_name指定容器模式depends_on指定多个服务之间的依赖关系ports端口映射command覆盖容器启动后默认执行的命令entrypoint覆盖容器中默认的入口命令env_file从文件…

开源3D 动态银河系特效:Vue 与 THREE.JS 的奇幻之旅

一、Vue 与 THREE.JS 简介 &#xff08;一&#xff09;Vue Vue 是一个流行的 JavaScript 框架&#xff0c;它采用了组件化的设计思想&#xff0c;使得开发人员可以轻松地构建复杂的用户界面。Vue 提供了丰富的功能和工具&#xff0c;如数据绑定、指令、组件通信等&#xff0c…

EXISTS 和 NOT EXISTS 、IN (和 NOT IN)

在 SQL 中&#xff0c;EXISTS、NOT EXISTS 和 IN 都是用于子查询的条件运算符&#xff0c;用于根据子查询的结果过滤主查询的行。它们之间的区别主要体现在工作方式、效率、对 NULL 值的处理以及适用场景上。 1. EXISTS 和 NOT EXISTS 作用&#xff1a; EXISTS: 检查子查询是…

医疗标准集中标准化存储与人工智能智能更新协同路径研究(上)

摘要 为了提高医疗系统中文件管理的效率与质量,本文围绕医疗文档的集中化标准化存储与人工智能驱动的智能更新,构建了一种协同策略研究框架。通过分析医疗文档管理的痛点,结合集中化存储与AI技术的协同路径,提出了一种基于标准化文档处理与智能更新的协同优化方案。研究发现…

c# 比较两个list 之间元素差异

在C#中&#xff0c;比较两个List之间元素的差异通常有多种方法&#xff0c;具体取决于你想如何表达这些差异&#xff08;例如&#xff0c;找出存在于一个列表中但不在另一个列表中的元素&#xff09;。下面是一些常用的方法&#xff1a; 1. 使用Except方法 Except方法可以找出…

使用 KernelSU + PlayIntegrityFix 解决Root后ChatGPT不能使用的问题

参考文章: [GUIDE] &#x1f6e1;️ How to Pass Strong Integrity on Android (Step-by-Step Guide) 刚从iPhone转到Android的用户&#xff0c;买了一加13T&#xff0c;享受刷机折腾的乐趣&#xff0c;结果安装了ChatGPT以后&#xff0c;发现无法使用&#xff0c;报错&#xf…

STM32安全固件升级:使用自定义 bootloader 实现SD卡固件升级,包含固件加密

前言 在 STM32 嵌入式开发中&#xff0c;Bootloader 是一个不可或缺的模块。ST 公司为 STM32 提供了功能完备的官方 Bootloader&#xff0c;支持多种通信接口&#xff08;如 USART、USB DFU、I2C、SPI 等&#xff09;&#xff0c;适用于标准的固件更新方案。 然而&#xff0c…

变现与自我提升:加法与乘法的智慧抉择

在当今这个快速发展的时代&#xff0c;无论是追求财富的变现&#xff0c;还是致力于个人能力的提升&#xff0c;我们都会面临一个关键问题&#xff1a;是分类分步地逐步实现&#xff0c;还是将多种要素混合在一起&#xff1f;是简单地做加法&#xff0c;还是复杂的乘法运算&…

Outlook总是提示登录微软,怎么办?

1.问题描述 我的Outlook2021邮箱有一个问题&#xff0c;打开邮箱之后&#xff0c;总是提示让登录Microsoft的账号&#xff08;如图所示&#xff09;&#xff0c;因为个人和公司都没有连接微软&#xff0c;只能关闭&#xff0c;但点击关闭之后&#xff0c;就提示必须需要键入ex…

探秘 VR 逃生救援技术的奇妙世界​

VR 逃生救援技术之所以能为我们带来如此震撼和逼真的体验&#xff0c;背后离不开一系列先进技术的支撑。在 VR 逃生救援体验中&#xff0c;其核心在于利用虚拟现实技术&#xff0c;构建出高度逼真的火灾场景&#xff0c;让参与者仿佛身临其境。​ 在构建火灾场景方面&#xff0…