MRRA LogoMRRA
入门指南

配置

LLM提供商、检索系统和MCP服务的高级配置选项

配置

MRRA为LLM提供商、检索系统、缓存和MCP服务提供了灵活的配置选项。本指南详细介绍所有配置方面。

LLM提供商配置

支持的提供商

MRRA通过统一接口支持多个LLM提供商:

# OpenAI 配置
openai_cfg = dict(
    provider='openai',
    model='gpt-4o-mini',  # 或 gpt-4, gpt-3.5-turbo
    api_key='your-openai-api-key',
    temperature=0.2,
    max_tokens=1000,
    timeout=60
)

# 使用自定义base URL(用于代理)
openai_proxy_cfg = dict(
    provider='openai',
    model='gpt-4o-mini',
    api_key='your-api-key',
    base_url='https://your-proxy.com/v1',
    temperature=0.2
)
# 千问配置(阿里巴巴DashScope)
qwen_cfg = dict(
    provider='openai-compatible',  # 使用OpenAI兼容接口
    model='qwen-plus',  # 或 qwen-turbo, qwen-max
    base_url='https://dashscope.aliyuncs.com/compatible-mode/v1',
    api_key='your-dashscope-api-key',
    temperature=0.2,
    max_tokens=2000
)

# 替代的直接配置
qwen_direct_cfg = dict(
    provider='qwen',
    model='qwen-plus',
    api_key='your-dashscope-api-key',
    temperature=0.2
)
# SiliconFlow 配置
siliconflow_cfg = dict(
    provider='openai-compatible',
    model='deepseek-chat',  # 或其他可用模型
    base_url='https://api.siliconflow.cn/v1',
    api_key='your-siliconflow-api-key',
    temperature=0.2,
    max_tokens=1500
)
# DeepInfra 配置
deepinfra_cfg = dict(
    provider='openai-compatible',
    model='meta-llama/Meta-Llama-3.1-8B-Instruct',
    base_url='https://api.deepinfra.com/v1/openai',
    api_key='your-deepinfra-api-key',
    temperature=0.2,
    max_tokens=2000
)
# 自定义提供商配置
custom_cfg = dict(
    provider='openai-compatible',  # 使用OpenAI兼容接口
    model='your-model-name',
    base_url='https://your-api-endpoint.com/v1',
    api_key='your-api-key',
    headers={'Custom-Header': 'value'},  # 可选的自定义头部
    temperature=0.2,
    max_tokens=1000,
    timeout=120
)

环境变量配置

设置环境变量以进行安全配置:

# OpenAI
export MRRA_OPENAI_API_KEY="your-openai-key"
export MRRA_OPENAI_MODEL="gpt-4o-mini"

# 千问
export MRRA_QWEN_API_KEY="your-dashscope-key"
export MRRA_QWEN_MODEL="qwen-plus"

# SiliconFlow
export MRRA_SILICONFLOW_API_KEY="your-siliconflow-key"

# 默认提供商
export MRRA_DEFAULT_PROVIDER="openai"
export MRRA_DEFAULT_MODEL="gpt-4o-mini"

在配置中使用环境变量:

import os

def create_llm_config_from_env():
    """从环境变量创建LLM配置"""
    
    provider = os.getenv('MRRA_DEFAULT_PROVIDER', 'openai')
    
    if provider == 'openai':
        return dict(
            provider='openai',
            model=os.getenv('MRRA_OPENAI_MODEL', 'gpt-4o-mini'),
            api_key=os.getenv('MRRA_OPENAI_API_KEY'),
            temperature=float(os.getenv('MRRA_TEMPERATURE', '0.2'))
        )
    elif provider == 'qwen':
        return dict(
            provider='openai-compatible',
            model=os.getenv('MRRA_QWEN_MODEL', 'qwen-plus'),
            base_url='https://dashscope.aliyuncs.com/compatible-mode/v1',
            api_key=os.getenv('MRRA_QWEN_API_KEY'),
            temperature=float(os.getenv('MRRA_TEMPERATURE', '0.2'))
        )
    else:
        raise ValueError(f"不支持的提供商: {provider}")

# 使用方法
llm_cfg = create_llm_config_from_env()

活动提取配置

参数指南

根据数据特征配置活动提取:

# 城市移动性的默认配置
default_cfg = dict(
    method="radius",           # 'radius' 或 'grid'
    radius_m=300,             # 检测半径(米)
    min_dwell_minutes=30,     # 最小停留时间
    max_gap_minutes=90,       # 点之间的最大间隙
    grid_size_m=200          # 网格单元大小(网格方法)
)

