5.6 KiB
5.6 KiB
name, overview, todos
| name | overview | todos | ||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| tokenhub 与 model 对齐优化 | 优化 tokenhub 包:让穿搭推荐充分利用 Clothes 模型字段、将品类枚举统一为 6 大类、整理运势映射与公共结构,使代码与 mysqlmodel 数据模型对齐。 |
|
产品概述
对 pkg/tokenhub 包做一次与数据模型(mysqlmodel)对齐的代码优化,使穿搭推荐和星座运势生成更贴合现有 Clothes、Horoscope 等模型定义,提升 LLM 推荐质量与代码可维护性。仅改动 tokenhub 包内代码,不接入新接口、不修改 main.go。
核心功能
- 穿搭推荐字段补全:将传给大模型的衣物摘要从 8 个字段扩充到
Clothes模型的完整穿搭属性(副色、厚度、袖型、衣长、领型、正式度、场合、视觉冲击力、名称等),并采用「字段名:值」标注格式,让模型准确理解每项属性。 - 品类枚举统一为 6 大类:将推荐品类从「上装/下装/鞋」扩展并统一为
Clothes.CategoryMain的 6 大类(上装/下装/连衣裙/外套/鞋/配饰),同步更新结构体注释、prompt 搭配规则与 JSON Schema 枚举,消除「鞋/鞋子」措辞不一致。 - 推荐结果校验增强:校验大模型返回的
clothes_id是否存在,并按实际衣物CategoryMain对齐type字段,同时对重复衣物去重。 - 运势映射收敛:为
FortuneItem增加到Horoscope模型的转换方法,将散落在调度器中的字段映射逻辑收拢到模型转换处。 - 公共结构整理:将共享的
chatResponse响应结构下沉到client.go,并更新过时的包注释。
视觉与交互
本次为纯逻辑层优化,不涉及界面或交互变化。
技术栈
- 语言:Go(沿用现有项目技术栈)
- 依赖:仅使用标准库(
encoding/json、strings、fmt等),不新增任何外部依赖 - 包结构:仅修改
/root/zt-closet-backend/pkg/tokenhub/下 4 个文件,mysqlmodel仅作只读引用
实现方法
总体策略
以 mysqlmodel 的字段定义为单一事实来源,消除 tokenhub 包中的硬编码字段列表与品类枚举漂移:衣物信息统一通过「字段名标注 + 全量字段」输出,品类统一通过包级常量切片管理,运势字段映射统一通过模型转换方法收敛。
关键决策
- 品类枚举集中管理:新增包级常量
outfitCategories,作为 prompt 文案、JSON Schemaenum、类型校验的唯一来源,避免多处字符串硬编码不一致。 - 衣物摘要字段名标注:
FormatClothesInfo改为- ID:1 | 大类:上装 | 小类:T恤 | ...格式,补全ColorSub/Thickness/SleeveType/ClothesType/NecklineType/Formality/Occasions/VisualImpact/Name等字段;继续使用strings.Builder拼接以保证性能。 - 推荐结果以 model 为准做纠偏:
ValidateClothesIDs先按clothes_id是否在衣橱过滤,再将保留项的Type规范化为衣橱中该衣物实际的CategoryMain(比简单丢弃更鲁棒),最后按clothes_id去重;GetClothesIDs同步去重。均使用map保证 O(n) 复杂度。 - 运势映射下沉到模型转换方法:为
FortuneItem增加ToHoroscope(statDate int64) *mysqlmodel.Horoscope,scheduler.go中的逐字段构造改为调用该方法,职责更清晰。 - 保持导出 API 兼容:
GenerateDailyFortunes、GenerateOutfitRecommendation、FormatClothesInfo的函数签名与返回类型不变,仅改内部实现,避免影响未来接入方。
性能与可靠性
- 所有列表处理均为单次遍历,
map去重 O(n),无额外性能负担。 - 不引入网络调用、不改变模型加载/调用流程,对启动与运行期无副作用。
- 新增的
ToHoroscope与outfitCategories均无并发写入,可安全复用。
目录结构
仅改动 pkg/tokenhub/ 下 4 个文件:
pkg/tokenhub/
├── client.go # [MODIFY] 更新 package 注释(补充穿搭推荐);新增 chatResponse 通用响应结构
├── fortune.go # [MODIFY] 移除 chatResponse;FortuneItem 新增 ToHoroscope 方法;统一「混元→Tokenhub」措辞
├── outfit_recommend.go # [MODIFY] 新增 outfitCategories 常量;重写 FormatClothesInfo;更新 prompt/schema/Type 注释为 6 大类;增强 ValidateClothesIDs 与 GetClothesIDs
└── scheduler.go # [MODIFY] runFortuneGeneration 改用 FortuneItem.ToHoroscope 构造 Horoscope
关键代码结构
// outfitCategories 穿搭推荐支持的衣物大类,与 mysqlmodel.Clothes.CategoryMain 取值对齐。
var outfitCategories = []string{"上装", "下装", "连衣裙", "外套", "鞋", "配饰"}
// ToHoroscope 将 LLM 返回的运势项转换为 Horoscope 模型。
func (f FortuneItem) ToHoroscope(statDate int64) *mysqlmodel.Horoscope