Skip to content
Cooing's Blog
Go back

Agent 的核心并非 Tool 数量:企业营销 AI 平台的工程实践

TL;DR

企业营销内容平台最容易做出的 Demo1,是给模型一份资料,让它写一篇文案;最难做成的产品,是让这篇内容在数周之后仍能回答:它属于哪家企业、依据哪些资料、使用了什么策略、由谁审核、到底发布到了哪里、结果是否可信,以及下一轮为什么应该这样改。

当概率模型进入一个已有身份、事实、状态、权限和责任边界的业务系统,最终形成了以 Workspace、Offer、Knowledge、Asset、Brand Kit、Strategy Unit、Creation、PublishingJob、TaskRun 和实际指标为主干2;Web UI、REST3 与 MCP4 不同入口;模型负责理解和生成,服务端负责租户隔离、对象归属、状态机、幂等、证据与业务校验;外部发布和策略仿真则通过明确的适配器与任务边界接入的综合系统

AI 内容生产的不确定性不可能被消灭,但可以被限制在合适的层;企业 Agent5 的价值,是把模型的创造力嵌入一条可追踪、恢复、审核、学习的业务中。

flowchart LR
    A["企业资料"] --> B["Workspace / Offer"]
    B --> C["Knowledge / Asset / Brand Kit"]
    C --> D["Strategy Unit"]
    D --> E["Topic / Article / Script / Image"]
    E --> F["Creation"]
    F --> G["审核快照"]
    G --> H["PublishingJob"]
    H --> I["TaskRun"]
    I --> J["草稿 / 人工发送"]
    J --> K["表现与 ROI"]
    K --> L["预测校准"]
    L -. "下一轮策略" .-> D

一、从“帮我发出去”开始的业务地图

运营平常是这样和豆包说的:

我把商品手册、官网和几张素材传进来了。请理解这个商品,找一个合适的内容角度,分别生成图文和短视频脚本,保持品牌语气,待我审后放进平台草稿。等我填写实际数据,再告诉我下一轮应该改什么。

如果把这句话直接翻译成一条大 Prompt6,Demo 很快就能跑起来。模型可以总结资料、写标题、生成正文,连续调用几个工具后,人工介入登个账号,也真能发出去 号还在不在我不好说,问题通常出现在第二次使用之后

第一次,Agent 把商品建到了错误的品牌下。第二次,网页首页最醒目的宣传语遮住了真正的产品功能,生成内容把多功能产品写成了单功能。第三次,审核过程中正文又被编辑,发布的并不是审核人看过的版本。第四次,为了形成学习闭环,团队把互动率临时当作 ROI7,结果预测模型学会了优化热闹,而不是优化生意。

这些问题有一个共同点:单纯靠“换一个更强模型”无法解决。对于Agent而言,这条命令是模糊的,它掩盖了中间每个词的业务含义:“资料”可能是企业级品牌规范,也可能只属于某个商品;“生成内容”可能是临时预览,也可能已经成为可编辑业务对象;“审核通过”可能只是一条通知送达,也可能代表一份冻结内容得到批准;“自动发布”可能只证明点击过按钮,不一定证明平台草稿或公开内容成立;“数据回流”可能是阅读量,也可能是有成本、有收入的 ROI

必须先回答以下问题,才能推进下一步,才能让业务真正跑起来,活起来:

问题需要的确定性事实
谁的数据?Workspace、账号与资源作用域8
推广什么?Offer 与商品事实
依据什么?Knowledge、Asset、来源与证据
为什么这样创作?Strategy Unit、Brand Kit 与 Memory
最终产物是什么?Creation 与结构化内容
审核了哪一版?PublishingJob 的冻结快照
外部动作发生了吗?TaskRun、远端证据和业务状态
结果是否有效?指标口径、ROI 资格与预测校准

1.1 真正的问题并非“生成”,而在于企业事实散落在不同地方

传统营销团队的资料不会是一张干净的数据库表,业务需求对齐和思路转换往往费时费力,除此以外,品牌规范可能在演示文稿里,商品参数在表格里,客服高频问题在文档里,历史案例散落在网页和 PDF 中,素材又分布在图片、视频和文案库里。运营人员知道这些资料彼此相关,但一个刚接入的 Agent 并不知道 :

  • 哪些资料属于同一个品牌;
  • 某条卖点适用于哪个商品;
  • 一张图片是品牌视觉参考、商品证明,还是已经过期的活动素材;
  • 某段文字是人工确认的事实,还是模型推断的建议;
  • 一份脚本是临时生成结果,还是已经进入审核与发布流程的正式内容。

最直觉的实现,是把所有文档塞进 Prompt,或者建一个“企业知识库”来RAG9,让模型自己判断。这个方案在 Demo 中很顺滑,在多品牌、多商品和多人协作环境里却很危险:上下文会越来越长,资料会互相污染,过期资料难以识别,模型还可能把“看起来相关”误当成“允许关联” 给我干哪来了,这还是国内吗.jpg

一份原始企业资料,要经历识别业务归属、抽取证据、组织策略、注入上下文和生成稳定产物,最后变成 Creation,系统并非直接把原文翻译成文案,而是先构建领域中间表示,再针对不同平台生成目标产物,我们可以把这个过程称为“编译”

flowchart LR
    R[原始网页 / 文档 / 素材] --> D[领域归属与证据抽取]
    D --> K[Knowledge / Asset / Brand Kit]
    K --> S[Strategy Unit]
    S --> X[分层生成上下文]
    X --> C[Creation]

因此,项目并未从 Prompt 模板开始,意在先定义营销内容域的事实所有权

1.2 Workspace是企业运营边界,Offer是内容生成真正围绕的营销对象

Workspace 与传统 RBAC 意义上的 tenant 语义几乎对齐,也承担租户隔离的业务语义。内容上它代表一家企业或一个品牌运营空间,承载默认语言、品牌画像、语气与合规信息

但绝大多数生成任务不会只围绕“品牌”发生。运营人员真正要推广的是某个商品、服务、组合方案或解决方案,所以 Offer 才是生成链的核心锚点。定位、目标受众、使用场景、核心卖点、常见异议、支撑证据、价格信息、营销目标以及后续仿真所需的预算与转化价值,策略学习参数,都围绕 Offer 组织

  • Workspace 回答:这是哪家企业、哪套品牌与合规边界?
  • Offer 回答:这次内容究竟在卖什么、对谁说、凭什么可信?

如果只保留 Workspace,商品事实会混在品牌级知识中;如果只保留 Offer,跨商品共享的品牌语气、合规约束与基础知识又会被复制多份,当前实现采用“Workspace 默认层 + Offer 专属层”的组合方式,后者可以补充或覆盖前者

这样一组织,Agent 不必在几十份资料中猜“这次内容到底在卖什么”。它先确定 Offer,再沿作用域读取知识、素材、品牌规范和策略

1.3 Knowledge、Asset 与 Brand Kit:不要把所有资料压成一种 Chunk10

对象主要回答的问题典型事实
Knowledge“我们知道什么?”可被引用的营销知识:商品事实、卖点、证明、FAQ、受众洞察
Asset“我们拥有什么可复用材料?”图片、视频、文案、文件、片段和来源文件
Brand Kit“内容应该以什么品牌方式表达?”语气、视觉规范、Logo、字体和参考风格

把它们都压成无类型文本块,检索可能仍能返回“相关内容”,但生成流程无法可靠判断这些内容能否作为事实、能否直接复用,以及应该在哪个环节注入,所以最终做了显式区分,Knowledge、Asset 和 Brand Kit 都使用 scope_type + scope_id 表示属于 Workspace 还是 Offer11。这种多态作用域让 REST、MCP 和 Web UI 可以复用同一套模型和服务

1.4 Strategy Unit:把“策略”从形容词变成对象

Strategy Unit 连接目标受众、场景、渠道、知识和素材,表达“针对谁、在什么情境、用什么论点与材料进行创作”,让策略/转化路径可复用依赖,技巧与思路不再只存在于一次对话里

把策略拆成可复用的决策切片:受众细分 × 使用场景 × 营销目标 × 目标渠道,每个策略单元可以通过显式关联表绑定 Knowledge 和 Asset,并为关联记录角色、优先级与备注。这样,“这张图为什么被选中”“这条证明服务哪个卖点”“这份素材用于 Hook 还是信任背书”就不再只存在于模型临时上下文中,策略对象化让同一份策略能被选题、脚本、素材匹配、仿真与复盘共同消费

1.5 Creation 与 PublishingJob:可编辑产物和冻结事实

Creation 保存最终可交付内容:正文、标题、内容类型、来源应用、商品归属,以及视频脚本等场景需要的结构化带时间戳文本,没有把所有内容压成一个固定 Schema12:图文、长文、短视频脚本、分镜与图片任务的结构不同

在前端展示模型流式输出时,产物绝非 Creation,浏览器里不断增长的文字只是临时投影;只有服务端完成持久化并返回 Creation ID,内容才成为可以刷新、评分、审核和发布的业务事实 猜猜我经历了什么(笑)

但是可编辑的 Creation 不能直接作为审核和发布的永久证据。否则用户在送审后修改正文,审核人看到的内容和执行器真正发送的内容就会发生漂移。

因此发布链会在提交时生成 payload_snapshot

flowchart LR
    C[Creation 可持续编辑] -->|提交确认| S[不可变内容快照]
    S --> P[PublishingJob 审核与发布账本]
    P --> T[TaskRun 执行尝试]
    C -.后续编辑不回写.-> S

这个设计同时关联了两个经典思想:审批应该消费稳定输入,历史应该保留当时发生的事实13,不要求整个系统采用 Event Sourcing,要求外部动作不要回读一个已经变化的上游对象

二、原始资料进入系统后,保留了什么

2.1 “支持某格式”不等于“完整提取并理解传输内容”

Knowledge 和 Brand Kit 复用统一资料提取入口。当前支持常见 PDF、DOCX、PPTX、XLSX、CSV、文本、网页和部分远程文档14;扫描 PDF 会先提取文本层,再通过 OCR15 补充识别,不同格式的语义保真程度并不相同,同时为了控制上传风险、响应时间和模型上下文成本,限制输入体积、解析页数和输出长度,这个选择部分牺牲了尾部完整性与档案级保真,换取在线产品可接受的延迟和资源消耗,也防止一个巨无霸打崩服务

2.2 最响亮的文案不一定最接近事实

网页解析最初优先读取可见正文。一次真实任务中,产品首页的 Hero Copy16 反复强调某项能力,模型便把一个多功能产品总结成单功能工具,忽略了站点中更完整的产品结构。

后来的流程先从原始 HTML17 中提取 JSON-LD18 的 Product、Service、SoftwareApplication 等高信号字段,再补充导航项,最后合并网页正文。短内容或噪声异常时会回退到另一条提取路径,也遇到过反方向问题:某些站点把真正的正文放在导航式结构里,过度删除 nav 会伤害信息,因此实现选择了保守提取 + LLM19语义提取

网页有展示优先级、模板噪声、缓存和结构化元数据,解析器做的每一次清洗,本质上都在改变证据,RAG 工程的本质是在“噪声、信息密度、成本与证据保真”之间做选择与多方面优化,这方面还是得客制化提取,泛用/递归化提取器难做

2.3 Asset 与 Knowledge 分成两条链

Asset 保存图片、视频、音频、文档、链接或文案资产,可以记录存储位置、文件哈希、解析状态、元数据与切片。Knowledge 保存可检索的营销知识,包括类型、正文、结构化内容、来源、置信度与标签,把二者分开有明确业务价值:

  • 一张商品图可以作为发布素材,不等于一句产品证明
  • 一条 FAQ 可以参与问答,不一定对应一个可视化 Asset
  • 一个视频可切出多个 B-roll 片段,而它的文字说明可能形成多条 Knowledge

文档作为 Knowledge 摄取时,主要保留提取文本和来源名称;Asset 链保存原文件与哈希,因此,系统暂时只能回答“这条知识来自某份文件”的文件级别粗粒度标签,细粒度有待优化

当前 Knowledge 查询并不含向量检索。普通列表通过 Workspace/Offer 作用域、知识类型和标题/正文的 PostgreSQL 模糊匹配筛选;问答与 Assistant 使用中英文 token、字符和 bigram 重叠评分20,标题权重更高,再截取有限数量的候选,这不如混合检索“先进”,但规则可解释,出现错召回时容易复现;无需先解决 embedding 模型、索引迁移与多语言评测;在当前知识规模下,先验证领域作用域、引用和生成链是否正确

在同义表达、长文语义、跨资料推理和规模增长后,混合检索轻而易举就会超过词法检索能力,向量或混合检索是合理演进方向;RAG 的核心并非拥有向量数据库,让生成基于可更新的外部知识才是关键,当前阶段选择先验证作用域、来源、召回与引用是否可信;混合检索会在数据上一个量级,Eval21 证明收益后引入 但本阶段ECS还用不起,算喽

三、企业资料如何产出运营内容

3.1 不同事实以不同优先级进入模型

一次内容生成可能同时需要:Workspace 品牌与合规信息;Offer 商品事实、定位和目标;Workspace 与 Offer 两层 Knowledge;Strategy Unit 的受众、场景、目标与渠;Asset 摘要与候选素材;Brand Kit 的品牌语气;用户确认过的长期 Memory22;当前页面上的临时要求。如果把这些内容无差别拼接,模型很难判断冲突时谁优先覆盖。当前系统采用分层注入:Offer 级品牌语气优先于 Workspace 级;Knowledge 和 Asset 同时聚合两级 Scope;Memory 只在适用的生成 surface23 中进入;Strategy Unit 作为显式策略焦点

更细的一项产品取舍是“预览什么”,上下文预览只显示某层是否存在、数量、是否适用、是否已解析和是否注入,前端只暴露给用户“你选择了什么”,“产出了什么”,减轻心智负担24

3.2 Workflow 和 Agent 各自做擅长的事

系统覆盖选题、脚本、图文、图片与素材筛选,但并没有把每一步都交给一个自由规划 Agent,对于路径清晰、可预期的任务,更适合使用 Workflow25,本平台遵循固定的workflow,但是也开放 MCP 能力供用户接 Agent 自由调用:

flowchart LR
    I[用户目标] --> C[加载领域上下文]
    C --> S[选择平台 / 结构 / Persona]
    S --> L[LLM 生成]
    L --> V[确定性解析与校验]
    V -->|合法| P[保存 Creation]
    V -->|不合法| R[回退 / 修复 / 显式失败]
    P --> Q[异步仿真或图片任务]

生成流程按职责编排,当前主链覆盖:热点/知识驱动的选题生成;图文和长文创作;结构化脚本与多个版本;Persona26 与 B-roll27 素材匹配;图片生成、参考图和迭代编辑;最终结果保存、评分和历史查询

确定性代码负责解析 JSON 或 Markdown 结构,规范内容类型和平台标识,限制 B-roll 数量、插入位置与时长,清除模型泄漏的 JSON 痕迹,持久化 Creation,决定是否触发下一步 TaskRun 等等

例如:脚本生成中的 B-roll 环节,测试中模型MIMO V2.5有时会把“插入位置”写成一句原文,有时输出越界时长或过多镜头,服务端会尝试把原文定位回字符位置、裁剪时长、排序、限制总数,无法解释的条目则丢弃,让下游视频合成只消费稳定 Schema

同时,脚本创作的页面可以实时展示 token 和 thinking28,但流结束后必须根据服务端返回的 Creation ID 再读一次持久对象,图片封面则先创建 ImageJob29,再由后台任务写回同一个 Job 和 Creation;页面刷新后可以从历史 Job 恢复轮询,失效请求从此失去写 UI 的资格,让每次生成都不止是一个 Promise

