MRRA LogoMRRA
入门指南

快速开始

构建智能体并执行三种预测任务

快速开始

本节提供一个最小的可运行示例。流程包括:轨迹标准化 → 活动提取 → 活动目的分配(使用LLM并发)→ 图构建 → 图检索 → 多智能体反思 → 执行三种类型的预测。

环境设置

开始之前,确保环境配置正确:

  • Python版本:>= 3.10(推荐虚拟环境)
  • 基础依赖pip install -e .
  • 开发环境pip install -e .[dev]
  • MCP扩展pip install langchain-mcp-adapters mcp anyio httpx-sse

关键包说明

  • langchain-openai:创建OpenAI兼容的聊天模型客户端
  • networkx:图结构实现
  • pandas:数据处理和时间解析

完整示例

这是一个展示完整MRRA工作流程的完整可运行示例:

from mrra.data.trajectory import TrajectoryBatch
from mrra.data.activity import ActivityExtractor
from mrra.analysis.activity_purpose import ActivityPurposeAssigner
from mrra.graph.mobility_graph import MobilityGraph, GraphConfig
from mrra.retriever.graph_rag import GraphRAGGenerate
from mrra.graph.pattern import PatternGenerate
from mrra.agents.builder import build_mrra_agent
from mrra.agents.subagents import make_llm
from mrra.persist.cache import CacheManager, compute_tb_hash

import pandas as pd

# 1) 加载轨迹数据(必须包含列:user_id, timestamp, latitude, longitude)
df = pd.read_csv("your_traj.csv")
tb = TrajectoryBatch(df)  # 自动解析时间,添加派生列如hour/dow

# 2) 活动提取(radius/grid方法)和LLM并发细化"活动目的"
ext_cfg = dict(
    method="radius", 
    radius_m=300, 
    min_dwell_minutes=30, 
    max_gap_minutes=90, 
    grid_size_m=200
)
acts = ActivityExtractor(tb, **ext_cfg).extract()

llm_cfg = dict(
    provider='openai-compatible', 
    model='qwen-plus', 
    base_url='https://dashscope.aliyuncs.com/compatible-mode/v1', 
    api_key='YOUR_API_KEY', 
    temperature=0.2
)
llm = make_llm(**llm_cfg)  # 注意:这是一个可调用客户端,不是字典
acts = ActivityPurposeAssigner(tb, llm=llm, concurrency=8).assign(acts)

# 3) 可选:缓存结果以便重用
cm = CacheManager()
tb_hash = compute_tb_hash(tb)
cm.save_activities(tb_hash, "default", acts)

# 4) 构建移动图(注入"目的分配"活动以避免在图构建期间重新调用LLM)
cfg = GraphConfig(grid_size_m=200, min_dwell_minutes=5, use_activities=True)
mg = MobilityGraph(tb, cfg, activities=acts, assume_purposes_assigned=True)

# 5) 图检索器(GraphRAG),支持目的作为种子
retriever = GraphRAGGenerate(tb=tb, mobility_graph=mg)

# 6) 多智能体反思智能体(两个子智能体 + 置信度投票聚合)
reflection_cfg = dict(
    max_round=1,
    subAgents=[
        {"name": "temporal", "prompt": "从选项中选择最可能的位置id(选择),不要输出坐标。"},
        {"name": "spatial",  "prompt": "从选项中选择最可能的位置id(选择),不要输出坐标。"},
    ],
    aggregator="confidence_weighted_voting",
)
agent = build_mrra_agent(llm=llm_cfg, retriever=retriever, reflection=reflection_cfg)

# 7) 执行三种预测任务
user_id = tb.users()[0]
last_ts = tb.for_user(user_id).iloc[-1]["timestamp_local"].strftime("%Y-%m-%d %H:%M:%S")

for task, extra in (
    ("next_position", {"t": last_ts}),
    ("future_position", {"t": last_ts}),
    ("full_day_traj", {"date": tb.for_user(user_id).iloc[-1]["timestamp_local"].strftime("%Y-%m-%d")}),
):
    payload = {"task": task, "user_id": user_id}
    payload.update(extra)
    res = agent.invoke(payload)
    print(task, res)

脚本演示

脚本python scripts/verify_geolife.py演示了上述完整工作流程,具有额外功能:

  • LLM并发推理"活动目的"并缓存(.mrra_cache/
  • 在图构建期间重用"目的分配"活动(避免二次LLM调用)
  • 演示使用目的作为检索种子(purpose=dining)

数据要求

你的轨迹数据应包含以下必需列:

user_id      - 用户标识符
timestamp    - 时间戳(支持多种格式)
latitude     - 纬度坐标
longitude    - 经度坐标
poi_id       - 兴趣点ID
activity_type - 活动类型注释
speed        - 移动速度
bearing      - 移动方向
user_id,timestamp,latitude,longitude,poi_id
user_1,2023-01-01 09:00:00,31.2304,121.4737,poi_home
user_1,2023-01-01 12:00:00,31.2404,121.4837,poi_office
user_1,2023-01-01 18:30:00,31.2304,121.4737,poi_home

对于Geolife数据集用户:将原始.plt文件放置在scripts/Data/<user>/Trajectory/中并运行python scripts/verify_geolife.py。你可以使用环境变量GEOLIFE_USER=<user>指定用户目录。

下一步

完成快速开始后: