
基于 MCP 实现推荐业务场景案例架构设计 原创
Anthropic 推出的 MCP(模型上下文协议)取得了成功,这显然激发了 AI 行业里的其他参与者,大家都想来定义一些开放协议,好用在 AI Agent 系统(Agentic Systems)的集成里。
1、MCP 架构设计
MCP(模型上下文协议)是由 Anthropic 定义的一个开放协议,标准化应用程序如何为大语言模型(LLM)提供上下文。更具体地说,它试图标准化基于 LLM 的应用程序与其他环境集成的协议。
在 AI Agent 系统(Agentic Systems)中,上下文可以通过多种方式提供:
1、外部数据:这是长期记忆的一部分。
2、工具:系统与环境交互的能力。
3、动态提示词:可以作为系统提示词(System Prompt)的一部分注入。
第一、为什么要标准化?
目前,AI Agent 应用的开发流程很混乱:
1.有许多 AI Agent 框架存在细微差异。虽然看到生态系统蓬勃发展令人鼓舞,但这些细微差异很少能带来足够的价值,但可能会显著改变你的代码编写方式。
2.与外部数据源的集成通常是临时实现的,并且使用不同的协议,即使在组织内部也是如此。对于不同公司来说,这显然是如此。
2.工具在代码库中以略微不同的方式定义。如何将工具附加到增强型 LLM 上也是不同的。
目标是提高我们创新 AI Agent 应用的速度、安全性以及将相关数据带入上下文的便利性。
第二、MCP 架构设计
1.MCP Host:使用 LLM 为核心并希望通过 MCP 访问数据的程序。
2.MCP Client:与 MCP Server 保持1:1连接的客户端。
3.MCP Server:每个 MCP Server 都通过标准化的模型上下文协议公开特定功能的轻量级程序。
4.Local Data Sources:你计算机上的文件、数据库和服务,MCP Server 可以安全访问。
5.Remote Data Sources:通过互联网可用的外部系统(比如:通过 API),MCP Server 可以连接到这些系统。
第三、通过 MCP 分离控制责任
MCP Server 公开三个主要元素(Prompts、Resoures、Tools),这些元素是有意设计的,以帮助实现特定的控制分离。
1.Prompts 提示词被设计为用户控制的。后端的程序员可以公开特定的提示词(适用于与后端服务公开的数据交互),这些提示词可以注入到使用 LLM 的应用程序中,并暴露给给定应用程序的用户。
2.Resoures 资源被设计为应用程序控制的。Resources 资源是任何可以被利用 LLM 构建的应用程序使用的数据(文本或二进制)。应用程序的程序员(通常是 AI 应用开发工程师)负责将这些信息编码到应用程序中。通常,这里没有自动化,LLM 不参与此选择。
3.Tools 工具被设计为大模型控制的。如果我们赋予应用程序如何与环境交互的代理权,我们使用 Tools 工具来实现这一点。MCP Server 公开一个端点,可以列出所有可用 Tools 工具及其描述和所需参数,应用程序可以将此列表传递给 LLM,以便它决定哪些 Tools 工具适用于手头的任务以及如何调用它们。
2、基于 MCP 实现招聘推荐业务场景
第一、招聘推荐业务场景剖析
很多企业内部都有推荐业务的场景,特别是对于招聘推荐业务,招聘场景涉及到企业用人端的招聘服务,也涉及到个人用户的简历数据,这些数据往往散落在不同的平台中,为了更高效的实现人才的匹配,招聘平台就需要利用 AI Agent 智能体根据招聘岗位需求快速找到最合适的候选人,这就是招聘的推荐业务场景。
在这个业务场景中,通过 MCP 统一协议连接多个系统,AI Agent 智能体可以自主决策,从而按需获取岗位数据、职位数据、简历数据等,从而将招聘找人效率提高30%+。
第二、基于 MCP 的整体流程设计,如下所示:
- 1、招聘平台内部需要提供 API 接口能力;
- 2、提供获取岗位 JD 的 API 接口能力;
- 3、提供内部封装的简历排序能力;
- 4、AI Agent 智能体根据 MCP Server 调用结果,给出对应的简历推荐理由。
第三、基于 MCP 的整体架构设计,如下所示:
第四、MCP Server 的代码实现,如下所示:
import requests
import json
from mcp.server.fastmcp import FastMCP
# 创建 MCP 服务器
mcp = FastMCP()
@mcp.tool()
def get_job_list(job_name="", page=1, page_size=20):
"""
获取职位列表和对应的jobId
参数:
职位名称: 职位的名称关键词,如"安全"、"工程师"等
页码: 分页查询的页码,默认为1
每页数量: 每页返回的职位数量,默认为20
"""
payload = {
"jobTitle": job_name,
"page": page,
"limit": page_size
}
try:
response = requests.post(URL, headers=HEADERS, data=json.dumps(payload))
response.raise_for_status() # 检查请求是否成功
return response.json()
except Exception as e:
return {"错误": f"获取职位列表失败: {str(e)}"}
第五、配置到 MCP Client 中,Client 调用如下所示:
随着 MCP Server 数量的增加,可能会面临以下挑战:
- MCP Server 选择难题:客户端在选择合适的 MCP Server 进行调用时可能会遇到困难,这需要花费大量时间来尝试不同的调用方案。由于服务器的不同排列组合,尝试的成本可能会急剧增加。在这种情况下,可能需要在客户端开发更高级的记忆功能,以记住成功的调用路径;同时,在服务器端实施服务评级机制,以便优先选择性能更优的服务器进行调用。
- 安全性和授权问题:目前的开源 MCP 版本尚未考虑授权和访问权限的问题,这可能导致 MCP Server 向客户端植入恶意信息,或者客户端将本地的个人隐私信息上传到网络中,从而引发安全风险。
本文转载自玄姐聊AGI 作者:玄姐
