浅谈AI大模型-MCP

发布于:2025-06-30 ⋅ 阅读:(36) ⋅ 点赞:(0)

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 {

    @Resource
    private ApplicationContext applicationContext;

    @Bean
    public 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 {
     @Resource
     private 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


网站公告

今日签到

点亮在社区的每一天
去签到