基于 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?? 作者:玄姐
