1. 项目概述:一个为以色列消费者打造的智能折扣查询技能

如果你在以色列生活或购物,大概率经历过这样的场景:站在超市收银台前,看着钱包里几张不同的信用卡、会员卡和手机里一堆优惠券App,突然有点懵——“今天在Victory超市买这堆东西,到底用哪张卡最划算?” 或者,想给家里囤点牛奶和鸡蛋,打开手机地图,看着周围好几家超市,又犯愁了——“Rami Levy、Shufersal、Victory,哪家的政府限价商品今天最便宜?”

这些问题,正是ClawSavings这个项目要解决的。它是一个运行在OpenClaw智能体生态系统中的“技能”,你可以把它理解为一个专门为以色列消费市场打造的、极度本地化的省钱助手。它的核心工作很简单: 把任何一个商店(或消费场景)映射到当前最优的折扣方案上 。这个“最优方案”可能来自HiTech Zone信用卡的POS折扣、Poalim Wonder积分兑换的优惠券,也可能是政府价格透明网站上的实时比价数据。

我之所以对这个项目感兴趣,是因为它精准地戳中了一个高频、刚需但信息极度分散的痛点。在以色列,各种折扣渠道五花八门:银行信用卡的附加福利(如Cal卡背后的HiTech Zone)、超市自家的会员计划、第三方积分平台(如Poalim Wonder),还有政府强制推行的价格数据。普通消费者根本记不住,也懒得去交叉比对。ClawSavings的价值就在于,它把这些散落在各处的“省钱信息”聚合、结构化,并通过一个类似聊天机器人的智能体接口,让你用最自然的方式(比如在WhatsApp或Telegram群里直接问)瞬间得到答案。

这个项目最初由yhyatt发起,是OpenClaw开源技能生态的一部分。它目前覆盖了以色列72家主流商店和14个消费类别,从超市、餐厅、外卖到药店、时尚、电子产品,几乎涵盖了日常消费的所有场景。对于开发者而言,它展示了一种如何为特定区域市场构建垂直领域AI应用的思路;对于终端用户(尤其是希伯来语使用者),它就是一个能塞进群聊里的“省钱专家”。

2. 核心设计思路:两层知识库与按需加载

当我深入研究ClawSavings的代码结构时,发现它的架构设计非常务实,充满了工程上的“巧思”,完全是从实际运行的成本和效率出发的。这不像一些学院派项目,追求理论上的完美;它的每一个设计决策,背后都有明确的、针对现实约束的考量。

2.1 为什么是“两层”知识库?

这是整个项目最核心的设计。在 discounts.json 这个知识库文件中,数据被清晰地分成了两层:

  1. 结构层 :定义了哪个折扣源(如HiTech Zone Card)覆盖哪个消费类别(如超市),以及能提供的 最大折扣百分比 max_pct )。例如,HiTech Zone Card在超市类别的最大折扣是20%。
  2. 交易层 :存储了具体的、有面额的优惠券交易详情。例如,Poalim Wonder平台上,一张面值300谢克尔的Victory超市礼品卡,当前售价是259谢克尔+50积分。

这个设计的 根本原因在于数据的变化频率和获取成本完全不同

  • 结构层数据(哪个源覆盖哪类店) :这类信息非常稳定。银行和积分平台与商家的合作协议不会天天变,一个折扣项目覆盖哪些大类,通常以季度甚至年度为单位更新。因此,这部分数据可以“近乎静态”地处理,手动维护,更新频率很低。
  • 交易层数据(具体优惠券价格) :这类信息变动频繁。优惠券是“商品”,其价格(用积分或现金购买所需金额)会随着库存、促销活动实时波动,可能每周甚至每天都不一样。获取这些实时价格通常需要模拟浏览器登录、抓取网页,成本较高。

把两者分离的好处立竿见影: 用低成本的数据回答大部分问题 。当用户问“在Victory用什么卡最好?”时,智能体可以先从结构层快速回答:“HiTech Zone Card最高能省20%,Poalim Wonder也可能有优惠券。” 这个回答已经解决了80%的疑问。只有当用户明确需要知道“具体能省多少钱”时,系统才需要去触发成本较高的交易层数据刷新。这是一种典型的“延迟计算”和“缓存优先”思想,在资源(特别是AI调用token和网络请求)有限的情况下非常有效。

