【Agent零基础入门课程】从单打独斗到协同作战:揭秘智能体(Agents)之间的沟通奥秘

本文系Datawhale 11月组队学习的学习笔记,笔记内容参考自Datawhale组队学习——Agent零基础入门课程

前言

嘿,各位未来的AI大师们!如果你一直在关注AI领域,你一定对“智能体”(Agent)这个词不陌生。我们已经见证了单个智能体如何利用强大的语言模型(LLM)进行推理、调用工具,甚至拥有自己的“记忆”。但当我们需要构建更复杂的系统时,问题也随之而来:如何让这些聪明的“家伙们”高效地与外部世界互动?又如何让它们像一个团队一样协同工作,而不是各行其是?

这就像我们从单兵作战发展到集团军作战,必须解决指挥和通信问题一样。今天,我们就来揭开智能体世界的“通信协议”的神秘面纱,看看它们是如何解决这些问题的。

智能体为什么需要“聊天”?沟通的必要性

想象一下,你开发了一个很棒的智能体,它能帮你写代码、查资料。但很快,你会发现它的局限性:

  • 集成新工具太麻烦:想让它访问你的GitHub仓库?你得为它专门写一个工具类。想让它连接数据库?又得写一个。每个新功能都意味着大量的“胶水代码”。
  • 能力扩展有瓶颈:你的智能体的能力被死死地限制在你预先为它准备的工具集里。它无法在运行时动态地发现和学习新技能。
  • 无法团队协作:一个复杂的任务,比如“调研市场上所有的AI Agents框架,并撰写一份详细的分析报告”,可能需要一个“研究员”智能体、一个“分析师”智能体和一个“报告撰写员”智能体协同工作。在没有通信协议的情况下,你只能手动地在它们之间传递信息,效率极低。

为了解决这些问题,通信协议应运而生。它就像为智能体世界建立了一套通用的“语言”和“接口标准”,让不同的智能体、不同的工具之间可以轻松对话、无缝协作。

沟通的“世界语”:MCP协议初探

在众多的通信协议中,由Anthropic团队提出的MCP(Model Context Protocol) 是目前生态相对成熟的一个。你可以把它想象成智能体世界的“USB-C”接口,目标是统一所有外部工具的交互方式。

MCP的核心思想是“上下文共享”。它不仅仅是让智能体能够调用一个工具那么简单,更重要的是,它允许工具和智能体之间共享丰富的上下文信息。例如,当智能体需要访问一个代码仓库时,一个设计良好的MCP服务器不仅会返回代码文件的内容,还可能提供代码的结构、依赖关系、甚至是最近的提交历史。这些丰富的“上下文”信息,能帮助智能体做出更智能的决策。

MCP的架构很简单,只有三个角色:

  1. Host(宿主):用户直接交互的界面,比如一个聊天应用。
  2. Client(客户端):内置在宿主中,负责与服务器建立连接,发送请求。
  3. Server(服务器):真正的“工具人”,负责执行具体的功能,比如读写文件、访问数据库等。

这种设计的好处是关注点分离。作为开发者,我们大多数时候只需要专注于开发功能强大的Server,而不用关心Client和Host的具体实现。社区里已经有很多现成的MCP服务器,比如文件系统、GitHub、数据库等,我们开箱即用,极大提高了开发效率。

动手才酷!构建你的第一个MCP服务器

理论说了这么多,不如我们亲手来打造一个。下面,我将带你一步步创建一个简单的“天气查询”MCP服务器。

第一步:明确我们的目标

我们希望创建一个MCP服务器,它能提供以下几个工具:

  • get_weather(city: str): 查询指定城市的天气。
  • list_supported_cities(): 列出所有支持查询的城市。
  • get_server_info(): 获取服务器的基本信息。

第二步:编写服务器代码

我们将使用hello-agents框架来快速搭建。你需要先安装它:

# python版本需要>=3.10
pip install "hello-agents==0.1.1"

然后,创建一个名为weather_mcp_server.py的文件,写入以下代码:

#!/usr/bin/env python3
"""
一个简单的天气查询MCP服务器
"""
import json
import requests
from datetime import datetime
from typing import Dict, Any
from hello_agents.protocols import MCPServer

# 1. 初始化一个MCPServer实例
weather_server = MCPServer(name="weather-server", description="一个简单的天气查询服务")

