• 正文
  • 相关推荐
申请入驻 产业图谱

十分钟实用教程 | MCP Agent Graph: 基于上下文工程的多智能体系统构建指南

11小时前
224
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

转载自公众号:敢敢AUTOHUB

1. 引言: 从单一模型到多智能体协作

1.1 大语言模型的能力边界

大语言模型(LLM)的发展经历了从简单文本生成到复杂推理的演进过程。早期的应用场景主要集中在问答、翻译、摘要等相对独立的任务上,模型作为一个无状态的推理引擎,接收输入并产生输出。然而,随着应用场景的深化,开发者们逐渐意识到单一模型在处理复杂、多步骤任务时面临着显著的局限性。这些局限性主要体现在以下几个方面: 模型无法访问实时数据,缺乏与外部系统交互的能力,难以维护跨会话的上下文信息,以及在长链条任务中容易出现推理偏差。

为了突破这些限制,AI Agent 的概念应运而生。与传统的 LLM 应用不同,智能体是一个具备自主决策能力的系统实体。它不仅能够理解用户的目标,还能够规划执行路径、调用外部工具、观察执行结果,并根据反馈动态调整策略。智能体的核心能力包括: 目标理解与任务分解、工具选择与调用、环境感知与状态维护、迭代优化与自我修正。这种从被动响应到主动执行的转变,使得 AI 系统能够处理更加开放和复杂的现实任务。

当单个智能体面对跨领域、多阶段的复杂任务时,其能力仍然受限。类比人类社会中的团队协作,多智能体系统(Multi-Agent System, MAS)通过让多个专业化的智能体协同工作,实现了能力的叠加与互补。例如,一个数据分析流程可能需要: 数据采集智能体负责从多个数据源获取原始数据,数据清洗智能体处理缺失值和异常值,分析智能体执行统计计算和建模,报告生成智能体将结果整理成可读的报告。每个智能体专注于其擅长的领域,通过协作完成单一智能体难以胜任的复杂任务。

项目地址:https://github.com/keta1930/mcp-agent-graph

2. MCP Agent Graph 系统架构

2.1 整体架构设计

MCP Agent Graph 采用分层架构设计,从底向上依次为: 基础设施层、协议层、引擎层和应用层。这种分层设计确保了系统的可扩展性和各组件间的解耦。

系统架构图:

基础设施层提供数据存储(MongoDB)、文件管理(MinIO)和缓存服务,为上层提供可靠的持久化支持。协议层实现了 MCP(Model Context Protocol)标准,定义了智能体与外部工具交互的规范接口。引擎层是系统的核心,包含智能体运行时、工作流引擎、记忆管理器等关键组件。应用层则提供了可视化的用户界面,支持智能体的创建、配置、测试和部署。

2.2 数据流与交互模式

系统中的数据流遵循清晰的路径: 用户请求首先到达 API 网关,经过认证和路由后分发到相应的服务。对于对话请求,系统会加载智能体配置、获取历史上下文、执行推理循环,并将结果返回给用户。整个过程中,记忆管理器负责维护短期和长期记忆,MCP 客户端负责与外部工具通信。

用户交互流程:

3. 核心组件深度解析

3.1 智能体(Agent)

智能体是 MCP Agent Graph 中最基本的执行单元。每个智能体都有明确的职责定义,包括系统提示词、可用工具列表、模型配置等。智能体的设计遵循单一职责原则,一个智能体专注于完成一类特定的任务。

智能体的核心属性包括:

from typing import List
from pydantic import BaseModel, Field, field_validator

class AgentConfig(BaseModel):
    """Agent配置数据模型"""
    name: str = Field(..., description="Agent唯一名称")
    card: str = Field(..., description="Agent能力描述卡片")
    model: str = Field(..., description="使用的模型名称")
    instruction: str = Field(default="", description="Agent的系统提示词")
    max_actions: int = Field(default=50, description="最大工具调用次数,范围1-200")
    mcp: List[str] = Field(default_factory=list, description="可用的MCP服务器名称列表")
    system_tools: List[str] = Field(default_factory=list, description="可用的系统内置工具列表")
    category: str = Field(..., description="Agent分类,如coding, analysis, writing等")
    tags: List[str] = Field(default_factory=list, description="Agent标签列表")

    @field_validator('name')
    @classmethod
    def validate_name(cls, v):
        if not v or '/' in v or '\\' in v or '.' in v:
            raise ValueError('名称不能包含特殊字符 (/, \\, .)')
        return v

    @field_validator('max_actions')
    @classmethod
    def validate_max_actions(cls, v):
        if v < 1 or v > 200:
            raise ValueError('max_actions 必须在 1-200 范围内')
        return v

创建智能体的服务层代码:

class AgentService:
    """Agent 服务 - 负责 Agent 业务逻辑和数据库交互"""

    async def create_agent(self, agent_config: Dict[str, Any], user_id: str) -> Dict[str, Any]:
        """创建 Agent"""
        # 验证配置
        is_valid, error_msg = await self.validate_agent_config(agent_config, user_id)
        if not is_valid:
            return {"success": False, "error": f"Agent 配置验证失败: {error_msg}"}

        # 创建 Agent
        agent_id = await mongodb_client.agent_repository.create_agent(agent_config, user_id)

        if agent_id:
            # 同时创建对应的 memory 文档
            agent_name = agent_config.get('name')
            await mongodb_client.memories_collection.insert_one({
                "user_id": user_id,
                "owner_type": "agent",
                "owner_id": agent_name,
                "memories": {},
                "created_at": datetime.now(),
                "updated_at": datetime.now()
            })
            return {"success": True, "agent_id": agent_id, "agent_name": agent_name}
        return {"success": False, "error": "创建 Agent 失败"}

智能体的执行采用 ReAct(Reasoning and Acting)模式,这是一种将推理与行动交织进行的范式。在每个步骤中,智能体首先进行推理分析当前状态,然后决定采取的行动(可能是调用工具或生成回复),最后观察行动结果并更新状态。

3.2 工作流图(Graph)

工作流图是编排多个智能体协作的核心机制。通过将智能体作为节点、定义节点间的连接关系,可以构建出复杂的任务处理流程。工作流图支持多种拓扑结构:

结构类型 描述 适用场景
线性流程 节点按顺序依次执行 简单的多步骤任务
并行分支 多个节点同时执行 独立子任务的并行处理
条件分支 根据条件选择执行路径 需要决策的复杂流程
循环迭代 重复执行直到满足条件 迭代优化、重试机制
子图嵌套 将完整图作为单个节点使用 模块化复用

3.3 记忆系统(Memory)

记忆系统为智能体提供了跨会话的信息持久化能力。系统区分短期记忆和长期记忆两种类型:

短期记忆用于维护当前会话的上下文,包括对话历史、中间结果等。短期记忆的生命周期与会话绑定,会话结束后可选择性地将关键信息转存到长期记忆。

长期记忆则是持久化的知识存储,包括用户偏好、领域知识、历史交互的总结等。长期记忆通过向量检索实现相关信息的快速召回,使智能体能够"记住"过去的经验。

以下是记忆服务的核心实现:

from datetime import datetime
from typing import Dict, Any, List
from app.infrastructure.database.mongodb import mongodb_client

class MemoryService:
    """记忆服务类"""

    def __init__(self):
        self.mongodb_client = mongodb_client

    async def get_all_memories(self, user_id: str) -> Dict[str, Any]:
        """获取用户的所有记忆元数据"""
        cursor = self.mongodb_client.memories_collection.find({"user_id": user_id})
        docs = await cursor.to_list(length=None)

        result = []
        for doc in docs:
            memories = doc.get("memories", {})
            categories_count = len(memories)
            total_items = sum(len(cat.get("items", [])) for cat in memories.values())

            result.append({
                "owner_type": doc.get("owner_type"),
                "owner_id": doc.get("owner_id"),
                "categories_count": categories_count,
                "total_items": total_items,
                "created_at": doc.get("created_at").isoformat(),
                "updated_at": doc.get("updated_at").isoformat()
            })
        return {"success": True, "data": result}

    async def get_owner_memories(
        self, user_id: str, owner_type: str, owner_id: str
    ) -> Dict[str, Any]:
        """获取特定智能体的记忆"""
        doc = await self.mongodb_client.memories_collection.find_one({
            "user_id": user_id,
            "owner_type": owner_type,
            "owner_id": owner_id
        })
        if doc:
            return {"success": True, "memories": doc.get("memories", {})}
        return {"success": False, "message": "记忆不存在"}

3.4 提示词中心(Prompt Center)

提示词中心提供了统一管理可复用提示词模板的能力。通过将常用的提示词模式抽象为模板,开发者可以避免重复编写相似的提示词,同时确保风格和质量的一致性。提示词模板支持变量插值,可以在运行时根据具体场景填充参数。

4. MCP Agent Graph 安装与部署

4.1 系统要求

在部署 MCP Agent Graph 之前,请确保您的系统满足以下要求:

组件 要求
操作系统 Linux、macOS 或 Windows (需要 WSL2)
Docker 20.10+ 版本,包含 Docker Compose
Python 3.11+ 版本
内存 最低 4GB (推荐 8GB)
存储空间 至少 10GB 可用空间

4.2 快速部署步骤

4.2.1 克隆项目
git clone <https://github.com/keta1930/mcp-agent-graph.git>
cd mcp-agent-graph
4.2.2 配置并启动 Docker 服务

进入 Docker 配置目录并创建环境配置文件:

cd docker/mag_services
cp .env.example .env

编辑 .env 文件,配置必要的参数:

# MongoDB 配置
MONGO_ROOT_USERNAME=admin
MONGO_ROOT_PASSWORD=securepassword123
MONGO_DATABASE=mcp-agent-graph
MONGO_PORT=27017

# MongoDB Express 配置 (数据库 Web 管理界面)
MONGO_EXPRESS_PORT=8081
MONGO_EXPRESS_USERNAME=admin
MONGO_EXPRESS_PASSWORD=expresspwd123

# MinIO 配置 (对象存储服务)
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=minioadmin123
MINIO_API_PORT=9010
MINIO_CONSOLE_PORT=9011
MINIO_SECURE=false

# JWT 配置(生成密钥: python mag/scripts/generate_jwt_secret.py)
JWT_SECRET_KEY=your_generated_secret_key_here
JWT_ALGORITHM=HS256
JWT_ACCESS_TOKEN_EXPIRE_MINUTES=15
JWT_REFRESH_TOKEN_EXPIRE_DAYS=7

# 超级管理员配置
ADMIN_USERNAME=admin
ADMIN_PASSWORD=admin123

启动 Docker 服务:

docker-compose up -d

验证服务状态:

docker-compose ps

启动后可访问以下服务:

服务 地址 说明
MongoDB Express http://localhost:8081 数据库 Web 管理界面
MinIO Console http://localhost:9011 文件存储管理界面
4.2.3 安装 Python 依赖并启动后端

方式一:使用 uv (推荐)

uv 是一个快速的 Python 包管理器:

# 安装 uv (如果尚未安装)
curl -LsSf <https://astral.sh/uv/install.sh> | sh

# 返回项目根目录并同步依赖
uv sync

# 启动后端服务
cd mag
uv run python main.py

方式二:使用 pip

cd ../..  # 返回项目根目录
pip install -r requirements.txt

cd mag
python main.py

后台运行(生产环境):

nohup python main.py > ../app.log 2>&1 &
4.2.4 访问应用

打开浏览器访问:http://localhost:9999

管理员登录:使用 .env 配置的 ADMIN_USERNAME 和 ADMIN_PASSWORD

新用户注册:使用邀请码注册(管理员在后台生成邀请码)

其他访问端点:

端点 地址 说明
Web 界面 http://localhost:9999 主应用界面
API 文档 http://localhost:9999/docs Swagger API 文档
健康检查 http://localhost:9999/health 服务健康状态

5. 本地部署实践: Ollama + Qwen3 集成

5.1 为什么选择本地部署

在生产环境中,将 LLM 部署在本地具有多方面的优势。首先是数据隐私保护,敏感数据无需传输到外部 API 服务器。其次是低延迟响应,本地推理避免了网络往返时间。第三是成本可控,避免了按调用次数计费的模式。最后是离线可用性,即使在网络不稳定的环境下也能正常工作。

Ollama 是一个轻量级的本地 LLM 运行框架,它简化了模型的下载、配置和运行过程。Qwen3 是阿里巴巴开源的高质量语言模型,支持中英文双语,具有优秀的推理能力。将 Ollama + Qwen3 与 MCP Agent Graph 集成,可以构建一套完全本地化的智能体系统。

5.2 Ubuntu 环境下 Ollama 安装与配置

5.2.1 安装 Ollama
# 一键安装 Ollama (Ubuntu/Debian)
curl -fsSL <https://ollama.com/install.sh> | sh

# 验证安装
ollama --version
5.2.2 配置 Ollama 为系统服务

在 Ubuntu 服务器环境中,建议将 Ollama 配置为 systemd 服务以便自动启动和管理:

# 创建 systemd 服务文件
sudo tee /etc/systemd/system/ollama.service > /dev/null <<EOF
[Unit]
Description=Ollama Service
After=network-online.target