2.2 令牌高效加载机制

OpenClaw这类智能体在运行时,每次读取文件内容都会消耗Token(可以理解为处理能力和成本的单位)。 discounts.json 如果完整加载,内容会很长,消耗的Token也多。ClawSavings采用了一种“按需读取”的聪明办法。

它的流程是这样的:

  1. 首先,它维护一个极小的、常驻内存的 快速查询表 quick_lookup.store_to_category )。这个表只做一件事:把商店名字(如“Victory”)映射到其所属的类别(如“supermarkets”)。这一步消耗的Token极少(约200个)。
  2. 确定了类别后,智能体 只去读取 discounts.json 中属于该类别的数据片段 ,以及一些必要的源信息元数据。这样一来,每次查询加载的数据量从整个文件缩减到了一个类别,Token消耗从可能的上万降到了800-1200个。

根据项目文档的说法,这减少了约75%的Token消耗。在AI应用按Token计费的大背景下,这个优化直接关系到项目的可持续性和响应速度。我自己的经验是,在处理大规模、结构化的参考数据时,这种“索引+片段加载”的模式是降低运营成本的关键,远比一味追求更强大的模型来得实在。

2.3 按需缓存刷新策略

缓存策略和两层知识库的设计是联动的。交易层数据中的每个优惠券条目都有一个 cached_at (缓存时间)标记和30天的TTL(生存时间)。

当查询到来时:

  1. 系统先检查所需数据的 cached_at 。如果它不存在,或者距离现在超过30天,则被视为“过期”。
  2. 关键点来了:系统不会让用户等待。 它会立即用结构层中的 max_pct (最大折扣百分比)给出一个初步的、保守的答案。例如:“目前数据显示,通过Poalim Wonder在Victory消费最高可能有约13%的折扣。”
  3. 同时,如果本次查询确实需要精确价格(或者系统决定在后台更新),它会 异步触发 一个数据刷新任务( scripts/refresh_deals.py )。这个任务会启动浏览器,模拟登录相应网站,抓取最新的优惠券价格。
  4. 刷新成功后,更新 discounts.json 中对应条目的 deals 数组和 cached_at 时间戳。
  5. 下一次相同的查询,用户就能立刻得到精确的、带具体金额的答案。

这个策略平衡了“准确性”和“响应速度”。用户永远不会面对一个空白的、正在加载的界面,总能立刻得到一个有用的答案(哪怕是基于稍旧的数据或估算)。后台的刷新过程对用户是无感的。这在实际产品中非常重要,即使用户感知到的数据不是“实时秒级更新”,连续的、快速的交互体验也比一次漫长的等待要好得多。

注意 :这种异步刷新机制要求部署环境能够执行后台任务。如果是简单的服务器less函数,可能需要结合消息队列或定时触发器来实现,否则“异步刷新”这一步可能会失败。

3. 折扣源解析与数据维护实操

要理解ClawSavings能做什么,首先得搞清楚它背后连接的这些以色列本土折扣源。这不仅仅是技术集成,更是对当地商业生态的理解。

