0%

写在前面

我评审了团队里几位研发程师提交的《xx详细设计》。

在评审数据库设计(Schema Design)部分时,我们针对“资产表的独立性”、“复杂 JSON 的存储策略”以及“列表查询性能”展开了几轮讨论。起初他的设计偏向于“开发省事”,而我更强调“业务边界”和“长期可维护性”。这样的场景在我职业生涯中其实遇到好多次,虽然每次可能都稍有不同但是我个人认为核心考量规则是不变的。

这次讨论非常有代表性,不仅解决了一个具体的业务场景,更折射出 SaaS 系统设计中通用的取舍逻辑。复盘如下,与大家分享。


摘要:在现代 SaaS 架构中,越来越多的业务场景需要依赖“外部异步工作流”来生成核心数据(例如:调用一个耗时的分析流、审批流或数据处理管道)。本文复盘了一个垂直领域 SaaS 系统的数据库演进过程,探讨在异步任务复杂结构化数据的双重挑战下,如何进行合理的数据库建模。

一、 业务场景与技术挑战

我们正在开发一套垂直领域的 SaaS 系统,核心业务链路是:**客户 (Customer) -> 资产 (Asset, 如宠物/设备) -> 业务记录 (Record)**。

核心痛点
系统的核心记录(Record)不是由用户简单的 CRUD 生成的,而是依赖一个**外部异步工作流 (External Workflow)**。

  1. 触发:用户上传基础素材(如音频/文件)。
  2. 处理:系统调用外部 Workflow 引擎进行处理(耗时不定)。
  3. 结果:Workflow 回调返回一个包含多板块、多维度的复杂 JSON 数据

架构师面临的三个核心问题

  1. 资产定义的独立性:当核心记录依赖工作流生成时,资产信息(如宠物/设备基础信息)应该包含在记录里,还是独立建表?
  2. 结构化与灵活性的平衡:工作流返回的是一个大 JSON,数据库设计是该“打散成列”还是“整存整取”?
  3. 历史数据的不可变性:资产状态会随时间改变(如改名、升级),如何保证历史记录的准确性,同时兼顾列表查询性能?

二、 架构演进:从“耦合”到“解耦”

1. 资产的独立性:解耦业务边界

最初的想法
“既然每次调用工作流都是针对某个对象的,能不能直接把对象信息存在记录表里?减少表关联。”

架构决策坚决剥离资产表(如 t_pet),建立星型拓扑。

  • 战略考量
    • 业务解耦:资产是核心实体,它可能会被未来的其他业务模块(如电商、预约、CRM)复用。如果强绑定在当前这个“工作流记录表”中,新业务将无法复用该资产数据。
    • 生命周期分离:资产的生命周期(长期、可变)与工作流记录的生命周期(一次性、不可变)完全不同,必须物理分离。

2. Workflow 数据的落地:混合存储策略

面临挑战
工作流返回的数据极其复杂,既包含核心指标(如数值、状态),也包含大量的描述性文本和嵌套结构。

架构决策“核心指标列式存储” + “业务载荷 JSONB 存储”。

  • 计算层 (SQL):将工作流返回结果中,后续需要参与计算、统计、全局搜索的字段(如 weight, status, result_summary),提取为独立的数据库列。
  • 展示层 (NoSQL):将工作流返回的完整业务载荷(Payload),直接以 JSONB 格式存入 form_data 字段。这既应对了工作流输出结构的潜在变化,又简化了前端渲染逻辑。

3. 历史快照与性能优化:反范式化设计

面临挑战
列表页需要展示资产当时的名称、客户的联系方式。如果采用完全范式化设计(Join Asset Join Customer),不仅查询性能受限,且一旦资产发生变更(如过户),历史记录的展示就会失真。

架构决策在记录表中引入“快照冗余” (Snapshot Redundancy)。

在工作流完成并写入数据库的那一刻,将当时的 关键资产属性(如名称、归属人)冗余写入记录表。

  • 性能收益:列表查询实现 0 JOIN,单表极速返回。
  • 业务收益:保留了“业务现场”,记录了工作流执行时的真实状态,不受后续资产变更影响。

4. 存储容量评估:单表足矣

面临挑战
是否需要将记录表拆分为 Record_MasterRecord_Detail

架构决策回归“单表设计”。

经过评估,外部工作流返回的结果主要是结构化数据,不包含巨大的二进制文件(BLOB)或超长文本(Log)。单行数据量控制在合理范围内(< 2KB)。在 PostgreSQL 等现代数据库中,单表完全足以支撑百万级业务数据,拆分反而增加了事务复杂性。


三、 最终架构方案 (PostgreSQL)

1. 领域模型设计 (ER Diagram)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
erDiagram
%% 核心资产:独立存在,作为公共底座
t_asset {
bigint id PK
varchar name
jsonb current_properties "当前属性(可变)"
}