# 支持的城市列表
CITY_MAP = {
    "北京": "Beijing", "上海": "Shanghai", "广州": "Guangzhou",
    "深圳": "Shenzhen", "杭州": "Hangzhou", "成都": "Chengdu",
    "重庆": "Chongqing", "武汉": "Wuhan", "西安": "Xi'an",
    "南京": "Nanjing", "天津": "Tianjin", "苏州": "Suzhou"
}

# 2. 定义我们的工具函数
def get_weather(city: str) -> str:
    """获取指定城市的当前天气"""
    try:
        city_en = CITY_MAP.get(city, city)
        url = f"https://wttr.in/{city_en}?format=j1"
        response = requests.get(url, timeout=10)
        response.raise_for_status()
        data = response.json()["current_condition"][0]

        weather_data = {
            "city": city,
            "temperature": float(data["temp_C"]),
            "condition": data["weatherDesc"][0]["value"],
            "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        }
        # MCP工具的返回值推荐是字符串
        return json.dumps(weather_data, ensure_ascii=False, indent=2)
    except Exception as e:
        return json.dumps({"error": str(e), "city": city}, ensure_ascii=False)



def list_supported_cities() -> str:
    """列出所有支持的中文城市"""
    result = {"cities": list(CITY_MAP.keys()), "count": len(CITY_MAP)}
    return json.dumps(result, ensure_ascii=False, indent=2)


def get_server_info() -> str:
    """获取服务器信息"""
    info = {
        "name": "Weather MCP Server",
        "version": "1.0.0",
        "tools": ["get_weather", "list_supported_cities", "get_server_info"]
    }
    return json.dumps(info, ensure_ascii=False, indent=2)

# 3. 将工具函数注册到服务器
weather_server.add_tool(get_weather)
weather_server.add_tool(list_supported_cities)
weather_server.add_tool(get_server_info)

# 4. 启动服务器
if __name__ == "__main__":
    print("天气查询MCP服务器已启动...")
    weather_server.run()

这段代码做了四件事:

  1. 创建了一个MCPServer实例。
  2. 定义了三个普通的Python函数,每个函数都将成为一个“工具”。
  3. 使用add_tool()方法将这些函数注册为MCP服务器的工具。
  4. 调用run()方法启动服务器。

第三步:在智能体中使用我们的新工具

现在,我们让一个智能体来使用这个刚刚创建的服务器。新建一个文件test_weather_agent.py

from hello_agents import SimpleAgent, HelloAgentsLLM
from hello_agents.tools import MCPTool

# 初始化一个简单的智能体
llm = HelloAgentsLLM()
assistant = SimpleAgent(
    name="天气助手",
    llm=llm,
    system_prompt="你是一个天气助手,可以查询城市天气。请使用工具来回答问题。"
)

# 创建MCPTool,并指向我们的服务器脚本
# 智能体会自动启动并管理这个服务器进程
weather_tool = MCPTool(
    name="weather_service", # 给这个工具集起个名字
    server_command=["python", "weather_mcp_server.py"]
)

# 将MCP工具添加到智能体
assistant.add_tool(weather_tool)

# 见证奇迹的时刻!
print("你好,我是天气助手,今天想查哪个城市的天气?")
while True:
    user_input = input("你: ").strip()
    if not user_input:
        break
    response = assistant.run(user_input)
    print(f"天气助手: {response}")

当我们运行上面的客户端代码时,其内部的通信流程是这样的:
请添加图片描述

现在,运行test_weather_agent.py,你就可以和你的“天气助手”对话了。当你问“北京今天天气怎么样?”时,SimpleAgent会自动分析你的意图,发现需要调用weather_serviceget_weather工具,然后通过MCP协议与我们的weather_mcp_server.py进程通信,获取数据,并最终生成友好的回答。

整个过程,我们没有为智能体编写任何复杂的API调用或数据解析代码,只是将一个普通的Python脚本通过MCPTool“注入”给了智能体。这就是MCP协议的魅力所在!

结语

今天我们只是揭开了智能体通信的冰山一角。除了MCP,还有专注于智能体之间点对点协作的A2A协议,以及用于构建大规模智能体网络的ANP协议。

掌握这些协议,就像是为你的智能体打开了新世界的大门,让它们从一个个孤立的“信息孤岛”,连接成一个强大、协同的“智能网络”。这不仅仅是技术的革新,更是一种思维方式的转变——从构建单个“超级英雄”智能体,转向构建一个分工明确、合作无间的“智能体团队”。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