AI-3.3-03 共享行业术语库 · 实现策略 TDD

垂直行业专业词库——共享术语库基础设施四件套(PRD 需求编号 FR-3.3-03)

类型:技术设计文档(TDD) 条目编号:AI-3.3-03(溯源 FR-3.3-03) PRD 版本:V1.4(2026-10-22) 优先级:Should(P2:规划中,共享术语库基础设施独立前置交付) 深度分级:full(P2_full,与 P1 同级) full 波次:p2-a(A 波先行,设计归属方) 文档版本:v1.0(2026-10-26) schema 状态:评审候选稿 源文件:docs/reports/ai-module-prd/tdd/AI-3.3-03-shared-thesaurus.md

摘要

PRD V1.4 §5.2 FR-3.3-03 验收要点:「术语库覆盖选定行业词表;翻译与检索两端复用生效;词库更新机制可运营。」 现状判定为从零新建(无任何词库能力)——但两域消费端注入点已明确且经代码复核: 翻译域 fillPrompt 注入位(backend/src/modules/translation/client.ts:295-306,精确成立)与 检索域查询/索引扩展槽(AI-3.3-02 §4.4)。行业词条内容生产为持续运营任务,仅定义验收口径(覆盖数值 DEC-5), 不阻塞下游 TDD 生成与基础设施实施。

本卡交付共享术语库基础设施四件套——①术语实体(thesaurus_term)+ ②admin CRUD + ③消费 API 双契约(翻译端注入契约 / 检索端查询扩展契约)+ ④管理界面,及词库更新运营机制(生效/版本/回滚)。 RK-14 强制设计约束:实体 schema 冻结前必须经翻译域与检索域两域消费契约联合评审——评审前本卡全部字段级设计为 评审候选稿,不构成冻结。Blockers 为空,全卡可开工。

四件套交付
4
术语实体 / admin CRUD / 消费 API 双契约 / 管理界面 + 更新运营机制
验收标准
8
A1 四件套齐备 … A8 状态机与留痕,含降级零阻断(A6)
Blocker
0
本卡 blockers 为空;词条内容生产(运营任务)不阻塞基础设施与下游 TDD
设计前置流程
1
RK-14 两域联审(medium 风险):schema 冻结前必须完成翻译域/检索域联合评审

关键概念

四件套
①术语实体(thesaurus_term)②admin CRUD API ③消费 API 双契约(翻译端/检索端)④管理界面——共享术语库基础设施的独立前置交付。
一词两用
翻译域(FR-3.5-03 场景翻译)与检索域(FR-3.3-02/3.3-04)共同复用同一 published 词条集合——PRD §7.5-④「一次建设、两域复用,无循环依赖」。
RK-14 两域联审
实体 schema 冻结前,翻译域(fillPrompt 注入格式)与检索域(查询扩展格式)消费契约的强制联合评审;评审通过记录回填决策章节。评审前 schema 为评审候选稿。
synonym_group
同义词组标识——同组内词条互为等价变体,检索端展开单位;null=独立词条不参与组展开。
getTranslationTermContext
翻译端注入契约:按 domain+双语过滤取 published 词条,返回 terms 数组与 prompt_block(per-domain 术语约束段,注入格式冻结对象)。
expandQueryByThesaurus
检索端查询扩展契约:实现 AI-3.3-02 §4.4 expandQuery 恒等占位的真实语义——P1 精确匹配起步,返回 [原词, ...组内全部 published 词];未命中或词库不可用恒返回 [q]。
六域枚举
ai_tech / legal / tax / medical / education / cross_border_trade——逐字对齐 PRD FR-3.3-03 行业清单(AI 科技/法务/财税/医疗/教育/跨境贸易);新增域需迁移扩展枚举。
featureFlags.thesaurus
词库功能独立开关(默认 false):关闭时消费函数恒等回退 + admin API 返回 404(能力整体不可见);与代码回退二选一,不并存两套回滚机制。

方案设计

设计红线声明与设计归属