# 不同场景的配置
scenarios = {
    'urban_detailed': dict(
        method="radius",
        radius_m=200,           # 密集城市区域更小的半径
        min_dwell_minutes=20,   # 更短的最小停留时间
        max_gap_minutes=60,     # 更紧的间隙容忍度
        grid_size_m=150
    ),
    
    'suburban': dict(
        method="radius", 
        radius_m=500,           # 郊区更大的半径
        min_dwell_minutes=45,   # 更长的停留时间
        max_gap_minutes=120,    # 对间隙更宽松
        grid_size_m=300
    ),
    
    'sparse_data': dict(
        method="grid",          # 网格方法对稀疏数据更稳健
        radius_m=800,
        min_dwell_minutes=15,   # 稀疏数据的较低阈值
        max_gap_minutes=180,    # 更高容忍度
        grid_size_m=500
    ),
    
    'high_frequency': dict(
        method="radius",
        radius_m=100,           # 高频数据非常细粒度
        min_dwell_minutes=10,   # 频繁采样的短停留
        max_gap_minutes=30,     # 紧密间隙
        grid_size_m=100
    )
}

# 根据数据类型选择
data_type = 'urban_detailed'  # 根据需要更改
ext_cfg = scenarios[data_type]

acts = ActivityExtractor(tb, **ext_cfg).extract()

自适应配置

基于数据分析自动配置:

