一文讀懂 AI 智能體中 MCP、API 與 Function Call

引言

隨着人工智能技術的快速發展,大語言模型 (LLM) 與外部系統交互的需求日益增長。在這一背景下,API、Function Call 和 MCP(Model Context Protocol)作爲關鍵交互機制,各自扮演着不同的角色。本文將深入探討這三種技術的概念、特點、應用場景以及在 AI Agent 中的作用,通過具體例子幫助讀者全面理解它們之間的異同。

基本概念與定義

API (Application Programming Interface)

API 是一種通用的系統組件通信標準,它定義了軟件組件之間交互的規則。API 可以用於任何兩個系統之間的通信,不特定於 AI 或 AI 代理。

API 在 AI 系統中主要扮演着 "橋樑" 的角色,連接 AI 模型與外部數據源或服務。通過 API,AI 模型可以訪問和利用外部系統的功能和數據,從而增強其能力和應用範圍。

Function Call

Function Call 是特定於大語言模型 (LLM) 的機制,允許模型調用外部函數或 API。這是 LLM 與外部世界交互的主要方式,由 LLM 決定何時調用哪個函數。

Function Call 最初由 OpenAI 在 2023 年 6 月推出,最初在 GPT-3.5 和 GPT-4 模型上實現。它允許模型生成結構化 JSON 輸出,以調用外部系統中預定義的函數或 API。

Model Context Protocol (MCP)

Model Context Protocol 是由 Anthropic 在 2024 年 11 月推出的一種開放標準,旨在統一大型語言模型 (LLM) 與外部數據源和工具之間的通信協議。MCP 的主要目的是解決當前 AI 模型因數據孤島限制而無法充分發揮潛力的問題。

MCP 提供了一個標準化的接口,使 AI 模型能夠安全地訪問和操作本地及遠程數據,爲 AI 應用提供了連接萬物的接口。它通過標準化的數據訪問接口,大大減少了直接接觸敏感數據的環節,降低了數據泄露的風險。

在 AI Agent 中的作用

API 在 AI Agent 中的作用

API 是 AI Agent 與外部系統交互的基礎。通過 API,AI Agent 可以訪問和利用各種外部服務和數據源。例如:

API 爲 AI Agent 提供了與外部世界的連接,使 AI Agent 能夠獲取必要的數據和功能支持,從而完成更復雜的任務。

示例

import requests
查詢北京今天的天氣
response = requests.get('http://localhost:5000/api/weather?city=北京&date=today')
data = response.json()
 print(f"北京今天的天氣是:{data['weather']},溫度範圍:{data['temperature']},降雨概率:{data['rain_probability']}")

Function Call 在 AI Agent 中的作用

Function Call 是 AI Agent 調用外部函數的機制。它允許 AI 模型生成調用外部函數的指令,開發者實現具體函數即可。例如,模型調用天氣 API,返回實時天氣數據。

Function Call 使 AI Agent 能夠直接與外部系統交互,而無需開發者編寫複雜的文本解析邏輯。這簡化了開發流程,提高了 AI 應用的可靠性和準確性。

Function call 的工作流程

  1. 1. 用戶向 LLM 發送自然語言請求(例如 "北京今天天氣如何?")

  2. 2. LLM 識別需要調用外部函數(get_weather)並生成 JSON 格式的參數

  3. 3. 函數調用請求發送到相應的 API 或服務

  4. 4. API 返回結果數據

  5. 5. LLM 將結果轉換爲用戶友好的自然語言回覆

Fuction Call 關鍵組件

具體來說,Function Call 爲 AI Agent 提供了以下優勢:

  1. 1. 結構化輸出:確保模型能以預定義的 JSON 格式輸出函數調用參數,提高了可解析性和可靠性

  2. 2. 函數定義明確:通過函數模式(schema)清晰定義名稱、描述、參數類型等

  3. 3. 降低解析複雜度:開發者不需要編寫複雜的文本解析邏輯

  4. 4. 提高準確性:減少了模型在生成函數調用時的 "幻覺" 問題

  5. 5. 簡化開發流程:標準化了大模型與外部工具的交互方式

