先说结论:我把品牌检测从“每天安排专人刷几千条预警”变成了“早上打开报告看一眼,该处置的处置,其余自动归档”。整个流程跑起来之后,人工介入量大概只有原来的10%不到。核心思路不复杂:把检测拆成模块,用MCP把各数据源标准化接进来,再用技能系统把这些模块编排成Agent能自主调用的能力。这篇文章完整复盘我搭建这套全自动Agent的过程,覆盖架构选型、技能封装、调度落地、实测定级和迭代路径,适合正在做品牌监测、舆情管理、内容合规自动化的同学参考。
1. 品牌检测为什么要做成Agent:被人工流程逼出来的自动化
1.1 品牌检测到底在检测什么
我帮某消费品客户做品牌检测的时候,需求非常明确,需要在四类渠道上持续盯四类风险:
- 假冒商品和侵权店铺:仿冒包装、山寨旗舰店、乱用logo;
- 未授权销售:非官方渠道卖货、窜货、乱价;
- 负面舆情:产品质量投诉、公关危机苗头、虚假宣传的讨论扩散;
- 商标蹭词:标题里堆品牌词蹭流量,实际卖完全无关的产品。
这四类风险有一个共同点:关键词命中只是信号,真实判定要看页面内容、店铺资质和上下文。品牌方过去靠的是各平台自带的预警工具,再配合人工每天跑一遍搜索。问题是预警工具能给到的只是“出现过这些词的链接”,后边的判断、分级、处置动作全部依赖人工点开页面人工确认。
当时帮客户做流程梳理,最直观的感受是:检测本质上是一条非常标准的流水线——采集、清洗、判定、归类、出具报告。流水线里每一步都重复、规则性强、量大,这种活儿天然适合交给Agent来做。但“适合”不代表“容易”,因为数据源分散、判定规则复杂、业务方还会随时改品牌词和检测口径。这也是后来我坚持用MCP加技能系统,而不是简单写死脚本的根本原因。
1.2 人工流程到底卡在哪
先看一组真实对比:
| 维度 | 专人人工检测 | 早期脚本检测 | MCP+技能系统Agent |
|---|---|---|---|
| 单日可处理量 | 200-300条 | 可以跑几千条,但误报率极高 | 稳定处理4000-6000条原始文本 |
| 覆盖数据源 | 3-5个常用平台 | 单一平台,扩展要改代码 | 统一协议,新增平台写一个Server |
| 误报率 | 人工判断相对准确 | 关键词命中即报,误报60%以上 | 迭代后控制在10%左右 |
| 业务规则变化 | 重新培训人员 | 改代码发版 | 改配置、改技能描述 |
| 人工复核负担 | 全部人工 | 全部人工 | 每天10-20分钟 |
人工流程的核心瓶颈有三点。第一是量:大促期间单日预警能到两三千条,两三个人根本刷不完,刷完也没效率。第二是覆盖面:社交平台、电商平台、新闻站、评论区,每一类平台的搜索规则都不一样,人工能覆盖的源非常有限,漏检是常态。第三是误报与漏报并存:大量关键词命中其实是无关讨论、粉丝玩梗、二手交易转卖,异常的真问题又常常因为关键词没覆盖到变体而漏掉。
1.3 为什么最终选了MCP和技能系统的组合
在正式搭建之前,我其实试过两条路。第一条是写死的Python采集脚本,把平台API直接封装成定时任务。这条路能跑,但每次品牌方改一个品牌词的别名,或者新增一个数据源,就得改代码、发版、回归,一个简单的业务变化往往要折腾小半天。第二条更激进,直接给大模型套一个搜索工具,让它自由发挥去检测。结果也不理想:模型确实能给出看起来很专业的分析,但它不知道什么时候该收敛,有时候分析完不执行,有时候在无关内容上反复深挖,输出结果没法直接作为处置依据。
最终选定的方案是MCP加技能系统的组合。MCP负责把数据源连接标准化,让Agent能稳定调用外部工具;技能系统负责把品牌检测的领域动作封装成边界清晰的原子能力,让模型在明确的流程节点上做判断。这套组合的好处是:业务方经常改的东西(品牌词、判定口径、平台配置)全部外置成配置和技能,流程本身保持稳定,模型不需要发明流程,只需要在每个节点上做擅长的事。
2. MCP与技能系统的分工逻辑:协议层和能力层解耦
2.1 MCP在架构里实际承担的角色
MCP的全称是Model Context Protocol,模型上下文协议。它的本质是在“外部工具/数据源”和“模型”之间加一层标准化协议。模型不需要了解每个平台API长什么样,只需要通过MCP客户端发现MCP服务端暴露的一组工具,再按统一的输入输出格式去调用。
这个抽象的价值可以类比成USB-C接口:各种平台底层接口完全不同,但MCP Server把“搜索某平台内容”“获取帖子详情”“订阅新发布内容”统一成同名工具,Agent只认协议不认具体实现。做品牌检测时数据源非常杂,社交平台、电商平台、新闻聚合源、评论区,我每个源部署一个MCP Server,新增平台时只需要给这个平台写一个适配器,Agent主流程和技能定义完全不用动。
我当时用某开源Agent框架搭的主流程,MCP客户端是框架内置的,MCP Server用Python实现,每个Server暴露若干个工具。工具定义的写法大致是这样:
# mcp_server/sources.py: 某社交平台数据源接入示例 from mcp.server import Server server = Server("brand_source_platform_a") @server.tool() def search_post(keyword: str, date_from: str, limit: int = 20): """在平台A上搜索包含指定关键词的最新内容。返回统一结构。""" client = get_platform_client("platform_a") raw_list = client.search(keyword=keyword, date_from=date_from, limit=limit) return normalize_records(raw_list) # normalize_records统一输出字段: # content / author / url / publish_time / source_type统一输出字段这件事特别重要。品牌检测后面所有技能都依赖这个结构,只要字段统一,清洗、判定、归档都只需要写一套逻辑。这也是MCP带来的隐藏收益:不仅是协议统一了调用方式,还逼着你把数据模型统一了。
2.2 技能系统:把检测动作封装成标准件
技能系统真正核心的不是“技能”这两个字,而是“契约”。每个技能都要有明确的名称、描述、输入参数Schema、输出Schema和执行方式。Agent调度层通过技能注册表发现技能,模型根据技能描述决定何时调用。
这里有个很容易忽略的细节:技能描述必须写清楚“什么时候该调用”以及“什么时候不该调用”。比如语义判定技能的描述,我会写“仅在已获得待判定文本后调用”。如果描述只写“判断一条文本是否侵权”,模型可能在还没采集到数据时就强行调用,然后告诉你“暂时没有数据,无法判断”,白白浪费一次推理。
我把品牌检测流程拆成四类技能:
| 技能 | 输入 | 输出 | 实现方式 |
|---|---|---|---|
| 采集技能 | 品牌词、日期范围、平台列表 | 结构化文本记录列表 | 调用MCP搜索/详情工具 |
| 清洗技能 | 原始文本记录 | 去重、过滤后的记录 | 本地数据处理逻辑 |
| 语义判定技能 | 品牌词、文本、上下文 | verdict、confidence、reason | 大模型推理 |
| 证据抽取与报告技能 | 判定通过的高置信结果 | 结构化证据、报告文件 | 本地逻辑+MCP数据回查 |
每个技能内部都可以调用MCP工具、本地函数或大模型接口,但外部看起来就是一个输入输出明确的函数。技能之间不能互相拧成一团,采集技能不知道判定技能怎么工作,判定技能也不负责去调平台API,这样才能保证整个流程可以单独测试、单独替换。
2.3 MCP和技能系统的边界:谁管连接,谁管编排
一句话总结:MCP管“接通外部世界”,技能系统管“定义内部动作”。技能是编排单元,MCP是执行通道。技能可以调用MCP工具,但技能定义里不绑定某个具体MCP Server;切换数据源时只换Server实现,不改技能本身。
这个解耦带来的实际收益是上线之后才感受到的。某电商平台的接口突然改版,导致搜索接口失效,我只需要更新对应的MCP Server,技能层、调度层、报告层完全不受影响。换成以前写死脚本的方式,平台接口一变,整条采集链路瘫痪,还得连夜改代码。
另外还要强调一点:技能注册表里必须带权限和版本。哪些技能允许Agent自主调用,哪些技能只能在人工审批后调用,要在一开始就配置好。品牌检测虽然不需要Agent去执行“下架商品”这种高危动作,但“发送告警通知”和“导出报告”这类动作也建议做权限区分,避免模型在误判时批量触发通知,造成告警轰炸。
3. 全自动Agent的搭建过程:从技能定义到调度落地
3.1 数据源接入与凭证管理
接入阶段我按平台类型建MCP Server,覆盖了四类:某社交平台、某电商平台、某新闻聚合源、评论区聚合源。每个Server都返回统一结构:content、author、url、publish_time、source_type。这样后续无论哪个源进来,清洗和判定逻辑都不用改。
凭证管理是这里最需要提醒的一件事。平台API的密钥、Token绝对不能写进技能描述,也不能写进Agent的System Prompt,而是统一放在MCP Server的环境变量或密钥管理服务里,Server启动时读取。原因是技能描述和System Prompt可能被模型原样返回或者被日志记录,密钥一旦进去就等于暴露了。我在内部规范里加了硬性要求:任何敏感信息只能存在于执行层,提示层只保留引用名。
3.2 四类核心技能的封装要点
采集技能接受品牌词、日期范围、平台列表,内部会去读一个检索词库。检索词库是独立配置文件,包含官方名称、简称、拼音变体、同音字、常见错字、大小写变体、表情包符号等等。客户品牌方通过一个简单页面维护这份词库,Agent每次抓最新配置,完全不用改代码。
清洗技能做两层去重:文本完全一致直接去掉;相似度80%以上的聚成一簇,保留最早发布的那条。这一步能把大量转发、洗稿、重复铺货的内容压缩掉,是降低后续判定成本的关键。
语义判定技能内部调用大模型,把品牌词、待判定文本、组装好的上下文一起交给模型,强制要求输出结构化JSON。证据抽取技能则负责把判定通过的内容做进一步归因,比如找出店铺主体名、商品链接、发布时间,为后续处置提供依据。
技能定义的示例大概是这个结构:
{ "skill_id": "semantic_judge", "name": "品牌语义判定", "description": "判断一条文本是否构成对指定品牌的侵权、负面或合规提及。仅在已获得待判定文本后调用。", "inputs": { "brand_name": "string", "text": "string", "context": "object" }, "outputs": { "verdict": "enum(infringement, negative, compliant, irrelevant)", "confidence": "number", "reason": "string" }, "impl": "llm_judge", "updated_at": "2026-01-10" }3.3 语义判定技能的上下文组装
这个环节是整个系统里对准确率影响最大的细节。我踩过的最深的坑就是:不要只把一条文本丢给模型。一条“这是官网”出现在大V的评论区里,和出现在一个叫“品牌官方旗舰店全球购”的店铺页面里,含义完全不同,只给文本没有上下文,模型只能瞎猜。
我后来固定了一个上下文组装模板,字段包括:品牌词、命中的检索式、文本正文、发布者或店铺主体名称、平台类型、发布时间、近7天该关键词命中次数、该发布者历史异常记录。组装后的Prompt长这样:
judge_prompt = f""" 你是品牌检测判定员。判断以下内容是否构成对【{brand_name}】的侵权、负面或合规提及。 严重性分级:infringement(侵权) / negative(负面) / compliant(合规) / irrelevant(无关) 品牌词命中方式:{matched_rule} 文本正文: {text} 发布者信息:{author_info} 所属平台:{platform} 发布时间:{publish_time} 该关键词近期命中次数:{hit_count} 只输出JSON:{{"verdict": "...", "confidence": 0-1, "reason": "..."}} """这个模板上线后,误报率肉眼可见地往下掉。原因很简单:模型需要的信息都齐了,它不需要猜,只需要基于事实做判断。上下文组装这件事,听起来简单,实际执行时很容易偷懒,但这一步省不得。
3.4 Agent调度层:触发、拆解和重试
全自动的最后一环是调度。我做了三套触发方式:定时触发,每15分钟跑一次高优品类,每两小时跑一次全量;事件触发,平台Webhook推送新帖子或新评论时即时进入处理队列;手动触发,品牌方在运营后台点“立即检测”。
任务进来之后,调度器按依赖关系执行:采集到清洗,清洗完判定,判定通过做证据抽取,最后归档生成报告。每一步都有超时和重试机制,超时三次的任务丢进延迟队列。幂等性靠任务ID保证,同一条内容在并发场景下不会重复处理。
调度配置我看的是这样一份YAML:
scheduler: frequency: hourly tasks: - task_id: collect_and_judge skills: [search_collect, clean_deduplicate, semantic_judge, evidence_extract] brand_config: data/brand_keywords.yml failure_policy: retry_3_times alert_threshold: 5告警阈值也做了控制:只有当天新增“侵权”或“负面”且置信度大于0.9时才触发即时通知,其余全部汇总进日报。否则误报再多一点,运营就会被通知弹窗烦到直接把系统关掉。
4. 跑通后的四大坑:全自动流程不是上了就能跑
4.1 第一轮跑通:流程能跑,报告没法用
第一次完整跑通是个里程碑,但第二天打开数据统计就发现问题了:误报率接近60%,大量“品牌名”命中其实是“品牌名粉丝某条评论”“品牌名爱好者收藏”之类的内容,还有大量重复结果。数据量倒是很大,但几乎没法用,运营看到报告的第一反应是“这报告是不是坏了”。
复盘下来,问题不在于某个技能写错了,而在于技能之间的预期不一致。采集技能认为“命中关键词就是有价值的信号”,清洗技能认为“只要是文本就去重”,判定技能却需要“高价值的上下文文本”。链条上的每一环都在按自己的规则工作,但没人对上最终的判定需求。解决方式是给每个技能增加“输出预期说明”,在联调阶段给每条技能输出都做抽样检查,确保上游输出是下游想要的格式和粒度。
4.2 误报率从60%降到15%的三次调整
第一次调整:清洗环节加规则,把所有转发、重复内容、明显广告压掉,误报率降到40%左右。第二次调整:把判定上下文从“只有文本”升级为完整字段组合,加入发布者信息和平台类型,误报率降到25%左右。第三次调整:针对高频误报场景维护负面样本库,在判定Prompt中作为few-shot示例,误报降到15%左右。
三次调整的核心逻辑不是让模型“更聪明”,而是让进入模型的信息更干净、更完整。模型本身没有变,变化的是输入质量和示例质量。
| 调整阶段 | 处理动作 | 误报率 |
|---|---|---|
| 基线 | 关键词规则直接命中即报 | 60%左右 |
| 第一轮 | 加清洗去重、过滤广告 | 40%左右 |
| 第二轮 | 完整上下文组装 | 25%左右 |
| 第三轮 | few-shot负面样本库 | 15%左右 |
4.3 限流、超时和并发问题
MCP Server虽然把平台API统一了,但各平台限流策略完全不同。某社交平台限制单账号每分钟20次搜索,一开始并发开10,直接把账号接口打封了一小时。这个坑很现实:协议再标准也解决不了上游的流控策略,只能在MCP Server内部做令牌桶和任务队列,把搜索并发降为2。另一家电商平台限制更严,同一时间只允许一个任务调用,我就做了全局互斥锁。
模型调用也有超时问题。单条判定最坏要8秒,批量任务一多就堆积。我的方案是把并行度控制在4,同时精简Prompt,长文只喂关键段落,而不是整篇塞给模型。还有一个细节是降级策略:如果模型服务超时,先把文本放进延迟队列,而不是直接标记失败,避免因为一次波动丢数据。
4.4 结果归档与人工复核闭环
全自动不等于无人复核。我设计了双层归档:高置信度结果(confidence大于等于0.9)直接进入处置队列,运营只需要处理真正需要处置的高危内容;中低置信度进入人工复核队列,运营每天花10到20分钟快速过一遍。
复核标记会写进数据回流表,下一轮判定时更新样本库。这个闭环跑起来之后,准确率是稳定提升的,而不是靠某一次人工调参冲高。最开始我认为“全自动”就是把人工彻底踢出去,后来才明白“全自动”真正的价值是把人工从执行者变成审核者,把人的经验转化成系统持续进化的信号。
5. 从关键词规则到V3:准确率这样一步步磨上来
5.1 三个版本的准确率对比
整个系统迭代过程可以看作三个版本。V0是纯关键词规则引擎,准确率只有45%左右,但召回率能做到80%,好处是简单、可解释,坏处是误报太高,报告基本没法直接看。V1接入LLM判定,准确率升到70%,但因为判定放宽,召回率上去了误报又回来。V2加入上下文组装和few-shot示例之后,准确率到了85%,召回率稳定在90%以上。V3再叠加技能组合优化和数据回流,准确率做到90%以上,召回率做到92%左右。
这个数字不一定能直接套到别的场景,但趋势很有参考价值:真正拉高准确率的不是模型本身,而是输入质量与样本质量。在V0到V1的变化里,模型带来了大幅提升;但V1到V3的提升,靠的就是工程层面的打磨。
5.2 数据回流:把人工复核变成训练信号
数据回流是这套系统和普通脚本最大的区别。人工复核标记“这条不该标”“这条漏了”之后,系统自动做两件事:第一,把错误样本加入正负样本库,定期抽样写入判定Prompt的few-shot;第二,更新检索词库,如果发现某个品牌词变体总是引来无关结果,就在词库中标记为低价值词,降低采集权重。
最开始我担心回流会导致过拟合,实际情况是只要控制每次加入示例的数量,比如每周最多20条,同时保留一个固定的核心示例集,整体判定质量是稳定的。也就是说,数据回流不是把模型无限往一个方向推,而是不断修正系统对“边界情况”的理解。
5.3 成本与人力账,算清楚再动手
最后算一笔账。系统稳定之后每天处理原始文本约4000到6000条,实际调用LLM判定约1500到2000次,按商用模型单价估算,每天成本在几十元量级,具体看选哪个档位。人力方面,每天人工复核10到20分钟,对比原来专人两小时加促销期加班的状态,节省非常明显。
但我必须说句实话:如果每天只有两三百条待检测量,这套系统性价比其实不高,直接上关键词工具加人工复核可能更划算。这套方案真正适合的是单日量大、数据源多、业务规则频繁变化的场景。想做的话,第一步不是写代码,是先统计当前处理量,确定瓶颈到底在哪。
最后再分享一个跑了半年之后的真实体会:Agent不是让模型想干嘛就干嘛,而是把流程拆到足够细,让每一步都有明确的输入和输出,模型只负责做它最擅长的判断。MCP负责稳定接数据,技能系统负责定义边界,Agent负责编排调度,三个角色各管各的,整个系统才敢全自动。不管模型多强,永远保留一个“人工复核”出口,让运营能反馈、能纠错,把反馈回流到系统里——这套东西的价值不在一开始有多准,而在每一次人工干预之后,它都会变得更准一点。这个循环转起来之后,品牌检测才算真正变成了全自动Agent。