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的工作原理
流程分為兩步:
- 檢索(Retrieval):
-
- 用戶提問后,RAG從外部知識庫(數據庫、文檔、網頁等)中檢索相關片段。
- 例如:提問“2024年諾貝爾獎得主是誰?” → 檢索最新新聞或官網數據。
- 生成(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
)傳輸數據。 - 輕量級,適合實時性要求較高的場景(如狀態更新、日志流)。
- 使用長連接(Long Polling),通過事件流(
- 適用場景:
-
- Web 應用中服務器向瀏覽器實時推送數據(如股票行情、聊天消息)。
- Agent 作為服務端向監控端推送連續狀態(如訓練進度、傳感器數據)。
Streamable HTTP(可流式傳輸的HTTP)
- 特點:
-
- 基于 HTTP 的流式數據傳輸,支持分塊編碼(
Transfer-Encoding: chunked
)。 - 允許逐步發送/接收數據,無需等待完整響應(如大文件傳輸、AI 生成的逐步輸出)。
- 雙向或單向流式通信,兼容 RESTful 接口。
- 基于 HTTP 的流式數據傳輸,支持分塊編碼(
- 適用場景:
-
- 大模型逐詞生成文本(如 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