From 3fb9db847400b1fdce800db29fcf2346d2e5bf7f Mon Sep 17 00:00:00 2001 From: czj <13261895355@163.com> Date: Wed, 8 Jul 2026 11:30:05 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E9=95=BF=E6=9C=9F=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=A1=88=E4=BE=8B=E5=AD=98=E5=82=A8=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTEXT.md | 137 +++++ .../0001-unified-optimization-case-library.md | 3 + ...g-term-optimization-case-storage-design.md | 573 ++++++++++++++++++ 3 files changed, 713 insertions(+) create mode 100644 CONTEXT.md create mode 100644 docs/adr/0001-unified-optimization-case-library.md create mode 100644 docs/superpowers/specs/2026-07-08-long-term-optimization-case-storage-design.md diff --git a/CONTEXT.md b/CONTEXT.md new file mode 100644 index 0000000..ff48150 --- /dev/null +++ b/CONTEXT.md @@ -0,0 +1,137 @@ +# GEO Agent Article Optimizer + +This context defines the product language for the GEO article optimization workflow and its long-term learning records. + +## Language + +**优化案例**: +一次优化从原始输入、约束信息、优化结果到后续回看的完整业务记录。 +_Avoid_: 任务, 作业, job, 单个导出文件 + +**文章优化案例**: +长期存储覆盖的优化案例类型之一,围绕文章原文、事实卡、优化稿、质量检查、导出文件和发布表现形成记录。 +_Avoid_: 所有文案工具 + +**人味文案优化案例**: +长期存储覆盖的优化案例类型之一,围绕短文案原文、优化目标、优化强度、优化后文案、修改说明、AI 味检查和发布表现形成记录。 +_Avoid_: 仁微文案优化, 普通文章优化 + +**原始输入**: +用户提交给优化流程的原文、图片说明或链接、目标平台和补充要求,是优化案例可复用和可解释的起点。 +_Avoid_: 请求体, 日志, 草稿 + +**优化案例库**: +用于回看、复用和重新导出优化案例的长期业务资产集合。 +_Avoid_: 文件归档, 历史列表 + +**统一案例库**: +同时容纳文章优化案例和人味文案优化案例的优化案例库,通过案例类型区分不同详情内容。 +_Avoid_: 两套案例库, 分散入口 + +**案例类型**: +区分优化案例业务形态的分类,目前包括文章优化案例和人味文案优化案例。 +_Avoid_: 技术路由, 数据表名 + +**效果学习库**: +沉淀发布表现、质量评分和校准结论的长期业务资产集合,用来比较生成时的质量预期与发布后的真实效果。 +_Avoid_: 日志仓库, 埋点表, 监控数据 + +**评分口径**: +某类优化案例用于判断优化质量和预期效果的评价标准,不同案例类型可以有不同评分口径。 +_Avoid_: 全局统一分数, 发布指标 + +**LLM 审计摘要**: +一次模型调用的长期可追溯记录,只包含供应商、模型、任务、耗时、校验状态、错误摘要和内容指纹等元数据。 +_Avoid_: 完整 prompt, 完整 response, 控制台日志 + +**调试证据**: +为排查模型或 schema 问题而临时保留的完整模型输入输出,应有明确过期时间。 +_Avoid_: 长期训练样本, 默认日志 + +**中间稿**: +优化流程在最终版本之前生成的草稿或修复稿,默认不是长期业务记录。 +_Avoid_: 最终优化稿, 优化案例 + +**过程摘要**: +对优化流程中关键步骤、失败规则、修复轮次和耗时的轻量记录,不包含每一轮中间稿全文。 +_Avoid_: 完整草稿历史, 前端进度 + +**特殊样本**: +因失败复盘、人工采纳对比或用户显式标记而保留更多过程内容的优化案例。 +_Avoid_: 普通优化案例, 调试证据 + +**失败案例**: +优化流程未产出正式产物但仍被保存的优化案例,用于排查失败阶段、错误原因和输入质量。 +_Avoid_: 系统日志, 被丢弃的请求 + +**归档案例**: +从默认列表中隐藏但仍保留长期记录的优化案例,可用于追溯、恢复或复盘。 +_Avoid_: 硬删除, 清理缓存 + +**正式产物**: +优化案例中用户可回看、复用或下载的最终业务结果,包括结构化结果和导出文件快照。 +_Avoid_: 中间稿, 临时预览 + +**结果版本**: +同一优化案例内一次成功优化产出的正式产物版本;重新运行优化会产生新的结果版本。 +_Avoid_: 覆盖结果, 临时草稿 + +**修改说明**: +人味文案优化中说明原文与优化后文案差异、修改原因和不确定性的正式产物组成部分。 +_Avoid_: 调试日志, 模型解释 + +**AI 味检查**: +人味文案优化中对宣传腔、套路句、格式痕迹和语气失真等风险的正式产物组成部分。 +_Avoid_: QA 报告, 模型日志 + +**结构化结果**: +系统可查询和再处理的最终优化稿、QA 报告、评分与校准数据,是正式产物的事实源。 +_Avoid_: 导出文件, 页面展示内容 + +**导出文件快照**: +用户在某次优化完成后可下载的 Markdown、DOCX 或 QA JSON 文件版本,用来保留当时实际交付的文件形态。 +_Avoid_: 可随时重算的下载结果, 模板 + +**案例归属**: +优化案例所属的品牌、客户和项目标签,用于组织、检索和复用长期案例。 +_Avoid_: 用户账号, 权限策略, 全局流水账 + +**客户**: +优化案例服务的外部或内部业务对象,可以拥有多个品牌或项目。 +_Avoid_: 登录用户, API 调用者 + +**项目标签**: +给优化案例附加的业务分组标记,例如活动、产品线、行业专题或阶段性服务包。 +_Avoid_: 技术标签, 日志级别 + +**案例备注**: +用户为优化案例补充的自由文本说明,用于记录复盘判断、客户反馈或后续动作。 +_Avoid_: 系统日志, QA 报告 + +**发布目标**: +优化内容计划使用的渠道或场景,例如官网、媒体文章、公众号、朋友圈、私域、短视频口播或销售私信。 +_Avoid_: 技术平台, 存储位置 + +**发布记录**: +某个结果版本实际发布到目标平台后的业务记录,包含平台、地址、发布时间和状态。 +_Avoid_: 导出文件, 优化结果 + +**效果快照**: +在某个时间窗口采集到的发布表现数据和反馈摘要,用于比较质量预期与真实效果。 +_Avoid_: 实时监控, 普通日志 + +**手动表现录入**: +用户人工录入效果快照的方式,是效果学习库的第一阶段数据来源。 +_Avoid_: 平台 API 集成, 自动采集 + +**数据保留策略**: +对不同类型长期数据和临时数据设定不同保留边界的业务规则。 +_Avoid_: 数据库清理任务, 备份策略 + +**长期保留**: +默认持续保存的业务资产状态,适用于优化案例、正式产物、发布记录和效果快照。 +_Avoid_: 永不删除, 临时缓存 + +**自动过期**: +临时数据在达到约定时间后自动失效或删除的保留方式,主要适用于调试证据。 +_Avoid_: 手动清理, 长期保留 diff --git a/docs/adr/0001-unified-optimization-case-library.md b/docs/adr/0001-unified-optimization-case-library.md new file mode 100644 index 0000000..d0a3803 --- /dev/null +++ b/docs/adr/0001-unified-optimization-case-library.md @@ -0,0 +1,3 @@ +# Unified Optimization Case Library + +We will model long-term storage as a unified optimization case library rather than separate archives for article optimization and human-tone copy optimization. Cases are saved automatically during optimization so original inputs, audit summaries, process summaries, and formal outputs are not lost; users can enrich them afterward with titles, ownership metadata, tags, and notes. Re-running optimization from a case creates a new result version rather than overwriting prior output, preserving comparison and learning history. The shared library supports type-based filtering, shared ownership metadata, shared LLM audit summaries, and shared list/detail navigation, while each case type keeps type-specific detail modules. Both case types include a first-version entry point and empty state for publication performance and learning feedback so the case library can also become the performance learning library. Publication records and performance snapshots are shared concepts, but quality scoring uses type-specific rubrics so article quality and human-tone copy quality are not forced into one artificial score. diff --git a/docs/superpowers/specs/2026-07-08-long-term-optimization-case-storage-design.md b/docs/superpowers/specs/2026-07-08-long-term-optimization-case-storage-design.md new file mode 100644 index 0000000..0f268e9 --- /dev/null +++ b/docs/superpowers/specs/2026-07-08-long-term-optimization-case-storage-design.md @@ -0,0 +1,573 @@ +# 长期优化案例存储设计 + +## 目标 + +建立一套长期存储机制,把运行过程中的原始输入、关键约束、正式产物、过程摘要、LLM 审计摘要和发布后的效果反馈沉淀为可回看、可复用、可学习的优化案例库。 + +这套机制第一版覆盖两类案例: + +- `文章优化案例`:GEO 文章优化主流程产生的案例。 +- `人味文案优化案例`:普通文案人味优化产生的案例。 + +案例库不仅是历史记录,也是效果学习库。它要能解释“当时为什么这样生成”,也要能继续记录“发布后表现如何”。 + +## 背景 + +当前项目已经有一部分长期数据能力: + +- 文章优化会保存 `article_jobs`、事实卡、优化稿、QA 报告和导出路径。 +- 文章导出在本地写入 `data/exports//`,Cloudflare 路径写入私有 R2。 +- 发布表现校准已有发布记录、效果快照、评分 run 和校准事件模型。 +- 人味文案优化当前是一次性 API,返回优化后文案、修改说明和 AI 味检查,但不落库。 + +现有结构能支撑文章优化,但缺少统一案例入口、跨类型列表、案例元数据、失败案例保留、LLM 审计摘要和人味文案长期记录。 + +## 范围 + +第一版包含: + +- 统一优化案例库。 +- 文章优化案例和人味文案优化案例两种案例类型。 +- 优化时自动保存案例。 +- 成功和失败案例都保存。 +- 结果版本化,重新运行优化生成新版本。 +- 案例列表和案例详情页。 +- 客户、品牌、项目标签、备注等可选归属信息。 +- 基础关键词搜索和常用筛选。 +- 发布记录、效果快照和效果学习入口。 +- 两类案例各自一套评分口径,但共用发布记录和效果快照结构。 + +第一版不包含: + +- 用户账号、团队权限或多租户隔离。 +- 平台 API 自动采集效果数据。 +- 完整全文搜索引擎和搜索高亮。 +- 案例硬删除。 +- 人味文案优化导出文件快照。 +- 默认长期保存完整 prompt/response。 + +## 核心决策 + +### 统一案例库 + +文章优化和人味文案优化都进入同一个优化案例库,通过案例类型筛选。 + +理由: + +- 两类案例都包含原始输入、优化结果、LLM 审计摘要、归属信息和发布表现。 +- 用户需要从一个地方检索和复用历史成果。 +- 详情内容按类型拆分即可,不需要拆成两个入口。 + +### 自动保存 + +案例在优化流程中自动保存,不要求用户优化完成后再手动点击保存。 + +运行开始时创建案例记录,后续持续补充过程摘要、结果版本、审计摘要和错误状态。用户可以在完成后补标题、客户、品牌、项目标签和备注。 + +### 失败案例保留 + +失败的优化也保存为失败案例。 + +失败案例不进入正式产物区,但详情页展示: + +- 原始输入。 +- 失败阶段。 +- 错误摘要。 +- LLM 审计摘要。 +- 已产生的过程摘要。 + +### 结果版本 + +同一案例重新运行优化时生成新的结果版本,不覆盖旧结果。 + +发布记录绑定结果版本,而不是绑定整个案例。效果快照继续绑定发布记录。 + +关系是: + +```text +优化案例 -> 结果版本 -> 发布记录 -> 效果快照 -> 校准结论 +``` + +### LLM 审计边界 + +默认长期保存 LLM 审计摘要,不保存完整 prompt/response。 + +审计摘要包含: + +- provider。 +- model。 +- task。 +- duration_ms。 +- schema 校验状态。 +- 错误摘要。 +- 输入内容 hash。 +- 输出内容 hash。 + +完整 prompt/response 只作为调试证据临时保留,并应有过期时间。第一版可以先不实现完整调试证据存储,但不能把完整 prompt/response 默认写入长期库。 + +## 数据保留边界 + +### 文章优化案例 + +长期保存: + +- 原文标题和正文。 +- 图片说明或链接。 +- 目标发布平台。 +- 用户补充要求。 +- 事实卡。 +- 最终优化稿。 +- QA 报告。 +- 评分结果。 +- 导出文件快照。 +- 过程摘要。 +- LLM 审计摘要。 +- 发布记录、效果快照和校准结论。 + +默认不长期保存: + +- 每一轮草稿和 rewrite 全文。 +- 完整 prompt/response。 +- 前端流式事件原始流。 + +### 人味文案优化案例 + +长期保存: + +- 原始文案。 +- 优化目标。 +- 修改强度。 +- 补充要求。 +- 发布目标。 +- 优化后文案。 +- 修改说明。 +- AI 味检查。 +- warnings。 +- 过程摘要。 +- LLM 审计摘要。 +- 发布记录、效果快照和校准结论。 + +第一版不保存: + +- Markdown/DOCX 导出文件快照。 +- 完整 prompt/response。 + +### 过程摘要 + +过程摘要只保存可复盘的轻量信息: + +- 阶段名。 +- 开始和结束时间。 +- 耗时。 +- 状态。 +- 失败规则或错误摘要。 +- rewrite 轮次。 +- 是否产出正式版本。 + +中间稿全文默认不保存。特殊样本保留更多过程内容可以作为后续能力。 + +## 概念模型 + +### 优化案例 + +统一案例库中的顶层记录。 + +公共字段: + +- `id` +- `case_type`: `article` 或 `human_copy` +- `title` +- `summary` +- `status`: `running`、`optimized`、`failed`、`archived` +- `customer_name` +- `brand_name` +- `project_tags` +- `notes` +- `created_at` +- `updated_at` +- `archived_at` + +`customer_name`、`brand_name`、`project_tags` 和 `notes` 第一版都可选,允许优化完成后补录和编辑。 + +### 案例输入 + +保存每个案例的原始输入和约束信息。 + +文章优化输入包含: + +- `source_title` +- `source_body` +- `image_inputs` +- `publish_platform` +- `user_instructions` +- `fact_card` + +人味文案输入包含: + +- `source_text` +- `goal` +- `intensity` +- `user_instructions` +- `publish_target` + +### 结果版本 + +一次成功优化产出的正式产物版本。 + +公共字段: + +- `id` +- `case_id` +- `version` +- `status` +- `result_summary` +- `process_summary` +- `created_at` + +文章优化版本包含: + +- 优化稿结构化结果。 +- QA 报告。 +- 评分 run。 +- 导出文件快照引用。 + +人味文案版本包含: + +- `optimized_text` +- `change_notes` +- `ai_taste_checks` +- `warnings` +- 人味文案评分 run。 + +### 发布记录 + +发布记录绑定到某个结果版本。 + +字段包含: + +- `result_version_id` +- `publish_target` +- `url` +- `published_at` +- `status` +- `notes` + +文章优化和人味文案优化共用这套概念。 + +### 效果快照 + +效果快照绑定发布记录。 + +第一版以手动表现录入为主,保留来源字段: + +- `source`: `manual` 或未来的 `adapter:` +- `window_label` +- `metrics` +- `feedback_summary` +- `raw_reference` +- `snapshot_at` + +## 与现有模型的关系 + +### 文章优化 + +现有 `article_jobs`、`fact_cards`、`optimized_articles`、`qa_reports` 和导出存储仍可作为文章优化的底层实现。 + +第一版实现时建议引入统一案例元数据层,并让文章优化创建案例时关联现有 article job: + +- 新增统一案例记录。 +- `article_jobs` 关联 `case_id`。 +- `optimized_articles.revision` 对应文章案例的结果版本号。 +- `qa_reports` 继续按文章结果版本保存。 +- 现有导出路径继续作为文章结果版本的导出文件快照。 + +这样可以避免一次性重写文章优化主链路。 + +### 人味文案优化 + +人味文案优化当前接口可以保留技术路由名 `POST /api/copy/renwei-optimize`,但产品文案统一使用“人味文案优化”。 + +第一版要把一次性 API 改为自动创建案例: + +- 请求开始时创建 `human_copy` 案例。 +- 保存原始文案、优化目标、强度、补充要求和发布目标。 +- 成功后保存结果版本,包含优化后文案、修改说明、AI 味检查和 warnings。 +- 失败时保存失败案例和错误摘要。 + +### 发布和效果 + +当前发布记录以文章 job 和 revision 为核心。统一案例库需要把发布记录的业务语义提升为“绑定结果版本”。 + +实现可以选择兼容迁移路径: + +- 为发布记录增加统一结果版本引用。 +- 文章旧字段保留兼容,逐步迁移到结果版本引用。 +- 新的人味文案发布记录直接绑定结果版本。 + +效果快照继续绑定发布记录。 + +## 页面设计 + +### 入口 + +新增 `案例库` 入口。 + +案例库是一个工作台页面,不是营销页。默认展示案例列表。 + +### 案例列表 + +默认列: + +- 标题/摘要。 +- 案例类型。 +- 客户/品牌。 +- 项目标签。 +- 发布目标。 +- 状态。 +- 创建时间。 +- 最近更新时间。 + +默认隐藏归档案例。 + +搜索和筛选: + +- 关键词搜索:标题、原文摘要、结果摘要、客户、品牌、备注。 +- 筛选:案例类型、状态、发布目标、项目标签、创建时间。 +- 第一版不做完整全文搜索引擎和高亮。 + +### 案例详情 + +详情页采用共享头部 + 类型专属模块。 + +共享头部: + +- 标题。 +- 案例类型。 +- 状态。 +- 客户/品牌。 +- 项目标签。 +- 备注。 +- 创建和更新时间。 +- 最新结果版本。 +- LLM 审计摘要概览。 +- 归档/恢复操作。 + +共享区域: + +- 结果版本列表。 +- 发布记录。 +- 效果快照。 +- 校准结论。 +- 重新运行优化。 + +文章优化专属模块: + +- 原文标题和正文。 +- 图片输入。 +- 目标平台和补充要求。 +- 事实卡。 +- 当前版本优化稿。 +- QA 报告。 +- 导出链接。 + +人味文案专属模块: + +- 原始文案。 +- 优化目标。 +- 修改强度。 +- 补充要求。 +- 发布目标。 +- 优化后文案。 +- 修改说明。 +- AI 味检查。 +- warnings。 + +失败案例详情: + +- 显示失败状态。 +- 显示失败阶段和错误摘要。 +- 显示原始输入和 LLM 审计摘要。 +- 不展示正式产物区。 +- 允许从失败案例重新运行优化,成功后生成新结果版本。 + +## API 设计 + +新增案例库 API: + +```text +GET /api/cases +GET /api/cases/:caseId +PATCH /api/cases/:caseId +POST /api/cases/:caseId/archive +POST /api/cases/:caseId/restore +POST /api/cases/:caseId/rerun +``` + +发布和效果 API: + +```text +POST /api/cases/:caseId/versions/:versionId/publications +GET /api/cases/:caseId/versions/:versionId/publications +POST /api/publications/:publicationId/performance +``` + +现有文章优化接口继续保留,但需要在运行过程中自动创建和更新案例: + +```text +POST /api/jobs/optimize-stream +POST /api/jobs +POST /api/jobs/:jobId/optimize +``` + +现有人味文案接口保留技术路径,但响应中增加案例信息: + +```text +POST /api/copy/renwei-optimize +``` + +成功响应应包含: + +```json +{ + "case": { + "id": "case_xxx", + "case_type": "human_copy" + }, + "result_version": { + "id": "ver_xxx", + "version": 1 + }, + "result": {} +} +``` + +失败响应仍返回明确错误,同时案例库中留下失败案例。 + +## 状态规则 + +案例状态: + +- `running`:优化已开始但尚未完成。 +- `optimized`:至少有一个成功结果版本。 +- `failed`:当前运行失败且没有成功结果版本,或最近一次运行失败。 +- `archived`:从默认列表隐藏但仍保留记录。 + +结果版本状态: + +- `optimized`:成功产出正式产物。 +- `failed`:本次运行失败,没有正式产物。 + +如果一个已有成功版本的案例重新运行失败,案例仍保留历史成功版本;详情页提示最近一次运行失败。 + +## 评分口径 + +文章优化和人味文案优化使用不同评分口径。 + +文章优化评分继续关注: + +- 事实一致性。 +- 平台适配。 +- 搜索意图匹配。 +- 答案密度。 +- 信任信号质量。 +- 可读性。 + +人味文案优化评分新增独立口径,建议关注: + +- 改动克制。 +- 原意保真。 +- 语气自然度。 +- 目标匹配。 +- AI 味风险。 +- 互动或转化表现。 + +发布记录和效果快照共用结构,但评分 run 必须记录自己的 rubric 版本。 + +## 错误处理 + +- API 访问密钥继续沿用现有 `x-api-key` 规则。 +- 案例创建失败时,本次优化应返回明确错误,不继续产生孤立结果。 +- LLM 失败时保存失败阶段和错误摘要。 +- schema 校验失败时保存校验摘要,不保存完整 response。 +- 导出文件写入失败时,文章案例可以保存结构化结果并标记导出失败。 +- 发布记录必须绑定存在的结果版本,否则返回 `409` 或 `404`。 +- 效果快照必须绑定存在的发布记录,否则返回 `404`。 + +## 测试计划 + +单元测试: + +- 案例类型校验接受 `article` 和 `human_copy`。 +- 案例元数据允许客户、品牌、项目标签和备注为空。 +- 人味文案结果校验包含优化后文案、修改说明、AI 味检查和 warnings。 +- LLM 审计摘要不包含完整 prompt/response。 +- 结果版本号重新运行时递增。 + +Repository 测试: + +- 可以创建文章优化案例。 +- 可以创建人味文案优化案例。 +- 可以保存失败案例。 +- 可以保存多个结果版本并按版本倒序读取。 +- 发布记录绑定结果版本。 +- 效果快照绑定发布记录。 +- 归档案例默认不出现在普通列表。 + +API 测试: + +- 文章优化成功后可以在案例列表查到。 +- 人味文案优化成功后可以在案例列表查到。 +- LLM 失败后可以查到失败案例。 +- `PATCH /api/cases/:caseId` 可以补录客户、品牌、项目标签和备注。 +- `POST /api/cases/:caseId/archive` 后默认列表隐藏该案例。 +- `POST /api/cases/:caseId/rerun` 生成新结果版本,不覆盖旧版本。 + +组件测试: + +- 案例列表展示默认列。 +- 案例列表支持类型、状态、发布目标、项目标签和时间筛选。 +- 文章案例详情展示事实卡、QA、导出链接和效果学习入口。 +- 人味文案案例详情展示修改说明、AI 味检查和效果学习入口。 +- 失败案例详情展示失败阶段和错误摘要,不展示正式产物区。 + +E2E 测试: + +- 完成一次文章优化后进入案例库,能打开详情并下载文章导出文件。 +- 完成一次人味文案优化后进入案例库,能打开详情并查看修改说明。 +- 给案例补项目标签和备注后,列表可搜索或筛选到。 +- 从详情页重新运行优化后出现新结果版本。 +- 为某个结果版本录入发布记录和手动效果快照后,详情页显示效果学习信息。 + +验证命令: + +```bash +npm run lint +npm test +npm run build +``` + +## 迁移策略 + +第一步先服务新产生的案例,不要求立即迁移所有旧数据。 + +推荐顺序: + +1. 增加统一案例元数据和结果版本能力。 +2. 让文章优化新请求自动创建案例,并关联现有 article job。 +3. 让人味文案优化新请求自动创建案例和结果版本。 +4. 增加案例列表和详情页。 +5. 将发布记录和效果快照入口接到结果版本。 +6. 再评估是否需要把历史 `article_jobs` 批量补成案例。 + +历史数据迁移可以延后,因为当前主要目标是让后续运行不再丢失长期资产。 + +## 不做范围 + +- 不做账号、角色和权限。 +- 不做平台 API 自动采集。 +- 不做人味文案导出文件快照。 +- 不默认保存完整 prompt/response。 +- 不做全文搜索引擎。 +- 不做硬删除。 +- 不把失败案例当作正式产物。 +- 不把两类案例强行合并为同一套评分口径。