import json
import requests
from typing import Dict, List, Any
定義可用函數
def search_weather(city: str, date: str = "today") -> Dict[str, Any]:
 """
 搜索指定城市和日期的天氣
Args:  
    city: 城市名稱,如"北京"、"上海"  
    date: 日期,格式爲YYYY-MM-DD或"today"表示今天  
    
Returns:  
    包含天氣信息的字典  
"""  
# 調用天氣API  
response = requests.get(f'http://weather-api.example.com/api/weather?city={city}&date={date}')  
return response.json()  
def search_restaurants(location: str, cuisine: str = None, price_range: str = None) -> Dict[str, Any]:
 """
 搜索指定位置的餐廳
Args:  
    location: 位置,如"北京海淀區"  
    cuisine: 菜系,如"川菜"、"粵菜"(可選)  
    price_range: 價格範圍,如"低於100"、"100-300"、"300以上"(可選)  
    
Returns:  
    包含餐廳信息的字典  
"""  
# 構建查詢參數  
params = {"location": location}  
if cuisine:  
    params["cuisine"] = cuisine  
if price_range:  
    params["price_range"] = price_range  
    
# 調用餐廳API  
response = requests.get('http://restaurant-api.example.com/api/search', params=params)  
return response.json()  

函數字典,映射函數名稱到實際函數
available_functions = {
 "search_weather": search_weather,
 "search_restaurants": search_restaurants
 }
函數描述,用於AI模型判斷應該調用哪個函數
function_descriptions = [
 {
 "name""search_weather",
 "description""獲取指定城市和日期的天氣信息",
 "parameters": {
 "type""object",
 "properties": {
 "city": {
 "type""string",
 "description""城市名稱,如北京、上海"
 },
 "date": {
 "type""string",
 "description""日期,格式爲YYYY-MM-DD或today表示今天"
 }
 },
 "required": ["city"]
 }
 },
 {
 "name""search_restaurants",
 "description""搜索指定位置的餐廳",
 "parameters": {
 "type""object",
 "properties": {
 "location": {
 "type""string",
 "description""位置,如北京海淀區"
 },
 "cuisine": {
 "type""string",
 "description""菜系,如川菜、粵菜"
 },
 "price_range": {
 "type""string",
 "description""價格範圍,如低於100、100-300、300以上"
 }
 },
 "required": ["location"]
 }
 }
 ]
模擬AI模型做出的Function Call決策
def simulate_ai_function_call(user_message: str) -> Dict[str, Any]:
 """
 模擬AI模型分析用戶消息並決定調用哪個函數
實際應用中,這部分由AI模型完成,此處僅爲演示  
"""  
if "天氣" in user_message or "下雨" in user_message:  
    # 提取城市  
    city = "北京"  # 簡化處理,實際應從消息中提取  
    if "明天" in user_message:  
        date = "2025-04-06"  # 模擬明天日期  
    else:  
        date = "today"  
        
    return {  
        "function""search_weather",  
        "parameters": {  
            "city": city,  
            "date": date  
        }  
    }  
elif "餐廳" in user_message or "喫飯" in user_message:  
    # 提取位置和偏好  
    location = "北京海淀區"  # 簡化處理  
    cuisine = "川菜" if "川菜" in user_message else None  
    price_range = "100-300"  # 默認中等價位  
    
    return {  
        "function""search_restaurants",  
        "parameters": {  
            "location": location,  
            "cuisine": cuisine,  
            "price_range": price_range  
        }  
    }  
else:  
    return None  # 不需要調用函數  
模擬處理用戶消息的過程
def process_user_message(user_message: str) -> str:
 """處理用戶消息並返回回覆"""
    print(f"用戶: {user_message}")
# 判斷是否需要Function Call  
function_call = simulate_ai_function_call(user_message)  

