【Agent零基础入门课程】从单打独斗到协同作战:揭秘智能体(Agents)之间的沟通奥秘
本文介绍了智能体(Agents)之间通信的必要性及MCP协议的应用。单个智能体存在工具集成麻烦、能力有限和无法协作等问题,而MCP协议通过上下文共享实现了智能体与工具间的无缝交互。文章以构建天气查询MCP服务器为例,展示了如何使用hello-agents框架快速创建服务器,并让智能体通过MCP协议调用工具。这种设计使开发者能专注于功能开发,无需处理底层通信细节,大大提高了开发效率。
本文目录标题
【Agent零基础入门课程】从单打独斗到协同作战:揭秘智能体(Agents)之间的沟通奥秘
本文系Datawhale 11月组队学习的学习笔记,笔记内容参考自Datawhale组队学习——Agent零基础入门课程
前言
嘿,各位未来的AI大师们!如果你一直在关注AI领域,你一定对“智能体”(Agent)这个词不陌生。我们已经见证了单个智能体如何利用强大的语言模型(LLM)进行推理、调用工具,甚至拥有自己的“记忆”。但当我们需要构建更复杂的系统时,问题也随之而来:如何让这些聪明的“家伙们”高效地与外部世界互动?又如何让它们像一个团队一样协同工作,而不是各行其是?
这就像我们从单兵作战发展到集团军作战,必须解决指挥和通信问题一样。今天,我们就来揭开智能体世界的“通信协议”的神秘面纱,看看它们是如何解决这些问题的。
智能体为什么需要“聊天”?沟通的必要性
想象一下,你开发了一个很棒的智能体,它能帮你写代码、查资料。但很快,你会发现它的局限性:
- 集成新工具太麻烦:想让它访问你的GitHub仓库?你得为它专门写一个工具类。想让它连接数据库?又得写一个。每个新功能都意味着大量的“胶水代码”。
- 能力扩展有瓶颈:你的智能体的能力被死死地限制在你预先为它准备的工具集里。它无法在运行时动态地发现和学习新技能。
- 无法团队协作:一个复杂的任务,比如“调研市场上所有的AI Agents框架,并撰写一份详细的分析报告”,可能需要一个“研究员”智能体、一个“分析师”智能体和一个“报告撰写员”智能体协同工作。在没有通信协议的情况下,你只能手动地在它们之间传递信息,效率极低。
为了解决这些问题,通信协议应运而生。它就像为智能体世界建立了一套通用的“语言”和“接口标准”,让不同的智能体、不同的工具之间可以轻松对话、无缝协作。
沟通的“世界语”:MCP协议初探
在众多的通信协议中,由Anthropic团队提出的MCP(Model Context Protocol) 是目前生态相对成熟的一个。你可以把它想象成智能体世界的“USB-C”接口,目标是统一所有外部工具的交互方式。
MCP的核心思想是“上下文共享”。它不仅仅是让智能体能够调用一个工具那么简单,更重要的是,它允许工具和智能体之间共享丰富的上下文信息。例如,当智能体需要访问一个代码仓库时,一个设计良好的MCP服务器不仅会返回代码文件的内容,还可能提供代码的结构、依赖关系、甚至是最近的提交历史。这些丰富的“上下文”信息,能帮助智能体做出更智能的决策。
MCP的架构很简单,只有三个角色:
- Host(宿主):用户直接交互的界面,比如一个聊天应用。
- Client(客户端):内置在宿主中,负责与服务器建立连接,发送请求。
- 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()
这段代码做了四件事:
- 创建了一个
MCPServer实例。 - 定义了三个普通的Python函数,每个函数都将成为一个“工具”。
- 使用
add_tool()方法将这些函数注册为MCP服务器的工具。 - 调用
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_service的get_weather工具,然后通过MCP协议与我们的weather_mcp_server.py进程通信,获取数据,并最终生成友好的回答。
整个过程,我们没有为智能体编写任何复杂的API调用或数据解析代码,只是将一个普通的Python脚本通过MCPTool“注入”给了智能体。这就是MCP协议的魅力所在!
结语
今天我们只是揭开了智能体通信的冰山一角。除了MCP,还有专注于智能体之间点对点协作的A2A协议,以及用于构建大规模智能体网络的ANP协议。
掌握这些协议,就像是为你的智能体打开了新世界的大门,让它们从一个个孤立的“信息孤岛”,连接成一个强大、协同的“智能网络”。这不仅仅是技术的革新,更是一种思维方式的转变——从构建单个“超级英雄”智能体,转向构建一个分工明确、合作无间的“智能体团队”。
更多推荐


所有评论(0)