数字公关行业做AI中台?乍一听是风马牛不相及的两个概念,可真把Infoseek这个项目做下来,我才意识到AI中台恰恰是解决数字公关行业一堆陈年烂账的最佳工具。我在某公司主导这个项目的架构设计与落地,最大的感受是:这个行业的业务链路比大多数互联网业务都要长,数据源杂、格式乱、实时性要求高,还要跟复杂的媒体生态打交道。一套架构合理的AI中台,能把原来靠人肉堆出来的舆情监测、媒体分析、内容发布,压成一条自动化的流水线。
这篇文章会从Infoseek的立项背景、架构分层、关键模块实现、数据工程与模型服务、生产环境稳定性这几个维度完整复盘。不写PPT式的架构图,也不堆概念,只讲我们实际怎么设计、怎么选型、怎么写代码、怎么排故障。适合正在做AI平台、自然语言处理、数据工程相关项目的工程师,也适合想了解中台化改造到底怎么落地的技术团队负责人参考。
1. 立项背景:数字公关为什么需要AI中台
1.1 行业痛点:数据分散、响应慢、效果难量化
数字公关的业务核心是舆情监测、媒体关系管理、内容发布与效果评估。听起来不复杂,但实际运作起来,每个环节都有各自的“历史包袱”,而且这些包袱不是靠多招几个人就能解决的,它们本质上都是数据处理和分析的问题。
先说舆情监测。公关团队需要从新闻门户、社交媒体、垂直社区、短视频评论区等多个渠道采集信息。每个渠道的数据格式都不一样,有的是标准JSON接口,有的是抓HTML页面,有的干脆就是截图需要OCR处理。更麻烦的是数据质量参差不齐,重复信息、垃圾广告、水军评论混杂在一起,直接喂给NLP模型做情感分析,准确率根本没法看。
再说媒体关系。传统的媒体关系维护基本靠Excel表格加通讯录,记者擅长的报道领域、历史发稿偏好、合作亲密度这些信息全都散落在各个公关人员的大脑中。一个人离职,整个客户关系网络就断了一截。这种知识资产没有沉淀成系统数据,是数字公关行业最被低估的问题。我们花在媒体关系维护上的精力,远超外界的想象,但产出的价值很难度量,也很难传承。
最后是内容发布。从新闻稿到社交媒体短文案,内容形态差异极大,撰写工作量也完全不同。品牌方经常要求“同一事件、多渠道适配发布”,这个需求背后是大量重复劳动。一个活动下来,公关顾问要手动改写十几个渠道的文案版本,每个版本还要符合对应平台的语气和格式规范,效率极低。
Infoseek立项的直接契机,是某一次大型品牌危机事件。当时我们靠人工监测舆情,从发现负面信息到出具完整分析报告花了将近12个小时。对公关行业来说,这个响应速度意味着品牌已经错过了最佳处理窗口。所以公司下决心做一套AI中台,把数据采集、分析、决策辅助、内容生成、发布追踪整条链路打通。项目代号定名Infoseek,含义是“在信息海洋里找到方向”。
1.2 方案对比:自研中台 vs 采购外部服务
立项之后第一个争论就是“自己造还是买”。市面上确实有现成的舆情监测SaaS和内容管理工具,但深入调研下来发现三个硬伤。
第一,数据源不可控。第三方服务的数据覆盖范围是它的优势也是风险,新闻渠道可能缺漏、媒体分类逻辑跟我们的业务认知对不上,出了问题连排查入口都没有。更难受的是,平台升级时规则变动不可预期,直接影响下游分析的一致性。
第二,定制化成本高。公关业务高度依赖“怎么界定事件”“怎么判断媒体层级”“怎么衡量传播效果”,这些业务逻辑非常微妙,通用产品很难贴合实际工作流。采购一套SaaS看起来便宜,但要在上面做定制开发,费用和时间往往比自研还高。
第三,也是最重要的一点——数据资产归属问题。舆情数据、媒体画像数据、历史案例数据,是公关公司最核心的资产。放在别人的SaaS平台上,等于把家底交给了竞争对手。这个角度一摆出来,自研就成了唯一合理的选择。技术团队当时的共识是:哪怕初期的投入大一点,也要把这套平台握在自己手里。
技术选型上,我们采用了一个偏保守的组合:Python做算法生态,服务层用Java/Go,基础设施跑K8s。理由是Python在NLP领域的工具链最成熟,模型迭代效率最高;而服务层需要高并发、高稳定性,Java/Go更合适。虽然看起来是“两套技术栈”增加了团队负担,但实际上算法团队和工程团队的边界也借此划清了,协作反而更顺畅。
2. 总体架构:六层模型与核心链路
2.1 分层设计总览
Infoseek的整体架构按功能边界分成六层,从下往上依次是:基础设施层、数据接入层、数据加工层、智能分析层、业务服务层、应用展示层。每层之间通过明确的标准接口交互,规则是禁止跨层调用。这个约束一开始执行起来很痛苦,尤其是算法团队总想绕过业务服务层直接写数据,后来靠代码评审机制才逐步形成习惯,架构也确实因此保持了干净。
基础设施层跑在K8s集群上。由于客户数据敏感度高,我们没有把数据放到公共云环境,而是用通用硬件搭建了私有化的基础环境,保证数据不出域。集群划分了dev、staging、prod三个环境,用命名空间和资源配额做隔离,不同环境的模型服务可以独立发布、独立回滚。这套环境隔离机制在后期迭代频繁时帮了大忙。
数据接入层负责对接所有外部数据源。这里有一个关键的设计决策:业务服务不允许直接调外部API,所有数据统一收口到一个数据接入网关。这个网关负责协议适配、频率限制、鉴权管理、数据格式标准化。无论上游数据源怎么变,下游模型和服务只面对一种统一的数据结构。网关层还承担了采集资源的调度,避免多个模块重复抓取同一数据源。
数据加工层负责清洗、去重、实体识别、事件聚类,产出的是“干净的语义化数据”。一条舆情记录在这里会被标注出发文账号、内容主题、涉及品牌、情感倾向、传播路径等结构化字段。这一层是所有模型服务的地基,加工质量直接决定上层分析的准确性。
智能分析层是“AI中台”这个名字含义最集中的体现,承载了情感分析、事件聚类、媒体关系图谱、传播路径分析、内容生成、效果预测等模型服务。设计上这层完全不感知业务细节,只提供“输入数据、输出结论”的标准接口。模型之间不做直接调用,统一通过服务网关走标准协议,这样单个模型升级替换时不影响其他模块。
业务服务层负责面向公关业务场景做编排。比如“危机预警工单”就是由舆情监测、事件聚类、风险等级评估三个模型服务组合而成的。业务规则(比如负面占比超过阈值就触发预警)放在这层,但业务层完全不关心背后的模型怎么实现。应用展示层是给公关顾问和客户看的界面,包括舆情大屏、媒体关系工作台、内容中心、报告生成器等,这一层做得很薄,核心逻辑都在下层。
2.2 核心链路:从数据接入到业务输出
拿危机预警场景举例,完整的数据链路是:
外部数据源 → 数据接入网关 → 消息队列 → 流式计算清洗 → 语义化标注 → 向量化 → 舆情服务判定 → 触发告警 → 生成分析简报 → 推送到工作台
这条链路里最容易被忽视的是消息队列和流式计算框架的配合。我之前做过的一些项目里,很多人直接把接入网关的数据写进数据库,靠定时任务去扫。后果就是舆情发现永远有延迟,而且数据库压力巨大。用消息队列做削峰缓冲,让流式计算做实时清洗,才能把从数据产生到触发告警的端到端延迟控制在秒级。
实时链路的另一侧是离线链路。每天凌晨,离线任务把当天的全量数据回放一遍,重新计算更精细的特征指标,产出日级报告。实时和离线共用一套数据源,通过统一的事件时间戳对齐。这里想强调一个经验:AI中台项目里,实时链路和离线链路一定要从一开始分开设计,不要图省事全走实时。因为离线链路容忍小时级延迟,却能做更深的计算,两个通道各司其职才是正解。实时链路保证“快”,离线链路保证“准”,两条腿走路才不会瘸。
3. 关键技术模块的实现与踩坑
3.1 舆情监测:多源采集与实时NLP流水线
舆情监测是Infoseek最早启动、也是踩坑最多的模块。这个模块要解决的核心问题是:从海量、异构、高噪音的数据源里,实时识别出与品牌相关的舆情事件,并判断情感倾向和风险等级。整个模块的数据流可以拆成采集和NLP流水线两部分来看。
数据采集层面,我们给每种数据源设计了一套独立的采集适配器。新闻门户类用RSS加HTML解析,社交媒体类走官方开放接口,论坛类用结构化解析。适配器输出的数据结构统一为:source_id、source_type、content、author、publish_time、url、raw_metadata。这个统一结构是后面所有下游逻辑的基础,定协议时多花一天,后面省一个月。
采集频率是需要细心设计的参数。最开始所有数据源统一5分钟采集一次,结果冷门论坛的采集完全没意义,热门新闻门户的5分钟粒度又漏掉突发消息。后来改成动态调度:采集频率由过去24小时的数据产出量决定,热门源缩短到1分钟,冷门源放宽到30分钟。这个改动让采集资源利用率提升了大约40%,同时突发消息的发现速度也明显改善。
NLP流水线的标准流程是:文本清洗 → 分句 → 实体识别 → 事件判定 → 情感分析 → 标签化。
文本清洗看起来简单,藏了很多坑。公关语料里大量出现“#话题#”“【标题】”这类特征符号,还有各种URL。我们的清洗规则里有二十多条正则,正则的优先级顺序直接影响效果。比如必须先处理URL再处理HTML标签,否则URL里的参数会被当成正文保留下来。这个顺序问题我们在联调阶段反复踩,最后写成了单元测试用例固定下来。
情感分析我们对比过多种方案。最早的版本用情感词典匹配,效果太粗糙,公关语境里的反讽和对比句式完全识别不出来。后来换成预训练语言模型微调,用的是中文RoBERTa权重,训练数据来自历史舆情工单的人工标注结果,前后标了大概8000条样本,覆盖十几个行业事件类型。这里有一个容易犯的错误:直接拿通用情感分析模型套到公关场景。通用模型对“股价下跌”会判成负面,但对公关语境里常见的“官方回应”“企业声明”这些中性内容经常误判。我们最终在通用模型基础上增加了“事件-品牌-情感”三元组结构,让模型判断情感时能结合事件对象。比如“某品牌被投诉”和“某品牌回应投诉”是两个完全不同的事件,情感倾向也不一样。
3.2 媒体关系图谱:知识图谱的构建与查询
媒体关系图谱是Infoseek最有“中台味道”、也最具业务价值的模块。它把记者、媒体机构、品牌方、报道主题之间的关系建模成知识图谱,支撑媒体推荐、关系亲密度计算、投放效果预测这些上层应用。对整个平台来说,这个模块是知识沉淀的核心载体,也是最能体现差异化能力的部分。
图谱构建分三步。第一步是实体抽取。从历史稿库、媒体通讯录、发稿记录里用NER模型抽取记者名、媒体名、主题词、品牌名。这里没有一上来就上大模型,而是规则加传统NER模型组合,因为记者的称呼方式相对固定,“某报记者某某”“XX周刊记者”这些模式用正则能覆盖八九成,剩下的模糊情况再靠模型兜底。
第二步是关系构建。实体间关系包括“隶属于”“报道过”“合作过”“关注领域”等类型。关系的建立一部分靠显式数据(发稿记录里稿子的归属),一部分靠隐式推导(一篇深度稿里同时出现记者和某品牌,就建立一条“报道过”关系)。隐式推导需要设置置信度阈值,起初阈值设得太低导致大量误报关系,调了两版才稳定。
第三步是存储与查询。我们选图数据库而不是关系型数据库,因为媒体关系的查询模式天然是“从记者出发,找它报道过的品牌,再找跟这个品牌合作的媒体机构”这种多跳查询。这种查询用SQL写关联要join七八张表,性能差到没法用。图数据库的查询语言表达这种模式就直观得多,一个典型查询长这样:
MATCH (j:Journalist)-[:REPORTED_ON]->(b:Brand)<-[:SERVES]-(m:MediaOutlet) WHERE b.name = '某品牌' RETURN j.name, m.name, count(*) AS co_occurrence ORDER BY co_occurrence DESC LIMIT 20这个查询能实时返回跟某品牌关联最紧密的记者和媒体名单,公关团队做活动邀约时直接拿名单定向沟通,替代了过去靠经验翻通讯录的原始方式。
图谱构建最大的问题是数据稀疏。头两三个月实体和关系数量少,查询结果没有参考价值。解决方法是把历史项目数据全部回灌,同时接入公开的行业媒体目录做种子数据。这里有一条经验:图谱类项目不要等数据攒够了再上线,应该设计成“边跑边长”的模式——图谱持续更新,业务查询基于当前快照,越用越准。如果一开始就追求完整,项目往往会死在漫长的等待期里。
3.3 智能内容生成:RAG与模板引擎的融合
内容生成模块解决“同一事件、多渠道适配发布”的需求,走了一条渐进路线,没有一上来就追求全AI生成。
第一版是纯模板引擎。预置新闻稿、社交短文案、视频脚本三类模板,通过变量填充实现批量产出。这个方案最大的优点是可控性强,模板写死之后生成结果完全可预期,不存在幻觉风险;缺点也很明显——写出来的内容千篇一律,不同品牌的稿子换个名字就是同一篇,完全没有策略差异和表达层次。
第二版引入检索增强生成(RAG)。把公司历史上积累的优质稿件、品牌调性文档、媒体投放风格指南全部向量化存储。生成时先从向量库检索相关参考,再交给大模型改写,既解决了模板引擎“没灵性”的问题,又有参考资料兜底,幻觉概率明显降低。
实现层面,我们用一个通用的中文Embedding模型做向量化,向量数据库选用支持过滤检索的方案,索引上按媒体类型和品牌标识建了过滤字段。检索的TopK设置为8,生成时把检索结果和用户需求一起拼进Prompt,核心逻辑用伪代码表示:
# 伪代码示例:RAG生成流程 from vector_db import VectorStore from llm_service import LLMClient def generate_copy(brand, event_desc, media_type): store = VectorStore(index="brand_corpus") refs = store.search( query=event_desc, filters={"brand": brand, "media_type": media_type}, top_k=8 ) prompt = build_prompt( system="你是资深公关文案,参考以下历史稿件风格,不得虚构事实。", references=[r.content for r in refs], task=event_desc ) return LLMClient.generate(prompt, temperature=0.3)Prompt里有两个参数值得说一下。temperature设成0.3,是为了保证生成内容稳定可控,公关文案不同于创意写作,事实准确性优先。RAG检索结果直接拼进Prompt是最简单的做法,如果参考文档太长,还需要增加重排环节,把最相关的3到4篇排到最前面。
踩过的坑是:向量检索偶尔会召回语义相似但事实无关的文档。比如用户要写“新品发布会”的稿子,检索结果可能召回一篇“年度总结”里同样提到该品牌的文章,生成时就把不相关信息混进去了。对策是在检索环节加一路关键词过滤,做一次“语义检索+关键词再筛选”的二次校验,实测生成质量提升非常明显。这个教训也印证了前面那句话:RAG不是把文本扔进向量库就完事,召回质量直接决定生成质量。
4. 数据工程与模型服务实战
4.1 数据管道:从原始语料到训练样本
AI中台里算法模型只是冰山一角,训练数据从哪来才是最头疼的。Infoseek的数据管道一开始非常原始——从数据库导出,人工打标签,用脚本切分训练集、验证集、测试集。一两百条样本还能忍,样本量过千之后彻底失控,标注质量和进度都跟不上模型迭代节奏。
后来搭了一套半自动标注平台,核心设计是“机器预标注+人工修正”。模型先对未标注样本给出预测和置信度,标注员只处理置信度低的样本,置信度高的直接入库。标注效率提升了大约三倍,同时持续收集难例用于模型迭代。平台还记录了每一条标注的操作日志,溯源时能查到是谁、在什么时候、基于什么上下文做的标注决定,这对标注质量的持续改进很关键。
特征工程方面,第一版情感分析模型只用了文本本身,效果一般。后来加入发布账号粉丝量、历史发帖情感倾向、发布时间段、内容长度这些元特征,模型准确率提升明显。这里想强调一个观念:NLP模型的输入不只有文本,把业务场景里的元数据合理编码成特征,往往比换一个更大的模型更有效。模型再大,没有业务特征context的支撑,也是“看不见行业”的通用模型。
训练流程上,我们固定使用基于Python生态的深度学习框架,数据集用版本化存储管理。每个训练任务的模型产物、超参数、训练数据版本都记录下来,好处是模型出了问题能迅速定位是哪批数据或哪个超参导致的,不用靠猜。这套训练管理机制从第一天就建立,到后期模型数量增长到十几个时,维护成本低得让人庆幸当初的决定。
4.2 模型部署:推理服务的性能调优
模型服务化是我负责的部分。Infoseek有十几个模型服务,覆盖情感分析、实体识别、事件聚类、内容生成等多个方向。最开始每个模型单独部署一个服务,自治性确实好,但很快暴露出资源浪费的问题。
后来做了两件事。第一,把可以合并的模型按推理链路整合——实体识别和情感分析在NLP流水线里是先后执行的,就合并成一个服务内部串联,省掉一次HTTP调用的开销。第二,给模型服务加自动扩缩容策略,按队列积压量触发扩容,高峰期自动拉起副本,闲时缩到最小副本。扩容不能只看CPU,要看真实处理能力,所以我们用“队列积压数”作为扩缩容的触发信号,比纯资源指标更贴合业务。
推理性能调优最有效的三个手段是:模型量化、批处理、结果缓存。模型量化把FP32权重转成FP16甚至INT8,推理延迟降低一半以上,精度损失在可接受范围。批处理把多个请求合并到一次GPU执行,吞吐量提升明显。结果缓存针对短时间内的重复查询,同一个事件被多个用户同时查看,舆情分析结果几分钟内不变,直接命中缓存。这三个手段组合下来,单机吞吐量提升了近三倍。
服务接口设计遵循一个原则:返回结构化结果而非原始文本。情感分析接口返回的不只是negative/positive标签,而是带置信度、关键语句索引、涉及品牌实体等字段。这样下游业务服务可以自由组合这些字段,不用再爬回文本里解析。接口契约先定义清楚,前后端并行开发才不用等来等去。
5. 稳定性与安全:生产环境必须过的坎
5.1 高可用架构与容灾
数字公关系统的稳定性要求比一般业务系统更特殊:越是重大危机时刻,系统越不能宕机,而重大危机恰恰是流量最高的时刻。所以高可用方案必须提前规划:核心系统全部多副本部署,数据库用主从加半同步复制,消息队列做了跨可用区容灾。这些基础工作看似无趣,但在真正的压力场景里,它们决定了系统的生死。
容量规划的经验尤其重要。舆情监测服务的容量不能按平均值估,必须按峰值估。我们测算过,一次大型品牌危机事件带来的舆情数据量是日常的5到10倍。如果按日常流量的2倍规划容量,事故发生时系统必然被打爆。设计原则是:核心链路按最大可能峰值预留,非核心链路允许降级降载。这套原则在几次压测中反复验证,最终定格为容量规划的默认基线。
降级策略同样关键。系统过载时,优先保障数据采集不丢数据——即使分析服务跟不上,原始数据也必须完整落库,分析延迟可以事后补算,数据一旦丢掉就永远找不回来了。这个“采集优先、分析可降级”的优先级策略,在几次真实的压力测试中挽救了系统。运维团队一开始觉得这个策略“太保守”,后来看到异常流量场景里采集通道稳如磐石,才意识到顺序设计是深思熟虑过的。
5.2 常见问题速查表
Infoseek这一年多的开发和运维过程中,我们积累了不少问题排查经验。有些问题是模型层面的,有些是数据链路层面的,还有些纯粹是架构设计埋下的雷。我把典型的几类问题整理成一张速查表,对做类似中台项目的团队应该会有直接参考价值:
| 现象 | 可能原因 | 排查思路 |
|---|---|---|
| 舆情数据延迟超过1分钟 | 消息队列消费者堆积、下游NLP服务过载 | 查看消费者lag指标,检查推理服务队列积压情况 |
| 情感分析结果明显异常 | 清洗规则误伤、模型版本未更新 | 回放原始文本走单条调试,对比标注结果 |
| 知识图谱查询超时 | 查询缺少索引、关系数据膨胀 | 用查询计划分析性能瓶颈,对热点节点建索引 |
| 生成内容包含不实信息 | RAG召回无关文档、Prompt约束不足 | 检查向量检索结果,增加关键词再筛选 |
| 服务重启后响应变慢 | 缓存穿透、预热机制缺失 | 增加启动预热任务,提前加载热点数据 |
| 跨天统计口径不一致 | 实时与离线链路时间戳对齐问题 | 统一事件时间戳取数逻辑,增加对账任务 |
表格里最想提醒大家的是第一行:舆情数据延迟,90%的情况不是单点故障,而是链路中某个消费者处理不过来。排查时不要只盯一个环节,要从数据接入到分析输出的整条链路逐个排查。我见过太多团队在某一台机器上折腾半天,结果问题出在另一个环节的队列深度上。全链路监控指标从一开始就要打通,否则事后追查的成本高得离谱。
6. 写在最后:一些个人的经验和建议
Infoseek做下来,我最大的体会是:AI中台的价值不在单个模型的精度,而在整条链路的稳定性和业务适配度。模型再强,数据进不来、结果出不去,一切都是空谈。所以这类项目里,架构设计和数据工程的分量,比算法本身更重。算法是放大器,架构和数据的质量和稳定性才是底数。
另一个经验是:AI中台项目一定要让业务人员全程参与。Infoseek的媒体关系图谱和内容生成模块,如果没有公关团队从业务角度持续反馈,方向会跑偏得很远。技术团队和业务团队每周做一次例行评审,让业务人员直接看模型产出的实际样例,听他们讲“这里不对”“那里缺失”,这种反馈远比盯指标曲线有用。模型指标漂亮但业务不买单,等于白做。
最后分享一个小技巧:复杂度高的中台项目,上线节奏应该按模块拆分,不要搞一刀切的大版本发布。我们的做法是每个核心模块独立灰度上线,先在小流量客户群体内跑两周,确认稳定后全面放开。这样即使某个模块出了问题,影响面也可控。这个节奏看起来慢,实际上因为每个模块都稳,整体反而比激进发布更快到达稳定状态。
如果后续扩展这个平台,我认为两个方向最有价值:一是把媒体关系图谱和内容生成打通,做到“知道该联系谁,也知道该说什么”的闭环推荐;二是引入更细粒度的传播效果归因分析,让AI中台不只是辅助执行,还能直接指导公关预算分配。这些设想已经排进Infoseek的路线图,后面有进展我再单独写文章分享。