[teamai] Push 87 resource(s) from XingfenD

This commit is contained in:
2026-09-10 16:10:45 +08:00
parent 425c9c078a
commit 65c04def51
1314 changed files with 211681 additions and 0 deletions
@@ -0,0 +1,197 @@
# Kb Retriever Skill — 本地知识库检索
> 让 AI Agent 高效回答基于**本地多格式知识库目录**的问题。靠分层索引导航 + 渐进式检索完成,不把整文件塞进 context。
[English](./README.md) · [返回集合首页](../../README.zh-CN.md)
![Kb Retriever Skill](https://cdn.jsdelivr.net/gh/ConardLi/assets@main/imgs/kb-retriever-skill.webp)
## 这个 Skill 干什么
把 Agent 指向一个本地的混合格式知识库目录(Markdown / PDF / Excel 等),用自然语言提问。Skill 会:
1. **走分层索引**:沿着每层目录的 `data_structure.md`,判断答案大概率在哪些文件里。
2. **强制先学习再处理**:碰到 PDF / Excel 时,必须先读对应的 `references/*.md`,按推荐工具去处理,不允许蛮力直接读。
3. **渐进式检索**:先 `grep` 定位,再用 offset/limit 局部读取,避免整文件加载。
4. **最多 5 轮迭代**:每轮根据已读到的内容收紧关键词,直到信息足够回答。
---
## 核心特性
- ✅ **多格式支持**:Markdown / 文本、PDF、Excel——按文件类型可扩展。
- ✅ **分层索引**:每层目录都带一份 `data_structure.md`,组成一棵索引树供 Agent 导航。
- ✅ **渐进式检索**:grep 优先 + 窗口读取,从不整文件加载,大语料下也能控制住 token。
- ✅ **强制学习机制**:PDF / Excel 的处理必须先读对应 references。
- ✅ **有界迭代**:最多 5 轮,带明确终止条件。
---
## Skill 结构
```
skills/kb-retriever/
├── SKILL.md 主技能(frontmatter name: kb-retriever)
├── README.md / README.zh-CN.md 本文档
├── references/
│ ├── pdf_reading.md PDF 处理指南(pdftotext / pdfplumber / pypdf)
│ ├── excel_reading.md pandas 读取 Excel 的方法(nrows / dtype 等)
│ └── excel_analysis.md Excel 的过滤 / 聚合 / 派生指标方法
└── scripts/
└── convert_pdf_to_images.py 当文本抽取失败时把 PDF 转图像的兜底脚本
```
---
## 准备你的知识库
本 Skill **不自带**知识库——需要你自己提供。两种方式:
### 默认路径
在调用 Agent 的工作区根目录放一个 `knowledge/`:
```
your-project/
├── .claude/skills/ 或 .agents/skills/
│ └── kb-retriever/ ← 本 Skill 目录
└── knowledge/ ← ← ← 你的知识库
├── data_structure.md (根级索引,模板见下)
├── <领域-1>/
│ ├── data_structure.md
│ └── ...
└── <领域-2>/
└── ...
```
### 自定义路径
在你的问题里直接告诉 Agent,例如"用 `./docs` 这个目录回答"或"我的知识库在 `/data/kb`",Skill 会改用你指定的路径。
如果默认 `knowledge/` 不存在、用户也没指定路径,Skill 会主动询问而不是瞎猜。
### `data_structure.md` 模板
每个被索引的目录都建议放一份:
```markdown
# [目录名称]
## 用途
本目录是干什么的、什么场景下应该被检索。
## 文件说明
- file1.pdf —— 内容是什么、时间 / 版本范围
- file2.xlsx —— 表结构概要、关键列
- subdir/ —— 子目录用途
## 数据范围
时间范围、版本、数据来源等帮助 Agent 排序优先级的信息。
```
---
## 检索是怎么进行的
### 1. 分层索引导航
每层目录都先读 `data_structure.md`,挑出与问题最相关的子目录或文件,**再递归向下**——不会一次性铺开整棵树。
### 2. 先学习,再处理(PDF / Excel)
候选集合里出现 PDF 或 Excel 时,**必须**先读对应的 references:
```
✅ 读 references/pdf_reading.md / excel_reading.md / excel_analysis.md
✅ 理解推荐的工具与参数
✅ 用该工具完成转换 / 抽取
⏭️ 现在才能开始检索
```
禁止行为:
- ❌ 没读 `pdf_reading.md` 就直接处理 PDF
- ❌ 没读 `excel_reading.md` / `excel_analysis.md` 就直接处理 Excel
- ❌ 跳过文件处理直接对原始 PDF / Excel 检索
### 3. 渐进式检索
- 不读整文件。
- 先用 `grep` 定位关键词。
- 只读匹配处的窗口(`limit` ≈ 200–500 行)。
- 最多 5 轮,每轮收紧关键词。
### 4. 按文件类型选工具
| 格式 | 工具 | 注意 |
|---|---|---|
| Markdown / 文本 | `grep` + 窗口 `read_file` | 必须 offset/limit,不要整文件读。 |
| PDF | `pdftotext input.pdf output.txt` → 对结果文本 `grep` | **必须输出到文件**,不要走 stdout。超大 PDF 用 `-f / -l` 控制页范围。 |
| Excel | pandas,先 `nrows` 学结构,再带条件读取 | 先识别关键列(id / time / category),再查询。 |
### 5. 迭代循环
每轮:
1. 生成 / 更新关键词
2. 选择尚未充分检索的候选文件
3. 执行 grep / 局部读取
4. 分析返回的片段
5. 判断信息是否够回答 → 够则停止;不够进入下一轮。
终止条件:信息足够 ✅ 或 达到 5 轮 ⏱️。
---
## 最佳实践
### 推荐
1. 永远先从 `data_structure.md` 开始。
2. 碰到 PDF / Excel 之前**先**读匹配的 `references/*.md`。
3. 从最相关的文件开始检索,必要时才扩展范围。
4. 用 `offset` + `limit` 精确控制读取窗口。
5. PDF 先抽取到文件再 grep,**不要**把二进制塞进 context。
### 避免
1. ❌ 一次性读取大文件
2. ❌ 没读 references 就处理 PDF / Excel
3. ❌ `pdftotext input.pdf -`(stdout)—— 吃 token
4. ❌ 一次性读取整张 Excel
5. ❌ 在所有目录里盲目搜索
---
## 常见问题
**Q1:为什么要强制先读 `references/*.md`?**
保证 Agent 用对的工具配对的参数——否则它要么把整个文件塞进 context,要么挑了个慢 / 坏掉的方法。
**Q2:超大 PDF 怎么办?**
按页范围抽取(`pdftotext -f 1 -l 10`),对结果文本 grep,然后只读匹配页面附近的内容。
**Q3:知识库可以放别处吗?**
可以,问问题时明确告诉 Agent 路径即可("用 `/data/my-kb` 回答")。
**Q4:怎么提高检索准确率?**
使用更具体的关键词、缩小时间 / 文件名范围、用领域术语而非通用词汇。
---
## 工具依赖
本 Skill 假定 Agent 可以使用:
- `grep` —— 文本搜索
- `read_file` —— 带 offset / limit 的窗口读取
- `pdftotext`(poppler)或 `pdfplumber` —— PDF 文本抽取
- `pandas` —— Excel 读取 / 分析
`scripts/convert_pdf_to_images.py` 是兜底脚本,给那种文本抽取一无所获的扫描版 PDF 用。
---
## 许可证
MIT