规则与自定义上下文
在 RULES.md 中编写分析规则、引用已有上下文,并按主题添加文档、SQL 示例和其他参考文件。
规则
RULES.md 文件
RULES.md 是项目的规则文件,位于项目根目录。cappy init 会创建这个文件,写入起始说明;使用自带示例数据时,还会包含示例的分析规则。接入自己的数据后,将其改为团队的规则。
它主要有两个作用:
- 指引 Agent 查找上下文:说明指标定义在哪里、不同主题应查阅哪些文件,以及不同类型的问题应使用哪些表或技能。
- 约定查询和回答方式:统一回复语气、SQL 编写规范和数据访问要求等通用规则。
表结构、完整的指标定义和特定主题的规则放在各自的文件中,再由 RULES.md 引用。已有的上下文只需注明位置和使用条件,无须在这里重复编写。
每次向 Cappy 发送消息时,都会加载这个文件,因此请尽量保持其内容精简。
通过 cappy sync 生成的表说明和语义层文件,以及项目中已有的文档,都可以直接引用。这样既避免重复维护,也减少每次消息中重复发送的内容和 Token 消耗。
推荐结构
可以按下面的结构编写,保留项目需要的章节。这些是建议内容,初始化命令不会自动填写:
| 章节 | 内容 |
|---|---|
| 业务概况 | 公司提供什么产品或服务,收入从哪里产生 |
| 数据架构 | 使用的数据库、数据来源和数据分层 |
| 上下文索引 | 表说明、仓库文件、文档和语义层定义的位置,以及何时读取 |
| 核心数据模型 | 每张常用表用一行说明用途和文档位置;缺少其他说明时,再补充表的详细解释 |
| 关键指标 | 引用已有的指标定义;尚无定义时,在这里补充 |
| 日期筛选 | 给出最近若干天、最近若干周、当月等范围的 SQL 写法,让 Agent 据此处理其他时间范围 |
| 分析流程 | 确认指标、读取文档、选择表、核对筛选值、查询、检查并解释结果 |
| 图表规范 | 品牌配色,以及表示改善、恶化等含义的颜色 |
引用已有上下文
在“上下文索引”中写明文件位置和读取条件。例如,下面的片段同时引用了表说明、dbt 项目和销售文档;路径需要对应项目中已有的文件:
## 上下文索引
### 表说明
databases/.../table=<表名>/ 中可以查阅:
- columns.md:字段名称、类型和说明。
编写 SQL 前读取。
- profiling.md:去重后的取值数量、最小值、最大值等统计。
部分字段还包含 top_values,列出常见取值及其出现次数。
编写筛选条件前读取,确认实际取值。
### 代码仓库
- repos/dbt/:dbt 项目。
模型和字段说明见 models/silver.yml。
业务判断及其依据见 models/silver/*_ANALYTICS_DECISIONS.md。
语义模型和指标的源定义见 models/silver_semantic_layer.yml。
### 文档
- docs/crm.md:销售阶段、客户状态和商机含义。
回答销售问题前读取。
### 语义层
- semantics/metrics/:已同步的指标定义。
使用指标前读取,再通过 execute_semantic_query 查询,
不另写原始表 SQL 重算同一个指标。上面的 dbt 文件名是示例,请按仓库实际文件填写。profiling.md 需要启用相应数据库模板并同步后才会生成;它不保证列出每个字段的所有取值。没有该文件,或其中没有需要核对的值时,先查询实际取值再决定筛选条件。
这样,Agent 在回答销售问题时可以先用 read 读取 docs/crm.md,确认用户所说的客户状态;再读取相关表的 columns.md,核对字段。需要计算语义层指标时,读取 semantics/metrics/ 中的定义,再调用 execute_semantic_query,结果用于回答或生成图表。
可选章节
下面两类内容按需补充;如果其他文件已经说明清楚,就不必在 RULES.md 中另写一遍:
- 表的详细说明:如果各表目录中已有
query_history.md、ai_summary.md,或 dbt 的schema.yml已包含模型与字段说明,就直接引用这些文件。在“核心数据模型”中列出常用表及其用途,在“上下文索引”中写明对应文件的位置和读取条件,Agent 就能找到详细说明。这里仅补充其他文件尚未记录的跨表关联注意事项,不重复列出每张表的结构和字段。 - 完整指标定义:如果语义层或指标文档已经定义了指标,“关键指标”中只需用一句话指向对应文件,并说明何时使用。不要再复制计算公式、筛选条件等完整定义;指标调整时,更新原来的定义文件即可。尚无定义的指标,再补充其计算方式与适用条件;内容较长时放入独立文件,由
RULES.md引用。
同一个指标只维护一份定义。如果在 RULES.md、语义层和子规则文件中分别保存副本,修改时容易遗漏,Agent 读取不同文件后就可能使用不同的计算口径,导致回答不一致。
图表规范
在 RULES.md 中添加图表要求,可以让 Agent 按团队规范设置图表。品牌色用于区分产品、地区等类别;表示增减、目标差异或指标好坏时,另用固定的含义配色。两种用途分别约定,避免把某个类别的颜色误读成表现好坏。例如:
## 图表规范
### 品牌配色
- 单系列使用主色 #2B2BFF。
- 多系列依次使用 #2B2BFF、#12B981、#F59E0B。
- 超过六个系列时,使用这些颜色的深浅变化。
- 为系列显式指定颜色,不改用图表库的默认配色。
### 含义配色
- 改善或有利变化使用 #12B981。
- 恶化或不利变化使用 #EF4444。
- 先判断指标含义;成本下降与收入下降的含义不同。这些颜色用于展示写法,请替换为团队的品牌色和业务约定。图表工具支持指定系列颜色,Agent 可在生成图表时应用这些要求。
通用规则示例
除了指明上下文的位置,RULES.md 还可以约定 Agent 如何查询和回答。下面的示例包含回复语气、分析前澄清、回答结构、结果核对、SQL、数据访问、隐私和文件引用,可按团队要求调整:
# Agent 规则
## 回复语气
- 保持专业、简洁、友好。
- 解释结论的依据和分析过程。
- 使用假设时,明确说明假设是什么。
- 适当提出相关的后续问题。
## 与业务用户交流
### 分析前澄清
开始分析前,如果以下信息不明确,先向用户确认:
- **时间范围**:“要分析哪个时间段?”
例如最近 7 天、当月累计、今年累计或指定日期。
- **地区范围**:“要查看哪些地区或国家?”
例如全部地区或特定市场。
- **客户群体**:“要分析哪类客户?”
例如全部客户、企业客户(B2B)或个人客户(B2C)。
- **指标定义**:“这个指标采用哪一种定义?”
存在多种定义时,先确认使用哪一种。
- **时间粒度**:“按天、周还是月展示?”
### 回答结构
每次分析都按以下顺序组织回答:
1. **先给结论**:开头直接说明主要发现。
2. **提供数据**:展示支持结论的数字或图表。
3. **补充比较**:与上一周期、目标或其他相关基准比较。
4. **核对结果**:用已知基准验证结果是否合理。
5. **说明限制**:指出数据质量问题和其他影响结论的限制。
### 结果核对
展示结果前,检查:
- 数值的数量级是否符合预期。
- 按不同方式汇总时,总量是否一致。
- 是否与参考表一致,例如 monthly_kpi_summary 月度指标汇总表。
- 是否明显偏离历史趋势;存在偏差时,在回答中指出。
### 后续问题建议
回答后,按当前分析提出相关的后续问题:
- **进一步细分**:“需要按地区拆分看看吗?”
- **相关指标**:“是否也要看看留存率?”
- **趋势分析**:“需要看看这个指标随时间的变化吗?”
## SQL 编写规范
- 显式写出 JOIN。
- 使用有明确含义的表别名,例如 users 用 u,orders 用 o。
- 使用缩进和换行,保持 SQL 易读。
- 查询加上 LIMIT,限制返回行数。
- 优先使用公共表表达式(CTE),避免复杂的嵌套子查询。
## 数据访问
- 只查询正式表,排除 *_test、*_staging 等测试表和暂存表。
- 未指定时间范围时,默认查询最近 30 天。
- 每次查询最多返回 10,000 行。
## 隐私与安全
- 不展示完整的邮箱地址或电话号码。
- 查询涉及个人身份信息(PII)时,明确标注。
- 尽可能汇总个人数据,避免直接展示个人明细。
## 上下文引用
需要某个主题的详细说明时,读取对应文件:
- **营销问题**:读取 docs/marketing.md。
- **财务问题**:读取 docs/finance.md。
- **产品问题**:读取 docs/product.md。
这些文件包含:
- 详细的业务定义。
- 指标计算方式。
- 数据质量注意事项。
- 特定主题的规则。其中的默认时间范围、行数上限、参考表和文件路径都是示例。团队约定了默认值时,可以直接使用并在回答中说明;实际访问权限仍需通过项目权限和数据库账号限制。
子规则文件
将特定主题的详细说明写入单独的 Markdown 文件,作为子规则文件,Agent 只在需要时读取。下面以 my-project 表示你的项目文件夹:
my-project/
├── RULES.md # 每次消息加载的共同规则与文件引用
└── docs/
├── marketing.md # 营销问题需要的定义与规则
├── finance.md # 财务问题需要的定义与规则
└── product.md # 产品问题需要的定义与规则按主题把以下内容放入相应文件:
- 公司与产品背景:产品服务的客户、业务流程和收入来源,帮助 Agent 理解数据所描述的业务。
- 业务术语:团队使用的概念、缩写及其含义,避免同一个词在不同问题中被误解。
- 特定主题的上下文:该主题的指标定义、计算方式、相关表和分析要求。
- 数据质量说明:缺失、延迟或统计范围变化,以及这些问题对结果的影响。
- 事件说明:促销、系统迁移等事件的发生时间和影响范围,供解释数据变化时参考。
RULES.md 保留共同要求和文件引用,详细内容按需读取,减少无关内容占用的 Token。同一个指标仍只保留一份定义,其他文件需要使用时引用它。
下面是一份 docs/marketing.md 示例,将客户分类、活动类型和指标定义放在同一个文件中,供 Agent 分析营销问题时查阅:
# 营销
## 业务定义
### 客户生命周期
- 线索客户:留有有效邮箱,尚未创建账号。
- 潜在客户:已创建账号,尚无购买记录。
- 购买客户:至少完成过一次购买。
- 活跃客户:最近 90 天内有购买记录。
- 流失客户:连续 180 天及以上没有活动,且不存在有效订阅。
### 活动类型
- 获客:吸引线索客户与潜在客户。
- 留存:面向已有客户。
- 召回:重新触达流失客户。
- 增购:面向有扩展购买需求的客户。
## SQL 指标定义
### 客户获取成本(CAC)
计算方式:获客活动总支出 / 获取客户数。
- campaigns 表中每个活动一行,marketing_spend 记录活动支出。
- customers.acquisition_campaign_id 记录客户来自哪个活动。
- 客户在活动开始至结束后 30 天内创建账号,计入该活动的获客客户。
- 以下查询使用 PostgreSQL 语法;没有获取客户时,CAC 返回空值。
```sql
WITH acquisition AS (
SELECT campaign_id, start_date, end_date, marketing_spend
FROM campaigns
WHERE campaign_type = 'acquisition'
), spend AS (
SELECT SUM(marketing_spend) AS amount FROM acquisition
), acquired AS (
SELECT COUNT(DISTINCT cu.customer_id) AS customer_count
FROM acquisition c
JOIN customers cu ON cu.acquisition_campaign_id = c.campaign_id
WHERE cu.created_at >= c.start_date
AND cu.created_at < c.end_date + INTERVAL '30 days'
)
SELECT spend.amount::numeric / NULLIF(acquired.customer_count, 0) AS cac
FROM spend CROSS JOIN acquired;
```这些分类、时间窗口和表字段仅用于展示文件写法,请按团队实际约定填写。指标已有定义时,直接引用对应文件;SQL 单独保存时,也可以在这里引用其路径。
自定义上下文
自定义上下文是你为项目补充的参考资料,用来记录数据库表结构和代码中没有说明清楚的内容,帮助 Agent 按团队的实际约定理解和使用数据。
上下文项目采用文件系统组织,可以按团队的需要扩展:
- 创建目录:按团队、主题或项目划分,不必沿用示例中的目录安排。
- 添加材料:除了同步得到的内容,也可以直接加入团队编写的说明、查询和参考资料,无须先配置一种新的同步来源。
- 选择格式:Markdown 适合说明文字,SQL 适合查询,YAML、JSON 和 CSV 可以保存配置或结构化参考数据。
自定义目录与文件
按团队、主题或项目组织材料即可。例如,在 my-project/docs/ 中添加营销文档、已确认的查询和参考报表说明:
my-project/
├── RULES.md
└── docs/
├── marketing.md
├── finance.md
├── product.md
├── reports.md
├── data-quality.md
└── queries/
└── acquisition-cost.sql在 RULES.md 中说明每类问题应该读取哪些文件。Agent 可以用 search 查找文件,用 grep 搜索内容,再用 read 读取所需文件。例如,营销文档可以引用 docs/queries/acquisition-cost.sql,供 Agent 在分析获客成本时参考。
常见内容
| 内容 | 示例 |
|---|---|
| 业务定义 | 活跃客户、流失、收入等指标的定义 |
| 查询示例 | 团队确认过的 SQL,以及使用条件 |
| 参考报表 | 可信报表的链接和对应统计范围 |
| 术语与常见问题 | 缩写、别名和常见问题的解释 |
| 数据质量说明 | 已知缺失、数据延迟、时区和使用限制 |
团队成员可以在对应目录继续补充材料,并在 RULES.md 或相关子规则文件中加入引用。按主题组织后,Agent 能围绕当前问题查阅文件,减少无关内容和 Token 消耗;同一指标仍只保留一个定义。已有 Cappy 实例按更新上下文的流程更新项目文件后,即可在对话中使用这些材料。