# 需求介绍
这段内容是给你看的，有助于你更清晰的了解开发目的，不用把我说的话都写到程序中：
- 知识库是用户上传的有参考价值的历史资料，我们要对知识库进行整理分析，以便之后生成标书技术方案的时候，可以参考之前的资料。

# 知识库功能
- 页面应该是类似文件夹的样子，用户可以创建文件夹，并在文件夹内上传.doc.docx.wps.pdf.md文档。
- 将用户上传的任何文档都整理成markdown格式保存，这个要落到文件，以免之后丢失。
- 调用AI将文档内容整理成json格式，包括标题、简述和原文。
```
[{
    "id":"",
    "title":"",
    "resume":"",
    "content":""
}]
- 解析最好能有真实的进度条
```

# 知识库用法（这个先不用实现，只是便于你理解）
- 在生成目录阶段，传入[{"title":""}]给AI参考
- 生成正文的编排阶段，把`[{
    "id":"",
    "title":"",
    "resume":""
    }]`传给AI，让AI在编排阶段，确定每个子节点是否能应用到知识库中的内容，如果能用到，记录ID
- 在生成正文的时候，通过ID找到资料的正文，然后以参考资料的形式提供给生成正文的AI

---



# 优化1



上传资料时，用AI分析成知识条目库，这是现在的方案。但是分析的条目不准确，且丢失了很多内容。
我希望在分析阶段做以下处理：

1. 先让AI提取出有意义的知识条目（舍弃掉封面、目录等对写标书无意义的条目）。
2. 给正文按自然段编号，提交给AI
3. 让AI输出每个条目对应的段落编号
4. 程序根据AI输出结果，处理知识条目

目前我能想到的困难点有两个：
1. 第三步，AI分析条目对应段落编号时可能会漏掉部分段落，即有部分段落不属于任何条目，如何能做到让AI尽可能分析出所有段落所对应的条目
2. 如果AI能分析出所有段落对应的条目，那输出的内容会不会太多，超过AI输出上限？如何让AI分步执行以保证分析全面

---

结合你的方案我设计的流程如下：

1. 用程序筛掉封面、目录、页码、空行、页眉页脚、签章页等，直接筛掉，无需标记，不提交给AI就行了
2. 筛后的文档按自然段/表格/列表块编号
   例如：`P000001`、`P000002`、`P000003`。

3. 提交给AI，先让AI输出知识条目数组，仅包含ID、标题和摘要
4. 在页面中展示出AI返回的知识条目，总共多少条，用户录入一批分析多少条（因为我们现在不知道AI的能力上限，一次性提取所有段落，可能会有大量丢失，一次提取的太少又会有资源浪费，所以这是开发调试阶段的一个临时页面，让我们更好的测试出AI的能力）
5. 按照用户输入的条数，将知识条目分批，循环询问AI，投入分好段的全文、提取的部分id、标题、摘要json数组。然AI给这些数组匹配段落，仅返回id+段落号就行
6. 所有批次都执行完后，进行一次检查，判断是否有遗漏的段落，如果有，将完整知识条目id、标题、摘要和遗漏段落提交给AI，让AI再匹配一次，这次让AI返回匹配好的id+段落，再额外返回一个推荐舍弃段落和一个新增知识条目，即让AI分析这些遗漏短时是否有必要保留，被遗漏是否是因为没有合适的知识条目，如果是就新增条目，如果段落质量低没必要保留，就放到舍弃段落。这样所有遗漏段落就都有明确的标识了。
7. 把第五步和第六步的结果合并，看是否还有遗漏段落，如果还有再重复执行一次第六步。最多重复执行一次，再有遗漏就直接标记为舍弃。
8. 把前面执行返回的所有结果拼接成完整json
9. 用程序根据json进行正文提取，形成最终结果

---

# 定版流程



方案可以成立，我按你的取舍调整后，建议定版为下面这个流程。

**定版流程**
1. 程序预处理  
   直接筛掉封面、目录、页码、空行、页眉页脚、签章页等明显无价值内容。  
   同时保存 `filtered_blocks.json`，只用于调试，不进入 AI 分析。

2. 生成 block  
   对筛选后的正文生成 `block` 编号，例如 `P000001`。  
   block 类型包括 `paragraph`、`table`、`list` 等。

3. 第一次 AI 抽取知识条目  
   输入编号后的全文 block。  
   AI 只返回候选知识条目：标题、摘要，不返回正文，不返回 ID。  
   程序生成 ID，例如 `K000001`。

4. 第二次 AI 补充知识条目  
   输入全文 block + 第一次抽取出的条目标题摘要。  
   让 AI 判断是否有遗漏主题，并返回补充条目。  
   程序合并两次抽取结果，再统一编号。

5. 页面展示调试入口  
   展示：总 block 数、候选知识条目数、用户输入“每批分析多少条”。  
   这是开发调试阶段非常有必要的，可以用来摸模型能力上限。

6. 分批匹配段落  
   每批提交：全文 block + 当前批次知识条目。  
   AI 只做强相关匹配，不要求覆盖全部 block。  
   AI 返回 `id + ranges`。

7. 检查遗漏 block  
   程序合并所有批次结果后，找出没有被任何知识条目引用的 block。

8. AI 兜底补漏  
   输入：完整知识条目列表 + 遗漏 block。  
   AI 必须把遗漏 block 分成三类：匹配已有条目、新增知识条目、推荐舍弃段落。

9. 最多补漏两轮  
   第一次补漏后再检查遗漏。  
   如果仍有遗漏，再重复一次补漏。  
   第二次后仍遗漏的 block 放入 `system_discarded_after_retry`。

10. 程序生成最终结果  
   程序合并所有 AI 返回结果，根据 block 编号回填正文，生成最终知识条目库。

**AI 返回格式建议**
分批匹配返回：

```json
{
  "matches": [
    {
      "id": "K000001",
      "ranges": [["P000012", "P000018"], ["P000026", "P000030"]]
    }
  ]
}
```

补漏返回：

```json
{
  "matches": [
    {
      "id": "K000001",
      "ranges": [["P000080", "P000083"]]
    }
  ],
  "new_items": [
    {
      "title": "项目风险应对措施",
      "summary": "描述风险识别、响应机制和应急处理流程",
      "ranges": [["P000090", "P000095"]]
    }
  ],
  "discarded": [
    {
      "ranges": [["P000100", "P000102"]],
      "reason": "内容为低价值格式文本"
    }
  ]
}
```

**我建议额外保留的处理报告**
- `total_blocks`
- `filtered_blocks_count`
- `candidate_items_count`
- `matched_blocks_count`
- `discarded_blocks_count`
- `system_discarded_after_retry_count`
- `new_items_from_recovery_count`
- `coverage_rate`

**需要注意的一点**
第 5 步“全文 block + 当前批次知识条目”会反复提交全文，成本和上下文压力较大，但开发调试阶段可以接受。等效果验证后，再优化成“全文摘要索引 + 相关 block 候选”也不迟。

**我的结论**
这个方案可以作为下一版知识库分析流程实施。关键点是：AI 只负责抽条目和匹配编号，程序负责编号、合并、补漏、回填、报告，避免正文丢失。