MCP构建AI应用学习笔记(3)
MCP 架构的本质是通过和,让 AI 应用的每个功能单元既独立可控,又能灵活组合。其核心逻辑可概括为 “三层一储”(输入层、处理层、输出层、存储层),所有模块围绕 “数据驱动” 流转 —— 数据从输入层进入,经处理层加工,再由输出层呈现,中间关键信息存入存储层,全程通过统一接口衔接,彻底解决传统开发中 “代码缠绕、改一处动全身” 的问题。
MCP 架构详解:从分层设计到数据流转逻辑
一、MCP 架构的核心思想:用 “分层 + 模块化” 实现 “可拆可拼”
MCP 架构的本质是通过清晰的分层设计和标准化的模块划分,让 AI 应用的每个功能单元既独立可控,又能灵活组合。其核心逻辑可概括为 “三层一储”(输入层、处理层、输出层、存储层),所有模块围绕 “数据驱动” 流转 —— 数据从输入层进入,经处理层加工,再由输出层呈现,中间关键信息存入存储层,全程通过统一接口衔接,彻底解决传统开发中 “代码缠绕、改一处动全身” 的问题。
二、MCP 核心分层详解:职责、组件与接口标准
MCP 的每一层都有明确的 “职责边界”,层内组件遵循统一的接口标准,层间通过固定数据格式交互,具体如下:
1. 输入层:“数据入口”—— 负责 “收对、收准” 数据
核心职责
接收用户输入或外部系统数据,并完成 “格式校验、清洗、标准化”,确保后续模块能直接使用高质量数据(避免因输入格式混乱导致下游报错)。
关键组件与接口标准
组件名称 | 核心功能 | 输入接口(必填字段) | 输出接口(固定字段) |
---|---|---|---|
文档解析组件 | 处理 PDF/Word/Excel 等文件 | file_path (文件路径)、file_type (类型)、allow_encrypted (是否支持加密) |
parsed_text (结构化文本)、page_count (页数)、error (错误信息) |
文本输入组件 | 处理用户手动输入的文本 | user_input (原始文本)、max_length (最大长度限制) |
cleaned_text (清洗后文本)、is_valid (是否有效)、length (文本长度) |
语音转文字组件 | 处理语音输入(如麦克风) | audio_path (语音文件路径)、language (语言类型) |
transcribed_text (转写文本)、confidence (置信度)、duration (语音时长) |
典型场景示例
当用户上传一份加密的 PDF 时,文档解析组件会先校验allow_encrypted
参数:若为True
,则尝试解密并提取文本;若为False
,则在error
字段返回 “不支持加密文件”,且parsed_text
为空 —— 输入层通过这种 “预处理 + 容错”,确保下游模块无需处理无效数据。
2. 处理层:“核心大脑”—— 负责 “算对、算快” 逻辑
核心职责
承接输入层的标准化数据,完成 AI 核心逻辑(如 LLM 调用、规则判断、工具协作),是 MCP 架构的 “业务核心”。该层支持 “多组件串联 / 并联”,可根据需求灵活组合(如 “LLM 生成 + 结果校验” 串联,“多 LLM 并行对比” 并联)。
关键组件与接口标准
组件名称 | 核心功能 | 输入接口(必填字段) | 输出接口(固定字段) |
---|---|---|---|
LLM 调度组件 | 管理 LLM 调用(选模型、控参数) | input_text (输入文本)、model (模型名)、params (参数:temperature/top_p)、timeout (超时时间) |
output_text (LLM 生成结果)、response_time (响应时间)、model_used (实际使用模型)、error (错误信息) |
逻辑判断组件 | 执行规则化逻辑(如关键词匹配) | input_data (输入数据)、rules (规则列表:如 “包含‘紧急’则标记优先级高”) |
judge_result (判断结果)、matched_rules (匹配的规则)、confidence (判断置信度) |
工具协作组件 | 调用外部工具(如计算器、API) | tool_name (工具名)、tool_params (工具参数) |
tool_result (工具返回结果)、tool_status (工具状态:成功 / 失败) |
组件协作示例
在 “智能客服机器人” 中,处理层的逻辑是 “先判断意图,再调用 LLM”:
- 逻辑判断组件接收输入层的
cleaned_text
(如 “我的订单什么时候到”),通过rules
(“包含‘订单’‘到’→意图:查询物流”)输出judge_result: "query_logistics"
; - LLM 调度组件接收
input_text
(“查询订单 12345 的物流”)和params: {temperature: 0.2}
(确保输出精准),调用物流查询工具后生成结果。
3. 输出层:“结果出口”—— 负责 “传对、传好” 结果
核心职责
将处理层的结果转化为用户 / 外部系统能理解的形式,支持多渠道输出(如文本、文件、UI 展示),并确保结果格式统一、易于使用。
关键组件与接口标准
组件名称 | 核心功能 | 输入接口(必填字段) | 输出接口(固定字段) |
---|---|---|---|
文本格式化组件 | 将结果转为规范文本(如列表、表格) | raw_result (处理层原始结果)、format_type (格式:列表 / 表格 / 段落) |
formatted_text (格式化文本)、format_status (格式是否成功) |
文档导出组件 | 将结果导出为文件(Word/Markdown) | content (待导出内容)、export_format (格式)、save_path (保存路径) |
file_path (导出文件路径)、file_size (文件大小)、error (导出错误) |
UI 渲染组件 | 生成前端展示内容(如网页组件) | data (待展示数据)、component_type (组件类型:按钮 / 列表 / 卡片) |
html (HTML 代码)、css (样式)、js (交互脚本) |
4. 存储层:“数据仓库”—— 负责 “存对、存住” 关键信息
核心职责
存储应用运行中的关键数据(如用户输入历史、LLM 调用记录、中间结果),支持后续查询、回溯和复用,是实现 “记忆功能”(如对话上下文)的核心。
关键组件与接口标准
组件名称 | 核心功能 | 输入接口(必填字段) | 输出接口(固定字段) |
---|---|---|---|
对话存储组件 | 保存用户与 AI 的对话历史 | session_id (会话 ID)、role (角色:user/ai)、content (内容)、timestamp (时间戳) |
save_status (保存状态)、history_count (当前会话条数) |
结果缓存组件 | 缓存高频访问的处理结果(如重复查询) | cache_key (缓存键:如 “文档 ID + 问题”)、cache_value (缓存值:LLM 结果)、expire_time (过期时间) |
cache_status (缓存状态)、hit (是否命中缓存) |
向量存储组件 | 存储文本向量(用于语义检索) | vector (向量数据)、text (对应文本)、metadata (元数据:如文档 ID) |
insert_status (插入状态)、vector_count (向量总数) |
三、模块间交互:如何实现 “无缝衔接”?
MCP 架构能灵活组合的关键,在于 “统一的交互规则”—— 无论哪个层的组件,都遵循以下逻辑流转数据:
1. 数据流转方式
- 同步调用:适用于 “需等待结果才能继续” 的场景(如输入层→处理层),组件 A 调用组件 B 后,等待 B 返回结果再执行下一步,示例代码:
python
运行
# 同步调用:输入层(文档解析)→处理层(LLM调用) parsed_data = pdf_parser.extract_text(file_path="test.pdf") # 等待解析结果 if parsed_data["error"] is None: llm_result = llm_caller.generate(input_text=parsed_data["parsed_text"]) # 基于解析结果调用LLM
- 事件驱动:适用于 “无需等待,异步执行” 的场景(如处理层→存储层),组件 A 发送 “数据生成事件” 后直接继续,组件 B 监听事件并异步存储,示例:
python
运行
# 事件驱动:处理层→存储层(异步保存对话) def on_llm_result_generated(event): chat_storage.save(session_id=event["session_id"], role="ai", content=event["result"]) # 注册事件监听:当LLM生成结果时,触发存储 event_bus.subscribe("llm_result_generated", on_llm_result_generated) llm_caller.generate(input_text=parsed_text, session_id="s123") # 生成后触发事件,无需等待存储
2. 统一数据格式
所有组件的输入 / 输出均采用JSON 格式,且包含 3 个固定字段:
status
:组件执行状态(success
/failed
);data
:核心业务数据(如解析后的文本、LLM 结果);error
:错误信息(success
时为null
,failed
时说明原因)。
示例:文档解析组件的输出格式
json
{
"status": "success",
"data": {
"parsed_text": "MCP架构是模块化组件范式...",
"page_count": 5
},
"error": null
}
四、实战:用 MCP 架构拆解 “文档问答工具”
以之前的 “文档问答工具” 为例,其架构完全贴合 MCP 的 “三层一储”,各模块对应关系如下:
- 输入层:文档解析组件(处理用户上传的 PDF)+ 文本输入组件(处理用户的问题);
- 处理层:逻辑判断组件(判断问题是否需要调用文档内容)+ LLM 调度组件(基于文档文本生成答案);
- 输出层:文本格式化组件(将答案转为清晰列表)+ 文档导出组件(支持导出答案为 Markdown);
- 存储层:对话存储组件(保存用户问题和 AI 答案)+ 结果缓存组件(缓存相同问题的答案,避免重复调用 LLM)。
通过这种拆解,工具的每个功能都可独立修改(如替换 LLM 只需改处理层,新增 “Excel 解析” 只需加输入层组件)。
五、MCP 架构设计的 4 个关键原则
- 高内聚低耦合:每个组件只做 “一件事”(如文档解析组件不负责文本格式化),组件间仅通过接口交互,不依赖内部逻辑;
- 接口一致性:同类型组件的接口格式统一(如所有输入组件都有
status/data/error
字段),替换组件时无需改对接代码; - 可扩展性:支持新增层或组件(如后续需 “安全校验”,可新增 “安全层”,插入输入层与处理层之间);
- 容错性:组件需处理异常场景(如 LLM 调用超时、文件损坏),并通过
error
字段明确反馈,避免整个流程崩溃。
六、后续学习衔接
本集明确了 MCP 架构的 “骨架”(分层与交互规则),下一节将聚焦 “血肉”—— 具体如何开发 / 选择符合 MCP 标准的组件(如自定义 LLM 调度组件、集成开源向量数据库),并通过代码实战演示组件的拼接与调试。
更多推荐
所有评论(0)