
商品推荐最容易做成两种极端要么纯规则if预算500推A僵化要么纯大模型让模型直接推荐一款耳机模型可能编造不存在的产品。可靠的智能推荐是三层结构大模型负责理解和表达规则系统负责约束正确性各干各擅长的事。一、第一层约束提取——把自然语言变成结构化条件用户说想找个跑步戴的、500块以内、续航长点的耳机大模型用函数调用Function Calling输出结构化约束使用场景运动、价格上限500、偏好权重{续航:高}。约束分两类硬约束必须满足价格≤500、运动场景适用和软约束尽量满足续航越长越好、偏好黑色。这个区分决定后两层的处理方式——硬约束用于过滤软约束用于排序。约束提取允许跨轮累积用户第一轮只说跑步用第二轮补预算500内程序合并两轮约束而不是重新开始。二、第二层过滤与排序——规则保证正确性过滤阶段用硬约束在商品库做确定性筛选价格区间、类目、规格有货。这一层绝不让大模型参与——产品价格库存是硬事实模型推荐一个499元实际卖699元的产品就是事故。过滤后的候选集通常有5-20个。排序阶段对候选集按软约束打分续航权重0.4、品牌匹配0.3、用户历史偏好0.3加权算分取Top3。打分函数是确定性的大模型不参与——保证同一用户同一条件每次推荐结果一致不会出现上午问和下午问推荐不同的诡异体验。三、第三层推荐解释——大模型只做表达Top3产品确定后大模型才介入根据用户画像和约束权重为每个推荐生成为什么适合你的解释。解释不是复述参数表是把参数翻译成用户价值——续航40小时翻译成一周跑5次不用充电。解释生成的输入是结构化的推荐结果产品分数命中的用户偏好输出严格基于这些事实。模型不允许添加产品库以外的信息——这是防止幻觉的边界。三层架构对照层级执行者输入输出约束提取大模型自然语言硬/软约束结构过滤排序规则系统约束商品库Top3产品推荐解释大模型Top3用户画像自然语言推荐理由三层推荐实现TOOLS [{ name: submit_constraints, description: 提交用户的选购条件, parameters: { type: object, properties: { hard: {type: object, description: 必须满足的条件预算/类目/规格}, soft: {type: object, description: 偏好权重续航/外观/品牌等} }, required: [hard] } }] class ProductRecommender: def extract(self, dialog_history): 第一层跨轮累积的约束提取 result llm_function_call( messagesdialog_history, toolsTOOLS) new_constraints result.arguments # 与历史约束合并而非覆盖 merged merge_constraints( self.saved_constraints, new_constraints) self.saved_constraints merged return merged def filter_and_rank(self, constraints): 第二层确定性过滤打分 # 硬约束过滤 candidates db.query_sql( SELECT * FROM products WHERE category ? AND price ? AND stock 0, [constraints[hard][category], constraints[hard][budget]]) # 软约束加权排序 for p in candidates: p[score] ( 0.4 * self.score_battery(p, constraints[soft]) 0.3 * self.score_brand(p, constraints[soft]) 0.3 * self.score_pref(p, self.user_history)) return sorted(candidates, keylambda x: x[score], reverseTrue)[:3] def explain(self, top3, constraints, profile): 第三层基于事实生成解释禁止添加库外信息 facts [{name: p[name], price: p[price], specs: p[specs], matched: self.matched_prefs(p, constraints)} for p in top3] return llm_chat( system根据以下推荐结果数据解释为什么适合该用户 只能使用数据中存在的参数不得编造功能或价格, userf用户偏好{constraints[soft]} f画像{profile}推荐数据{json.dumps(facts)}) def recommend(self, wxid, dialog): c self.extract(dialog) # 硬约束不全→追问不硬推荐 if not self.hard_complete(c): return self.ask_missing(c) top3 self.filter_and_rank(c) if not top3: return self.nearest_alternative(c) # 无货时推荐替代 return self.explain(top3, c, self.profile(wxid))落地建议三层架构的核心原则是事实归规则表达归模型——过滤和排序绝不让模型碰模型只在首尾做理解和表达幻觉风险就被关在笼子里。约束跨轮累积是体验关键用户分几次说出的条件要能合并。硬约束不完整时宁可追问也不要放宽条件硬推——推荐了不满足预算的产品比不推荐更伤信任。商品库数据通过电商系统API同步微信侧的对话收发基于Eyun这类个人微信API接口实现两端打通就是完整的智能导购闭环。