if function_call:  
    function_name = function_call["function"]  
    parameters = function_call["parameters"]  
    
    print(f"AI決定調用函數: {function_name}")  
    print(f"參數: {json.dumps(parameters, ensure_ascii=False)}")  
    
    # 執行Function Call  
    if function_name in available_functions:  
        function_to_call = available_functions[function_name]  
        function_response = function_to_call(**parameters)  
        
        print(f"函數返回結果: {json.dumps(function_response, ensure_ascii=False)}")  
        
        # 根據函數返回結果生成回覆(簡化處理)  
        if function_name == "search_weather":  
            return f"{parameters['city']}{'明天' if parameters['date'] != 'today' else '今天'}的天氣是{function_response['weather']},溫度範圍{function_response['temperature']},降雨概率{function_response['rain_probability']}。"  
        elif function_name == "search_restaurants":  
            restaurants = function_response.get("restaurants", [])  
            if restaurants:  
                restaurant_names = [r["name"] for r in restaurants[:3]]  
                return f"我爲您找到了以下餐廳:{', '.join(restaurant_names)},它們都在{parameters['location']}{',提供' + parameters['cuisine'] if parameters['cuisine'] else ''}。"  
            else:  
                return f"抱歉,沒有找到符合條件的餐廳。"  
    else:  
        return f"抱歉,我無法處理這個請求,因爲函數{function_name}不可用。"  
else:  
    # 不需要調用函數,直接回復  
    return "我理解你的問題,但不需要調用特定工具來回答。[這裏是AI模型生成的直接回復]"  
測試
test_messages = [
 "北京今天天氣怎麼樣?會下雨嗎?",
 "推薦幾家海淀區的川菜館",
 "人工智能的發展歷史是怎樣的?"
 ]
for message in test_messages:
 response = process_user_message(message)
 print(f"AI: {response}\n")

MCP 在 AI Agent 中的作用

MCP 是 AI Agent 與外部系統交互的高級協議。它提供了一個標準化的接口,使 AI 模型能夠安全地訪問和操作本地及遠程數據,爲 AI 應用提供了連接萬物的接口。

MCP 通過客戶端 - 服務器架構實現,其中包含以下幾個核心概念:

MCP 爲 AI Agent 提供了以下優勢:

  1. 1. 統一標準:MCP 是一個開放標準,爲 AI 模型與外部系統之間的通信提供了一致的接口

  2. 2. 靈活性:MCP 允許 AI Agent 連接到各種不同的數據源和工具,無需針對每個數據源編寫自定義集成

  3. 3. 安全性:MCP 通過標準化的數據訪問接口,大大減少了直接接觸敏感數據的環節,降低了數據泄露的風險

  4. 4. 可擴展性:MCP 的架構設計使得 AI Agent 能夠隨着需求的增長而擴展,而無需重新編寫代碼

MCP定義文件示例
通常作爲系統提示(System Prompt)或配置傳遞給AI模型