sequenceDiagram
    participant U as 用户
    participant A as Agent / Web UI
    participant S as Content Service
    participant R as 审核方
    participant W as Worker
    participant P as 外部平台
    U->>A: 发起创作或发布意图
    A->>S: 结构化请求
    S->>S: 租户、对象与状态校验
    S->>R: 冻结快照送审
    R-->>S: 通过或驳回
    S->>W: 持久 TaskRun
    W->>P: 创建草稿
    P-->>W: 草稿证据或歧义结果
    W-->>S: 回写业务摘要
    S-->>U: 可理解、可恢复的状态

3.3 PublishingJob 与 TaskRun 掌管 Creation 生命周期

PublishingJob 是业务账本,回答:

  • 哪一份 Creation 快照进入了审核和发布,审核、批准与派发处于什么状态
  • 远程引用、真实指标和失败摘要是什么,用户现在应该看到什么业务结果

TaskRun 是执行尝试,回答:

  • 哪类任务何时入队,哪个 Worker 领取
  • 尝试了几次、是否重试,当前进度、锁与错误是什么,进程重启后如何继续

同一个 PublishingJob 可以经历多个 TaskRun,但一次 Worker30 重试不应该改变业务对象的身份,反过来,TaskRun 成功也不一定意味着内容已经发布:它可能只完成了“创建草稿”或“发送审核通知”

PublishingJob 将 review、approval 和 dispatch 分开31,内容送达审核通道等待批准,审核通道通过 Adapter 接入协作本平台/跨平台的系统,包括审批实例,机器人通知和回调处理等,以飞书链路为例,保存审核投递、审批结果与远程引用批准后落入发送队列;创建 Job 时还会冻结 Creation 快照,即使之后编辑原内容,已经进入审核的版本仍有自己的证据基础

脚本生成后的仿真、图片生成、发布执行和平台账号验证都可能超过一次 HTTP 请求的寿命,当前 TaskRun 使用 PostgreSQL 持久化任务,没有引入其他消息队列中间件:

  1. 入队时用业务 unique_key 去重活动任务
  2. Worker 通过 FOR UPDATE SKIP LOCKED 竞争领取待处理项
  3. 领取后记录 Worker、锁时间、开始时间和尝试次数
  4. 失败时根据尝试上限重排或进入失败态,进程退出留下的陈旧锁可以恢复

PostgreSQL 的 SKIP LOCKED 适合多个消费者领取队列式表32,它只保证同一时刻不要领到同一行,业务幂等、状态前置和外部副作用仍要由应用层维护。

例如发送草稿时,网络调用失败后,客户端通常无法知道服务器是否已经完成动作,TaskRun 的 unique_key 避免活动任务被重复创建,外部适配器必须使用稳定业务键、创建前后证据或远端幂等能力33,防止重复草稿和重复通知。

四、策略仿真:把“感觉会火”的运营内容,拆成预测、事实与校准

生成内容之后,还需要回答一个更难的问题:哪份脚本更值得发布?我把 Creation、渠道、预算、商品转化价值和已选 KOL34 组织成预测请求,交给独立仿真引擎。这样,内容域负责业务事实与流程,仿真域负责模型与消费者行为模拟

flowchart LR
    P[原始预测] --> J[PublishingJob]
    J --> E[草稿 / 用户声明 / 平台证据]
    E --> M[内容表现快照]
    M --> G{ROI 资格门禁}
    G -->|不满足| R[只进入表现报表]
    G -->|满足| L[平台校准权重]
    L --> S[下一轮 Strategy / Ranking]

4.1 仿真引擎的两类消费者模型

外部仿真引擎组合两种路径:

  • 向量化 Statistical Agents35:适合大规模、低成本和可复现的数值模拟;
  • Soul-Agent36:让 LLM 人格读取 persona、创意、KOL 和渠道上下文,返回点击意愿、理由、评论、感受和短期购买意图。

Soul-Agent 的判断可以作为统计模型的校准信号,切忌用少量 LLM 人格替代整个消费者群体。仿真引擎还会把人格映射回统计人口空间,以加权方式传播校准结果,当前运营生产平台预测请求默认关闭 LLM 决策,优先走更容易复现的统计/模板路径;只有显式开启付费时才使用真实 LLM Soul-Agent,运营生产平台本身也不承载 Soul-Agent 运行时,它只是仿真服务的调用者和结果消费者

4.2 原始预测不能被学习权重覆盖

把 Creation、平台分配、预算、商品转化价值与可选 KOL 信息发送给独立仿真服务后,仿真侧组合统计/规则模型与消费者 Soul Agent,返回 ROI、CTR、CVR37、收入、成本、平台拆分与其他预测信息,仿真结果写回 Creation,同时建立 StrategySimulationReview。Review 保存:

  • 原始预测请求与响应,原始 ROI 分数;
  • 按平台拆分的预测。学习权重调整后的分数,建议性 verdict38 与风险说明。

学习权重只影响排序和解释,不覆盖“当时模型原本预测了什么”,防止系统无法复查预测偏差,也无法判断新权重究竟改善还是掩盖了问题。

4.3 满足业务语义的真实指标才进入学习

发布后的累计指标,根据平台不同,可以包含曝光、互动、点击、收藏等内容表现,不同平台对同一个词的定义并不一致:阅读人数和阅读次数不同,收藏和书签可能相近但不完全相同,互动总数有的平台直接给出,有的平台只能由若干字段相加

系统因此维护后端拥有的平台与内容类型目录:生成侧的平台标签、执行器别名与指标字段通过 Alias39 归一;只有当样本具有正成本,并且存在收入,或可以用转化数与商品转化价值推算收入时,系统才计算真实 ROI:actual_roi = (revenue - cost) / cost40