%% 业务记录:承载工作流结果
t_asset ||--|{ t_workflow_record : "1:N"
t_workflow_record {
bigint id PK

%% 冗余快照 (Snapshot)
varchar snapshot_asset_name "当时名称"
varchar snapshot_owner_info "当时归属人"

%% 核心指标 (Structured Columns)
decimal key_metric_a "用于计算"
varchar key_status_b "用于统计"

%% 柔性载荷 (Flexible Payload)
jsonb workflow_result "完整结果数据"

%% 流程状态
varchar process_status "INIT, PROCESSING, DONE"
}

2. 生产级 SQL DDL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
-- 1. 资产表:核心实体,支撑多业务线
CREATE TABLE t_pet (
id BIGSERIAL PRIMARY KEY,
owner_id BIGINT NOT NULL,
name VARCHAR(64) NOT NULL,
current_weight DECIMAL(5,2), -- 资产当前状态
created_at TIMESTAMPTZ DEFAULT NOW()
);

-- 2. 记录表:存储工作流结果
CREATE TABLE t_medical_record (
id BIGSERIAL PRIMARY KEY,
pet_id BIGINT NOT NULL REFERENCES t_pet(id),

-- 【快照区】冗余字段,确保列表页 0 JOIN,且保留历史原貌
snapshot_owner_phone VARCHAR(20),
snapshot_pet_name VARCHAR(64),

-- 【核心指标区】独立列,用于后续的报表统计与逻辑计算
diagnosis_code VARCHAR(50), -- 诊断编码
recorded_weight DECIMAL(5, 2), -- 当时记录的数值

-- 【柔性载荷区】存储工作流返回的完整复杂结构
-- 利用 JSONB 存储,适应 Schema 的动态变化
form_data JSONB DEFAULT '{}',

process_status VARCHAR(32) DEFAULT 'INIT', -- 状态机
created_at TIMESTAMPTZ DEFAULT NOW()
);

-- 索引优化:针对快照字段建立索引,加速搜索
CREATE INDEX idx_record_search ON t_medical_record(snapshot_owner_phone varchar_pattern_ops);

四、 方法论总结:五维数据建模法

针对“SaaS + 复杂外部工作流”场景,我们总结了以下决策模版:

1. 业务边界维 (Extensibility)

  • 决策点:该对象未来是否会被其他业务模块复用?
  • 法则:如果可能,必须独立建表,下沉为公共数据底座。

2. 时间属性维 (Asset vs Event)

  • 决策点:数据是“会变化的状态”还是“不可变的历史”?
  • 法则:资产(Asset)独立存最新状态;记录(Record)存工作流执行时的历史切片。

3. 数据使用维 (Column vs JSON)

  • 决策点:字段是否用于 SQL 筛选、聚合统计或后端计算?
  • 法则要算、要搜的做成列;只用于展示、结构易变的扔进 JSON。

4. 查询性能维 (Normalization vs Snapshot)

  • 决策点:列表页是否高频?业务是否需要追溯“发生当时”的状态?
  • 法则:在记录表中冗余关键搜索字段和历史状态快照。

5. 存储容量维 (Split vs Merge)

  • 决策点:单行数据量是否显著过大(如含原始长文本/大图)?
  • 法则:存原始大素材 -> 拆主子表;只存处理后的结构化数据 -> 单表搞定。

结语

无论是对接 AI、IoT 设备还是审批流,架构设计的本质是不变的:**厘清资产与事件的边界,在结构化与灵活性之间找到平衡。**这套设计模式能有效降低系统的复杂性,并为未来的业务扩展预留充足的空间。

写在前面

最近读了 Naval Ravikant 的新作《Curate People》,有一种醍醐灌顶的感觉。

作为一名负责一线交付的技术团队负责人(Tech Lead),“招人”是我工作中极高频、也极痛苦的一环。很多时候,我很难向 HR 或其他协作方解释,为什么我拒绝了一个履历光鲜、技术看似合格的候选人,仅仅是因为“感觉不对”。

Naval 的这篇文章,给了这种“直觉”一个精准的理论支撑。他提出招聘不仅仅是填补空缺,而是一种“策展”(Curate)——像博物馆馆长挑选艺术品一样,审慎地甄选每一位团队成员。

这让我意识到,虽然我不是公司的创始人,但我实际上是这个研发团队的“创始人”。我所坚持的那些看似玄学的“闻味道”标准,其实正是为了对抗团队的平庸化。

这篇博客,既是对 Naval 顶级认知的深度梳理,也是对自己经手过百人面试后总结出的“闻味道”招聘法的复盘。希望能给同样在为打造“特种部队”而焦虑的技术管理者们一些启发。

第一部分:Naval 的核心观点——招聘是公司的 DNA

硅谷知名投资人、AngelList 创始人 Naval Ravikant 曾说过:“你建立的团队,就是你建立的公司。”(引用自 Vinod Khosla)。

对于早期创业者而言,很多人认为这是一场技术游戏或产品游戏,但 Naval 在他最近的分享《Curate People》中直言不讳地指出:这实际上是一场招聘游戏。

为什么招聘如此重要?为什么创始人绝对不能外包这一职能?以下是对 Naval 核心观点的深度解析。

1. 招聘是公司的 DNA,不可外包

Naval 提出一个核心论断:创始人可以授权一切,唯独除了招聘、融资、战略和产品愿景。 而这其中,招聘又是重中之重。

早期员工构成了公司的 DNA。如果你把招聘外包给猎头或 HR 部门,你就等于是在引入“中间层”和“机械传动装置”。外部人员或中层管理者永远无法像创始人那样保持极高的选择标准。

一旦创始人不再直接参与每一个人的招聘和管理,公司就开始变质。无论这时公司是 20 人还是 40 人,当你失去了对“谁在车上”的直接控制权,你就失去了对公司文化和产品灵魂的控制权。

2. A 类人才只愿与 A 类人才共事

招聘之所以不能妥协,有一个非显性的原因:最优秀的人,只愿意和最优秀的人一起工作。

对于一个顶尖人才来说,与平庸之辈共事是一种巨大的认知负担(Cognitive Load)。如果他们发现周围的人不如自己,他们会敏锐地意识到自己“来错了地方”。

Naval 提供了一个极其犀利的招聘测试标准

当你面试一个新人时,问自己:如果让这个人走进隔壁房间,随机挑选团队里的任何一个人进行 30 分钟的谈话,你会感到放心吗?如果你担心他会随机挑到那个“不够好”的员工,那就说明那个员工本就不该留在团队里。

好的团队是互相激励的。如果你允许平庸存在,你就在驱逐天才。

3. “只招天才” (Geniuses Only)

在早期阶段,你的目标不应该是扩张规模,而是浓缩密度

Naval 提到他和联合创始人设立的一个新标准:“Geniuses Only(只招天才)”。这听起来很刺耳,也不切实际,但这是一种态度的宣示。

你要找的不仅是“聪明且能干”的人(Smart and Get Things Done),更是能创造新知识的人。在 AI 时代,重复性的工作终将被自动化,唯有创造力无法被替代。

早期投资人看团队时,往往不看你的商业计划书,甚至不看早期的微小进展,他们只看一件事:你有多强? 而证明你有多强的最好方式,就是看你能招募到多少比你更强、或者和你一样强的“天才”。

4. 为了得到最好的人,你必须“打破规则”

这是 Naval 非常反直觉的一个建议:不要做标准化的 HR。

为了得到最顶尖的人才,你必须打破所有规则。

  • 薪资结构不合理?改。
  • 需要远程办公?准。
  • 头衔不符合层级?换。
  • 想在这个项目上工作而不是那个?行。

最优秀的人不是机器上的齿轮,他们往往是多面手,有着独特的怪癖和需求。如果你用死板的“公司制度”去套他们,你只能招到平庸的“齿轮型”员工。创始人相对于 HR 的最大优势,就在于你有权力为了一个人才去重写规则。

5. 剔除“高自我”(High Ego),保持极简沟通

在性格特质上,Naval 推崇巴菲特的“智慧、精力、正直”三要素,但他加了一个极其重要的第四点:低自我(Low Ego)

  • 低自我:关注工作本身,而非办公室政治或抢功劳。你可以管理 40 个低自我的人,却可能搞不定 5 个高自我的人。
  • 拒绝 Slack 文化:Naval 甚至提到在他的新公司不使用 Slack。因为群聊容易退化为噪音、表演和低效的忙碌。他倾向于更高门槛的沟通方式(如文档或直接解决问题),强迫员工独立思考,而不是把问题抛进群里制造“虚假的工作感”。

第二部分:我的思考——作为技术团队的“创始人”

我不是创始人而是技术团队负责人(Tech Lead / Manager)的角色,但是吹牛逼的说我也可以称为是这个研发团队的“创始人”
我将从技术管理者的角度,将 Naval 的“创始人思维”转化为更落地的“Team Lead 思考”。

作为技术管理者的思考

读完 Naval 的这篇文章,作为一个在一线带队的技术管理者(而非公司创始人),我深有感触。虽然我不能像创始人那样重写公司的底层规则,但在我的“局部环境”里,Curate People(甄选人才) 的逻辑同样适用,甚至更为紧迫。

以下是我作为技术 Team Lead 的几点反思:

1. 我是自己团队的“策展人”

Naval 说“创始人不能外包招聘”,对于研发主管来说,这意味着不能把技术把关的责任完全丢给 HR 或面试题库
在我的团队里,我必须是那个最终的“策展人”。所谓的“策展”,不仅仅是看候选人的技术栈(Java 熟不熟,架构懂不懂),更是看他的代码品味和工程素养。

  • 代码如展品:如果我允许一段糟糕的代码合入主干,或者允许一个写出“能跑但不可维护”代码的人进入团队,我就实际上是在降低整个团队的审美标准。
  • 红线思维:Naval 提到的“让新人随机挑选老员工交流”的测试非常残酷但有效。作为管理者,我必须时刻警惕:团队里是否存在那个“我不敢让新人见到”的短板?如果有,那就是我管理的失职。

2. “低自我(Low Ego)”是技术进化的前提

在技术团队中,”Low Ego” 尤为珍贵。软件开发是一个需要高频协作和快速试错的领域。

  • 我们提倡 “Fail Fast”(快速试错),这就要求工程师不能有太强的“面子包袱”,承认错误要快,调整方向要快。
  • 我们推崇 “Teach Back”(反向教学/分享),这也要求资深成员愿意分享,资浅成员敢于提问。
    如果招进来一个技术很强但“高自我”的人,他会把代码评审(Code Review)变成一场自尊心保卫战,这对于团队文化的破坏是毁灭性的。Naval 说得对,低自我的人才能专注于“创造新知识”,而不是“争夺功劳”。

3. 在规则之内,寻找“破局者”

Naval 建议为了人才“打破所有规则”。作为中层管理者,我或许无法随意打破公司的薪酬体系或期权池,但我可以在我的权限范围内打破常规:

  • 打破面试流程:对于有特殊专长(比如极其擅长解决硬件底层 Bug 或精通 Prompt Engineering)的偏才,我是否敢于通过非标准化的面试流程录取他?
  • 打破分工边界:Naval 提到最好的人才往往是多面手。在项目中,我是否允许后端开发去尝试前端,或者让架构师去写具体的业务逻辑?
    为了留住最优秀的人,我必须在团队内部创造一个相对自由的“特区”,让他们感觉到自己不是流水线上的螺丝钉,而是**”Pro First”(专业优先)**的创造者。

4. 只有 A 类人才,才能抗住熵增

在复杂的软硬件结合项目或高并发系统中,系统的“熵”(混乱度)是自然增加的。
平庸的工程师(B 类或 C 类)在解决问题时,往往会引入新的复杂度,导致系统越来越臃肿,变成“屎山”。只有 A 类人才(Naval 口中的 Geniuses),才具备把复杂问题简单化、把代码写得像工业设计一样优雅的能力。
招聘不仅仅是为了填补 HC(人力预算),而是为了引入对抗系统熵增的负熵流。

第三部分:我的实战——“闻味道”招聘法

我在公司电话面试+线下面试应该超过了100人,我的面试方法其实比较简单,首先我认为 “闻味道” (Sniff Test / Culture Fit) 往往比单纯的“做题”更重要。

因为技术栈(Spring Cloud, PostgreSQL, Python 等)是可以学的,但一个人的底层操作系统(性格、沟通方式、价值观、思维习惯)是很难重装的。

我的“闻味道”招聘法——当直觉成为最高效的算法

在技术圈,大家习惯谈论算法、架构和硬技能。但在我的招聘逻辑里,有一个看似不科学却极其精准的权重,称之为——“闻味道”(我之前没想到这个词,是在公司老板提出来的我觉得很贴切)。

这并不是忽视技术,而是我认为:技能决定了一个人的下限,但“味道”决定了一个人的上限,以及我们能一起走多远。

我的面试流程通常分为两轮:电话初筛和线下深聊。这其实就是我“闻味道”的两个步骤。

第一阶段:电话面试 —— “频段”对不对? (Frequency Check)

电话面试看不到表情,排除了视觉干扰,反而让我更能专注于思维的逻辑性沟通的信噪比

我在这一轮“闻味道”主要闻的是:逻辑闭环与沟通成本

  1. 听“清晰度”而非“术语量”

    • 我不看重他背了多少八股文,我看重他能否把一个复杂的技术点(比如多线程问题或硬件交互Bug)用最朴素的大白话讲清楚。
    • 味道不对的信号:顾左右而言他,堆砌大词,或者问A答B。
    • 味道对的信号:直击要害,逻辑线性,不仅告诉你怎么做,还能顺口说出“为什么不那样做”。
  2. 听“真诚度”

    • 电话里声音的微小迟疑是非常明显的。
    • 味道不对的信号:不懂装懂,试图用模糊的语言掩盖盲区。
    • 味道对的信号:坦率地说“这个细节我没接触过,但我的推测是……”。Intellectual Honesty(智识上的诚实) 是我非常看重的味道,这直接关联到未来的团队信任成本。

第二阶段:线下面试 —— “化学反应”有没有? (Chemistry Check)

到了线下,技术细节往往已经不是唯一的重点,我在观察这个人的能量场协作潜质

这一轮,我寻找的是:**同理心、好奇心与低自我 (Low Ego)**。

  1. **看“眼里的光” (Curiosity & Energy)**:

    • 当聊到他曾经解决的一个棘手难题,或者聊到我们正在攻克的软硬结合场景时,他的状态是怎样的?
    • 味道不对:像是在完成任务,只想知道薪资和加班情况,对技术本身没有兴奋感。
    • 味道对:眼睛会亮,身体会前倾,会反问我“那你们当时是怎么解决这个延迟问题的?”——这种好奇心是技术人员自我驱动的源动力。
  2. **测“抗压与复盘” (Resilience & Fail Fast)**:

    • 我会故意追问一个他答不上来的盲区,或者指出他方案里的漏洞。
    • 味道不对:表现出防御性(Defensive),急于辩解,或者面露不悦(High Ego)。
    • 味道对:停顿思考,然后承认“确实,这块我没考虑到,如果是这样的话,也许可以……”——这对应了我推崇的 “Fail Fast” 文化,只有敢于面对错误的人,才能快速迭代。
  3. 甚至看“非正式时刻”

    • 面试结束送他出门的那两分钟,闲聊几句生活或爱好。这时候最能看出一个人的真实底色。他是否是一个有趣的人?是否是一个如果项目上线熬夜时,我愿意和他一起吃外卖的人?

核心逻辑:为什么“感觉”比“技术”更重要?

Naval 说“只招天才”,但我认为的“天才”不一定是现在的技术大牛,而是具备“成长型思维”的潜力股

我之所以敢说“技术不一定要很牛逼”,是因为:

  1. 技术是显性知识:Java 的并发库、PostgreSQL 的调优、嵌入式的协议,这些只要智商在线,给足文档和时间,谁都能学会。
  2. “味道”是隐性素养:责任心(Ownership)、沟通时的换位思考(Empathy)、面对困难时的韧性(Grit),这些是教不会的。

“闻味道”,本质上是在寻找那一类

  • 无需鞭策(Self-managing):不需要我天天盯着进度;
  • 能够背靠背(Trustworthy):我可以放心把后背交给他;
  • 能够互相激发(Inspiring):甚至未来在某个领域能反过来做我的老师。

总结来说,我招的不是代码机器,而是能够在这个充满不确定性的世界里,一起解决问题的伙伴。

结语:甄选是为了“背靠背”的信任

Naval 在文中建议创始人要保持极高的“不耐受度(Intolerance)”,把每一个候选人都视为可能摧毁公司的变量。

这听起来很残酷,但无论是创始人还是像我这样的技术管理者,本质目标是一致的:我们在寻找那些无需鞭策(Self-managing)、能够背靠背信任(Trustworthy) 且能够互相激发(Inspiring) 的伙伴。

在这个 AI 杠杆率极高的时代,一个小型的、由“味道相同”的天才组成的特种部队,远胜过一支庞大却平庸的正规军。

归根结底,The team I build is the product I build.(我建立的团队,即是我最终交付的产品。)

原文链接:Naval: Curate People

75个顶级思维模型与落地工具全景图

“手中只有锤子的人,看什么问题都像钉子。” —— 查理·芒格

在商业决策、创业管理和个人成长中,我们常犯的错误不是不够聪明,而是思维维度的单一

所谓的“高手”,往往建立了一个跨学科的**“多元思维模型格栅” (Latticework of Mental Models)**。他们不只懂技术,还懂心理学;不只懂管理,还懂系统动力学。

但知道理论只是第一步,如何将抽象的“模型”转化为可执行的“动作”?

本文为您整理了 8大类、75个核心思维模型,并一一映射了业界最成熟的实战方法论与工具。这不仅是一份认知清单,更是创业者和管理者的实战核对表


🧠 第一部分:底层逻辑与认知操作系统

核心目标:提升思考质量,避免愚蠢的错误。

这些是思考“思考本身”的模型,是所有决策的基础。

序号 思维模型 核心理念 ⚔️ 落地方法论/工具 实战应用场景
1 第一性原理 (First Principles) 回归事物最基本的真理,从头推导。 5 Whys 分析法 / 苏格拉底提问法 颠覆式创新、打破常规流程。
2 逆向思维 (Inversion) 先想如何失败,然后避开它。 事前验尸 (Pre-mortem) 项目启动前的风险排查。
3 二阶思维 (Second-Order Thinking) 不只看直接后果,要看后果的后果。 决策树 / 影响地图 (Impact Mapping) 政策制定、复杂决策推演。
4 地图非疆域 (Map is not Territory) 模型只是简化,现实更复杂。 现地现物 (Genchi Genbutsu) 丰田管理法:亲自去现场看真实情况。
5 奥卡姆剃刀 (Occam’s Razor) 如无必要,勿增实体。 MVP / 代码重构 砍掉冗余流程、简化产品设计。
6 汉隆剃刀 (Hanlon’s Razor) 能用愚蠢解释的,别用恶意解释。 SBI 反馈法 沟通时只讲事实(S/B/I),减少情绪内耗。
7 能力圈 (Circle of Competence) 知之为知之,不知为不知。 能力矩阵 / 外包决策表 决定什么自己做,什么必须外包。
8 概率思维 (Probabilistic Thinking) 世界是灰度的,用概率下注。 期望值计算 (Expected Value) 计算 (赢率x收益) - (输率x成本)
9 贝叶斯更新 (Bayesian Updating) 随新信息出现,动态调整观点。 A/B 测试 根据测试数据验证并修正策略。
10 可证伪性 (Falsifiability) 科学理论必须容许被证明是错的。 假设检验 (Hypothesis Testing) 精益创业:设计实验去验证商业假设。

♟️ 第二部分:战略规划与竞争博弈

核心目标:找准方向,建立壁垒。

不要用战术上的勤奋,掩盖战略上的懒惰。

序号 思维模型 核心理念 ⚔️ 落地方法论/工具 实战应用场景
11 护城河 (Economic Moat) 建立不可复制的竞争优势。 VRIO 分析模型 评估资源的稀缺性和不可模仿性。
12 跨越鸿沟 (Crossing the Chasm) 早期市场到主流市场有巨大断层。 STP 营销理论 针对不同阶段切换目标用户群。
13 红海/蓝海 (Red/Blue Ocean) 避开血腥竞争,创造新需求。 战略布局图 / ERC 动作框架 剔除、减少、增加、创造。
14 不对称战争 (Asymmetric Warfare) 利用强者的弱点以弱胜强。 游击营销 (Guerrilla Marketing) 低成本、创意突袭大公司盲区。
15 破坏性创新 (Disruptive Innovation) 从低端切入,最终颠覆高端。 JTBD (Jobs to be Done) 挖掘用户“雇佣”产品的真实任务。
16 红皇后效应 (Red Queen Effect) 不进则退,必须比对手跑得更快。 标杆管理 (Benchmarking) 持续对标行业第一名的数据。
17 博弈论 (Game Theory) 你的收益取决于对手的行动。 囚徒困境矩阵 / 纳什均衡 定价策略、商务谈判分析。
18 只有偏执狂才能生存 时刻警惕战略转折点。 PESTEL 分析 扫描宏观环境的突变风险。
19 孙子兵法 (Sun Tzu) 知己知彼,攻其不备。 商业兵棋推演 (Business Wargaming) 模拟红蓝军对抗,预演对手反应。
20 有限/无限博弈 有的游戏为了赢,有的为了玩下去。 使命愿景价值观 (MVV) 确立企业的终极目标。

📈 第三部分:系统动力学与增长

核心目标:理解业务如何变大、变乱或崩溃。

系统不仅仅是零件的堆砌,而是零件之间的关系。

序号 思维模型 核心理念 ⚔️ 落地方法论/工具 实战应用场景
21 复利效应 (Compounding) 指数级增长的威力。 定投策略 / Wiki 知识库 财务积累、团队知识沉淀。
22 临界质量 (Critical Mass) 量变引起质变的引爆点。 病毒系数 (K-factor) 计算 确保 K>1 实现自增长。
23 网络效应 (Network Effects) 用户越多,价值越大。 梅特卡夫定律 平台型产品的估值与增长设计。
24 飞轮效应 (Flywheel Effect) 咬合齿轮,一旦转动惯性巨大。 增长回路图 设计业务闭环(如亚马逊飞轮)。
25 熵增定律 (Entropy) 封闭系统必然走向混乱。 5S 管理法 / 断舍离 整理整顿、定期重构、清除死代码。
26 反馈循环 (Feedback Loops) 正反馈导致暴涨,负反馈维持稳定。 系统动力学建模 识别增强回路与调节回路。
27 涌现 (Emergence) 简单的个体汇聚成群体智慧。 Scrum / 敏捷开发 自组织团队,去中心化管理。
28 幂律分布 (Power Law) 极少数人拿走极大部分利益。 ABC 分析法 重点管理最重要的20%(A类)。
29 长尾理论 (The Long Tail) 小众市场的总和匹敌热门市场。 SEO 关键词矩阵 覆盖大量低频但精准的长尾流量。
30 制约理论 (Theory of Constraints) 链条强度取决于最弱的一环。 DBR (鼓-缓冲-绳) 系统 找到瓶颈,围绕瓶颈排期。

💰 第四部分:财务、经济与资源配置

核心目标:算账、搞钱、提升效率。

商业的本质是价值交换,而财务是商业的语言。

序号 思维模型 核心理念 ⚔️ 落地方法论/工具 实战应用场景
31 机会成本 (Opportunity Cost) 选择A的成本是放弃了B。 艾森豪威尔矩阵 (四象限) 放弃“紧急不重要”的事。
32 沉没成本 (Sunk Cost) 泼出去的水,别再想了。 零基预算法 (ZBB) 预算从零算起,不参考历史投入。
33 边际效用递减 投入越多,新增产出越少。 边际分析 决策是否继续增加投入(如加班)。
34 安全边际 (Margin of Safety) 预留缓冲空间应对未知。 盈亏平衡分析 预留30%以上的现金流缓冲。
35 单元经济 (Unit Economics) 单笔交易必须赚钱。 LTV / CAC 模型 验证商业模式(SaaS标准 > 3)。
36 套利 (Arbitrage) 利用信息/价格差获利。 (无特定通用管理工具) 早期红利捕捉、跨市场交易。
37 杠杆作用 (Leverage) 劳动力、资本、代码、媒体。 杜邦分析法 拆解ROE,看靠什么撬动收益。
38 现金转换周期 (CCC) 资金周转速度决定生死。 营运资本管理 压缩应收账款,延长应付账款。
39 凡勃伦效应 (Veblen Effect) 价格越高,越有人买。 撇脂定价法 高端产品定价,收割高净值用户。
40 帕金森定律 (Parkinson’s Law) 工作会自动膨胀占满时间。 番茄工作法 / Timeboxing 强行限定截止时间 (Deadline)。

🛠️ 第五部分:产品、创新与工程

核心目标:做出用户真正需要的东西。

从“制造”思维转向“设计”思维。

序号 思维模型 核心理念 ⚔️ 落地方法论/工具 实战应用场景
41 MVP (最小可行性产品) 小步快跑,快速试错。 精益画布 (Lean Canvas) 一张纸写清商业模式,快速验证。
42 PMF (Product-Market Fit) 产品与市场完美契合。 NPS (净推荐值) 调查 判断用户忠诚度与扩张时机。
43 待办任务 (Jobs to be Done) 用户买钻头是为了得到孔。 用户故事 (User Story) 敏捷开发中的需求定义。
44 技术债务 (Technical Debt) 速度牺牲质量,未来要加倍还。 SonarQube / 偿债周 代码质量检测与定期修复。
45 冗余/备份 (Redundancy) 关键系统必须有备份。 RAID / 灾备演练 系统高可用设计。
46 标准化 (Standardization) 减少变数,提高效率。 SOP (标准作业程序) / Checklist 确保小白也能操作,减少失误。
47 规模效应 (Economies of Scale) 产量越大,单位成本越低。 供应链管理 (SCM) 集中采购,降低边际成本。
48 货柜崇拜 (Cargo Cult) 模仿外表,不理解本质。 (去形式化) 避免盲目照搬大厂流程。
49 断裂点 (Breakpoint) 系统在压力下崩溃的临界点。 压力测试 (Stress Testing) 模拟高并发,测出系统极限。
50 用户路径 (User Journey) 从用户视角看全流程。 用户体验地图 优化转化率,发现体验断点。

👥 第六部分:组织管理与领导力

核心目标:带好队伍,分好钱。

管理是关于人类行为的杠杆。

序号 思维模型 核心理念 ⚔️ 落地方法论/工具 实战应用场景
51 彼得原理 (Peter Principle) 人会被晋升到不胜任的位置。 九宫格人才盘点 区分业绩与潜力,避免错误提拔。
52 邓巴数字 (Dunbar’s Number) 150人的管理极限。 双披萨原则 (Two Pizza Rule) 亚马逊法则:团队规模保持精简。
53 激励机制 (Incentives) 屁股决定脑袋。 OKR / ESOP (期权池) 目标对齐与利益绑定。
54 破窗效应 (Broken Windows) 坏事没人管,就会越来越多。 Code Review / 6S 发现小问题立刻修复,维护文化。
55 格鲁夫杠杆 (High Output) 经理产出 = 团队产出。 1-on-1 会议 通过辅导下属撬动高产出。
56 指挥官意图 告诉Why和What,别管How。 任务式指挥 (Mission Command) 充分授权,发挥一线主观能动性。
57 皮格马利翁效应 期望越高,表现越好。 教练技术 (Coaching) 积极心理暗示,引导员工成长。
58 责任分散 人越多,越没人负责。 DRI (直接负责人) / RACI 确保每个任务有且仅有一个负责人。
59 群体极化 (Group Polarization) 群体讨论容易导致极端。 德尔菲法 (Delphi Method) 匿名征求专家意见,避免随大流。
60 学习曲线 (Learning Curve) 熟能生巧,效率随经验提升。 入职培训清单 (Onboarding) 加速新人上手速度。

🧠 第七部分:心理学与人性误判

核心目标:洞察人性,营销与说服。

查理·芒格最推崇的领域,理解人类误判心理学。

序号 思维模型 核心理念 ⚔️ 落地方法论/工具 实战应用场景
61 社会认同 (Social Proof) 大家都在买,所以我也买。 客户证言 / Logo墙 官网信用背书建设。
62 稀缺效应 (Scarcity) 越少越想要。 倒计时 / 限购令 电商逼单转化。
63 互惠倾向 (Reciprocity) 拿人手短,想回报。 内容营销 (白皮书/试用) 免费给价值,换取销售线索。
64 承诺与一致 (Consistency) 人倾向于遵守公开承诺。 登门槛效应 (Foot-in-the-door) 先求小承诺(点赞),再求大承诺。
65 厌恶损失 (Loss Aversion) 失去的痛苦大于得到的快乐。 无理由退款 / 试用期 消除客户顾虑,提升转化。
66 锚定效应 (Anchoring) 第一印象决定后续判断。 价格诱饵 / 价格锚点 设置高价套餐衬托主推款性价比。
67 确认偏误 (Confirmation Bias) 只看支持自己的证据。 红蓝军对抗 (Red Teaming) 找专人挑刺,攻击现有方案。
68 幸存者偏差 死人不会说话。 流失分析 (Churn Analysis) 回访不再续费的客户,寻找真因。
69 基本归因谬误 别人错是人品,我错是环境。 360度评估 多维度评价,避免单一视角偏见。
70 这种鲁巴效应 (Lollapalooza) 多种心理因素叠加产生爆炸效果。 营销漏斗 (Funnel) 在各环节叠加多种诱因促成转化。

🌊 第八部分:自然与物理隐喻

核心目标:从大自然借智慧。

序号 思维模型 核心理念 ⚔️ 落地方法论/工具 实战应用场景
71 活化能 (Activation Energy) 万事开头难,需最小能量启动。 用户引导 (Onboarding Flow) 极致简化注册/上手流程。
72 催化剂 (Catalyst) 加速反应但不消耗自己。 增长黑客 (Growth Hacking) 寻找低成本加速增长的手段。
73 半衰期 (Half-life) 事物衰减的速度。 内容审计 (Content Audit) 定期更新过时的文档或代码。
74 惯性 (Inertia) 改变现状需要巨大外力。 变革管理八步法 打破组织惯性,推行新政。
75 相对论 (Relativity) 参照系决定视角。 价格锚点 利用对比产生价值感。

📝 结语:如何使用这份清单?

不要试图一次性背诵所有模型。建议将本文收藏打印,作为您的“案头词典”。

  1. 遇到管理难题时(如团队内耗):查阅第六部分,尝试用 RACISBI 解决。
  2. 制定年度战略时:查阅第二部分,用 VRIOPESTEL 进行扫描。
  3. 产品推不动时:查阅第五部分,看看是否满足了 JTBD 或卡在了 跨越鸿沟 阶段。

思维模型不是为了让你看起来更聪明,而是为了让你在关键时刻,做出那个胜率更高的决定。

AI Spec-kit

掌握大型语言模型:50道面试题终极指南

本文基于一篇优秀的Medium文章,解析并提炼了50道经典LLM面试题。我对内容进行了润色和优化,使其更简洁、实用,同时保留了核心知识点。此次版本特别结合了相关图示,帮助你更直观地理解复杂概念。无论你是求职者、面试官,还是AI爱好者,这份指南都能帮你快速掌握LLM的核心概念、机制和应用。

这些问题涵盖了从基础原理到高级技巧的方方面面,每个问题后附带简明解释,帮助你获得“顿悟”时刻。让我们一起来探索吧!

1. 什么是分词(Tokenization),为什么它对LLM至关重要?

分词是将文本分解成更小的单位(如单词、子词或字符)的过程。例如,“artificial”可能被拆分成“art”、“ific”和“ial”。这对LLM至关重要,因为模型处理的是数字而非原始文本。分词能处理多种语言、稀有词汇,并优化词汇表大小,提高计算效率和模型性能。

2. Transformer模型中的注意力机制是如何工作的?

注意力机制允许LLM在生成或解释文本时,权衡序列中不同token的重要性。它通过查询(query)、键(key)和值(value)向量计算相似度分数(如点积)。例如,在“The cat chased the mouse”中,它能将“mouse”与“chased”关联起来,提升上下文理解,使Transformer在NLP任务中表现出色。

3. LLM中的上下文窗口是什么,为什么重要?

上下文窗口是指LLM一次能处理的token数量上限(如32,000个token),它定义了模型的“记忆”范围。更大的窗口能提升如摘要生成的任务连贯性,但会增加计算成本。在实际部署中,平衡窗口大小与效率是关键。

4. LoRA和QLoRA在LLM微调中的区别是什么?

LoRA(Low-Rank Adaptation)通过添加低秩矩阵来高效微调模型,减少内存开销。QLoRA在此基础上引入量化(如4-bit精度),进一步降低内存需求。例如,QLoRA能让70B参数模型在单GPU上微调,适合资源有限的环境。

5. 束搜索(Beam Search)如何比贪婪解码(Greedy Decoding)更好地生成文本?

束搜索在生成文本时保留前k个(例如k=5)最佳序列,探索更多路径,而贪婪解码只选最高概率词。这能产生更连贯的输出,尤其在机器翻译或对话生成中,平衡概率与多样性。

6. 温度(Temperature)在控制LLM输出中扮演什么角色?

温度是一个超参数,用于调整文本生成的随机性。低温度(如0.3)偏好高概率token,输出更可预测;高温度(如1.5)增加多样性。通过设置如0.8,能在创意任务如讲故事中平衡创造力和连贯性。

7. 什么是掩码语言建模(Masked Language Modeling),它如何辅助预训练?

掩码语言建模(MLM)是将序列中随机token隐藏,并训练模型基于上下文预测它们。如BERT模型中使用,这促进双向语言理解,捕捉语义关系,为情感分析或问答等任务打下基础。

8. 序列到序列(Seq2Seq)模型是什么,在哪里应用?

Seq2Seq模型将输入序列转换为输出序列(长度可不同),由编码器处理输入、解码器生成输出。应用包括机器翻译(如英文到西班牙文)、文本摘要和聊天机器人,处理变长输入输出。

9. 自回归模型和掩码模型在LLM训练中的区别是什么?

自回归模型(如GPT)基于先前token顺序预测,擅长生成任务如文本补全。掩码模型(如BERT)使用双向上下文预测掩码token,适合分类等理解任务。训练目标决定了它们在生成 vs. 理解上的优势。

10. 什么是嵌入(Embeddings),在LLM中如何初始化?

嵌入是将token表示为连续空间中的稠密向量,捕捉语义和句法属性。通常随机初始化或用预训练如GloVe,然后在训练中微调。例如,“dog”的嵌入可能在宠物相关任务中演化,提升模型准确性。

11. 什么是下一句预测(Next Sentence Prediction),它如何提升LLM?

下一句预测(NSP)训练模型判断两句是否连续(50%正样本,50%负样本)。如BERT中使用,这改善如对话系统或文档摘要的任务连贯性,通过理解句子关系。

12. Top-k和Top-p采样在文本生成中的区别是什么?

Top-k采样选择前k个最高概率token(如k=20)随机采样,确保控制多样性。Top-p(核采样)选择累积概率超过阈值p(如0.95)的token,更灵活。在创意写作中,Top-p能产生多样且连贯的输出。

13. 为什么提示工程(Prompt Engineering)对LLM性能至关重要?

提示工程是设计输入以引发理想响应的艺术。例如,“用100字总结这篇文章”比模糊指令更有效。在零样本或少样本设置中,它让LLM无需大量微调就能处理翻译或分类任务。

14. LLM如何在微调中避免灾难性遗忘(Catastrophic Forgetting)?

灾难性遗忘是微调抹除先前知识的现象。缓解方法包括:重放(混合旧新数据)、弹性权重整合(保护关键权重)、模块化架构(添加任务特定模块)。这些确保LLM在多任务中保持多功能性。

15. 什么是模型蒸馏(Model Distillation),它如何益处LLM?

模型蒸馏训练“小学生”模型模仿“大老师”模型的输出,使用软概率而非硬标签。这减少内存和计算需求,让模型能在智能手机上部署,同时保留近似性能,适合实时应用。

16. LLM如何处理词汇表外(OOV)词?

LLM使用子词分词如字节对编码(BPE),将OOV词拆分成已知子词。例如,“cryptocurrency”拆成“crypto”和“currency”。这确保处理稀有或新词,增强语言理解和生成鲁棒性。

17. Transformer如何优于传统Seq2Seq模型?

Transformer通过并行处理(自注意力同时处理token)、捕捉长距离依赖、位置编码(保留顺序)来改进。相比RNN的顺序处理,这些提升了可扩展性和如翻译任务的性能。

18. 什么是过拟合(Overfitting),在LLM中如何缓解?

过拟合是模型记忆训练数据但无法泛化。缓解包括:正则化(L1/L2惩罚)、Dropout(随机禁用神经元)、早停(验证性能停滞时停止)。这些确保对未见数据的鲁棒泛化。

19. NLP中的生成模型和判别模型有什么区别?

生成模型(如GPT)建模联合概率,创建新数据如文本。判别模型(如BERT分类)建模条件概率,区分类别如情感分析。生成模型擅长创建,判别模型聚焦准确分类。

20. GPT-4与GPT-3在功能和应用上的区别是什么?

GPT-4超越GPT-3的多模态输入(文本+图像)、更大上下文(25,000 vs. 4,096 token)、更高准确性(减少事实错误)。这扩展了其在视觉问答和复杂对话的应用。

21. 什么是位置编码(Positional Encodings),为什么使用?

位置编码为Transformer输入添加序列顺序信息,因为自注意力无固有顺序。用正弦函数或学习向量,确保如“king”和“crown”基于位置正确解释,关键于翻译任务。

22. 什么是多头注意力(Multi-Head Attention),它如何提升LLM?

多头注意力将查询、键、值拆分成多个子空间,同时关注输入的不同方面。例如,一头关注句法,另一头关注语义。这提升模型捕捉复杂模式的能力。

23. Softmax函数在注意力机制中如何应用?

Softmax将注意力分数规范化成概率分布:在注意力中,将原始相似分数(查询-键点积)转为权重,强调相关token,确保模型聚焦上下文重要部分。

24. 点积在自注意力中如何贡献?

在自注意力中,查询(Q)和键(K)向量的点积计算相似分数:高分表示相关token。尽管高效,但其二次复杂度(O(n²))促使研究稀疏注意力。

25. 为什么在语言建模中使用交叉熵损失(Cross-Entropy Loss)?

交叉熵测量预测与真实token概率的差异:它惩罚错误预测,鼓励准确token选择。在语言建模中,确保模型为正确下一token分配高概率,优化性能。

26. LLM中嵌入的梯度如何计算?

嵌入梯度通过链式法则在反向传播中计算:这些梯度调整嵌入向量以最小化损失,精炼语义表示,提升任务性能。

27. Jacobian矩阵在Transformer反向传播中的作用是什么?

Jacobian矩阵捕捉输出对输入的部分导数。在Transformer中,它帮助计算多维输出的梯度,确保权重和嵌入的准确更新,优化复杂模型。

28. 特征值和特征向量如何与降维相关?

特征向量定义数据主方向,特征值表示方差。在PCA中,选择高特征值的向量减少维度,同时保留大部分方差,便于LLM输入处理。

29. 什么是KL散度(KL Divergence),在LLM中如何使用?

KL散度量化两个概率分布的差异:在LLM中,它评估模型预测与真实分布的接近度,指导微调改善输出质量和数据对齐。

30. ReLU函数的导数是什么,为什么重要?

ReLU函数f(x) = max(0, x)的导数为:1 (x > 0),0 (x ≤ 0)。其稀疏性和非线性防止梯度消失,使ReLU在LLM中高效且广泛使用。

31. 链式法则如何应用于LLM中的梯度下降?

链式法则计算复合函数导数:在梯度下降中,它启用反向传播逐层计算梯度,高效更新参数,最小化深度LLM架构的损失。

32. Transformer中注意力分数如何计算?

注意力分数计算为:缩放点积测量token相关性,Softmax规范化分数,聚焦关键token,提升如摘要的上下文生成。

33. Gemini如何优化多模态LLM训练?

Gemini通过统一架构(结合文本和图像)、高级注意力(提升跨模态学习稳定性)、数据效率(自监督减少标签需求)来优化。更稳定、可扩展于如GPT-4。

34. 基础模型有哪些类型?

基础模型包括:语言模型(BERT、GPT-4用于文本)、视觉模型(ResNet用于图像分类)、生成模型(DALL-E用于内容创建)、多模态模型(CLIP用于文本-图像)。它们利用广泛预训练适用于多样应用。

35. PEFT如何缓解灾难性遗忘?

参数高效微调(PEFT)仅更新小部分参数,冻结其余以保留预训练知识。如LoRA,确保LLM适应新任务而不丢失核心能力,维持跨域性能。

36. 检索增强生成(RAG)的步骤是什么?

RAG包括:检索(用查询嵌入获取相关文档)、排序(按相关性排序)、生成(用检索上下文生成准确响应)。提升如问答的任务事实准确性。

37. 专家混合(MoE)如何提升LLM可扩展性?

MoE用门控函数激活特定专家子网络,减少计算负载。例如,每查询仅用10%参数,让亿级参数模型高效运行,同时保持高性能。

38. 思维链(Chain-of-Thought)提示是什么,它如何辅助推理?

CoT提示引导LLM逐步解决问题,模仿人类推理。例如,在数学问题中分解计算,提升复杂任务如逻辑推理的准确性和可解释性。

39. 判别AI和生成AI的区别是什么?

判别AI(如情感分类器)基于输入特征预测标签,建模条件概率。生成AI(如GPT)创建新数据,建模联合概率,适合文本或图像生成,提供创意灵活性。

40. 知识图谱集成如何改善LLM?

知识图谱提供结构化事实数据,通过减少幻觉(验证事实)、改善推理(利用实体关系)、增强上下文来提升LLM。适用于问答和实体识别。

41. 什么是零样本学习(Zero-Shot Learning),LLM如何实现?

零样本学习让LLM使用预训练通用知识执行未训练任务。例如,提示“将此评论分类为积极或消极”,无需特定数据即可推断情感,展示其多功能性。

42. 自适应Softmax如何优化LLM?

自适应Softmax按频率分组词,减少稀有词计算。降低大词汇表成本,加速训练和推理,同时保持准确性,尤其在资源有限环境中。

43. Transformer如何解决梯度消失问题?

Transformer通过自注意力(避免顺序依赖)、残差连接(直接梯度流)、层规范化(稳定更新)来缓解。与RNN不同,确保深度模型有效训练。

44. 什么是少样本学习(Few-Shot Learning),其益处是什么?

少样本学习让LLM用少量示例执行任务,利用预训练知识。益处包括减少数据需求、快速适应、成本效率,适合利基任务如特定文本分类。

45. 如何修复LLM生成偏见或错误输出?

解决方法:1. 分析模式(识别偏见来源);2. 增强数据(用平衡数据集和去偏技术);3. 微调(用精选数据或对抗方法重训)。改善公平性和准确性。

46. Transformer中编码器和解码器的区别是什么?

编码器将输入序列处理成抽象表示,捕捉上下文。解码器生成输出,使用编码器输出和先前token。在翻译中,编码器理解源语言,解码器产生目标语言,实现有效Seq2Seq任务。

47. LLM与传统统计语言模型的区别是什么?

LLM使用Transformer架构、海量数据集和无监督预训练,而统计模型(如N-gram)依赖简单监督方法。LLM处理长距离依赖、上下文嵌入和多样任务,但需大量计算资源。

48. 什么是超参数,为什么重要?

超参数是预设值,如学习率或批次大小,控制模型训练。它们影响收敛和性能;例如,高学习率可能导致不稳定。调优超参数优化LLM效率和准确性。

49. 什么是大型语言模型(LLM)?

LLM是训练于海量文本语料的AI系统,能理解和生成类人语言。拥有亿级参数,在翻译、摘要和问答中卓越,利用上下文学习广泛适用。

50. LLM部署面临哪些挑战?

挑战包括:资源密集(高计算需求)、偏见(延续训练数据偏见)、可解释性(复杂模型难解释)、隐私(数据安全担忧)。解决这些确保LLM的伦理和有效使用。

参考来源

https://transformers.run/c1/transformer/

AI Code Spec-kit

https://github.com/github/spec-kit

我选用的Cursut-agent,我的建议是一定要按照官方的这几个命令顺序执,按顺序执行你才能真正体现这个工具的强大之处:

按顺序执行

生成结果

我个人觉得,从0到1开始一个项目,有这个是很省心的。

  • 想的全面
  • 代码结构化
  • 使用得当不容易出现屎山代码

写在前面

因为研发进入公司后都给开了cursor帐号,虽然大多数人都知道cursor也简单试用过但是可能没有花心思研究它,所以导致最近一个多月用下来我发现大家的使用方式存在较大问题,且token消耗很快,简单说就是大多使用的时候都毫无技巧,就力大砖飞的方式跟对话框干上了的感觉。

所以我利用站会的一点时间简单给大家讲了一下使用技巧,让大家能把cursor用的更好同时也能适当降低token消耗。

Cursor 有哪些使用技巧?

核心目标:用最少的 Request 消耗,换取最准确的代码产出。
核心原则:AI 不懂就问(Interactive Feedback),人要想好再说(PVE 模式)。

🚀 第一部分:省流攻略 (Save Requests & Tokens)

1. 拒绝 “Auto” 模式,手动分级

痛点:默认的 “Auto” 模式经常在简单问题上杀鸡用牛刀,浪费宝贵的 Fast Request。

  • 最佳实践
    • **日常开发 (80%)**:强制使用 GPT-4o-mini 或 Claude 3.5 Haiku。用于改 Bug、写注释、简单函数。
    • **攻坚时刻 (20%)**:手动切换到 Claude 3.5 Sonnet。仅用于架构设计、复杂重构。
  • 操作:使用快捷键 Cmd + / (Mac) 或 Ctrl + / (Win) 快速切换模型,不要依赖自动路由 1。

2. 启用 Interactive Feedback (MCP) —— 关键技巧

痛点:需求模糊时,AI 靠猜。猜错 = 重写 = 浪费 2-3 次 Request。
原理:利用 MCP 协议,让 AI 在同一个请求内暂停并向你提问,直到确认清楚再写代码。

  • 最佳实践
    • 配置 interactive-feedback-mcp 服务。
    • Rule设置:在 .cursorrules 中加入:“如果指令不明确,必须调用 interactive_feedback 询问,禁止盲目猜测。”
  • 收益:将原本需要 3 轮“生成-纠错-再生成”的交互,压缩为 1 次请求 [User Input, 13]。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 1. clone interactive-feedback-mcp
git clone https://github.com/noopstudios/interactive-feedback-mcp.git
cd interactive-feedback-mcp

# 2. 使用 Python 3.11 创建标准虚拟环境
/opt/homebrew/bin/python3.11 -m venv .venv

# 3. 激活环境(为了确保 pip 指向正确)
source .venv/bin/activate

# 4. 新建requirements.txt,安装依赖
pip install requirements.txt

# 5. 检查是否能成功运行
./.venv/bin/python feedback_ui.py --project-directory "." --prompt "环境安装完毕测试" --output-file "debug_output.json"

# 6. cursor配置mcp
"interactive-feedback-mcp": {
"command": "/xxxx/interactive-feedback-mcp/.venv/bin/python",
"args": [
"/xxxx/interactive-feedback-mcp/server.py"
],
"cwd": "/xxxx/interactive-feedback-mcp",
"timeout": 600,
"autoApprove": [
"interactive_feedback"
]
}

3. PVE 工作流 (Plan-Verify-Execute)

痛点:想到哪写到哪(Vibe Coding),导致 AI 反复修改同一段代码,Token 爆炸。

  • 最佳实践
    • **P (Plan)**:先用免费模型(或 mini)让 AI 列出修改计划。
    • **V (Verify)**:人工确认计划无误。
    • **E (Execute)**:开启 Composer (Cmd+I),一次性把确认好的计划发给 Sonnet 执行。
  • 收益:一次成型,拒绝返工 3。

⚡ 第二部分:上下文工程 (Context Management)

1. 必须配置 .cursorignore

痛点:AI 读了 node_modules 或 lock 文件,导致 Token 耗尽且回答变慢。

  • 操作
    • 在根目录新建 .cursorignore。
    • 填入:node_modules/, dist/, *.json (大文件), logs/。
    • 效果:强制 AI 只看源码,Token 节省 30% 以上 4。

2. 精通 .cursorrules (配置即代码)

痛点:每次都要重复喊“用 TypeScript”、“不要用 Class 组件”。

  • 操作
    • 根目录新建 .cursorrules 文件。
    • 由简入繁
      1. 角色:You are a senior expert in [技术栈].
      2. 绝对禁止:No class components. No placeholder comments.
      3. 格式:Only output changed lines. (只输出修改行,极大节省 Output Token) 6。

3. “一次性” 会话原则

痛点:在一个 Chat 窗口聊几天,上下文充满了过时的旧代码,导致 AI 变笨且极其费钱。

  • 操作
    • Task 完成即销毁:一个功能点 = 一个 Chat。功能做完,立刻 Cmd+L 开新窗口。
    • 及时 Unpin:如果文件不再需要修改,立刻取消 Pin 状态 8。

🛠️ 第三部分:核心工具与技巧 (Tools & Tricks)

1. Composer (Cmd + I) > Chat (Cmd + L)

  • Chat 是咨询师(只看不写):用于问原理、查 Bug。
  • Composer 是工程师(直接写):用于多文件编辑
  • 技巧
    • Combo 连招:不要分三次改。直接在 Composer 输入:“在 User 表加字段,同步更新 API DTO,并修改前端类型定义。” —— 3 个文件变动,只需 1 次 Request 1。

2. 善用 Plan Mode (Shift + Tab)

  • 场景:大功能开发。
  • 操作:在 Composer 输入框按 Shift + Tab 进入 Plan Mode。AI 会先扫描代码库,生成 Markdown 格式的待办清单,你确认后它再动手。这比直接写代码更稳,更省重试次数。

📝 总结:开发者自查清单

在开始 coding 前,请确认:

  1. [ ] 模型对了吗? 简单问题切回 mini 了吗?
  2. [ ] 规则有了吗? .cursorrules 和 .cursorignore 配置了吗?
  3. [ ] 模式选对了吗? 多文件修改是否使用了 Composer?
  4. [ ] 反馈机制:是否启用了 Interactive Feedback 以防止 AI 瞎猜?
  5. [ ] 会话清理:上个任务结束了吗?结束了请开新 Chat。

参考资料

  1. Pricing | Cursor Docs
  2. Models | Cursor Docs
  3. In Cursor, Context is King - DEV Community
  4. Codebase Indexing | Cursor Docs
  5. Ignore files | Cursor Docs
  6. How to Use Cursor More Efficiently - r/ChatGPTCoding
  7. .cursorrules · GitHub Gist
  8. Understanding Cursor Token Usage - Reddit
  9. 4 hacks to turbocharge your Cursor productivity | LaunchDarkly

RAG 第一篇

后续团队需要做企业大脑,会用到RAG,先比较完整的了解下RAG,把零碎知识补的完整一些,做个记录。

### 标准RAG(Retrieval-Augmented Generation)的运行流程图

标准RAG系统的运行流程可以分为两大阶段:索引阶段(Indexing Phase)(预处理数据)和运行时阶段(Runtime Phase)(查询处理)。以下是详细的流程描述,我会结合常见的流程图示例来说明。RAG的核心是先从外部知识库中检索相关信息,然后用这些信息增强LLM的生成,以减少幻觉并提供更准确的回答。

这个流程图展示了RAG的高层结构:从数据源到最终输出的完整路径。

1. 索引阶段(Indexing Phase):预构建知识库

这一阶段发生在系统启动前,用于将外部数据转化为可检索的形式。通常是离线过程,目的是创建向量数据库以支持高效查询。

  • 步骤1: 数据采集(Data Ingestion)
    从各种来源(如文档、数据库、网页)收集原始数据。这些数据可以是结构化(e.g., SQL表)或非结构化(e.g., PDF、文本文件)。
  • 步骤2: 数据分块(Chunking)
    将长文档切分成小块(chunks),通常每个chunk 100-500 tokens,以匹配嵌入模型的输入限制。分块策略包括固定长度、按句子或语义分块(e.g., 使用LLM检测自然断点)。
  • 步骤3: 嵌入生成(Embedding Generation)
    使用嵌入模型(如BERT、OpenAI的text-embedding-ada-002)将每个chunk转化为向量表示(dense vector,e.g., 768维)。这捕捉语义相似性。
  • 步骤4: 索引存储(Indexing and Storage)
    将向量和对应的原始chunk存储到向量数据库(Vector DB,如FAISS、Pinecone、Milvus)。同时可能添加元数据(如来源、时间戳)。索引使用近似最近邻(ANN)算法如HNSW来加速检索。

这一阶段的输出是一个可查询的向量数据库。

这个图更详细地展示了索引和检索的子步骤,包括分块、嵌入和重排序。

2. 运行时阶段(Runtime Phase):实时查询处理

这是用户交互时的核心流程,对应你之前描述的“检索 + 生成”。

  • 步骤1: 用户输入(User Query Input)
    用户提供查询(query),e.g., “什么是RAG?”。
  • 步骤2: 查询嵌入(Query Embedding)
    使用相同的嵌入模型将query转化为向量。
  • 步骤3: 检索(Retrieval)
    在向量数据库中计算query向量与所有chunk向量的相似度(e.g., 余弦相似度)。返回Top-K个最相似的chunks(原始文本 + 元数据)。可选:重排序(Re-ranking)使用另一个模型(如Cross-Encoder)进一步过滤,提高相关性。
  • 步骤4: 提示构建(Prompt Construction)
    将检索到的Top-K chunks(原始文本)与query拼接成一个Prompt。模板示例:
    1
    2
    3
    4
    系统提示: 你是一个助手,使用以下上下文回答问题。
    上下文: [chunk1] [chunk2] ... [chunkK]
    问题: [query]
    回答:
    注意:这里不直接传递向量,只传递文本。Prompt长度需控制在LLM上下文窗口内(e.g., 8K-128K tokens)。
  • 步骤5: 生成(Generation)
    将Prompt输入LLM(e.g., GPT-4、LLaMA),LLM基于Prompt生成回答。生成过程使用解码算法如beam search或greedy decoding。
  • 步骤6: 输出响应(Output Response)
    返回生成的文本给用户。可选:后处理,如引用来源或验证事实。

结构化和非结构化数据的融合,以及Prompt + Context的输入到LLM。

详细流程的潜在变体和优化

  • 高级检索:可结合关键字搜索(BM25)与向量搜索的混合检索(Hybrid Search),或使用查询重写(Query Rewriting)来扩展query。
  • 多跳检索:对于复杂查询,多次检索(e.g., 先检索实体,再检索关系)。
  • 性能考虑:检索延迟通常<1s,生成取决于LLM大小。常见问题:噪声chunk(无关信息)导致Prompt过长,可用压缩(如摘要)优化。
  • 工具与框架:实现时常用LangChain、Haystack或LlamaIndex。嵌入模型:Sentence Transformers;向量DB:Weaviate。

总结

一句话概括RAG就像给AI装了个”外挂搜索引擎”,问啥先从知识库里找答案,再让AI组织回答。

整个流程就两步大动作:

1️⃣ 准备阶段(一次性干完)

  • 把一堆文档(PDF、网页、数据库)切成小块(像切西瓜一样)
  • 给每块内容**打个”指纹”**(向量嵌入,类似数字DNA)
  • 把这些”指纹+原文”存进搜索引擎(向量数据库)

比喻:就像给图书馆每本书都贴上标签,方便以后快速找书。

2️⃣ 回答问题时(每次提问都这样)

1
2
3
4
用户问问题 → AI先去"图书馆"翻书 → 找到相关内容 → 组织答案给用户
↓ ↓ ↓ ↓
"什么是RAG?" 搜"指纹"匹配 挑出3-5段 "RAG是检索增强生成..."
找相关段落 最相关的书 用这些内容回答

详细拆解

  1. 你问问题 → AI把你的问题也打个”指纹”
  2. AI去搜 → 在图书馆里找跟你问题”指纹”最像的几本书
  3. 挑重点 → 不把整本书都拿出来,只拿相关段落
  4. 拼答案 → 把这些段落+你的问题一起给AI,让它重新组织回答
  5. 输出 → AI用找到的”参考资料”给你准确回答

关键点:

  • 向量(指纹)只用来”找书”不直接给AI看
  • AI真正读的是书里的原文,不是那些数字指纹
  • 找书快(秒级),读懂写回答慢(几秒到几十秒)

为啥要这样?

  • 不RAG:AI只能凭记忆瞎编,容易胡说八道
  • 有RAG:AI像查字典一样先找事实,再组织语言回答

通俗理解:RAG就是让AI**”不瞎编,先查资料”**,回答前先翻书确认事实!

参考文档

https://www.6clicks.com/resources/blog/understanding-rag-retrieval-augmented-generation-explained
https://danielp1.substack.com/p/navigating-retrieval-augmented-generation

Linux netplan

初创团队,各方面有限,我们是saas+硬件,但是我们只有单个公网IP、一个一级域名,所以为了短时间适配生产、研发、测试三个环境,同时支持SaaS+硬件通信,我们需要做前端入口的流量管理,团队的小伙伴选择了OPNsense。
这一篇是我为了了解该技术方案而简单整理的。

# 解决Ubuntu Server 24.04删除网卡后的Netplan问题

引言

在Ubuntu Server 24.04中,Netplan是默认的网络配置工具,使用YAML文件管理网络设置。最近,我在虚拟机中配置了双网卡(一张内网,一张外网),但删除一张网卡后,网络无法正常工作。经过调试,我通过手动更新Netplan配置文件解决了问题,以下是我的经验分享。

问题描述

我的虚拟机最初配置了两张网卡:enp0s3(外网,静态IP)用于访问外部网络,enp0s8(内网,DHCP)用于本地通信。删除enp0s8后,运行netplan apply没有生效,ip a显示enp0s3未正确分配IP。日志(journalctl -u systemd-networkd)提示Netplan仍尝试配置已删除的网卡。

1
2
4: ens38: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 00:30:26:8c:78:57 brd ff:ff:ff:ff:ff:ff

解决方案

以下是解决步骤:

  1. 启动网卡
1
ip link set ens38 up
  1. 检查现有Netplan配置
    查看/etc/netplan/目录中的配置文件(通常为00-installer-config.yaml)。原始配置如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    network:
    version: 2
    ethernets:
    enp0s3:
    dhcp4: no
    addresses: [172.162.1.100/24]
    gateway4: 172.162.1.1
    nameservers:
    addresses: [8.8.8.8, 8.8.4.4]
    enp0s8:
    dhcp4: yes
  2. 更新配置文件
    删除enp0s8相关配置,仅保留enp0s3。修改后的文件如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    network:
    version: 2
    ethernets:
    enp0s3:
    dhcp4: no
    addresses: [172.162.1.100/24]
    gateway4: 172.162.1.1
    nameservers:
    addresses: [8.8.8.8, 8.8.4.4]

    注意:确保YAML缩进为2个空格,避免格式错误。

  3. 验证并应用配置
    检查配置语法:

    1
    sudo netplan --debug apply

    确认无错误后,应用配置:

    1
    sudo netplan apply
  4. 测试网络
    验证接口状态和连通性:

    1
    2
    ip a
    ping 8.8.8.8
  5. 检查日志
    如果仍不生效,查看日志:

    1
    journalctl -u systemd-networkd

总结

删除虚拟机网卡后,Netplan不会自动更新配置,需手动移除无效网卡的配置条目。关键是检查YAML文件、确保格式正确,并使用netplan --debug apply定位问题。在多网卡场景下,建议定期验证网卡名称(ip link)和配置文件一致性。遇到类似问题?欢迎留言分享你的经验!

网络安全 软路由

初创团队,各方面有限,我们是saas+硬件,但是我们只有单个公网IP、一个一级域名,所以为了短时间适配生产、研发、测试三个环境,同时支持SaaS+硬件通信,我们需要做前端入口的流量管理,团队的小伙伴选择了OPNsense。
这一篇是我为了了解该技术方案而简单整理的。

OPNsense的防火墙模块基于FreeBSD的pf(Packet Filter),提供了强大的NAT功能,包括Port Forward(转发规则)、Outbound NAT(出站NAT)和NPTv6(IPv6前缀转换)。从我的截图可以看到,Port Forward页面列出了WAN到LAN的TCP流量规则(如Web服务和RDP),而Outbound NAT页面显示了自动生成的出站规则。这些功能让我在单一公网IP下实现了多环境隔离和外部访问。
NAT策略:Port Forward与Outbound NAT的协同
最初我以为Port Forward能解决所有需求,但实践证明,仅靠它处理入站流量是不够的。Outbound NAT才是出站流量的关键,尤其在多VLAN和硬件通信场景中,两者需协同工作。

Port Forward:

用途:处理入站流量,将公网端口映射到内部IP。例如,我配置了WAN:443到192.168.10.10:443,让外部通过prod.example.com访问生产环境。
局限:不管理出站流量,硬件向SaaS发送数据时需依赖Outbound NAT。
配置:Firewall → NAT → 转发,添加规则(Protocol: TCP;Destination: WAN address:443;Redirect to: 192.168.10.10:443)。

Outbound NAT:

位置:Firewall → NAT → Outbound,当前为自动模式,自动为WAN出站流量分配公网IP。
优化:切换到手动模式,为每个VLAN设置规则,确保出站流量隔离。
我的经验:自动模式曾因端口冲突导致硬件API请求失败,切换到手动后问题解决。

找到并配置Outbound NAT
Outbound NAT是管理出站流量的关键,位于Firewall → NAT → Outbound页面。从我的截图可以看到,默认使用“自动生成规则”,为LAN和Loopback网段分配WAN地址。但对于复杂场景,我切换到手动模式以满足需求。

手动配置:
点击“切换到手动规则”(Switch to Manual Outbound NAT rule generation),保存。
添加规则:Interface: WAN;Source: 192.168.10.0/24(生产),Translation: WAN地址,描述:“Production Outbound”。
依次为研发(192.168.20.0/24)和测试(192.168.30.0/24)设置规则。
硬件场景:为生产VLAN的硬件(如192.168.10.10)添加规则,确保其API请求(如curl https://prod.example.com/api/v1/data)顺利出站。

优化:启用NAT Reflection(Firewall → Advanced),让内部设备用公网IP访问暴露服务。
经验:备份配置(System → Config History)后切换模式,避免误操作。日志监控(Firewall → Log Files)帮助我定位流量问题。

下一步行动项

实战配置:综合NAT策略

入站:Port Forward规则处理prod.example.com的HTTPS请求,映射到生产环境的Web服务器。
出站:手动Outbound NAT为每个VLAN配置规则,保障出站流量隔离。我的硬件通过生产VLAN的规则上传数据,测试显示吞吐量稳定。
硬件场景:结合Port Forward和Outbound NAT,硬件既能接收SaaS命令(入站),又能上传数据(出站),单IP利用率显著提升。
NPTv6(未来扩展):当前用IPv4,但NPTv6为IPv6网络的前缀转换提供了可能,适合ISP支持IPv6时升级。

硬件通信:NAT与子域名的结合
我的SaaS硬件通过prod.example.com与服务通信,NAT策略确保其双向通信。

入站:Port Forward映射WAN:443到192.168.10.10:443,配合HAProxy根据子域名分发流量。
出站:Outbound NAT规则让硬件出站请求使用公网IP,日志显示连接正常。
安全:用别名(Firewall → Aliases)定义硬件IP范围,限制未授权访问。
实践:我用curl测试硬件请求,确认数据成功上传到SaaS。

VPN: 团队vpn后续我会研究是否能用OPNsense