【Code with SOLO】用 SOLO 从零开发飞书知识库智能索引 CLI 工具,让团队文档秒级可搜

【Code With SOLO】用 SOLO 从零开发飞书知识库智能索引 CLI 工具,让团队文档秒级可搜

一、摘要

我用 TRAE SOLO 从零开发了一个名为 knowledge-indexer 的飞书知识库智能索引 CLI 工具。它能定时扫描飞书知识库中的所有文档,自动调用 LLM 生成摘要和标签,构建本地 FAISS 向量索引,支持自然语言语义搜索。整个项目包含 8 个核心模块、约 800 行 Python 代码,从需求分析到最终交付仅用一次对话完成,并经过了全面测试排查,修复了 7 个潜在问题。

二、背景

我是一名开发者,日常工作中团队使用飞书知识库沉淀了大量技术文档、设计文档和会议记录。但随着文档数量增长,找文档变得极其困难——飞书自带的搜索只能做关键词匹配,无法理解语义,经常搜不到想要的内容。

我面临的痛点:

  • 知识库中有数百篇文档,手动翻找效率极低

  • 关键词搜索经常遗漏相关文档(比如搜"性能优化"找不到标题为"系统响应速度提升方案"的文档)

  • 新人入职时无法快速了解知识库全貌

  • 想用 AI 做语义搜索,但没有现成的工具

我决定用 TRAE SOLO 从零构建一个本地知识库索引工具,让团队文档支持自然语言搜索。

三、实践过程

3.1 任务拆解

拿到需求后,我没有直接让 SOLO 写代码,而是先做了清晰的任务拆解。SOLO 在理解需求后,主动帮我规划了以下子任务:

模块 职责 关键技术
config.py 配置管理 Pydantic Settings + .env
models.py 数据模型 Pydantic v2
feishu.py 飞书 API 客户端 lark-cli 封装
llm.py LLM 集成 OpenAI 兼容 API
indexer.py 索引构建器 FAISS 向量索引
search.py 搜索引擎 余弦相似度
scheduler.py 定时调度 schedule
cli.py CLI 入口 Click + Rich

3.2 技术选型

SOLO 主动询问了我的技术偏好,我选择了:

  • Python — 生态丰富,适合 CLI 和 NLP

  • FAISS — 轻量级向量索引,无需额外服务

  • OpenAI 兼容 API — 灵活切换不同 LLM 服务商

3.3 关键开发过程

第一步:飞书 API 调研

SOLO 自动调研了飞书开放平台的 API 文档和 lark-cli(飞书官方 CLI 工具),最终选择基于 lark-cli 封装飞书 API 调用,利用其内置的认证管理、安全保护和结构化输出能力,避免了手动处理 Token 和 API 签名的复杂度。

第二步:核心模块开发

SOLO 按照模块依赖关系依次开发,每个模块都经过语法检查后才进入下一个:

config.py → models.py → feishu.py → llm.py → indexer.py → search.py → scheduler.py → cli.py

第三步:全面测试排查

完成初版后,我让 SOLO 进行了全面测试排查。SOLO 设计了 11 项测试用例,覆盖:

  • 模块导入检查

  • 数据模型序列化/反序列化

  • FAISS 索引创建、更新、搜索

  • 边界情况(空内容、无效 JSON、维度不匹配等)

最终发现并修复了 7 个问题,包括 3 个高严重度 BUG:

问题 影响 修复方案
SearchEngine 无条件创建 LLM 客户端 tags/status 命令在无 API 时超时 改为延迟初始化
FAISS 索引每次写入都读写磁盘 大量文档时性能极差 改为内存维护,一次性保存
静态方法使用默认配置 data_dir 路径可能不一致 改为实例方法
LLM 返回 content=None 时崩溃 运行时异常 添加 None 保护
嵌入维度不匹配时 FAISS 崩溃 更换模型后不可用 添加维度校验和自动重建
定时任务重复注册 内存泄漏 添加 schedule.clear()
导入位置不规范 代码风格 移至顶层

第四步:编写 README 并推送到 GitHub

SOLO 编写了完整的 README.md(含架构图、命令参考、配置说明、飞书应用配置指南),并通过 gh CLI 创建了 GitHub 仓库并推送代码。

3.4 踩过的坑

  1. 飞书 API 分页问题:知识库节点列表是分页返回的,需要递归遍历所有子节点。lark-cli 的 --page-all 参数简化了分页处理,但子节点递归仍需自行实现。

  2. FAISS 索引更新策略:FAISS 的 IndexFlatIP 不支持删除向量,更新文档时需要重建整个索引。SOLO 设计了"标记删除 + 重建"的策略来处理。

  3. LLM 输出格式不稳定:标签生成期望返回 JSON 数组,但 LLM 有时会用 Markdown 代码块包裹。SOLO 设计了多层降级解析策略(JSON 解析 → 代码块提取 → 逗号分割)。

  4. lark-cli 输出格式适配:lark-cli 的 docs +fetch 返回的 JSON 结构与飞书 API 原始格式有所不同,需要适配 blocks 结构来提取文档文本内容。

四、成果展示