MCP_DEFINITION = """
智能助手行爲準則 (Model Context Protocol)
1. 基本行爲規範
身份與語氣
你是一個專業、友好的AI助手
使用禮貌而自然的語氣,避免過於正式或過於隨意
在回答中保持一致的人稱,使用""而非"AI助手"或第三人稱
迴應格式
對簡單問題提供簡潔明瞭的回答
對複雜問題提供結構化的回答,使用標題和分段
使用Markdown格式優化回答的可讀性
避免不必要的重複和冗餘表述
知識邊界
承認知識的時效性限制,你的知識截止到2023年4月
當不確定答案時,明確表示不確定,避免編造信息
對於最新信息,主動提示需要使用搜索工具
2. 工具使用規範
搜索工具使用
當用戶詢問2023年4月後的事件、新聞或數據時
當用戶明確要求獲取最新信息時
當問題涉及快速變化的信息(如天氣、股票價格)時
當需要驗證可能已過時的信息時
數據分析工具使用
當用戶上傳數據文件需要分析時
當需要處理複雜的數值計算時
當需要生成數據可視化時
當需要從結構化數據中提取洞見時
圖像生成工具使用
當用戶明確要求創建或生成圖像時
當表達複雜概念更適合用圖像說明時
當用戶需要視覺創意或設計靈感時
3. 安全與倫理規範
敏感話題處理
對於政治、宗教等敏感話題,保持中立、客觀的立場
提供多元視角,避免偏向任何特定立場
拒絕生成可能引起爭議或冒犯的內容
有害請求處理
禮貌拒絕生成可能導致傷害的信息
拒絕提供非法活動的詳細指導
重新引導用戶到建設性的替代方案
個人數據保護
不存儲或記憶用戶的敏感個人信息
提醒用戶避免在對話中分享敏感信息
不要試圖收集用戶的隱私數據
4. 多輪對話管理
上下文理解
維持對話的連貫性,記住之前的交流內容
理解代詞指代和隱含信息
當上下文不清時,禮貌請求澄清
對話主動性
在適當情況下提供與當前話題相關的後續建議
識別並回應用戶的情緒狀態
引導對話朝着建設性和有幫助的方向發展
錯誤處理
當識別到之前回答中的錯誤,主動糾正
接受用戶的糾正並表示感謝
避免爲錯誤辯解,專注於提供正確信息
5. 響應風格指南
技術內容
根據用戶的專業水平調整技術術語的使用
爲複雜概念提供通俗解釋
在必要時使用類比來解釋抽象概念
教育內容
採用漸進式解釋,先基礎後進階
提供實例和應用場景
鼓勵用戶提問和探索
創意內容
展現思維靈活性和創造力
提供多樣化的創意選擇
平衡實用性和創新性
6. 工具調用詳細規範
搜索工具 (search)
參數構造: 
keywords:簡潔的搜索關鍵詞,不超過5個詞
rewritten_query:詳細的搜索查詢,包含完整上下文
結果處理: 
提取最相關的信息點
覈實信息的一致性
明確引用信息來源
數據分析工具 (data_analysis)
使用時機: 
當文件ID可用時
代碼構建遵循最佳實踐
結果解釋需通俗易懂
代碼規範: 
使用pandas進行數據處理
使用matplotlib或seaborn進行可視化
包含適當的註釋說明
圖像生成工具 (text_to_image)
提示詞構造: 
詳細描述視覺元素、風格和氛圍
避免要求特定品牌或名人肖像
指定適合的藝術風格
 """
在實際應用中,這個MCP會被加載並用於配置AI模型的行爲
def configure_ai_model_with_mcp(ai_model, mcp_definition=MCP_DEFINITION):
 """配置AI模型的行爲規範"""
 # 在實際實現中,這可能涉及設置模型的系統提示或特定參數
 # 這裏僅作示意
    ai_model.set_system_prompt(mcp_definition)
    return ai_model
模擬AI處理用戶消息的過程
def process_with_mcp(user_message):
 """使用MCP規範處理用戶消息"""
    print(f"用戶: {user_message}")
    # 模擬AI根據MCP進行思考的過程  
    print("\n[AI根據MCP的思考過程]")  

# 判斷消息類型和需要的處理方式  
if "天氣" in user_message:  
    print("1. 消息涉及天氣,屬於實時信息類別")  
    print("2. 根據MCP工具使用規範,應當使用搜索工具獲取最新天氣信息")  
    print("3. 需要構建合適的搜索參數,包括地點和時間")  
    
    # 模擬Function Call決策  
    function_call = {  
        "function""search",  
        "parameters": {  
            "keywords""北京今天天氣",  
            "rewritten_query""北京市今天最新天氣預報 溫度 降雨概率"  
        }  
    }  
    
    print(f"4. 決定調用:{function_call['function']}")  
    print(f"5. 參數:{json.dumps(function_call['parameters'], ensure_ascii=False)}")  
    
    # 模擬函數返回結果  
    function_result = {  
        "weather""晴朗",  
        "temperature""22-28℃",  
        "rain_probability""5%"  
    }  
    
    print("6. 獲取到天氣信息,按照MCP響應格式規範組織回答")  
    print("7. 根據MCP,對簡單問題提供簡潔明瞭的回答")  
    
    # 生成回覆  
    response = f"北京今天天氣晴朗,溫度在22-28℃之間,降雨概率很低,只有5%。適合戶外活動,不過紫外線較強,建議做好防曬。"  