3.1 五大折扣源深度剖析

  1. HiTech Zone Card (כאל)

    • 类型 :POS机刷卡折扣。这是最直接、无感的省钱方式。结账时使用指定的信用卡(通常是Bank Hapoalim的Cal卡),折扣直接在账单上扣除。
    • 覆盖范围 :最广,涵盖食品连锁、药店、餐厅、时尚、旅游等。它不依赖于优惠券,是卡组织与商户直接谈的合作。
    • 认证要求 :需要持有该实体信用卡。ClawSavings在这里的角色是“提醒器”,告诉你在这个店用这张卡有折扣,但它无法替你完成支付认证。
  2. HiTech Zone Club

    • 类型 :折扣券/礼品卡购买。这是一个会员制平台,提供低于面值的各类商业礼品卡。比如花90谢克尔买一张100谢克尔的咖啡店卡。
    • 覆盖范围 :约500家企业,跨所有类别。
    • 认证要求 :需要HiTech Zone网站的登录账号。ClawSavings若要做自动化刷新,就需要处理登录会话(Cookie、Token),这是数据抓取中比较复杂的一环,涉及模拟登录和会话保持。
  3. HiTech Zone PRO²

    • 类型 :现金返还+商店折扣。这是HiTech Zone的升级服务,在网站消费有返现,在特定合作商店有额外折扣。
    • 覆盖范围 :相对特定,集中于线上和PRO²专属商店。
    • 认证要求 :同样需要登录。其数据结构可能与Club不同,需要单独适配。
  4. Poalim Wonder

    • 类型 :积分兑换优惠券。Bank Leumi(邮政银行)客户可以将信用卡消费累积的积分,以非常优惠的比例兑换成合作商店的礼品卡。这是以色列非常主流的一种积分消费方式。
    • 覆盖范围 :主流食品连锁、外卖、时尚、体育、礼品店等。它的优惠力度往往很大(见后文示例表格)。
    • 认证要求 :免费注册即可。对于爬虫来说,其页面结构可能相对友好,但同样需要注意反爬机制。
  5. 政府价格透明度数据

    • 类型 :全商品价格对比。以色列法律要求大型超市连锁每日上传数百种受监管商品的价格。这是一个公开的、标准化的数据源(通常以XML格式提供)。
    • 覆盖范围 :所有主要超市连锁(Shufersal, Rami Levy, Victory等)。
    • 认证要求 :无。这是最“干净”的数据源,可以直接通过API或下载文件获取,稳定性高,是进行“哪里最便宜”比价的黄金数据。

3.2 数据维护:手动与自动的平衡

维护这样一个知识库,是持续性的工作。ClawSavings采用了混合策略:

季度维护(结构层)

  • 操作 :手动检查 discounts.json 中的 max_pct last_reviewed 字段。
  • 检查什么 :访问HiTech Zone、Poalim Wonder等官网,查看是否有大的合作商户变动、折扣档位调整。例如,HiTech Zone是否取消了某家连锁店的合作?Poalim Wonder的积分兑换比例是否有全局性调整?
  • 技巧 :可以设置一个日历提醒,每季度花半小时进行一次巡检。这部分变动不频繁,手动维护成本可控,且能确保基础框架的准确性。

按需/定期刷新(交易层)

  • 自动脚本 :项目提供了 scripts/refresh_deals.py 脚本。运行 python scripts/refresh_deals.py --source poalim_wonder 即可刷新指定来源的优惠券数据。
  • 原理 :这个脚本很可能使用 selenium playwright 这样的浏览器自动化工具,模拟访问Poalim Wonder的优惠券页面,解析HTML,提取商店名称、面值、现价、所需积分等信息,然后格式化并更新到 discounts.json 的对应 deals 数组中。
  • 手动更新 :当然,你也可以直接编辑 discounts.json 文件。找到对应的商店和折扣源,修改 deals 数组,并将 cached_at 设置为当前日期。这在测试或紧急修正时很有效。
  • 部署建议 :在生产环境中,应该将这个刷新脚本设置为 定时任务 (例如,每周运行一次)。可以使用系统的cron job,或者如果你用云服务,可以使用AWS Lambda的定时触发器、Google Cloud Scheduler等。重要的是处理好错误:网络超时、网站改版导致解析失败等情况,脚本应该有日志记录和重试机制,避免因为一次失败污染了缓存数据。

实操心得 :在编写这类爬虫脚本时,有两点至关重要。第一, 设置合理的请求间隔 (如 time.sleep(random.uniform(2,5)) ),避免对目标网站造成压力,这也是基本的网络礼仪。第二, 做好异常处理和数据验证 。解析到的价格是否是一个合理的数字?是否比面值还高?在写入 discounts.json 前,应该有一套简单的逻辑校验,防止抓取到错误或异常数据导致智能体给出离谱的建议。

4. 技能集成与OpenClaw智能体交互实现

ClawSavings作为一个“技能”,其灵魂在于 SKILL.md 文件。这个文件定义了智能体(Agent)如何理解用户问题、何时调用本技能、以及调用后如何思考和回复。这是连接底层数据与上层对话的桥梁。

4.1 技能指令剖析