红线对照(AGENTS.md §0.1 逐条)
  • Workflow 承载业务逻辑:词条全部状态变更(创建/更新/发布/废弃/恢复)必须走 Workflow step;查询类消费 API 为只读 service 无需 Workflow。
  • 不修改上游源码:@medusajs/*/@mercurjs/* 零触碰;translation client(本地模块)的接线修改归 AI-3.5-03 实施并另行评审,本卡交付契约与消费 service 本体。
  • 后端单一数据源:词条以后端 thesaurus_term 表为唯一事实源;admin-panel 仅消费 API;消费端不建本地词表副本(检索端展开每次实时查询)。
  • 参数化 SQL:全部查询经模块 service 参数化;ILIKE 转义沿用 route.ts:265 范式(%_\ 转义)。
归属内容
本卡 owns ①thesaurus_term 实体;②admin CRUD API+管理界面;③消费 API 双契约(翻译端注入契约/检索端查询扩展契约);④词库更新运营机制(生效/版本/回滚)——供 AI-3.3-04、AI-3.5-03 引用
references_only AI-3.3-02 检索链路重构(本卡只对齐其 query_expansion 槽位格式,不重设计检索);AI-3.5-03 场景翻译的术语注入消费方式(引用方,接线实施归其卡)
RK-14 强制设计约束 评审候选稿

实体 schema 冻结前必须经翻译域(fillPrompt 注入格式)与检索域(查询扩展格式)两域消费契约联合评审——评审通过记录(日期/参与方/结论/遗留项)回填决策章节;schema 预留 extensions jsonb 扩展位避免两域二次返工。评审前本 TDD 全部字段级设计为「评审候选稿」,不构成冻结。评审候选稿仍可先行部分:模块骨架/CRUD(draft 态写入不影响消费契约)/管理界面可并行开工——仅「published 生效链路+消费函数」待联审后合入。

数据模型:thesaurus_term 实体(字段级,从零新建)

新本地模块 backend/src/modules/thesaurus/(models/services/index),表 thesaurus_term:

字段类型约束/默认说明
idtextPK,prefix thstermmedusa id 约定
domainenum(ai_tech, legal, tax, medical, education, cross_border_trade)not null行业域枚举——逐字对齐 PRD FR-3.3-03 行业清单;新增域需迁移扩展枚举(附录留迁移记录位)
source_texttextnot null源术语原文
source_localeenum(ja-JP, zh-Hans, en-US)not null源语言——值域复用 SUPPORTED_SOURCE_LOCALES(locale.ts:36-40)
target_texttextnot null目标译文
target_localeenum(ja-JP, zh-Hans, en-US)not null目标语言;约束:target_locale ≠ source_locale(service 层校验)
synonym_grouptextnullable同义词组标识(同组内词条互为等价变体;检索端展开单位;null=独立词条不参与组展开)
statusenum(draft, published, deprecated)not null, default draft生效语义:仅 published 参与两域消费(与 AI-3.4-02 category_standard 三态同构)
versionintegernot null, default 1行内版本号;published 状态下再编辑时自增(运营机制④)
extensionsjsonbnullableRK-14 两域扩展位——评审后如需 domain 特有属性(检索域:词性/变体标记;翻译域:preferred 标记/禁译标志)落此列,避免二次 migration
reviewed_at / reviewed_bytimestamptz / textnullable审核留痕(字段组命名沿用 seller-profile.ts:33-34 范式;reviewed_by=req.auth_context.actor_id)
rejection_reasontextnullable废弃/驳回原因(沿用 seller-profile.ts:35 命名)
created_at / updated_at / deleted_attimestamptz标准三件套medusa 约定

索引与约束:

  • UNIQUE(domain, source_text, source_locale, target_locale)(同域同源词同目标语唯一;软删行经 deleted_at 部分唯一索引处理,migration 按 @medusajs/translation 表 unique index 范式写 partial index);
  • INDEX(domain, status)(消费端 published 热点查询);INDEX(synonym_group)(组展开);INDEX(status)。
两域联审候选问题清单(评审会输入,不是结论)
  • ①检索端是否需要 pos(词性)/variant_type(缩写/全称/别名类型)列或落 extensions;
  • ②翻译端是否需要 preferred(同 group 多译时的首选标记)——若需要,建议落 extensions jsonb(RK-14 预留位已备)。
stateDiagram-v2 [*] --> draft : 创建(upsert Workflow) draft --> published : publish(reviewed_at/by 留痕) published --> draft : published 再编辑(version+1 + prev_snapshot) published --> deprecated : deprecate(可带 reason) draft --> deprecated : 废弃草稿 deprecated --> published : restore(行级回滚) deprecated --> [*] : DELETE 软删(deleted_at 置位) note right of published 仅 published 参与两域消费 非法迁移抛 409(service 层白名单) end note
图 1. 词条生命周期状态机(draft → published → deprecated → published;状态机白名单在 service 层,forward-only 语义参照 qualification-state-machine 范式)

消费 API 双契约(本卡冻结,RK-14 联审对象)

① 翻译端注入契约(翻译域消费格式——冻结稿,接线实施归 AI-3.5-03)

服务内部函数(backend/src/modules/thesaurus/service.ts 导出,无 HTTP 路由):

getTranslationTermContext({ domain, source_locale, target_locale })
  → { terms: [{ source_text, target_text, synonyms: string[] }],
      prompt_block: string | null }   // 无 published 词条时 prompt_block = null
  • 取词口径:domain = ? AND status = 'published' AND source_locale = ? AND target_locale = ?(参数化);synonyms = 同 synonym_group 内其他 published 词条的 source_text 集合(上限截断随联审定,暂记 20);
  • prompt_block 格式(per-domain 术语约束段,评审冻结对象):
【术语表(必须遵守,逐条按给定译法)】
- {source_text} → {target_text}
- …(每域上限条目数随联审定,暂记 50,按 updated_at DESC 截断)
  • 注入位对齐:翻译请求携带 domain 上下文时,prompt_block 拼接进 system prompt(落点为 client.ts:464-465 systemPrompt 组装链尾——fillPrompt(client.ts:295-306)本身只做 {source}/{target} 替换不改其函数体;术语段作为独立段追加,避免污染 config.prompt 语义);
  • 双域联审点:prompt_block 分隔符/条目上限/是否标注禁译词,由翻译域引用方(AI-3.5-03)在本契约框架内提出、联审定稿。

② 检索端查询扩展契约(检索域消费格式——对齐 AI-3.3-02 §4.4 槽位)

expandQueryByThesaurus(q: string, locale?: string) → string[]
  • 实现 AI-3.3-02 §4.4 预留的 expandQuery(q) 恒等占位的真实语义;命中规则(P1 精确匹配起步):q 经 trim 后与 source_text/target_text/同 synonym_group 词全等命中(大小写不敏感,ILIKE 转义同 route.ts:265 范式)→ 返回 [原词, ...组内全部 published 词](去重保序);未命中或词库不可用 → 恒返回 [q];
  • 展开词集合注入 AI-3.3-02 §4.1 A1 查询构造:命中词集合 OR 链(其卡已声明「仍全参数化」);
  • 分词/模糊匹配/跨语查询改写属 AI-3.3-04 演进(其 §5.2 已预留该落点位),本卡不含;
  • 性能注记:词表量级为运营词条数(千级以内),INDEX(domain,status) 覆盖查询;命中判断走内存集缓存(进程内 TTL ≤60s,失效即回源)标注为演进项——首版直接查库即可满足;
  • 双域联审点:展开是否含 target_text 方向词(检索跨语场景)由 AI-3.3-02 维护方在联审提出——本契约默认含(一词两用口径),评审可收紧。
sequenceDiagram autonumber participant ADM as admin 词条生产(人工运营) participant W as 词条 Workflow(upsert / transition) participant T as thesaurus_term 表 participant TR as 翻译域 AI-3.5-03 participant SE as 检索域 AI-3.3-02 / 3.3-04 ADM->>W: 录入词条(status=draft) W->>T: upsert(version=1) ADM->>W: publish / deprecate / restore W->>T: 状态迁移 + reviewed_at/by 留痕 TR->>T: getTranslationTermContext(domain + 双语,published) T-->>TR: terms + prompt_block(无 published 词条时 null) TR->>TR: prompt_block 拼接 system prompt → 翻译 LLM 调用 SE->>T: expandQueryByThesaurus(q) T-->>SE: 展开词集合(命中词 OR 链,全参数化) Note over T,SE: 词库不可用 / flag 关闭 → 翻译 prompt_block=null、检索恒返回 [q](未配置/故障即跳过不阻断主业务)
图 2. 双域消费时序——published 词条集合供翻译与检索两端实时复用(一词两用)

词库更新运营机制(生效/版本/回滚)

机制设计
生效 消费端每次实时读 status='published' 集合——发布即生效,无批量发布/定时生效复杂度(P1 不引入词库版本快照表;若运营需要「词库整体版本」概念,经 extensions 或独立表演进,本卡预留不实现)
版本 行内 version 自增:published 词条被编辑 → 自动回退 draft 且 version+1(历史语义:编辑中不生效);Workflow step 落 metadata.prev_snapshot(编辑前快照 jsonb)
回滚 行级:deprecate(下线,可带 reason)→ restore(恢复 published);批量回滚 = admin 按 updated_at 时间窗勾选批量 restore(复用 [id]/status 路由循环提交,不新建批量 API)
内容生产边界声明 词条批量导入/导出(CSV 等)、行业词表初装内容均为运营任务——验收口径只约束「机制可运营」(CRUD/状态流转/留痕可用),词表覆盖数值=DEC-5,不阻塞本基础设施实施与下游 TDD

Workflow 设计(数据变更必须走 Workflow)

新 Workflow 目录 backend/src/workflows/thesaurus/:

upsert-thesaurus-term(创建/更新)
  steps: validate-thesaurus-input(域枚举/locale 白名单/目标语≠源语/唯一性预检)
       → upsert-thesaurus-term-record(status=draft;published 再编辑时 version+1+存 prev_snapshot)
       → emit "thesaurus-term.upserted"
  补偿:upsert 失败回滚写入(事务内,无跨模块副作用)

transition-thesaurus-term(publish/deprecate/restore)
  steps: load-thesaurus-term → assert-status-transition(状态机白名单,守卫在 step 内)
       → update-thesaurus-term-status(published/deprecated 时 reviewed_at/reviewed_by/rejection_reason 留痕)
       → emit "thesaurus-term.transitioned"
  补偿:读旧值回写(快照式)

delete-thesaurus-term(软删)
  steps: load → soft-delete → emit(补偿=恢复 deleted_at=null)

消费端(getTranslationTermContext/expandQueryByThesaurus)为只读 service,不设 Workflow。

子任务 DAG 与排期

flowchart TD T1["T1 实体 + migration(候选稿)"] --> T2["T2 Workflow 三件(upsert / transition / delete)"] T2 --> T3["T3 admin CRUD API(5 路由)"] T3 --> T4["T4 管理界面(列表 + Drawer + 状态动作)"] G["RK-14 两域联审通过(schema 冻结)"] --> T5["T5 消费契约实现(getTranslationTermContext / expandQueryByThesaurus)"] T1 --> T5 T5 --> T6["联调冒烟(翻译端 A2 / 检索端 A3)"] T1 -. "T1-T4 可在联审前以评审候选稿先行" .-> G
图 3. 子任务 DAG——T1-T4 以评审候选稿先行,T5 消费契约实现以 RK-14 联审通过为门控
子任务依赖估时
T1 实体+migration无(候选稿)0.5d
T2 WorkflowT11d
T3 admin APIT21d
T4 管理界面T31.5d
T5 消费契约 service+单测RK-14 联审 + T11d
联调冒烟(A2/A3)T50.5d

所属波次 p2-a(A 波先行——设计归属方,wave_verdict 结论①「A 波先行判定维持」一致)。交叉引用:AI-3.3-02(检索域上游契约,p1 已交付);AI-3.5-03(翻译域 B 波引用方);AI-3.3-04(B 波下游);与 AI-3.4-03 同属 p2-a 可并行,无文件/API 冲突。

数据模型 / API / Workflow

实体关系

erDiagram THESAURUS_TERM { text id "PK(prefix thsterm)" text domain "六域枚举(ai_tech / legal / tax / medical / education / cross_border_trade)" text source_text "源术语原文" text source_locale "ja-JP / zh-Hans / en-US" text target_text "目标译文" text target_locale "≠ source_locale(service 校验)" text synonym_group "同义词组(null=独立词条)" text status "draft / published / deprecated" int version "published 再编辑自增" jsonb extensions "RK-14 两域扩展位" timestamptz reviewed_at "审核留痕" text reviewed_by "req.auth_context.actor_id" text rejection_reason "废弃/驳回原因" } THESAURUS_TERM ||--o{ THESAURUS_TERM : "同 synonym_group 互为等价变体"
图 4. thesaurus_term 实体字段级模型(新表独立,无既有数据纠缠;partial unique index 处理软删)

admin CRUD API 契约(四件套②)

新 API 目录 backend/src/api/admin/thesaurus-terms/(route.ts+middlewares.ts+validators.ts,范式对齐 translation-config route 的中间件与出口处理):

路由方法权限域请求/响应契约要点错误码
/admin/thesaurus-terms GET admin(auth) query:domain/status/q(source_text ILIKE,转义沿用 route.ts:265 范式)/limit/offset;响应 { thesaurus_terms: [...], count, limit, offset } 400(validator)
/admin/thesaurus-terms POST admin body:domain/source_text/source_locale/target_text/target_locale/synonym_group?/extensions?;入 Workflow upsert-thesaurus-term;响应单词条(含 id/status=draft/version=1) 400/409(唯一约束冲突)
/admin/thesaurus-terms/[id] GET admin 单条详情 404
/admin/thesaurus-terms/[id] POST admin 局部更新(draft 可全改;published 再改走版本自增并回退 draft——运营机制) 404/409
/admin/thesaurus-terms/[id] DELETE admin 软删(deleted_at 置位,Workflow 承载) 404
/admin/thesaurus-terms/[id]/status POST admin body:{ action: "publish" | "deprecate" | "restore", reason? };入 Workflow transition-thesaurus-term;published/deprecated 时 reviewed_at/by 留痕 404/409(非法迁移)

状态机(service 层白名单,forward-only 语义参照 qualification-state-machine 范式,本卡行内实现不引入 AI-3.9-04 工具依赖):draft → published → deprecated → published(restore 行级回滚);draft → deprecated(废弃草稿);published 再编辑 → draft(version+1)。非法迁移抛 409。

API 契约汇总

路由方法权限域说明
/admin/thesaurus-terms(GET/POST)、/[id](GET/POST/DELETE)、/[id]/status(POST) — admin 见上表;无 store 端路由(消费走内部 service)
内部 service:getTranslationTermContext / expandQueryByThesaurus — 模块内 见「消费 API 双契约」,无 HTTP 暴露

AI 能力接入点:无 LLM 调用声明

共享术语库本体(实体/CRUD/消费 API/管理界面)零 LLM/AI 调用——与 backend/src/modules/translation/client.ts 通路无调用关系,是被其消费的数据源:admin 词条生产(人工运营,draft→published)→ published 集合 → thesaurus_term 表 → ①getTranslationTermContext → 术语约束段 → 翻译 LLM 调用的 prompt 上下文(LLM 调用本体仍由 translation client 承载,属 AI-3.5-03/3.5-02 通路);②expandQueryByThesaurus → 展开词集合 → 检索查询构造(纯 SQL,零 AI)。与该通路关系 = 数据供给(prompt 上下文增强),非通路复用/并行/抽公共任一形态——本卡不改通路。

前端改动面与 i18n

端改动证据/说明
admin-panel 新增 src/routes/thesaurus/page.tsx(列表:domain/status 筛选+分页;编辑 Drawer:全字段表单;状态动作按钮 publish/deprecate/restore)——骨架复用 settings/translation-config/page.tsx(配置页)与既有 Drawer 审核动作范式(AI-3.9-04 §2.2) 从零新建页面,API 走 admin 五路由(status 动作独立路由,共 6 路由位)
storefront / b2b / h2b storefront 无改动 词条为后端消费内部数据,前台零暴露
vendor-panel 无改动 词库管理为平台侧职责(PRD 未授权商家自维护词表)
influencer-panel / referrer-panel 无改动 rg 确认无词库触点

i18n 三语言 key 规划(en / zh-Hans / ja)

文件路径新增 key(示意)
admin-panel/src/i18n/translations/{en,zh-Hans,ja}.json(沿既有命名空间文件组织) thesaurus.title / thesaurus.domain.*(六域枚举名)/ thesaurus.status.draft|published|deprecated / thesaurus.field.sourceText|targetText|synonymGroup|version / thesaurus.action.publish|deprecate|restore / thesaurus.compliance.medicalNote(医疗域薬機法确认提示)

三语值随实现提交;命名空间 thesaurus.* 独立,禁止混入 translation.* 既有空间。

验收与测试

验收标准(PRD 要点 + 技术口径)

#验收标准映射
A1 四件套齐备:thesaurus_term 表 migration 可跑通;admin 5 路由可用(CRUD+状态流转);管理界面可完成「录入→发布→废弃→恢复」全生命周期操作 PRD 要点③(可运营)
A2 翻译端复用生效:对已发布词条,getTranslationTermContext 返回含该词的 prompt_block;格式与冻结稿一致(联审后以联审稿为准) PRD 要点②(翻译侧)
A3 检索端复用生效:对已发布词条及其同义词组,expandQueryByThesaurus(q) 返回含组内全部词的展开集合;展开词经 AI-3.3-02 A1 查询可命中(联调冒烟) PRD 要点②(检索侧)
A4 词表覆盖口径:覆盖选定行业词表(PRD 六域枚举齐备可录入);覆盖数值=基线立项定(DEC-5)——本卡验收框架不含数值达标 PRD 要点①
A5 L0 门禁:本文档十要素齐备+关键锚点可 rg(client.ts:295-306 / translation-config.ts / route.ts / algolia-product.ts / thesaurus_term / RK-14 / 联合评审);既有 translation 域单测回归(8 个单测文件)不受本卡破坏 模板 full 级
A6 降级路径(词库不可用零阻断):空库→prompt_block=null 且翻译请求成功;查询异常→[q] 且检索成功;flag 关闭→恒等回退 NFR-3.8-01
A7 同义词组语义:组内展开去重保序、含原词;独立词条(synonym_group=null)不参与组展开 消费契约②
A8 状态机与留痕:非法状态迁移 409;publish/deprecate/restore 均落 reviewed_at/by/reason;published 再编辑 version+1 且回退 draft API 契约/运营机制/Workflow

测试策略(分层)与 L0 门禁

层范围明细
新增单测(service) 消费契约/降级 ①getTranslationTermContext:域+双语过滤、空库 null、异常 null;②expandQueryByThesaurus:精确命中/组展开/去重/未命中恒等/异常恒等;③状态机白名单(合法/非法迁移);④version 自增与 prev_snapshot
新增 integration(API) admin CRUD CRUD 全链路(含唯一约束 409、软删后重建)、status 流转留痕断言、admin 权限域守卫
新增单测(Workflow) Workflow 三件 upsert/transition 两 Workflow 的 step 守卫(validate-thesaurus-input 的枚举/白名单/目标语≠源语校验)
既有回归 A5 translation 域 8 个既有单测文件复跑(client/ssrf/config.service/mark-skipped-no-config/retry-translations/translation-updated-revalidate/translation-config/run-translate-product);products route 既有单测复跑(expandQuery 占位语义不破坏——恒等回退下查询行为逐字节等价)
降级路径测试 A6 与 AI-3.3-02 §8.2 降级测试同构(空库/异常/flag 三前置)

量化指标占位口径:行业词表覆盖条数(分域)=基线立项定(DEC-5);词条审核抽检率=DEC-5;消费查询 p95 时延指标名 thesaurus_lookup_p95(数据源:service 耗时日志)随实现纳入,数值同属 DEC-5。

风险与降级

风险卡

Medium RK-14 两域联审返工风险(probability 3 × impact 3)
术语库实体 schema 若未经翻译域(fillPrompt 注入格式)与检索域(查询扩展格式)两域联审定约,可能返工。强制缓解:实体 schema 冻结前必须完成两域消费契约联合评审,评审通过记录回填决策章节;评审前 4.1/4.3 均为评审候选稿。评审候选稿仍可先行部分:模块骨架/CRUD(draft 态写入不影响消费契约)/管理界面可并行开工——仅「published 生效链路+消费函数」待联审后合入。
Low 薬機法(医疗域词条)合规敏感
医疗类词条(medical domain)若含健康功效/适应性表述,属《薬機法》规制敏感区。缓解:医疗域词条发布时强制引用 FR-3.4-02 薬機法适用性确认(medical_regulation_applicable/pharmaceutical_law_note 字段范式)——管理界面 medical 域编辑表单显示薬機法确认提示(i18n key thesaurus.compliance.medicalNote),确认结论记录进 rejection_reason/备注字段;法务口径归 FR-3.4-02/C3,本卡不内联。

降级与跳过路径(NFR-3.8-01 强制范式)

「未配置/故障即跳过不阻断主业务」
故障场景行为
词库表不可用/查询异常翻译端:getTranslationTermContext 返回 prompt_block = null,翻译照常执行(无术语段);检索端:expandQueryByThesaurus 返回 [q],检索照常执行
词库 feature flag 关闭两消费函数恒等回退(null / [q])——词库能力整体旁路
域无 published 词条prompt_block = null(正常空态,非故障)

跳过路径测试点(验收必含项):①空库→null;②查询抛错→null/[q] 且原业务调用不抛;③flag 关闭→恒等回退;④同义词组展开含原词去重(A6/A7)。

合规挂钩

NFR / 评估项影响判定本卡动作
NFR-3.9-01(APPI 数据最小化)词条为行业术语(非个人信息);admin 录入的 reviewed_by 为操作者 id 属业务留痕既有口径无新增个人信息处理目的;无新增声明
NFR-3.9-02(AI 输出免责)术语约束降低 AI 翻译误差,但不改变 AI 输出免责条款适用(译责细化归 NFR-3.9-02 P1 范围)引用不展开
NFR-3.9-03(审计与可追溯)词条全生命周期 Workflow 留痕(who/when/prev_snapshot/reason)Workflow 已落;管理端可查
NFR-3.9-04(人工审核 AI 产出物)词条由人工生产并 publish(本身即人工把关);若未来引入 AI 辅助词条生成,须挂 AI-3.9-04 把关框架——ai_review_record.artifact_type 开放枚举可扩展 thesaurus_term_candidate引用+扩展位声明(本卡仅预留引用、不设计)
薬機法(医疗域词条)医疗类词条若含健康功效/适应性表述属规制敏感区医疗域词条发布时强制引用 FR-3.4-02 薬機法适用性确认;法务口径归 FR-3.4-02/C3,本卡不内联
C6不适用(无画像/对话/推荐处理)—

迁移与回滚

  • backend/src/modules/thesaurus/ 新模块建表经 medusa db:generate thesaurus 生成 migration(新增目录不触碰既有模块 migration 序列);
  • partial unique index(UNIQUE(domain, source_text, source_locale, target_locale) WHERE deleted_at IS NULL)按 @medusajs/translation 表 unique index 范式手写于 migration 内(medusa model DSL 表达力不足处,migration 补写,属官方支持路径);
  • seed 兼容声明:不改动 pnpm db:reset / db:reset:demo 流程——空词库下两消费函数恒等回退(A6),种子链路零依赖零破坏;demo 种子不注入词条(内容生产为运营任务,避免 seed 与运营口径混淆)。
变更回滚路径
词库模块本体feature flag 关闭即旁路;代码回退=模块目录删除+migration down(新表独立,无既有数据纠缠)
admin API/界面前端回退+路由注销;无数据回滚
消费契约接线翻译端接线归 AI-3.5-03(其卡回滚章节承载);检索端 expandQuery 真实语义替换恒等占位后,回退=恢复恒等实现(AI-3.3-02 回滚方案同构)
词条数据行级 deprecate/restore 即业务回滚;物理回滚仅限 migration down(新表无历史包袱)

feature flag 与开关:新增 featureFlags.thesaurus(backend/medusa-config.ts:55-56 featureFlags 区既有 translation: true 同位扩展,默认 false——词库功能独立开关):关闭时消费函数恒等回退+admin API 返回 404(能力整体不可见);灰度序:flag 开启→联审通过→消费链路合入;关闭态与代码回退等价,二选一不并存两套回滚机制(沿用 AI-3.3-02 §10.3 范式声明)。

前置决策点

Blocker 二分表

Blocker类型阻塞什么可并行做什么
(无) blockers 为空 — 本卡 blockers 为空(findings AI-3.3-03 blockers=[] 复核一致)——词条内容生产(运营任务)不阻塞基础设施实施与下游 TDD 生成(范围收窄 locked decision) 全卡可开工:实体→Workflow→API→界面→消费契约依序交付

RK-14 设计协调(非 blocker,为设计前置流程)联审前置

项内容
风险术语库实体 schema 若未经翻译域(fillPrompt 注入格式)与检索域(查询扩展格式)两域联审定约,可能返工(risk-matrix RK-14,probability 3×impact 3=medium)
强制缓解实体 schema 冻结前必须完成两域消费契约(①②)联合评审;评审通过记录(日期/参与方/结论/遗留项)回填本节;评审前 schema 为评审候选稿
评审候选稿仍可先行部分模块骨架/CRUD(draft 态写入不影响消费契约)/管理界面可并行开工——仅「published 生效链路+消费函数」待联审后合入

内部依赖与下游引用方(阻塞/可并行二分)

方向条目关系与二分
上游AI-3.3-02(三语检索,p1 已交付)检索端契约对齐对象:其 expandQuery 恒等占位与「注入格式归本卡冻结」声明——已交付,无阻塞
上游AI-3.5-02(动态内容翻译,pilot)翻译管道底座(本卡注入契约的落点通路);无直接阻塞
下游AI-3.3-04(B 波)阻塞其:查询理解的术语/同义词词料消费(DEP-3.3-03);可并行:其查询解析层架构设计不依赖词库数据
下游AI-3.5-03(B 波)阻塞其:场景翻译术语一致性消费(DEP-3.3-03,翻译端接线实施);可并行:其场景实体/prompt 路由架构设计

开放数值决策

  • DEC-5 行业词表覆盖条数(分域)/ 词条审核抽检率 / 消费查询 p95 时延目标——基线立项定,本卡仅引用编号不臆造数值。
  • 联审待定 prompt_block 分隔符/条目上限(暂记 50)/ synonyms 截断上限(暂记 20)/ 展开是否含 target_text 方向词——两域联合评审定稿。

附录:溯源表

本文档由 docs/reports/ai-module-prd/tdd/AI-3.3-03-shared-thesaurus.md(v1.0,2026-10-26)可读化重组生成。章节映射与处理方式如下:

本文档章节源文档章节处理方式
摘要文档头(元数据/范围口径)+ §1 溯源与现状Summarized
关键概念§1.2 关联条目映射 + §2 代码现状底座 + §4 方案设计Summarized
方案设计 · 设计红线与设计归属§4.0 设计红线声明与设计归属 + RK-14 强制设计约束Preserved
方案设计 · thesaurus_term 实体§4.1 数据模型(字段级表+索引约束+联审候选问题)Preserved
方案设计 · 消费 API 双契约§4.3(①翻译端注入契约 + ②检索端查询扩展契约)Preserved
方案设计 · 词库更新运营机制§4.4(生效/版本/回滚/内容生产边界)Preserved
方案设计 · Workflow 设计§4.5 Workflow 设计(三 Workflow steps 链)Preserved
方案设计 · 子任务 DAG§9 波次与排期适配(T1-T5 DAG + 估时表)Preserved
数据模型 / API / Workflow(实体关系/admin CRUD/API 汇总/AI 接入点)§4.1 实体 + §4.2 admin CRUD API 契约 + §4.8 API 契约汇总 + §5 AI 能力接入点Preserved
前端改动面与 i18n§4.6 管理界面触点 + §4.7 i18n 三语言 key 规划Preserved
验收与测试§8.1 验收标准(A1-A8)+ §8.2 测试策略与 L0 门禁Preserved
风险与降级(风险卡/降级/合规/迁移回滚)§5.2 降级与跳过路径 + §6 合规挂钩 + §10 迁移与回滚Preserved
前置决策点§7.1 Blocker 二分表 + RK-14 + §7.2 内部依赖Preserved
图 1 词条生命周期状态机§4.2 状态机(service 层白名单)Inferred(状态迁移文字描述转绘为 stateDiagram)
图 2 双域消费时序§5.1 数据供给图 + §4.3 双契约Inferred(数据流转绘为时序图,含降级注记)
图 3 子任务 DAG§9 子任务 DAG 文字图Inferred(文字图转绘为流程图,依赖关系一致)
图 4 实体字段级模型§4.1 字段表Inferred(按源字段表转绘 ER 图)
锚点复核约定

源 TDD 全部 file:line 锚点在其生成 run(run-d7006c21fca3)中以 rg/sed 逐条复核;漂移双写共 4 处(translation-config.ts :13-21→:10-18、translation-config route.ts :49-92→:34/:45/:55/:75、algolia-product.ts :7-31→:5-31、seller-profile approval 组→:29-35);fillPrompt(client.ts:295-306)与 q 链路(route.ts:258-272)复核精确无漂移。本页沿用源文档复核后的锚点表述。