def auto_configure_extraction(tb):
    """根据轨迹特征自动配置提取"""
    
    df = tb.df
    
    # 分析数据特征
    avg_points_per_user = len(df) / df['user_id'].nunique()
    time_span = (df['timestamp_local'].max() - df['timestamp_local'].min()).total_seconds() / 3600  # 小时
    
    # 计算典型采样频率
    sampling_freq_minutes = time_span * 60 / len(df) if len(df) > 0 else 60
    
    # 估计典型移动距离
    distances = []
    for user_id in df['user_id'].unique()[:5]:  # 取前5个用户样本
        user_df = df[df['user_id'] == user_id].sort_values('timestamp_local')
        
        for i in range(1, min(100, len(user_df))):  # 最多取100个点
            prev = user_df.iloc[i-1]
            curr = user_df.iloc[i]
            
            lat_diff = curr['latitude'] - prev['latitude']
            lon_diff = curr['longitude'] - prev['longitude']
            distance = ((lat_diff**2 + lon_diff**2)**0.5) * 111000  # 近似米数
            
            distances.append(distance)
    
    median_distance = sorted(distances)[len(distances)//2] if distances else 300
    
    # 基于分析配置
    if avg_points_per_user > 2000 and sampling_freq_minutes < 5:
        # 高频数据
        config = dict(
            method="radius",
            radius_m=max(100, median_distance * 0.5),
            min_dwell_minutes=max(5, sampling_freq_minutes * 2),
            max_gap_minutes=max(30, sampling_freq_minutes * 10),
            grid_size_m=max(100, median_distance * 0.3)
        )
    elif avg_points_per_user < 200:
        # 稀疏数据
        config = dict(
            method="grid",
            radius_m=max(500, median_distance * 2),
            min_dwell_minutes=max(15, sampling_freq_minutes * 0.5),
            max_gap_minutes=max(120, sampling_freq_minutes * 5),
            grid_size_m=max(300, median_distance * 1.5)
        )
    else:
        # 标准数据
        config = dict(
            method="radius",
            radius_m=max(200, median_distance),
            min_dwell_minutes=max(20, sampling_freq_minutes),
            max_gap_minutes=max(60, sampling_freq_minutes * 3),
            grid_size_m=max(150, median_distance * 0.7)
        )
    
    print(f"自动配置提取参数: {config}")
    print(f"基于: {avg_points_per_user:.0f}平均点数/用户, {sampling_freq_minutes:.1f}分钟采样, {median_distance:.0f}米中位距离")
    
    return config

# 使用自适应配置
ext_cfg = auto_configure_extraction(tb)
acts = ActivityExtractor(tb, **ext_cfg).extract()

图配置

图构建选项

from mrra.graph.mobility_graph import GraphConfig

# 基础配置
basic_cfg = GraphConfig(
    grid_size_m=200,              # 网格单元大小
    min_dwell_minutes=5,          # 图节点的最小停留时间
    use_activities=True           # 使用基于活动的构建
)

# 高级配置
advanced_cfg = GraphConfig(
    grid_size_m=200,
    min_dwell_minutes=5,
    use_activities=True,
    include_transitions=True,      # 包含位置到位置的边
    purpose_transitions=True,      # 包含目的到目的的边
    temporal_granularity='both',   # 'hour', 'timebin', 或 'both'
    weight_by_duration=True,       # 按花费时间加权边
    max_edge_weight=1000,         # 边权重上限
    normalize_weights=True         # 标准化边权重
)

# 大数据集的内存优化配置
memory_optimized_cfg = GraphConfig(
    grid_size_m=500,              # 更大的网格减少节点数
    min_dwell_minutes=10,         # 更高阈值减少边数
    use_activities=True,
    include_transitions=False,     # 跳过转换边以节省内存
    purpose_transitions=False,
    temporal_granularity='hour',   # 仅使用小时节点,不使用时间段
    max_nodes=10000               # 限制总节点数
)

检索配置

配置GraphRAG检索权重和参数:

from mrra.retriever.graph_rag import GraphRAGGenerate

# 使用自定义权重创建检索器
retriever = GraphRAGGenerate(tb=tb, mobility_graph=mg)

# 配置检索权重
retriever.purpose_weight = 0.6    # 目的上下文权重
retriever.hour_weight = 0.5       # 小时上下文权重
retriever.dow_weight = 0.3        # 星期几权重
retriever.recent_weight = 0.2     # 最近位置权重
retriever.user_weight = 1.0       # 用户上下文权重

# 配置检索参数
retriever.max_results = 50        # 考虑的最大位置数
retriever.min_score_threshold = 0.01  # 最小相关性得分
retriever.diversification_factor = 0.3  # 结果多样化(0=无多样化,1=最大多样化)

# 任务特定配置
task_configs = {
    'next_position': {
        'purpose_weight': 0.4,
        'hour_weight': 0.6,
        'dow_weight': 0.4,
        'recent_weight': 0.8,  # 最近上下文高权重
    },
    'future_position': {
        'purpose_weight': 0.6,
        'hour_weight': 0.5,
        'dow_weight': 0.3,
        'recent_weight': 0.3,  # 最近上下文低权重
    },
    'full_day_traj': {
        'purpose_weight': 0.7,  # 目的模式高权重
        'hour_weight': 0.4,
        'dow_weight': 0.5,
        'recent_weight': 0.2,
    }
}

def configure_retriever_for_task(retriever, task):
    """根据预测任务配置检索器权重"""
    if task in task_configs:
        config = task_configs[task]
        for param, value in config.items():
            setattr(retriever, param, value)
    return retriever

缓存配置

缓存目录和设置

from mrra.persist.cache import CacheManager

# 默认缓存配置
default_cache = CacheManager()  # 使用 .mrra_cache/

# 自定义缓存目录
custom_cache = CacheManager(base_dir='/path/to/custom/cache')

# 基于环境的缓存配置
import os
cache_dir = os.getenv('MRRA_CACHE_DIR', '.mrra_cache')
cache_manager = CacheManager(base_dir=cache_dir)

多智能体反思配置

智能体配置模板

# 不同用例的模板配置
agent_templates = {
    'basic': dict(
        max_round=1,
        subAgents=[
            {"name": "temporal", "prompt": "专注于时间模式并从选项中选择。"},
            {"name": "spatial", "prompt": "专注于位置模式并从选项中选择。"},
        ],
        aggregator="confidence_weighted_voting"
    ),
    
    'comprehensive': dict(
        max_round=2,
        subAgents=[
            {"name": "temporal", "prompt": "分析时间模式包括一天中的时间和星期几偏好。"},
            {"name": "spatial", "prompt": "分析空间模式包括聚类和可达性。"},
            {"name": "purpose", "prompt": "分析活动目的和序列逻辑。"},
            {"name": "routing", "prompt": "分析移动效率和转换模式。"},
        ],
        aggregator="confidence_weighted_voting",
        consensus_threshold=0.6
    ),
    
    'fast': dict(
        max_round=1,
        subAgents=[
            {"name": "combined", "prompt": "快速考虑所有因素并从选项中选择。"}
        ],
        aggregator="simple_selection"
    )
}

def get_agent_config(template_name, custom_overrides=None):
    """从模板获取智能体配置,可选覆盖"""
    
    if template_name not in agent_templates:
        raise ValueError(f"未知模板: {template_name}")
    
    config = agent_templates[template_name].copy()
    
    if custom_overrides:
        config.update(custom_overrides)
    
    return config

# 使用方法
config = get_agent_config('comprehensive', {
    'max_round': 1,  # 覆盖以加速
    'consensus_threshold': 0.8  # 需要更高共识
})

配置最佳实践

  • 从默认配置开始,根据数据特征进行调整
  • 使用环境变量保存敏感信息如API密钥
  • 在运行昂贵操作前验证配置
  • 监控性能并相应调整参数
  • 广泛使用缓存避免重复计算

安全考虑

  • 永远不要将API密钥或敏感数据提交到版本控制
  • 对所有秘密使用环境变量
  • 为配置文件实施适当的访问控制
  • 定期轮换API密钥并更新配置

下一步