SKILL.md 里通常包含以下几部分关键指令,我根据常见模式进行还原和解读:

  1. 技能描述与触发 :告诉智能体“你是谁,干什么的”。

    你是一个以色列消费折扣专家。当用户询问在特定商店使用哪种支付方式最划算、哪里购买某类商品最便宜,或者查询特定品牌的优惠券时,你应该使用本技能。
    核心能力:比较HiTech Zone Card、HiTech Zone Club/PRO²、Poalim Wonder以及政府价格数据,为用户提供最优省钱方案。
    
  2. 查询理解与参数提取 :教智能体如何从用户凌乱的自然语言中提取关键信息。

    用户可能这样问:
    - “在Victory用什么卡好?” -> 提取商店:Victory
    - “买牛奶去哪家超市便宜?” -> 提取商品类别:牛奶 (属于超市), 模式:比价
    - “Wolt有折扣吗?” -> 提取商店:Wolt, 模式:优惠券查询
    
    你需要识别出:目标商店(或商品)、用户关心的折扣类型(刷卡折扣、优惠券、纯比价)。
    
  3. 决策与执行逻辑 :这是技能的核心“思考”过程。

    步骤:
    1.  确定商店和类别:使用 quick_lookup 映射商店到类别。
    2.  加载数据:仅加载该类别对应的 discounts.json 片段。
    3.  分析可用折扣源:
        a. 如果有政府价格数据且用户问比价,优先展示跨超市价格对比。
        b. 检查所有覆盖该商店的折扣源(HTZone Card, Club, Poalim Wonder)。
        c. 对于每个源,如果有缓存的有效具体交易(deals),则计算实际节省金额(面值-现价)。
        d. 如果无缓存但结构层有 max_pct,则告知最大可能折扣,并提示价格需刷新。
    4.  排序与推荐:将所有选项按节省金额或折扣比例从高到低排序。
    5.  生成回复:用清晰、有条理的列表呈现结果,注明数据来源和缓存时间。
    
  4. 回复模板 :确保输出格式友好、一致。

    针对“Victory用什么卡”的回复示例:
    
    🛒 **在 Victory 的最佳折扣方案** (数据更新于 2026-03-10)
    
    1.  **Poalim Wonder 优惠券** (节省最多)
        - ₪300 面值礼品卡,售价 ₪259 + 50积分。
        - **实际节省:₪41** (约 13.7% 折扣)
        - 需使用 Bank Leumi 积分兑换。
    
    2.  **HiTech Zone Card (כאל) 刷卡折扣**
        - 直接刷卡享受折扣。
        - **最高折扣:20%** (基于历史合作数据,结账时自动扣除)。
        - 需持有 Bank Hapoalim 的 Cal 信用卡。
    
    💡 提示:Poalim Wonder 券需提前兑换,HiTech Zone Card 最方便。政府数据显示 Victory 的牛奶今日价格为 ₪5.9,与 Shufersal 持平。
    

4.2 在OpenClaw中部署与调试

部署过程本身很简单,就是复制文件夹:

cp -r clawsavings ~/.openclaw/workspace/skills/

OpenClaw框架应该会自动扫描 skills 目录并加载新技能。关键在于后续的调试。

  • 测试查询 :在OpenClaw的对话界面中,尝试用希伯来语或英语(取决于技能配置)输入各种查询。例如:“קפה לנדוור הנחה”、“discount for Castro”、“cheapest supermarket for eggs”。
  • 查看日志 :OpenClaw通常会有运行日志,记录智能体是否识别了技能、调用了哪些函数、加载了哪些数据。通过日志可以判断参数提取是否正确、数据加载是否完整。
  • 验证输出 :检查回复是否准确引用了 discounts.json 中的数据,排序逻辑是否正确,对于过期数据的提示是否清晰。

注意事项 :技能的成功运行高度依赖OpenClaw主框架的版本和配置。确保你的OpenClaw版本支持技能加载机制,并且模型有足够长的上下文窗口来处理 discounts.json 中加载的数据片段。如果回复出现混乱或包含无关信息,可能是智能体没有正确地将问题路由到本技能,需要检查 SKILL.md 中的触发描述是否足够精确。

5. 扩展方向与实战优化建议

ClawSavings项目文档中提到了Roadmap,这些都是很好的扩展方向。结合我开发类似本地化服务的经验,还有一些更深层次的优化点和潜在挑战值得探讨。

