mcp+llm+rag
MCP+RAG简介
- 前言
- 一、MCP是什么?
- 二、MCP工作原理
- (1. MCP Hosts(主机)
- (2.MCP Clients(客户端)
- (3. MCP Servers(服务端)
- (4. Local Data Sources(本地数据源)
- (5. Remote Services(远程服务)
- 三, 模型选取_最终效果
- 1,异步llm
- 四,开源代码通读
- 总结
前言
MCP(Model Connectivity Protocol) 是连接 AI 助手与数据系统的新一代开放标准,旨在打破数据孤岛,让前沿模型能够更高效地访问内容存储库、业务工具和开发环境中的数据,从而生成更精准、更相关的响应。
当前,尽管 AI 助手的推理能力和生成质量快速提升,但其潜力仍受限于数据隔离问题——关键信息往往分散在孤立的遗留系统和封闭平台中。每接入一个新数据源,都需要定制化开发,导致扩展困难、维护成本高昂。
MCP 通过统一的协议解决了这一挑战。它标准化了 AI 系统与数据源的连接方式,取代了传统的碎片化集成模式,使开发者能够以简单、可靠的方式为模型提供实时数据支持。这一进步不仅降低了技术复杂性,还为 AI 应用的大规模落地铺平了道路,让智能助手真正融入企业工作流和终端用户体验。
mcp官网地址
一、MCP是什么?
模型上下文协议是一个开放标准,使开发人员能够在其数据源和人工智能工具之间建立安全的双向连接。架构很简单:开发人员可以通过MCP服务器公开他们的数据,也可以构建连接到这些服务器的AI应用程序
二、MCP工作原理
MCP遵循客户端-服务器架构(client-server),其中主机应用程序可以连接到多个服务器
(1. MCP Hosts(主机)
定义:直接面向用户的程序或工具(如 Claude Desktop、IDE 插件、AI 工具),通过 MCP 协议请求数据或服务。功能:为用户提供交互界面(如聊天窗口、代码提示)。将用户请求转换为 MCP 标准协议,发送给对应的 MCP Server。
(2.MCP Clients(客户端)
定义:协议客户端,负责与 MCP Server 建立并维护 1:1 的通信连接。功能:管理连接的生命周期(如重连、加密)。转发主机(Host)的请求,并返回服务器(Server)的响应。
(3. MCP Servers(服务端)
定义:轻量级程序,每个服务端通过 MCP 协议暴露特定能力(例如文件读取、API 调用)。特点:模块化:不同服务端专注不同功能(如一个处理本地文件,另一个连接数据库)。标准化:统一协议确保与客户端的兼容性。数据源:可安全访问 Local Data Sources 或 Remote Services。
(4. Local Data Sources(本地数据源)
定义:用户设备内的数据或服务(如文件、SQLite 数据库、系统剪贴板)。安全机制:MCP Server 需获得明确权限(如用户授权)才能访问。
(5. Remote Services(远程服务)
定义:通过互联网调用的外部系统(如 OpenAI API、GitHub 接口)。角色:MCP Server 作为中介,将主机请求转发至远程 API,并返回处理结果。
三, 模型选取_最终效果
使用mcp服务需要特定的模型如图
整理网页-整理总结-保存文件
查询本地文档-注入上下文
1,异步llm
异步对话型LLM(Large Language Model,大语言模型)是一种结合了异步编程和对话交互能力的人工智能系统,专门设计用于处理需要长时间运行或多步骤协作的任务。
异步对话型LLM与传统同步LLM的核心差异主要体现在执行方式、功能扩展性和适用场景三个方面。异步对话型LLM采用非阻塞式执行模式,通过事件循环机制实现任务的高效调度,在等待I/O操作时能够释放系统资源处理其他请求,这种特性使其特别适合需要协调多个外部工具或服务的复杂多步骤任务,如自动化数据处理流水线或智能助手场景。相比之下,传统同步LLM采用阻塞式执行,必须顺序完成每个操作,主要面向简单的单轮问答场景,缺乏对工具链的动态协调能力。在资源利用方面,异步架构能够显著提高CPU利用率,尤其在I/O密集型任务中表现突出,而同步模型在高并发场景下容易因线程阻塞导致资源浪费。总体而言,异步对话型LLM代表了更先进的架构设计,为构建具备工具调用能力的智能代理系统提供了技术基础,而传统同步LLM则更适合轻量级的即时响应需求。
四,开源代码通读
我读过了这篇代码对我有了很多启发
classDiagram
class Agent {
+mcp_clients: list[MCPClient]
+model: str
+llm: AsyncChatOpenAI
+system_prompt: str
+context: str
+init()
+cleanup()
+invoke(prompt: str)
}
class MCPClient {
+name: str
+command: str
+args: list[str]
+version: str
+init()
+cleanup()
+get_tools()
+call_tool(name: str, params: dict)
}
class AsyncChatOpenAI {+model: str+messages: list+tools: list[Tool]+system_prompt: str+context: str+chat(prompt: str, print_llm_output: bool)+get_tools_definition()+append_tool_result(tool_call_id: str, tool_output: str)
}class EembeddingRetriever {+embedding_model: str+vector_store: VectorStore+embed_query(query: str)+embed_documents(document: str)+retrieve(query: str, top_k: int)
}class VectorStore {+items: list[VectorStoreItem]+add(item: VectorStoreItem)+search(query_embedding: list[float], top_k: int)
}class ALogger {+prefix: str+title(text: str, rule_style: str)
}Agent --> MCPClient
Agent --> AsyncChatOpenAI
Agent ..> EembeddingRetriever
EembeddingRetriever --> VectorStore
Agent ..> ALogger
AsyncChatOpenAI ..> ALogger
通过调用上面几个类来对大模型进行异步处理
参考代码
其中我想要重点说明mcp代码
"""
MCP (Model Context Protocol) 客户端实现该模块提供了与MCP服务进行交互的异步客户端实现,支持通过标准输入输出(stdio)与外部工具服务通信。
基于 https://modelcontextprotocol.io/quickstart/client 修改实现。主要功能:
1. 管理MCP服务进程的生命周期
2. 提供工具发现和调用接口
3. 处理异步通信和资源清理典型使用场景:
- 在AI Agent系统中集成外部工具
- 构建可扩展的工具调用框架
"""import asyncio
from typing import Any, Optional
from contextlib import AsyncExitStackfrom mcp import ClientSession, StdioServerParameters, Tool
from mcp.client.stdio import stdio_clientfrom rich import print as rprintfrom dotenv import load_dotenvfrom augmented.mcp_tools import PresetMcpTools
from augmented.utils.info import PROJECT_ROOT_DIR
from augmented.utils.pretty import RICH_CONSOLE# 加载环境变量
load_dotenv()class MCPClient:"""MCP协议客户端实现属性:name: 客户端名称标识command: 启动服务端的命令args: 服务端启动参数version: 协议版本session: MCP会话连接exit_stack: 异步资源管理器tools: 可用的工具列表"""def __init__(self,name: str,command: str,args: list[str],version: str = "0.0.1",) -> None:"""初始化MCP客户端Args:name: 客户端名称(如"filesystem")command: 启动服务端的命令(如"python -m mcp.filesystem")args: 服务端启动参数列表version: 协议版本号"""self.session: Optional[ClientSession] = Noneself.exit_stack = AsyncExitStack()self.name = nameself.version = versionself.command = commandself.args = argsself.tools: list[Tool] = []async def init(self) -> None:"""初始化客户端连接"""await self._connect_to_server()async def cleanup(self) -> None:"""清理资源并关闭连接"""try:await self.exit_stack.aclose()except Exception:rprint("Error during MCP client cleanup, traceback and continue!")RICH_CONSOLE.print_exception()def get_tools(self) -> list[Tool]:"""获取可用工具列表Returns:当前可用的工具列表"""return self.toolsasync def _connect_to_server(self) -> None:"""建立与MCP服务端的连接1. 配置服务端参数2. 建立stdio通信管道3. 初始化MCP会话4. 获取可用工具列表"""server_params = StdioServerParameters(command=self.command,args=self.args,)# 建立stdio通信通道stdio_transport = await self.exit_stack.enter_async_context(stdio_client(server_params),)self.stdio, self.write = stdio_transport# 创建MCP会话self.session = await self.exit_stack.enter_async_context(ClientSession(self.stdio, self.write))# 初始化会话await self.session.initialize()# 获取并存储可用工具列表response = await self.session.list_tools()self.tools = response.toolsrprint("\nConnected to server with tools:", [tool.name for tool in self.tools])async def call_tool(self, name: str, params: dict[str, Any]) -> Any:"""调用指定工具Args:name: 工具名称params: 工具参数字典Returns:工具执行结果"""return await self.session.call_tool(name, params)async def example() -> None:"""使用示例演示如何初始化文件系统和网络请求工具客户端"""for mcp_tool in [PresetMcpTools.filesystem.append_mcp_params(f" {PROJECT_ROOT_DIR!s}"),PresetMcpTools.fetch,]:# 打印服务启动命令(调试用)rprint(mcp_tool.shell_cmd)# 创建并初始化客户端mcp_client = MCPClient(**mcp_tool.to_common_params())await mcp_client.init()# 获取并打印工具列表tools = mcp_client.get_tools()rprint(tools)# 清理资源await mcp_client.cleanup()if __name__ == "__main__":# 运行示例asyncio.run(example())
总结
简单来说mcp是使用异步操作对大模型的api进行异步操作,和mcp客户端来选择将要使用的tool。mcp是一种标准化的协议可以将模型与浏览器进行直接操作而没有那么多的限制了。