乐于分享
好东西不私藏

告别向量模型!TreeSearch 让文档检索回归本质

告别向量模型!TreeSearch 让文档检索回归本质

一个革命性的文档检索系统,零依赖、毫秒级延迟、完全离线,不需要向量化。

GitHub 地址https://github.com/shibing624/TreeSearch


你还在为向量模型买单吗?

如果你正在构建 RAG 系统,可能遇到过这些问题:

  • 🤑 成本高昂:每次查询都要调用向量模型 API,账单不断增长
  • 🐢 速度缓慢:向量化 + 相似度搜索,延迟动辄 100ms-1s
  • 💔 结构破坏:文档被分割成碎片,原有的层级关系荡然无存
  • 🔗 依赖繁重:向量数据库、嵌入模型、各种中间件

有没有想过,这一切都不必要?

今天要介绍的 TreeSearch,就是这样一个”大道至简”的解决方案。


TreeSearch 是什么?

TreeSearch 是一个结构感知的文档检索系统,由开源开发者 shibing624 创建。它提供了一种完全不同于传统 RAG 的文档检索方案。

核心特点

  • ✅ 无需向量模型 – 不依赖任何嵌入模型
  • ✅ 零依赖 – 核心功能仅依赖 Python 标准库 + SQLite
  • ✅ 毫秒级延迟 – 超快的搜索速度(< 50ms)
  • ✅ 保留文档结构 – 维持原始的层级关系和上下文

一句话总结:用关键词匹配 + BM25 排序,替代向量相似度搜索。


为什么传统 RAG 这么”重”?

传统 RAG 的流程

文档 → 分块 → 向量化 → 向量DB → 相似度搜索 → 结果

问题所在

  1. 文档结构被破坏

    • 一个完整的概念被分到多个块中
    • 标题层级、逻辑关系丢失
    • 结果缺乏上下文
  2. 成本高昂

    • 每个文档都要调用向量模型 API
    • OpenAI embedding:$0.02/1K tokens
    • 1000万文档库:$200,000+ 的向量化成本
  3. 速度慢

    • 向量化本身需要时间
    • 向量相似度搜索需要扫描大量向量
    • 延迟:100ms-1s
  4. 依赖繁重

    • 需要向量数据库(Pinecone、Weaviate 等)
    • 需要维护嵌入模型
    • 需要处理向量维度、相似度阈值等复杂参数

TreeSearch 的”反向思维”

TreeSearch 采用完全不同的思路:

文档 → 解析树结构 → FTS5 关键词索引 → BM25 排序 → 结果

核心思想

1. 保留文档结构

对于 Markdown 文件,TreeSearch 会解析标题层级:

# 认证系统## 用户认证### 密码验证### 多因素认证## 权限管理### 角色定义### 权限分配

解析后的树结构:

认证系统 (level=0)├── 用户认证 (level=1)│   ├── 密码验证 (level=2)│   └── 多因素认证 (level=2)└── 权限管理 (level=1)    ├── 角色定义 (level=2)    └── 权限分配 (level=2)

2. 使用 SQLite FTS5

FTS5 是 SQLite 内置的全文搜索引擎:

  • 倒排索引:快速关键词查找
  • BM25 算法:相关性排序(同 Elasticsearch 使用的算法)
  • 零外部依赖:SQLite 自带,无需额外数据库
  • 毫秒级查询:O(log N) 复杂度

3. 结构感知的列设计

CREATEVIRTUALTABLE fts_nodes USING fts5(    title,           -- 权重: 5.0 (标题最重要)body,            -- 权重: 10.0 (正文最重要)    summary,         -- 权重: 2.0 (摘要)    code_blocks,     -- 权重: 1.0 (代码块)    front_matter     -- 权重: 2.0 (元数据));

可以精确搜索特定字段:title:authentication AND body:config


实际对比:TreeSearch vs Elasticsearch

部署成本

Elasticsearch 方案

  • 安装 Java JDK(500MB+)
  • 下载 Elasticsearch(1GB+)
  • 配置集群(主节点、数据节点、协调节点)
  • 年度成本:$60,000-110,000(服务器 + DBA)

TreeSearch 方案

  • pip install pytreesearch
  • 初始化对象,调用 build_index()
  • 年度成本:$600-1,200(存储)

成本对比:TreeSearch 约为 Elasticsearch 的 1/50 到 1/100

配置复杂度

Elasticsearch:需要理解 shards、replicas、analyzers 等复杂概念

{"settings": {"number_of_shards"5,"number_of_replicas"1,"analysis": {"analyzer": {"my_analyzer": {"type""custom","tokenizer""standard","filter": ["lowercase""stop""snowball"]        }      }    }  }}

TreeSearch:一行代码搞定

from treesearch import set_configset_config(    cjk_tokenizer='jieba',    fts_title_weight=10.0,    fts_body_weight=5.0)

搜索性能

场景
Elasticsearch
TreeSearch
单关键词查询
10-50ms
5-20ms
复杂布尔查询
50-200ms
10-50ms
1000万文档
100-500ms
50-200ms

内存占用

Elasticsearch(1000万文档):

  • 进程:8-16GB
  • 索引缓存:5-10GB
  • 查询缓存:2-5GB
  • 总计:15-31GB

TreeSearch(1000万文档):

  • Python 进程:500MB-1GB
  • SQLite 缓存:1-2GB
  • 总计:1.5-3GB

内存节省10 倍以上


支持的文件格式

TreeSearch 不仅支持 Markdown,还支持多种格式:

格式
解析方式
Markdown
基于 H1-H6 标题层级
Python
基于 AST(类、函数、方法)
多语言代码
TreeSitter(支持 40+ 种语言)
JSON
基于 JSON 结构
CSV
基于行列结构
XML
基于 XML 元素
PDF
可选(需要依赖)
DOCX
可选(需要依赖)
HTML
可选(需要依赖)

实际应用场景

1. 代码库搜索

在大型代码库中快速找到相关函数、类、文件:

from treesearch import TreeSearchts = TreeSearch("project_root/", db_path="code_index.db")# 搜索认证相关的代码results = ts.search("user authentication")# 结果包含:# - 函数定义位置# - 类和方法# - 调用关系# - 完整的代码上下文

2. 文档知识库检索

在 Markdown 文档、API 文档中搜索信息:

ts = TreeSearch("docs/", db_path="docs_index.db")# 搜索"如何配置认证"results = ts.search("认证配置")# 返回:# - 相关章节# - 完整的层级关系# - 上下文(前后章节)

3. RAG 系统的检索层

替代向量检索,作为 LLM 的检索增强:

from treesearch import TreeSearchts = TreeSearch("knowledge_base/", db_path="kb_index.db")defretrieve_context(query: str, top_k: int = 5):"""为 LLM 检索上下文"""    results = ts.search(query, top_k_docs=3, max_nodes_per_doc=top_k)# 组织成 LLM 可用的格式    context = "\n\n".join([f"[{r.doc_name}{r.title}\n{r.text}"for r in results    ])return context# 在 LLM 提示中使用query = "用户如何重置密码?"context = retrieve_context(query)prompt = f"根据以下信息回答问题:\n{context}\n\n问题:{query}"

优势

  • 零 API 成本(无向量模型调用)
  • 毫秒级检索(快速迭代)
  • 完整上下文(更好的 LLM 回答)

法条库场景:成本节省 1000 倍

如果你在构建法律知识库、医学文献库等超大规模系统,TreeSearch 的优势更加明显。

场景:1000万条法条库

传统 RAG 方案

向量化成本:1000万文档 × $0.02/1000 tokens = $200,000向量DB 成本:$1,000-10,000/月总成本:$200,000-$340,000(首年)+ $12,000-120,000/年(运维)

TreeSearch 方案

索引构建成本:单机 CPU 10-30 小时(无额外成本)SQLite 数据库:50-100GB(存储成本 $100-200)运维成本:增量更新自动化,成本接近零总成本:$100-200(存储)+ 人力维护(低)

成本节省1000 倍以上

为什么法条库特别适合 TreeSearch?

  1. 精确匹配需求强

    • 法律查询需要精确定位条款号
    • 向量相似度容易混淆相似条款
    • 关键词匹配更符合法律逻辑
  2. 文档结构重要

    • 法律有明确的层级:法律 → 编 → 章 → 条 → 款 → 项
    • TreeSearch 完整保留这个结构
    • 查询结果包含完整的法律路径
  3. 更新频率低

    • 法律相对稳定,不需要频繁重新向量化
    • TreeSearch 增量索引,只处理修改的文件

性能指标

索引性能

数据集规模
预期时间
瓶颈
100 个 Markdown 文件
< 1s
解析器分发
1,000 个代码文件
< 10s
AST 解析
5,000 个文档
< 60s
磁盘 I/O

搜索性能

文档数量
预期延迟
瓶颈
10 个文档
< 5ms
FTS5 查询
100 个文档
< 20ms
节点评分
1,000 个文档
< 100ms
文档聚合
5,000 个文档
< 200ms
并发评分

何时选择 TreeSearch?

✅ 强烈推荐使用 TreeSearch

  • 精确匹配需求强(法律、医学等)
  • 文档结构重要(法律层级、代码结构)
  • 成本敏感(初创公司、学术研究)
  • 离线部署(无网络环境)
  • 更新频率低(法律相对稳定)
  • 中文为主(jieba 分词优化)

❌ 不适合使用 TreeSearch

  • 超大规模(百亿+文档)
  • 需要复杂聚合(统计分析)
  • 需要语义理解(问答、推荐)
  • 需要多语言混合(向量模型更通用)

快速开始

安装

pip install pytreesearch

基本使用

from treesearch import TreeSearch# 1. 构建索引ts = TreeSearch("docs/", db_path="docs_index.db")# 2. 搜索results = ts.search("认证配置")# 3. 查看结果for result in results:    print(f"文档:{result.doc_name}")    print(f"标题:{result.title}")    print(f"内容:{result.text}")    print(f"相关性分数:{result.score}")

布尔查询

# AND 查询results = ts.search("民法典 AND 合同")# OR 查询results = ts.search("认证 OR 授权")# NOT 查询results = ts.search("authentication NOT oauth")# 短语匹配results = ts.search('"用户认证"')# 通配符results = ts.search("auth*")

总结

TreeSearch 代表了一种回归本质的检索哲学:

  • 不追求最先进的向量模型
  • 不依赖复杂的外部系统
  • 用最简单的方式解决最实际的问题

如果你的需求是

  • 快速、精确地从文档中找到相关信息
  • 保留文档的原始结构和上下文
  • 降低系统复杂度和运维成本

那么 TreeSearch 就是你的答案。


相关资源

  • GitHubhttps://github.com/shibing624/TreeSearch
  • 文档:项目 README 和示例代码
  • 适用场景:代码搜索、文档检索、RAG 系统、法律库、医学库等

下一次构建检索系统时,不妨试试 TreeSearch。你可能会惊讶于它的简洁和高效。