一篇自然流量内容即使没有成本,也可能有真实阅读、点赞、收藏和分享。系统允许保存这类表现快照并用于报表展示,但不得进入 ROI 排名和策略学习,避免把互动率或浏览量重新包装成“商业回报”41,策略学习服务按 Workspace + Offer 聚合有效样本,再计算各平台的预测 ROI 与真实 ROI 偏差,样本不足时保持冷启动权重;样本成立后,平台 multiplier42 才用于调整后续 Creation 排名

五、Agent 如何接入这台“内容编译器”

5.1 Tools、Resources、Prompts 分别解决什么

当前 MCP 服务静态注册了 61 个 Tools、2 个 Resources 和 5 个 Prompts,这三种原语按MCP规范,承担不同控制权43

MCP 原语项目中的职责例子
Tools查询或改变业务事实查询商品、写知识、保存 Creation、创建发布任务
Resources可被会话附着的稳定上下文Workspace 画像、Offer 完整上下文
Prompts用户可选择的高频业务workflow入驻梳理、内容 Brief、长文、活动脚本、知识缺口报告

Tools 覆盖 Workspace、Offer、Knowledge、Asset、Strategy Unit、应用运行、Creation、媒体任务、发布任务和 Memory 的读写,以新增知识、保存 Creation、创建发布任务为例,工具会构造与 REST 接口相同的 Pydantic 数据对象,调用相同的 Application Service,再由 SQLAlchemy Async 会算完成事务44

Resource 分别面向 Workspace Profile 和 Offer Context,它们适合让客户端把某个品牌或商品上下文附着到会话,表达一类稳定、可寻址的业务上下文,如:workspace://... 表示品牌运营范围,offer://.../context 表示某个商品的完整创作上下文,供Agent自行发现探索

Prompt 覆盖企业认识、内容 Brief、长文创作、营销脚本和知识缺口审计,是客户端可发现的引导模板:告诉 Agent 应该先读取哪些上下文、调用哪些业务能力、怎样把最终内容保存回 Creation

5.2 有关 Agent 的序列化、异常与审计

SQLAlchemy 模型在返回给 Agent 前,会通过 Pydantic Schema 做序列化。对于历史数据库中不够友好的 JSON 包装字段,MCP 层会转换成稳定的扁平形态,避免 Agent 读到一种结构、写回另一种结构

所有注册 Tool 统一包裹调用审计,记录工具名、非空参数摘要、执行时间、结果数量或异常,资源不存在、状态冲突、参数错误和外部能力失败由领域异常与 API 错误语义统一表达,Agent 因而可以区分“对象不存在”“当前状态不允许操作”和“外部服务暂不可用”,不必从 Python Traceback 或供应商原文中猜测下一步

Function Calling 和 Structured Outputs 能约束参数结构45,但 Schema 合法不代表 Workspace 正确、对象归属正确或状态允许写入。模型输出仍然是不可信的结构化输入

与此同时,创建 Offer 后,系统可以进一步推断知识:Offer 先提交成为确定事实,知识推断再使用新会话 best-effort46 执行。即使模型服务失败,已经创建的商品不会被一起回滚,这和 Saga47 的思想相似:面对无法纳入数据库事务的远程或非确定性步骤,先明确每一步的业务成立条件,再用补偿、重试或显式失败管理后续状态

REST 主链会从认证账号解析 Workspace,并对 Offer、Knowledge、Asset、Brand Kit 和 Creation 做资源归属校验,确保租户隔离

六、仍然待解决的问题

问题核心原因解决方案与演进方向
MCP 工具过多与治理成本飙升单纯叠加 Tool 数量,导致选择歧义增加;仅靠 Schema 校验和 Prompt 规范无法替代严密的租户鉴权。实施 Tool 分组与最小权限控制,将 MCP Token 与 Workspace/Actor 强绑定48,建立 Schema 演进与工具级 Eval 机制。
检索基座的语义与规模上限基于词频/Bigram 重叠的检索无法处理同义变体、隐式语义推论及大规模长文本场景。演进为混合检索(Dense + Sparse RAG)49,同步搭建文档版本控制、失效清理、Reranking 评测与引用证据链。
外部平台自动化的天然脆弱性远端平台 DOM 变动、Session 校验、验证码与人工防刷机制超出后端系统确定性控制范围。坚持“草稿优先 + 远端证据对齐 + 人工最终确认”50,建立轻量级 Adapter 异常降级与人工复查机制51
仿真预测与现实结果的噪声偏差统计 Agent 和 Soul-Agent 依赖参数假设与特定样本分布,易陷入短期热点或采样噪声。设立 ROI 资格门禁,只将具备真实成本与收入的后验样本用于策略校准;结合多轮反馈持续修正预测 multiplier。
PG 任务队列的扩展与隔离瓶颈使用 SKIP LOCKED 实现简单队列,导致任务调度、并发竞争与主数据库故障域强绑定。在低成本期保留单库轻量优点,设定吞吐与隔离警戒线;高并发场景平滑迁移至 Dedicated 消息队列。

七、小结:Agent 应该进入业务系统,而不是绕过业务系统

回到开头那篇“看起来正确”的内容,企业最终需要相信的,并非模型写得多像专家,旨在证明系统能够说明:

flowchart LR
    A["企业 / 商品归属"] --> B["原始资料与知识"]
    B --> C["声明 vs 推断"]
    C --> D["策略与品牌偏好"]
    D --> E["Creation 版本"]
    E --> F["审核冻结快照"]
    F --> G["Worker 动作"]
    G --> H["状态回传"]
    H --> I["指标与统计时间"]
    I --> J["确定 ROI 资格"]
    J --> K["后验校准优化"]

能回答这些问题,Agent 才真正成为企业内容系统的一部分

模型可以理解模糊需求、组织语言、提出候选、选择受控工具;确定性代码必须维护身份、作用域、业务关联、状态前置、幂等和证据绑定;人类负责高影响确认和无法稳定自动核查的外部动作;平台事实与商业结果则必须带着来源和时间进入系统。

因此,我真正的产品是一套让企业事实能够被 Agent 安全消费、让内容决策能够被追踪、让外部结果能够被分级相信的业务系统,并非单纯停留在“一个能写营销内容的 AI”

一篇内容之所以可信,并非依赖它毫无错误,更取决于当错误出现时,系统知道应该回到哪一级事实重新检查


Footnotes

  1. Demo(Demonstration,演示版本):用最短路径证明某项能力“能够运行”的样例;本文特指只覆盖单次生成、尚未承担长期状态、权限、恢复与审计责任的实现

  2. 项目领域对象速览。Workspace 是企业运营与租户边界;Offer 是本次营销对象;Knowledge 是可引用知识;Asset 是可复用素材;Brand Kit 是品牌表达规范;Strategy Unit 是可复用策略切片;Creation 是持久化内容产物;PublishingJob 是审核与发布业务账本;TaskRun 是一次异步执行尝试。它们是本文项目的领域语言,不是外部协议规定的标准名词

  3. Web UI(Web User Interface)是浏览器用户界面;REST(Representational State Transfer)是围绕资源表述与统一接口约束组织网络系统的一种架构风格。本文中二者与 MCP 是同一 Content 应用服务的不同入口,而不是三套业务规则;REST 原始定义将其描述为“an architectural style for distributed hypermedia systems” Roy Fielding 博士论文

  4. MCP(Model Context Protocol,模型上下文协议):让 AI 应用发现和调用 Tools、读取 Resources、使用 Prompts 的开放协议;本文用它暴露 Content 域的受控能力,而不让协议层拥有业务事实。官方概括三类原语为“Prompts, Resources, Tools” MCP Server Overview

  5. Agent(智能体):围绕目标自主选择步骤、调用外部能力并根据中间结果继续行动的模型应用;本文中的 Agent 负责理解意图与编排受控能力,企业事实、权限和状态仍由服务端拥有。Anthropic 对 Agent 的区分是“LLMs dynamically direct their own processes and tool usage” Building Effective AI Agents

  6. Prompt(提示词):提交给模型的指令与上下文集合;它适合表达任务、约束和示例,不适合作为租户权限、对象归属或业务状态的唯一执行边界

  7. ROI(Return on Investment,投资回报率):衡量投入带来净回报的业务指标;本文只在存在正成本,且收入可直接获得或可由合格转化推算时使用 actual_roi = (revenue - cost) / cost,浏览量和互动率不能替代收入

  8. 范式:认证不等于租户隔离。RBAC(Role-Based Access Control,基于角色的访问控制)回答某个角色能做什么,tenant 表示共享系统中的客户或组织边界;本文用 Workspace 承载 Content 域租户语义,并在资源访问时校验归属。Azure 的设计提醒是“consider both tenant and user identity in your authorization process” Azure Multitenancy:Tenancy Models

  9. RAG(Retrieval-Augmented Generation,检索增强生成):先从外部知识源检索,再让模型基于检索内容生成;本文当前实现强调作用域、词法召回和确定性引用,尚不是完整向量检索系统。原始论文描述它“combine[s] pre-trained parametric and non-parametric memory” Lewis 等,2020

  10. Chunk(内容分块):为解析、检索或上下文装配而切出的文档片段;分块大小和边界会改变召回信息与证据定位,因此 Chunk 不是原文事实本身,更不能抹掉 Knowledge、Asset 和 Brand Kit 的业务类型

  11. 字段规范:多态作用域scope_type 声明归属对象类型,scope_id 保存对应对象标识,两者必须成对校验;本文允许 workspaceoffer 两种作用域,以复用模型并实现“企业默认层 + 商品专属层”,但数据库无法仅靠单一外键证明其指向哪个表,服务端仍需校验类型、存在性与 Workspace 归属

  12. Schema(结构模式):对对象字段、类型、必填项、枚举和嵌套关系的机器可读约束;它能稳定不同内容形态的交换结构,却不能单独证明字段值符合权限、业务语义或现实事实

  13. 范式:可变主对象与不可变业务快照分离payload_snapshot 冻结送审时真正消费的内容,Creation 后续仍可编辑;这借用了事件历史与 Provenance(溯源)的思想,但项目没有声称全面采用 Event Sourcing。Fowler 的核心定义是“all changes to application state are stored as a sequence of events”;W3C PROV 则用于描述生产对象涉及的实体与活动 Martin Fowler: Event Sourcing · W3C PROV Primer

  14. PDF 是固定版式文档;DOCX、PPTX、XLSX 分别是 Office 文档、演示文稿和工作簿的开放 XML 容器格式;CSV 是分隔符文本表格。声明“支持格式”只表示存在解析入口,不保证扫描件、复杂版式、公式、批注、动画或跨页表格都能完整保真

  15. OCR(Optical Character Recognition,光学字符识别):把扫描图像中的字符转成机器可读文本;本文用于补充扫描 PDF 的文本层,识别结果仍受版面、字体、语言、旋转与图像质量影响,因此应保留来源文件并允许人工复核

  16. Hero Copy(首屏主文案):网页首屏用于快速传达价值主张的标题和说明,目标通常是吸引与转化,而不是完整陈述产品能力;本文事故说明展示优先级不能直接等同于事实优先级

  17. HTML(HyperText Markup Language,超文本标记语言):描述网页结构与语义的标准标记语言;正文、导航、结构化数据和视觉布局可能表达不同层次的信息,解析器删除某类节点也会同时改变可用证据 WHATWG HTML Living Standard

  18. JSON-LD(JSON for Linking Data):使用 JSON 序列化关联数据的 W3C 标准,网页常结合 Schema.org 声明 Product、Service 或 SoftwareApplication;本文把它当作高信号来源之一,而不是天然真值。规范定义其为“a JSON-based format to serialize Linked Data” W3C JSON-LD 1.1

  19. LLM(Large Language Model,大语言模型):通过大规模语料训练、按上下文生成或判断文本的概率模型;本文让它负责语义抽取和内容生成,但不让它决定租户归属、状态前置与外部副作用是否成立

  20. 词法检索术语。token 是分词或模型处理的基本单元,bigram 是连续两个字符或词组成的二元组,embedding 是把文本映射为稠密向量的表示;本文当前召回主要依赖字符、token 与 bigram 重叠,尚未把 embedding 向量相似度作为线上检索事实

  21. Eval(Evaluation,评测):用固定样本、评分规则与回归门槛比较系统质量的方法;本文要求混合检索先在真实查询、引用正确性、召回与成本上证明增益,而不是因为技术更流行就替换现有链路。OpenAI 文档也建议“Create and use evals”来确定适合具体用例的结构 Structured Outputs

  22. Memory(长期记忆):从历史交互中保存、可在后续任务复用的偏好或事实;本文只在适用的生成环节注入已确认内容,不把完整聊天记录自动视作企业事实

  23. surface(产品能力表面):用户实际进入的页面、接口或创作环节;本文用它约束 Memory 等上下文只注入适用任务,防止某一页面的偏好无条件污染其他生成链

  24. 产品范式:Progressive Disclosure(渐进披露)。先展示当前任务需要的高频信息,再按需提供高级细节;本文的上下文预览只暴露存在性、数量、适用性和注入状态,避免把原始 Prompt 与内部轨迹倾倒给用户。该范式的目的之一是“defer advanced or rarely used features” Nielsen Norman Group: Progressive Disclosure

  25. 范式:路径清晰时优先 Workflow。Workflow 由预定义代码路径编排模型与工具,Agent 则让模型动态决定过程;本文对选题、脚本、图片和发布前处理使用可检查流程,只在开放判断处保留自主性。Anthropic 的建议是“finding the simplest solution possible” Building Effective AI Agents

  26. Persona(用户画像原型):为创作或仿真归纳的一组目标受众特征、需求与行为假设;本文把它作为生成上下文,而不是对任何真实个人的身份断言

  27. B-roll(补充镜头):用于覆盖剪辑点、补充场景或支撑叙事的辅助画面;本文把它建模为带插入位置、时长和素材引用的结构化条目,并由确定性代码限制数量、顺序与边界

  28. token 是模型流式输出的增量单位;thinking 在本文指供应商可选择暴露的推理摘要或中间状态,它不是所有模型共有的协议字段,也不应被当作完整、可审计的内部推理过程

  29. ImageJob/Job 是可持久化的异步任务对象;Promise 是 JavaScript 中表示异步操作最终完成或失败的内存对象。页面刷新后 Promise 无法恢复,而持久 Job 可以保存 ID、状态与结果,因此本文用 Job 承担跨请求生命周期。MDN 定义 Promise 为“eventual completion (or failure) of an asynchronous operation” MDN Promise

  30. Worker(工作进程)负责从持久任务中领取并执行工作;Adapter(适配器)把稳定的领域输入转换成外部平台或供应商协议,并把结果归一回领域语义。二者都不应重新定义 PublishingJob 的业务身份

  31. 产品范式:业务状态与执行状态分离。PublishingJob 回答用户正在审核或发布哪份内容,TaskRun 回答某次执行尝试怎样运行;内部任务成功只能升级它实际证明的业务阶段。可用性原则要求系统“keep users informed about what is going on”,但状态可见不等于暴露全部内部枚举 Nielsen Norman Group: 10 Usability Heuristics

  32. 范式:数据库竞争领取工作项。PostgreSQL FOR UPDATE SKIP LOCKED 跳过已被其他事务锁定的候选行,适合多个消费者竞争队列表;它只解决并发领取,不提供业务幂等、死信、公平调度或外部副作用恰好一次。官方明确说它可用于“multiple consumers accessing a queue-like table” PostgreSQL SELECT

  33. 范式:把网络重试当作正常路径unique_key 用稳定业务意图去重活动任务,降低超时或重复点击造成的重复执行;它不能替代外部平台自己的幂等与结果核验。Stripe 对幂等请求的概括是“safely retrying requests without accidentally performing the same operation twice” Stripe Idempotent Requests

  34. KOL(Key Opinion Leader,关键意见领袖):在特定领域拥有受众影响力的内容传播者;本文把已选 KOL 作为仿真请求的可选上下文,不把其历史影响力直接当作本次转化事实

  35. Statistical Agents(统计智能体):用向量化参数、规则或概率分布模拟一批消费者响应的计算单元;本文中它们强调低成本、规模与可复现性,不等同于会自主调用工具的企业 Agent

  36. Soul Agent:外部仿真服务中用于模拟具有相对稳定画像、偏好与行为倾向的消费者个体;它不代表真实用户,也不保证每次预测都启用 LLM,输出只能作为预测或校准信号

  37. CTR(Click-Through Rate,点击率)通常为点击数除以曝光数;CVR(Conversion Rate,转化率)通常为合格转化数除以访问、点击或会话数,分母必须随业务口径明确。两者都是漏斗效率指标,不能与 ROI 或收入互换

  38. verdict(建议性判断):仿真评审根据预测分、风险与规则给出的推荐结论;它是派生意见,不覆盖原始预测,也不等于平台实际结果

  39. Alias(别名映射):把不同入口、执行器或平台使用的多个标签归一到后端拥有的 canonical(规范)标识;最佳实践是目录与映射由单一事实源维护,未知值显式失败或进入待治理状态,避免前端和 Worker 各自发明枚举

  40. 范式:指标先定义语义,再参与计算actual_roi 的成本必须大于零,收入必须来自明确来源;内容表现可以展示,却不能被改名为商业回报。Google 的生产 ML 指南提醒“Model metrics don’t necessarily measure the real-world impact” Google Production ML Monitoring

  41. 范式:反馈闭环必须防止自我强化。如果模型排序影响曝光,曝光又直接成为下一轮学习标签,系统可能把自身决策产生的数据当成客观事实;本文用 ROI 资格门禁、原始预测保留与样本不足冷启动降低这种偏差。Google 提醒“a model can affect its own training data” Production ML Systems: Questions to Ask

  42. multiplier(校准乘数):根据某平台历史预测误差调整后续排序分的系数;本文只让它影响派生排序与解释,不覆盖原始预测,从而保留“模型当时判断了什么”的复盘基础

  43. 范式:按控制权区分 MCP 原语。Tools 是模型可调用动作,Resources 是应用管理的上下文,Prompts 是用户选择的模板;本文分别用它们承载业务操作、稳定领域上下文和高频工作流配方。官方控制层级为“User-controlled / Application-controlled / Model-controlled” MCP Server Overview

  44. 技术栈与职责。Pydantic 负责把不可信输入解析、校验为类型化模型;Application Service 编排领域用例与事务边界;SQLAlchemy Async 提供异步 ORM/数据库会话。Pydantic 明确支持“Untrusted data”经解析校验进入模型;SQLAlchemy 则警告单个 AsyncSession “is not safe for use in multiple, concurrent tasks” Pydantic Models · SQLAlchemy asyncio

  45. 范式:结构合法不等于业务合法。Function Calling 让模型请求应用提供的工具;Structured Outputs 可约束输出遵循 JSON Schema,但 Workspace、对象归属、状态前置和跨字段不变量仍须由服务端校验。官方能力边界是“adhere to a JSON schema you define”,而且只支持 JSON Schema 子集 OpenAI Function Calling · Structured Outputs

  46. best-effort(尽力而为):系统尝试执行后续增强步骤,但不把它纳入前一步成功的原子条件;本文中 Offer 写入是确定事实,知识推断失败会被记录或重试,却不反向伪装成 Offer 创建失败

  47. Saga:把跨服务长业务拆成一系列本地事务,并为失败设计补偿、重试或人工恢复;本文只借用其“远程副作用不能假装与本地数据库原子提交”的思想,并未声明已实现完整 Saga 编排器。Azure 将其概括为“a sequence of local transactions” Azure Architecture Center: Saga

  48. 安全范式:最小权限与资源级重新授权。MCP Token 只能证明调用者持有凭证,仍应绑定 Actor(行为主体)与 Workspace,并在每次对象访问时重新校验归属;OWASP 要求每个使用客户端对象 ID 的函数都检查当前用户是否有权操作该记录 OWASP API1:2023 Broken Object Level Authorization

  49. 范式:混合检索按证据引入,而不是按名词升级。Dense 用向量相似度寻找概念相关内容,Sparse 用关键词或倒排索引保留精确匹配,Reranking 对候选再次排序;本文计划在版本、失效、引用与 Eval 就绪后再引入。Azure 的混合检索“runs full-text search and vector search in parallel”,再用 RRF 合并结果 Azure AI Search: Hybrid Search

  50. 范式:高影响且难以可靠核验的动作保留人类监督。本文的 Draft-first(草稿优先)把公开发送前的最终形态交给用户确认,并区分“用户声明已发送”与“平台已核验”;这不是弱化自动化,而是把不可逆动作放在证据更充分的边界。NIST AI RMF 的目标是把可信性纳入 AI 系统的“design, development, use, and evaluation” NIST AI Risk Management Framework

  51. DOM(Document Object Model,文档对象模型)是浏览器对页面结构的可编程表示;Session 是一段登录或交互会话及其状态。网页自动化依赖页面结构与有效会话,平台改版、验证码或风控都可能让 Adapter 无法确定动作是否成立

Copyright & License

Author: Cooing

Original Link: https://blog.cooingcode.space/en/blog/enterprise-ai-agent/

License: Feel free to share or quote, but please attribute properly.