使用说明
AGF介质测量——MCP代理演示
概念验证演示 动态工具发现 使用MCP和LLM。系统模拟 AGF德国-风格电视观众测量数据——覆盖率、市场份额、跨媒体指标——都可以按节目、频道、类型和人口统计细分进行查询。
关键演示: 工具集在运行时注册/注销。LLM在每个回合都会发现新的功能——从基本指标开始,然后将高级分析带到网上,并观看LLM立即使用它们。
建筑
┌──────────────────────────────────────────────────────────────────────────────┐
│ Railway Project │
│ │
│ Service 1: Gateway (:8000) │
│ ┌──────────────────────────────┐ Service 2: Basic Metrics (:8002) │
│ │ Tool Registry (REST API) │◄─register──┌──────────────────────┐ │
│ │ Web Agent (OpenAI LLM) │──invoke───►│ list_channels │ │
│ │ Web UI (chat + inspector) │ │ list_programs │ │
│ │ │ │ get_program_reach │ │
│ │ /api/register │ │ get_channel_share │ │
│ │ /api/deregister/{name} │ └──────────────────────┘ │
│ │ /api/toolsets │ │
│ │ /ws/chat │ Service 3: Advanced Analytics │
│ │ │◄─register──┌──────────────────────┐ │
│ │ │──invoke───►│ get_top_programs │ │
│ └──────────────────────────────┘ │ get_demographic_brkdn │ │
│ │ get_cross_media_reach │ │
│ Browser ◄──WebSocket──► Gateway │ compare_channels │ │
│ │ get_genre_performance │ │
│ └──────────────────────┘ │
└──────────────────────────────────────────────────────────────────────────────┘
它是如何工作的:
- 网关启动--还没有可用的工具
- 工具集服务启动并将其工具定义POST到
POST /api/register - 在每条聊天消息中,网关都会发现当前注册的工具
- LLM决定调用哪些工具;网关代理对所属工具集的调用
- 如果一个工具集停止,它的工具就会消失——LLM会在下一轮进行调整
演示流程
- 启动网关——聊天显示“没有可用工具”
- 启动基本度量——UI显示工具集已上线,包含4个工具
- 问: “Tagesschau在65岁以上人群中的影响力有多大?” --LLM使用
get_program_reach - 问: “向我展示Tatort的完整人口统计数据” --LLM说它不能(没有工具)
- 启动高级分析——UI显示还有5个工具上线
- 问同样的问题——LLM现在使用
get_demographic_breakdown并给出一个完整的矩阵 - 停止基本指标——LLM失去了基础工具,但保留了高级工具
工具
工具集:基本指标
| 工具 | 说明 |
|---|---|
list_channels() |
列出所有10个德国电视频道 |
list_programs(channel?, genre?) |
使用过滤器浏览程序 |
get_program_reach(program, age_group?, gender?) |
达到千+% |
get_channel_share(channel, age_group?, gender?) |
市场份额% |
工具集:高级分析
| 工具 | 说明 |
|---|---|
get_top_programs(metric?, n?, age_group?, gender?) |
排名前N的项目 |
get_demographic_breakdown(name, entity_type?) |
完整年龄x性别矩阵 |
get_cross_media_reach(name, entity_type?, age_group?, gender?) |
电视+流媒体覆盖 |
compare_channels(channels, metric?, age_group?, gender?) |
并排比较 |
get_genre_performance(genre, age_group?, gender?) |
综合流派指标 |
快速入门(本地)
先决条件
- Python 3.10+
- OpenAI API密钥
设置
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
export OPENAI_API_KEY=sk-...
运行(3个终端)
终端1——网关:
python3 gateway/app.py
# Starts on http://localhost:8000
终端2——基本度量工具集:
python3 toolsets/basic_metrics.py
# Registers 4 tools with the gateway
终端3——高级分析工具集:
python3 toolsets/advanced_analytics.py
# Registers 5 tools with the gateway
打开 http://localhost:8000 在您的浏览器中。
随时启动/停止工具集——UI实时更新,LLM根据下一条消息进行调整。
部署到铁路
1.从同一仓库创建3个服务
在Railway中,创建一个新项目,然后添加3个服务,所有服务都指向 ucKaizen/mcpagents GitHub仓库:
| 服务 | Dockerfile | 环境变量 |
|---|---|---|
| 网关 | gateway/Dockerfile |
OPENAI_API_KEY=sk-... |
| 基本度量 | toolsets/Dockerfile.basic |
GATEWAY_URL=http://gateway.railway.internal:8000, SELF_URL=http://basic-metrics.railway.internal:8002 |
| 高级分析 | toolsets/Dockerfile.advanced |
GATEWAY_URL=http://gateway.railway.internal:8000, SELF_URL=http://advanced-analytics.railway.internal:8003 |
2.配置网络
- 生成一个 公有领域 仅适用于网关服务(这是您在浏览器中打开的URL)
- 工具集通过Railway与网关通信 内部联网 (
.railway.internal)
3.演示
- 从Railway仪表板停止/启动工具集服务
- 实时观察聊天界面的反应
项目结构
mcpagents/
├── gateway/
│ ├── app.py # Gateway: registry + web agent + UI server
│ └── Dockerfile
├── toolsets/
│ ├── basic_metrics.py # Toolset 1: list, reach, share
│ ├── advanced_analytics.py # Toolset 2: top, demographics, cross-media
│ ├── Dockerfile.basic
│ └── Dockerfile.advanced
├── server/
│ └── media_data.py # Shared data engine (deterministic, no DB)
├── web/
│ └── index.html # Chat UI + tool inspector + toolset status
├── requirements.txt
└── README.md
数据设计
没有数据库。所有受众数据都是从基于哈希的种子+现实的人口统计偏差矩阵中确定生成的:
- 类型偏见 --新闻偏65(1.9倍),娱乐偏14-29(1.5倍),体育偏男性(1.45倍)
- 渠道偏见 --ARD/ZDF在老年人口中占主导地位,ProSieben以14-29岁的成绩最强
- 校准的 --Tagesschau约900万人,ARD约12%的份额,与真实的AGF数据相匹配
- 跨媒体 --流媒体在线性电视的基础上增加了5-25%,对年轻观众来说更重
- 确定性的 --相同的查询总是返回相同的数字
聊天机器人约束
LLM配置为 专业媒体分析助理。它将:
- 仅回答有关德国电视观众测量的问题
- 仅使用注册工具中的数据(切勿猜测或编造数字)
- 明确说明何时缺少功能(工具集未注册)
- 拒绝回答无关的问题(编码、常识等)