elif "人工智能" in user_message and "歷史" in user_message:  
    print("1. 消息詢問人工智能歷史,屬於知識類問題")  
    print("2. 根據MCP,這屬於複雜問題,應提供結構化回答")  
    print("3. 這是模型知識範圍內的內容,不需要使用工具")  
    print("4. 根據MCP教育內容指南,應採用漸進式解釋")  
    
    # 生成回覆  
    response = """# 人工智能的發展歷史  
人工智能(AI)的發展歷程可以分爲幾個關鍵階段:
初期探索 (1940s-1950s)
1943年:McCulloch和Pitts創建了首個數學模型神經網絡
1950年:Alan Turing提出了著名的"圖靈測試"
1956年:Dartmouth會議正式確立"人工智能"這一術語
早期發展 (1960s-1970s)
專家系統開始出現
基於規則的AI系統興起
自然語言處理初步研究
第一次AI寒冬 (1970s-1980s)
資金減少,研究放緩
計算能力限制阻礙進展
復興與進步 (1990s-2000s)
機器學習方法開始流行
1997年:IBM的Deep Blue擊敗國際象棋冠軍Kasparov
深度學習革命 (2010s至今)
2012年:AlexNet在ImageNet競賽中取得突破
2016年:AlphaGo擊敗圍棋冠軍李世石
2020年代:GPT系列、DALL-E等大型語言和多模態模型出現
人工智能正持續發展,影響着我們生活的方方面面。"""
elif "幫我生成" in user_message and "圖片" in user_message:  
    print("1. 消息請求生成圖片,需要使用圖像生成工具")  
    print("2. 根據MCP圖像生成工具使用規範,需要構建詳細的提示詞")  
    print("3. 需要從用戶消息中提取圖像描述元素")  
    
    # 模擬Function Call決策  
    function_call = {  
        "function""text_to_image",  
        "parameters": {  
            "prompt""一隻可愛的橙色貓咪坐在窗臺上,望着窗外的鳥,陽光透過窗戶照在貓咪身上,營造溫暖舒適的氛圍",  
            "style""digital-art"  
        }  
    }  
    
    print(f"4. 決定調用:{function_call['function']}")  
    print(f"5. 參數:{json.dumps(function_call['parameters'], ensure_ascii=False)}")  
    print("6. 圖像已生成,根據MCP響應規範組織回答")  
    
    # 生成回覆  
    response = "我已經爲您生成了一張可愛的橙色貓咪坐在窗臺上的圖片,採用了數字藝術風格。貓咪正望着窗外的鳥,陽光灑在它的身上,整個畫面溫暖而舒適。希望這符合您的期望!"  

else:  
    print("1. 無法確定具體的消息類型")  
    print("2. 根據MCP,當消息不明確時,應禮貌請求澄清")  
    
    # 生成回覆  
    response = "抱歉,我不太確定您想了解什麼具體信息。您是想了解天氣預報,尋找某個信息,還是需要我幫您完成其他任務?請提供更多細節,這樣我才能更好地幫助您。"  

print("\n[AI最終回覆]")  
return response  
測試不同類型的用戶消息
test_messages = [
 "北京今天天氣怎麼樣?適合出門嗎?",
 "人工智能的發展歷史是怎樣的?",
 "幫我生成一張貓咪的圖片",
 "你覺得明天會怎樣?"
 ]
for message in test_messages:
 ai_response = process_with_mcp(message)
 print(f"用戶: {message}")
 print(f"AI: {ai_response}\n")

三者的區別與聯繫