4.1 项目仓库

GitHub 仓库: GitHub - peachgreenti/knowledge-indexer: 飞书知识库自动索引工具 - 定时扫描文档、生成摘要标签、构建本地搜索索引、支持自然语言查询 · GitHub

4.2 功能演示

初始化配置:

$ knowledge-indexer init
✅ 配置模板已生成: .env

查看知识库空间:

$ knowledge-indexer spaces
┏━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┓
┃ 空间名称         ┃ 空间 ID                  ┃ 描述              ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━┩
│ 产品技术文档      │ 7123456789012345678      │ 技术团队知识库    │
└──────────────────┴──────────────────────────┴──────────────────┘

扫描构建索引:

$ knowledge-indexer scan
┏━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ 指标             ┃ 数量      ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ 总节点数         │ 256       │
│ 新增文档         │ 128       │
│ 更新文档         │ 12        │
│ 跳过文档         │ 116       │
│ 失败文档         │ 0         │
└──────────────────┴──────────┘

自然语言搜索:

$ knowledge-indexer search "如何设计一个高可用的微服务架构"
┌──────────────────────────────────────────────────────────┐
│ 1. 微服务架构设计实践                    相似度: 0.9234   │
│ 本文介绍了微服务架构的核心设计原则...                        │
│ 标签: 架构, 微服务, 高可用                                │
├──────────────────────────────────────────────────────────┤
│ 2. 服务治理与熔断降级                    相似度: 0.8756   │
│ 详细讲解了服务熔断、降级、限流的实现方案...                  │
│ 标签: 架构, 服务治理, 稳定性                              │
└──────────────────────────────────────────────────────────┘

交互式搜索:

$ knowledge-indexer search -i
🔍 搜索 > 数据库性能优化
🔍 搜索 > quit
再见!

定时扫描:

$ knowledge-indexer watch --interval 30
⏰ 定时扫描已启动,每 30 分钟扫描一次

4.3 项目结构

knowledge-indexer/
├── pyproject.toml          # 项目配置
├── .env.example            # 环境变量模板
├── README.md               # 完整文档
└── src/knowledge_indexer/
    ├── cli.py              # CLI 入口(7 个命令)
    ├── config.py           # 配置管理
    ├── models.py           # 数据模型
    ├── feishu.py           # 飞书 API 客户端
    ├── llm.py              # LLM 集成
    ├── indexer.py          # 索引构建器
    ├── search.py           # 搜索引擎
    └── scheduler.py        # 定时调度

4.4 技术亮点

  • 增量更新:基于文档编辑时间戳,仅处理新增和变更文档,避免重复处理

  • 延迟初始化:LLM 客户端仅在需要时创建,tags/status 等命令无需 API 连接

  • 维度校验:自动检测嵌入维度不一致并重建索引,防止更换模型后崩溃

  • 多层解析:LLM 输出格式不稳定时有多层降级策略

  • 内存优化:FAISS 索引在内存中维护,批量操作后一次性持久化

五、效果与总结

提效数据

维度 传统方式 使用 SOLO 后
项目开发时间 2-3 天 约 2 小时(一次对话)
代码行数 ~800 行,结构清晰
测试覆盖 手动测试 11 项自动化测试
文档编写 单独耗时 README 同步生成

SOLO 在开发流程中的角色

在整个开发过程中,SOLO 扮演了多个角色:

  1. 需求分析师 — 主动拆解任务、确认技术选型

  2. 技术调研员 — 自动调研飞书 API 文档,梳理调用链路

  3. 全栈开发者 — 按依赖顺序逐模块开发,每步验证

  4. 测试工程师 — 设计 11 项测试用例,发现 7 个 BUG

  5. 技术写作者 — 编写完整 README 和项目文档

  6. DevOps — 通过 gh CLI 创建仓库并推送代码

使用心得

  1. 任务拆解是关键:不要一次性丢给 SOLO 一个大需求。清晰的任务拆解和逐步验证,能让输出质量大幅提升。

  1. 主动测试排查非常有价值:初版代码看起来没问题,但 SOLO 的深度测试发现了 7 个潜在 BUG,其中 3 个是高严重度的。如果不做这步,上线后肯定会出问题。

  1. SOLO 的技术选型能力很强:飞书 API 文档比较分散,SOLO 不仅调研了 API 文档,还发现了飞书官方的 lark-cli 工具,最终选择了更优雅的封装方案,避免了手动处理 Token 和 API 签名。

  1. 代码质量超出预期:最终代码通过了 ruff lint 检查,模块划分清晰,类型注解完整,错误处理完善,不像是 AI 生成的"玩具代码"。

  1. 可复用的方法:这个项目的开发模式——“需求拆解 → 技术调研 → 逐模块开发 → 全面测试 → 文档编写 → 仓库推送”——可以复用到任何类似项目中。

项目仓库: GitHub - peachgreenti/knowledge-indexer: 飞书知识库自动索引工具 - 定时扫描文档、生成摘要标签、构建本地搜索索引、支持自然语言查询 · GitHub

标签:Code-with-SOLO #AI编程 #飞书 #知识库 #向量搜索