5.1 官方路线图解读与实现难点

  1. 政府XML价格集成

    • 价值 :这是实现“精准比价”的杀手锏。从回答“哪家超市便宜”升级到“哪家超市的 1升3%牛奶 今天最便宜”。
    • 实现 :需要集成类似 OpenIsraeliSupermarkets 这样的开源爬虫库或直接解析政府提供的XML每日数据文件。难点在于 数据对齐 :政府数据中的商品名称、规格单位需要与用户查询中的口语化名称(如“Milk 3%”、“חלב 3%”)进行匹配。这可能需要构建一个简单的商品同义词映射表。
  2. HTZone交易自动化

    • 难点 :HTZone网站登录通常需要处理更复杂的认证(可能包括双因素认证)。自动化浏览器需要 持久化会话 (保存cookies到文件),并处理登录过期问题。此外,其页面结构可能比Poalim Wonder更复杂,动态加载内容多,需要更稳定的选择器和等待逻辑。
    • 建议 :使用 playwright 这类现代浏览器自动化工具,它比 selenium 在处理SPA(单页应用)上更可靠。务必使用 headless=False 模式进行开发调试,亲眼看到自动化操作每一步是否成功。
  3. 扩展至Max/Isracard

    • 意义 :覆盖以色列另外两大信用卡集团(Max属于Leumi, Isracard是独立的卡组织),将覆盖率提升到接近100%。
    • 挑战 :每个卡组织的福利体系接口都不同。有的可能提供简单的API(可能性不大),有的可能需要解析复杂的会员网页。工作量是线性的,但价值巨大。

5.2 超越路线图:深度优化思路

  1. 个性化推荐

    • 目前的技能是“客观最优”。但用户可能有偏好:A用户就是喜欢用Poalim积分,B用户只关心刷卡无感折扣。可以在技能中增加 用户偏好设置 。例如,在OpenClaw的上下文中记忆用户说过“我只有Cal卡”,那么后续推荐优先展示HiTech Zone Card的方案。
  2. 交易历史与趋势分析

    • discounts.json deals 中,不仅可以存当前价格,还可以保留 历史价格数组 。这样就能回答:“Poalim Wonder的Victory券最近是不是涨价了?” 甚至可以给出建议:“历史数据显示,这款券通常在月末折扣更大,可以等等。”
  3. 多渠道通知与预警

    • 除了被动查询,可以设置 主动通知 。例如,用户说“监控一下Wolt的100谢克尔券,低于80谢克尔时告诉我”。技能可以结合定时刷新任务,在条件满足时通过Telegram Bot主动推送消息给用户。这从“查询工具”变成了“省钱助手”。
  4. 处理模糊与复合查询

    • 用户可能会问:“我今天要去购物,买吃的和用的,怎么最省钱?” 这是一个跨类别(超市、家庭用品)的复合查询。技能需要能汇总多个类别的最优方案,甚至计算出一条最优的购物路线(如果结合地理位置数据)。

5.3 数据质量与可靠性的生命线

对于此类严重依赖外部数据的应用,数据源的可靠性是生命线。

  • 数据源监控 :建立简单的监控,定期(如每天)运行测试查询,检查核心商店(如Victory, Shufersal)的数据是否还能成功获取和解析。一旦失败,立即报警。
  • 降级方案 :当某个折扣源(如Poalim Wonder网站改版)临时无法抓取时,技能应能优雅降级。例如,回复:“Poalim Wonder的实时价格暂时无法获取,但根据上周缓存,其折扣通常在10%-15%。您可以参考HiTech Zone Card的20%刷卡折扣。”
  • 法律与合规 :务必仔细阅读目标网站的 robots.txt 和服务条款。确保你的抓取频率是友好的,不构成攻击。对于公开的政府数据,通常没有问题;但对于银行和商业网站,需保持谨慎。可以考虑在项目中添加明确的免责声明。

ClawSavings是一个出色的范例,展示了如何用相对轻量的技术(结构化数据+规则逻辑+简单爬虫),结合大语言模型的自然语言理解能力,解决一个具体地域内的具体问题。它的架构考虑到了性能和成本,它的数据模型区分了稳定与变化,它的扩展路线清晰务实。无论是想学习构建地域性AI应用,还是单纯想为自己在以色列的生活省点钱,这个项目都提供了极具价值的参考。

更多推荐