[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_MODELS=/var/lib/ollama/models"

[Install]
WantedBy=default.target
EOF

# 创建 ollama 用户和目录
sudo useradd -r -s /bin/false -m -d /var/lib/ollama ollama
sudo mkdir -p /var/lib/ollama/models
sudo chown -R ollama:ollama /var/lib/ollama

# 启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable ollama
sudo systemctl start ollama

# 检查服务状态
sudo systemctl status ollama
5.2.3 环境变量配置
# 编辑环境配置文件
sudo vim /etc/environment

# 添加以下内容:
OLLAMA_MODELS=/var/lib/ollama/models
OLLAMA_HOST=0.0.0.0:11434

# 或者添加到用户 profile
echo 'export OLLAMA_HOST=0.0.0.0:11434' >> ~/.bashrc
source ~/.bashrc

5.3 下载并运行 Qwen3 模型

Ollama 提供了多个 Qwen3 模型版本,可根据硬件配置选择:

模型版本 参数量 显存需求 适用场景
qwen3:0.6b 6亿 约1GB 轻量级测试
qwen3:1.7b 17亿 约2GB 基础对话
qwen3:4b 40亿 约4GB 均衡性能
qwen3:8b 80亿 约8GB 高质量推理
qwen3:14b 140亿 约16GB 复杂任务
qwen3:32b 320亿 约32GB 专业应用
# 下载并运行 Qwen3 8B 模型(推荐)
ollama run qwen3:8b

# 或者选择更小的模型以适应有限硬件
ollama run qwen3:4b

# 仅下载模型不运行
ollama pull qwen3:8b

首次运行时会自动下载模型文件,下载完成后即可开始对话测试。

5.4 验证 Ollama API 服务

Ollama 运行后会在本地启动一个 RESTful API 服务,默认监听 http://localhost:11434。可以通过以下方式验证服务状态:

# 检查服务状态
curl <http://localhost:11434/api/tags>

# 预期返回已安装模型列表:
# {"models":[{"name":"qwen3:8b","modified_at":"...","size":...}]}

5.5 在 MCP Agent Graph 中配置 Ollama

MCP Agent Graph 支持 OpenAI 兼容的 API 格式,而 Ollama 提供了这种兼容接口。配置步骤如下:

步骤一: 修改环境配置

在 MCP Agent Graph 的 .env 文件中添加 Ollama 配置:

# Ollama 配置
OLLAMA_BASE_URL=http://localhost:11434/v1
OLLAMA_API_KEY=ollama  # Ollama 不需要真实密钥,但某些客户端要求非空

步骤二: 在模型管理中添加 Ollama 模型

登录 MCP Agent Graph 后台,进入"工作空间 → 模型管理"页面:

点击"添加模型",填写以下配置:

模型名称: Qwen3-8B-Local
模型标识: qwen3:8b
API 基础地址: <http://localhost:11434/v1>
API 密钥: ollama
模型类型: chat

步骤三: 创建使用 Ollama 的智能体

在"智能体管理"页面创建新智能体,选择刚才添加的 Qwen3 模型:

6. 完整部署流程脚本

以下是一个完整的部署脚本,用于在本地环境中部署 MCP Agent Graph + Ollama:

#!/bin/bash
# deploy.sh - MCP Agent Graph + Ollama 本地部署脚本

set -e

echo "=== MCP Agent Graph 本地部署脚本 ==="

# 1. 检查 Docker 是否安装
if ! command -v docker &> /dev/null; then
    echo "错误: Docker 未安装,请先安装 Docker"
    exit 1
fi

# 2. 安装 Ollama
echo ">>> 安装 Ollama..."
if ! command -v ollama &> /dev/null; then
    curl -fsSL <https://ollama.com/install.sh> | sh
fi

# 3. 下载 Qwen3 模型
echo ">>> 下载 Qwen3 模型..."
ollama pull qwen3:8b

# 4. 克隆 MCP Agent Graph 项目
echo ">>> 克隆项目..."
if [ ! -d "mcp-agent-graph" ]; then
    git clone <https://github.com/keta1930/mcp-agent-graph.git>
fi
cd mcp-agent-graph

# 5. 配置环境变量
echo ">>> 配置环境变量..."
cd docker/mag_services
if [ ! -f ".env" ]; then
    cp .env.example .env
    # 修改默认配置
    sed -i 's/ADMIN_USERNAME=.*/ADMIN_USERNAME=admin/' .env
    sed -i 's/ADMIN_PASSWORD=.*/ADMIN_PASSWORD=admin123/' .env
fi

# 6. 启动 Docker 服务
echo ">>> 启动 Docker 服务..."
docker-compose up -d

# 7. 等待服务就绪
echo ">>> 等待服务启动..."
sleep 10

# 8. 安装 Python 依赖并启动后端
cd ../..
echo ">>> 安装 Python 依赖..."
pip install -r requirements.txt

echo ">>> 启动后端服务..."
cd mag
nohup python main.py > ../app.log 2>&1 &

echo "=== 部署完成 ==="
echo "访问地址: <http://localhost:9999>"
echo "管理员账号: admin"
echo "管理员密码: admin123"
echo ""
echo "Ollama API: <http://localhost:11434>"
echo "已安装模型: qwen3:8b"

7. 总结

本文深入介绍了 MCP Agent Graph 这一基于上下文工程理念构建的多智能体系统框架。从理论基础到实践部署,它提供了一个完整的实验和开发平台,无论是学习多智能体系统的原理,还是构建实际的应用产品,都是一个理想的起点。

参考资源

https://github.com/keta1930/mcp-agent-graph

https://keta1930.github.io/mcp-agent-graph/

https://modelcontextprotocol.io/specification

相关推荐