从论文到工程:美团 ASX 团队的 Agent 技术栈给搜推系统带来什么

2026-07-03 29 预计阅读时间: 1 分钟
来源: tech.meituan.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 分钟

搜索推荐正在从“排序模型 + 规则系统”走向“能理解、能规划、能反馈学习的 Agentic System”。美团业务研发平台/搜推 ASX 团队围绕大模型后训练、Agentic 强化学习、多模态理解等方向持续产出顶会研究,这类工作对业务工程的启发不只是“模型更大”,而是如何把大模型变成可控、可评估、能嵌入生产链路的智能组件。

搜推 Agent 不是聊天机器人,而是决策系统

在搜索推荐场景里,Agent 的目标通常不是闲聊,而是完成一串带约束的决策:理解用户意图、调用检索或排序工具、处理图片/文本/结构化上下文、生成解释或候选策略,并根据反馈持续优化。

这和传统搜推链路有几个明显差异:

  • 输入更复杂:不仅有 query、用户画像、商户特征,还可能有图片、评论、地理位置、实时上下文。
  • 动作更丰富:Agent 可以选择检索、重排、改写 query、调用多模态模型、请求补充信息。
  • 训练目标更接近任务闭环:不只优化单点点击率,还要关注多步决策后的整体收益。
  • 评估更困难:离线指标、在线指标、人工偏好、安全边界需要一起看。

ASX 团队关注的后训练、Agentic 强化学习、多模态理解,正好对应这三个工程痛点:让模型更会执行任务,让模型从交互反馈中学习,让模型看懂更丰富的业务世界。

后训练:把通用大模型磨成业务模型

通用大模型有语言能力,但直接进入搜推系统会遇到两个问题:一是业务概念不稳定,比如“附近好吃的轻食”背后有地理、品类、价格、时段等约束;二是输出不可控,比如模型可能生成听起来合理但不可执行的策略。

后训练的价值在于把模型行为压到业务轨道上。常见可实践路径包括:

  • 监督微调:用高质量任务样本教模型按指定格式输出。
  • 偏好优化:让模型学会在多个候选行为中选择更符合业务目标的一个。
  • 工具调用训练:让模型知道什么时候查索引、什么时候调用排序服务、什么时候拒答。
  • 安全与边界样本:减少幻觉、越权调用、错误解释。

对工程团队来说,后训练不是一次性“喂数据”,而是一个数据闭环:线上日志抽样、人工或规则标注、训练、评估、灰度,再回到日志。

Agentic 强化学习:优化的是多步行为

传统推荐模型常常把问题拆成召回、粗排、精排、重排,各模块分别优化。Agentic 强化学习的关注点更像“整条路径是否做对了”:模型先判断用户意图,再选择工具,再基于返回结果做下一步动作,最终影响用户体验。

可以把一次搜索推荐交互抽象成:

  • 状态:用户上下文、query、历史行为、当前候选集。
  • 动作:query 改写、选择召回通道、调用视觉理解、调整排序策略。
  • 奖励:点击、转化、停留、用户反馈、违规惩罚、延迟惩罚。
  • 策略:给定状态后选择下一步动作的模型。

这里最大的工程挑战不是算法公式,而是奖励设计。只奖励点击可能诱导标题党;只奖励转化可能牺牲探索;不惩罚延迟会让 Agent 滥用工具。因此,生产环境通常需要把业务收益、体验成本和安全约束组合起来。

多模态理解:让系统读懂图片、文本和场景

本地生活、餐饮、酒旅、零售等场景天然是多模态的。用户看到的是图片、门店名、菜单、评价、距离、价格;系统如果只理解文本,就会丢掉大量信号。

多模态理解在搜推里可以落到这些任务:

  • 从商户图片中识别菜品、环境、风格。
  • 将评论文本和图片证据对齐,降低虚假或无关内容影响。
  • 用图片辅助 query 理解,例如“这种蛋糕附近有吗”。
  • 为推荐解释提供更可信的证据链。

但多模态也会带来成本和风险:图片模型推理更贵,视觉标签可能误判,用户上传内容还涉及隐私和合规。工程落地时通常需要缓存、异步特征生产、置信度阈值和人工审核机制。

可以这样实践:一个最小 Agent 搜索重排原型