層級區別

從層級上看,這三種技術可以分爲三個不同的層次:

  1. 1. Level 1: Function Calling 解決 "怎麼調用外部函數"

  2. 2. Level 2: MCP 解決 "大量外部工具如何高效接入"

  3. 3. Level 3: AI Agent 解決 "如何自主完成複雜任務"

功能對比

關係與協作

這三種技術不是相互排斥的,而是可以協作工作的。它們共同構成了 AI Agent 與外部世界交互的完整系統:

  1. 1. API 提供基礎功能,使系統能夠相互通信

  2. 2. Function Call 提供直接的操作能力,使 AI 模型能夠調用外部函數

  3. 3. MCP 提供更高層次的智能協調能力,使 AI Agent 能夠高效、安全地訪問和操作各種數據源和工具

通過這種協作,AI Agent 能夠完成複雜的任務,例如從 CRM 查詢銷售合同 PDF、發送電子郵件、安排會議等。

具體應用場景

使用 Function Call 的場景

Function Call 適用於簡單的、與特定 LLM 強耦合的外部系統調用。例如:

  1. 1. 天氣查詢:調用天氣 API 獲取實時天氣信息

  2. 2. 路線規劃:調用地圖 API 獲取最佳路線

  3. 3. 數學計算:執行簡單的數學計算

  4. 4. 股票查詢:獲取股票價格和趨勢分析

使用 MCP 的場景

MCP 適用於需要訪問多個不同系統、需要保持上下文的應用。例如:

  1. 1. 企業級應用:需要訪問 Google Drive、Slack、GitHub 等多個系統的數據

  2. 2. 長期對話:需要保持對話上下文的應用

  3. 3. 複雜工作流:需要協調多個工具完成複雜任務的應用

  4. 4. 安全敏感應用:需要嚴格控制數據訪問的應用

同時使用的情況

許多現代 AI 應用同時支持 MCP 規範和 Function Call 特性。例如:

  1. 1. Claude Desktop:支持 MCP Server 接入能力,作爲 MCP client 連接某個 MCP Server 感知和實現調用

  2. 2. Cursor:支持 MCP Server 功能,提高開發效率

  3. 3. Zed:支持 MCP 資源

  4. 4. Sourcegraph Cody:通過 OpenCTX 支持資源

發展趨勢與未來展望

標準化與互操作性

MCP 作爲開放標準,正成爲連接 AI 與外部系統的重要橋樑。它使工具調用不再依賴於特定的 LLM 提供商,提高了互操作性和擴展性。

安全性與隱私保護

MCP 的架構提供了更好的安全模型和隱私保護。例如,MCP 服務器自己控制資源,不需要將 API 密鑰等敏感信息提供給 LLM 提供商。這樣一來,即使 LLM 提供商受到攻擊,攻擊者也無法獲取到這些敏感信息。

上下文管理

MCP 特別適合需要維持長期上下文的 AI 應用。它通過提供資源、工具和提示功能,幫助 AI 模型更好地理解和處理複雜任務。

生態系統建設

MCP 的生態系統正在快速發展,出現了許多由社區實現的 MCP server。這些 server 提供了豐富的功能,例如文件系統訪問、數據庫交互、Web 自動化等。

結論

MCP、API 和 Function Call 是 AI Agent 與外部世界交互的三種關鍵機制,它們在不同層次上發揮作用,共同構成了完整的 AI 系統交互框架。

API 提供了基礎的系統間通信能力,是構建 AI 應用的基礎。

Function Call 爲 AI 模型提供了直接調用外部函數的能力,簡化了 AI 應用的開發流程。

MCP 作爲高級協議,爲 AI 模型與外部系統之間的通信提供了一致的標準,提高了互操作性和安全性。

通過理解這三種技術的異同和應用場景,開發者可以更好地設計和實現 AI 應用,使其能夠高效、安全地與外部世界交互,完成更復雜的任務。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/W-7rFGRZfndUzITIP0Ghjw