在 SageMaker AI 上用多轮强化学习训练更可靠的搜索智能体

2026-10-02 28 预计阅读时间: 1 分钟
来源: aws.amazon.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:11 分钟

搜索智能体的难点通常不在“会不会调用搜索工具”,而在于它能否连续做对几件事:理解问题、构造查询、判断结果是否充分、必要时改写查询,并基于证据给出答案。通过在 Amazon SageMaker AI 上进行多轮强化学习(Multi-Turn Reinforcement Learning,MTRL)微调,可以让较小的模型熟悉特定工具和运行环境,以更低的延迟与成本获得更稳定的领域表现。

需要注意的是,这里的目标并不是让小模型在所有任务上取代前沿模型,而是把它训练成一个边界清晰、工具固定、评价标准明确的专用搜索智能体。

为什么单轮微调不够

传统监督微调往往把一个样本表示为“输入问题—目标答案”。但搜索智能体面对的是一条轨迹:

  1. 用户提出问题;
  2. 模型选择搜索工具并生成参数;
  3. 环境返回搜索结果;
  4. 模型判断证据是否充分;
  5. 模型继续搜索,或者生成最终答案。

如果只监督最终答案,模型可能碰巧答对,却使用了错误查询或引用了不相关文档。相反,一个搜索过程也可能在前几步失败,经过查询改写后成功找回正确内容。多轮强化学习关注整条轨迹,让最终任务结果、检索质量、工具调用合法性和执行成本共同影响训练信号。

可以把一条训练轨迹抽象为:

用户问题
  -> search(query="...")
  <- 文档列表
  -> search(query="改写后的查询")
  <- 更相关的文档
  -> 带证据的最终答案

这种表示方式尤其适合企业内部搜索,因为模型需要学习的不只是自然语言,还包括索引字段、过滤条件、工具参数以及“什么时候应该停止搜索”。

奖励函数决定智能体真正学到什么

MTRL 的关键并不是简单地给正确答案打 1 分,而是设计一组能反映业务目标的奖励。一个实用的奖励函数通常包含以下部分:

  • 任务成功率:最终答案是否解决了用户问题;
  • 检索相关性:返回结果是否包含支持答案的文档;
  • 证据一致性:答案中的结论能否由检索内容支撑;
  • 工具合法性:工具名称、参数结构和过滤条件是否有效;
  • 交互效率:是否存在重复搜索、无意义改写或过多轮次;
  • 安全约束:是否访问了不允许的数据域,或暴露了敏感信息。

下面是一个可直接运行的本地奖励计算示例。它不是特定 MTRL 框架的完整训练器,而是一个可用于数据检查、离线评估或奖励服务原型的最小实现。

将其保存为 reward_demo.py,然后运行 python reward_demo.py:

from dataclasses import dataclass
from typing import List


@dataclass
class RetrievedDocument:
    document_id: str
    relevance: float  # 约定为 0.0 到 1.0


@dataclass
class SearchTrajectory:
    tool_calls: int
    invalid_tool_calls: int
    answer_supported: bool
    documents: List[RetrievedDocument]


def calculate_reward(trajectory: SearchTrajectory) -> dict:
    best_relevance = max(
        (doc.relevance for doc in trajectory.documents),
        default=0.0,
    )

    task_reward = 1.0 if trajectory.answer_supported else 0.0
    tool_reward = 1.0 if trajectory.invalid_tool_calls == 0 else 0.0
    extra_call_penalty = 0.05 * max(0, trajectory.tool_calls - 3)

    total = (
        0.45 * task_reward
        + 0.35 * best_relevance
        + 0.20 * tool_reward
        - extra_call_penalty
    )

    return {
        "total": round(total, 4),
        "task_reward": task_reward,
        "retrieval_reward": best_relevance,
        "tool_reward": tool_reward,
        "extra_call_penalty": extra_call_penalty,
    }


if __name__ == "__main__":
    sample = SearchTrajectory(
        tool_calls=2,
        invalid_tool_calls=0,
        answer_supported=True,
        documents=[
            RetrievedDocument("doc-17", 0.42),
            RetrievedDocument("doc-23", 0.91),
        ],
    )
    print(calculate_reward(sample))

生产环境中不应直接把人工标注分数当作唯一事实。可以组合搜索相关性标注、确定性规则、答案验证器和人工抽检,并分别记录每个奖励分量。否则,一旦只优化总分,就很难发现模型是在提升真实质量,还是学会了利用奖励函数的漏洞。

在 SageMaker AI 中组织训练任务

一种可行的工程结构是把轨迹生成、奖励计算、策略训练和离线评估拆开:

search-agent-mtrl/
├── src/
│   ├── train.py
│   ├── reward.py
│   └── tools.py
├── data/
│   ├── train.jsonl
│   └── validation.jsonl
├── launch_training.py
└── requirements.txt

每条 JSONL 数据可以保存问题、每轮动作、工具观察结果和最终评价。例如:

{"episode_id":"ep-001","question":"如何重置某服务的访问令牌?","turns":[{"action":"search","arguments":{"query":"服务 访问令牌 重置"},"observation":["doc-23","doc-42"]},{"action":"answer","text":"根据 doc-23,需要先撤销旧令牌,再创建新令牌。"}],"labels":{"supported":true,"relevant_document_ids":["doc-23"]}}

当自定义训练镜像和 train.py 已经准备好后,可以通过 SageMaker Python SDK 提交训练任务。下面的启动脚本是可改造的通用骨架,并不假设某个特定的强化学习库:

# launch_training.py
import os
from sagemaker.estimator import Estimator

role = os.environ["SAGEMAKER_ROLE_ARN"]
image_uri = os.environ["TRAINING_IMAGE_URI"]
training_data = os.environ["TRAINING_DATA_S3_URI"]
output_path = os.environ["MODEL_OUTPUT_S3_URI"]

estimator = Estimator(
    image_uri=image_uri,
    role=role,
    instance_count=1,
    instance_type=os.getenv("INSTANCE_TYPE", "ml.g5.2xlarge"),
    entry_point="train.py",
    source_dir="src",
    output_path=output_path,
    hyperparameters={
        "learning-rate": 1e-6,
        "episodes-per-batch": 32,
        "max-turns": 6,
        "kl-coefficient": 0.02,
    },
    environment={
        "TOKENIZERS_PARALLELISM": "false",
    },
)

estimator.fit({"train": training_data})

运行前需要安装并配置 AWS 与 SageMaker SDK,再替换以下环境变量:

python -m pip install sagemaker boto3

export AWS_DEFAULT_REGION=us-east-1
export SAGEMAKER_ROLE_ARN='arn:aws:iam::123456789012:role/SageMakerExecutionRole'
export TRAINING_IMAGE_URI='123456789012.dkr.ecr.us-east-1.amazonaws.com/search-agent-mtrl:latest'
export TRAINING_DATA_S3_URI='s3://my-bucket/search-agent/train/'
export MODEL_OUTPUT_S3_URI='s3://my-bucket/search-agent/models/'

python launch_training.py

train.py 应从 SageMaker 提供的训练通道读取数据,并将最终模型写入模型目录。具体策略优化算法、分布式配置和模型加载方式取决于所选基础模型及 RL 框架,因此不宜把它们硬编码进通用示例。

评估时不要只看最终答案

来源摘要提到,微调后在检索质量和可靠性方面获得了提升,但没有提供可复述的具体数值。实际复现时,应该同时建立基线模型、固定评测集和分层指标,而不是只比较几个演示问题。

建议至少记录:

维度 指标示例
检索质量 Recall@K、MRR、nDCG、关键文档命中率
答案质量 正确率、证据支持率、拒答准确率
工具可靠性 合法调用率、参数错误率、超时率
交互效率 平均搜索轮数、重复查询率、每任务 token 数
系统成本 单任务推理成本、P50/P95 延迟

评测集还应该覆盖无答案问题、工具超时、空搜索结果、权限不足、互相矛盾的文档和恶意提示。一个只在“搜索一定成功”的环境中训练出来的智能体,进入生产环境后往往会过度自信。

上线前的取舍与检查清单

多轮强化学习适合工具固定、任务重复、反馈可衡量的搜索场景。若工具接口经常变化、奖励难以验证,或者任务本身高度开放,先改善检索索引、提示词和监督数据,通常比直接引入 RL 更稳妥。

上线前可以逐项确认:

  • 训练集、验证集与测试集是否按问题或文档来源隔离,避免泄漏;
  • 奖励函数是否同时约束答案正确性、证据质量和调用成本;
  • 是否保留每轮动作、观察结果和奖励分量,便于回放故障;
  • 是否限制最大轮数、工具权限和可访问的数据范围;
  • 是否与基础模型、监督微调模型和更大模型基线进行同集比较;
  • 是否设置质量下降时的回滚机制,以及复杂问题转交更强模型的路由策略。

较小搜索智能体的价值来自“专用”和“可控”。SageMaker AI 提供训练任务所需的计算、数据通道和模型产物管理基础,而 MTRL 则把多轮工具交互纳入优化目标。两者结合的重点不是追求更长的推理轨迹,而是让每一次搜索、改写和停止决策都更可靠、更便宜,也更容易评估。


相关推荐