下面是一个可复制运行的 Python 示例,用来演示“Agent 根据 query 选择工具,再对候选结果重排”的最小形态。它不是论文实现,也不代表 ASX 内部系统,只是把上述思想压缩成一个可改造的工程骨架。

运行前只需要本机安装 Python 3.10+。把代码保存为 agentic_search_demo.py 后执行 python agentic_search_demo.py

from dataclasses import dataclass
from typing import Callable


@dataclass
class Item:
    name: str
    category: str
    distance_km: float
    rating: float
    price: int
    tags: list[str]


CATALOG = [
    Item("青禾轻食", "healthy", 0.8, 4.7, 38, ["沙拉", "低脂", "午餐"]),
    Item("巷口火锅", "hotpot", 1.2, 4.8, 96, ["聚餐", "麻辣", "晚餐"]),
    Item("麦香蛋糕", "bakery", 0.5, 4.6, 52, ["生日", "蛋糕", "下午茶"]),
    Item("快客简餐", "fast_food", 0.3, 4.2, 24, ["便宜", "快", "午餐"]),
]


def retrieve(query: str) -> list[Item]:
    keywords = set(query.lower().split())
    results = []
    for item in CATALOG:
        haystack = " ".join([item.name, item.category, *item.tags]).lower()
        if any(word in haystack for word in keywords):
            results.append(item)
    return results or CATALOG


def intent_policy(query: str) -> Callable[[Item], float]:
    query = query.lower()

    def score(item: Item) -> float:
        value = item.rating * 2 - item.distance_km
        if "便宜" in query or "cheap" in query:
            value -= item.price / 50
        if "附近" in query or "near" in query:
            value -= item.distance_km * 2
        if "健康" in query or "轻食" in query or "healthy" in query:
            value += 3 if item.category == "healthy" else 0
        if "蛋糕" in query or "cake" in query:
            value += 3 if item.category == "bakery" else 0
        return value

    return score


def agent_search(query: str) -> list[Item]:
    candidates = retrieve(query)
    ranker = intent_policy(query)
    return sorted(candidates, key=ranker, reverse=True)


if __name__ == "__main__":
    query = "附近 健康 午餐"
    ranked = agent_search(query)
    for index, item in enumerate(ranked, start=1):
        print(f"{index}. {item.name} | {item.category} | {item.distance_km}km | ¥{item.price} | {item.rating}")

这个原型可以继续演进:

  • intent_policy 替换成大模型函数调用,让模型输出结构化意图。
  • retrieve 接到 Elasticsearch、向量数据库或内部召回服务。
  • 把排序分数拆成可观测特征,记录每次决策原因。
  • 加入延迟、价格、商户质量、安全规则等惩罚项。
  • 用线上反馈构造偏好样本,做后训练或策略优化。

如果要把它改成 API 服务,可以先约定 Agent 的输入输出格式:

{
  "query": "附近适合生日的蛋糕",
  "user_context": {
    "lat": 31.2304,
    "lng": 121.4737,
    "time": "afternoon"
  },
  "constraints": {
    "max_distance_km": 3,
    "max_latency_ms": 300
  }
}

生产系统中,强烈建议让 Agent 输出结构化 JSON,而不是自由文本。这样后续服务可以校验字段、打日志、回放评估,也能在模型异常时快速降级。

落地时要盯住的边界

ASX 这类研究方向对搜推工程很有启发,但从论文走到生产还需要克制:

  • 不要让 Agent 绕过现有安全规则:工具调用权限、内容安全、商户公平性都要硬约束。
  • 不要只看模型离线分数:多步系统要看延迟、稳定性、成本和线上业务指标。
  • 不要把奖励写得过窄:单一点击奖励可能放大短期行为,伤害长期体验。
  • 保留可解释和可回放能力:每次工具选择、候选集变化、重排原因都应能追踪。
  • 灰度替换,而不是一刀切重构:先从 query 改写、解释生成、多模态特征补充等低风险环节切入。

更现实的采用路径是:先用大模型增强局部模块,再把反馈数据沉淀为后训练样本,最后逐步引入 Agentic 强化学习优化多步策略。这样既能吃到大模型能力红利,也不会把核心搜推链路一次性暴露在不可控风险里。


相关推荐