告别向量模型!TreeSearch 让文档检索回归本质
一个革命性的文档检索系统,零依赖、毫秒级延迟、完全离线,不需要向量化。
GitHub 地址:https://github.com/shibing624/TreeSearch
你还在为向量模型买单吗?
如果你正在构建 RAG 系统,可能遇到过这些问题:
-
🤑 成本高昂:每次查询都要调用向量模型 API,账单不断增长 -
🐢 速度缓慢:向量化 + 相似度搜索,延迟动辄 100ms-1s -
💔 结构破坏:文档被分割成碎片,原有的层级关系荡然无存 -
🔗 依赖繁重:向量数据库、嵌入模型、各种中间件
有没有想过,这一切都不必要?
今天要介绍的 TreeSearch,就是这样一个”大道至简”的解决方案。
TreeSearch 是什么?
TreeSearch 是一个结构感知的文档检索系统,由开源开发者 shibing624 创建。它提供了一种完全不同于传统 RAG 的文档检索方案。
核心特点:
-
✅ 无需向量模型 – 不依赖任何嵌入模型 -
✅ 零依赖 – 核心功能仅依赖 Python 标准库 + SQLite -
✅ 毫秒级延迟 – 超快的搜索速度(< 50ms) -
✅ 保留文档结构 – 维持原始的层级关系和上下文
一句话总结:用关键词匹配 + BM25 排序,替代向量相似度搜索。
为什么传统 RAG 这么”重”?
传统 RAG 的流程
文档 → 分块 → 向量化 → 向量DB → 相似度搜索 → 结果
问题所在:
-
文档结构被破坏
-
一个完整的概念被分到多个块中 -
标题层级、逻辑关系丢失 -
结果缺乏上下文 -
成本高昂
-
每个文档都要调用向量模型 API -
OpenAI embedding:$0.02/1K tokens -
1000万文档库:$200,000+ 的向量化成本 -
速度慢
-
向量化本身需要时间 -
向量相似度搜索需要扫描大量向量 -
延迟:100ms-1s -
依赖繁重
-
需要向量数据库(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(1000万文档):
-
进程:8-16GB -
索引缓存:5-10GB -
查询缓存:2-5GB -
总计:15-31GB
TreeSearch(1000万文档):
-
Python 进程:500MB-1GB -
SQLite 缓存:1-2GB -
总计:1.5-3GB
内存节省:10 倍以上
支持的文件格式
TreeSearch 不仅支持 Markdown,还支持多种格式:
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
实际应用场景
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?
-
精确匹配需求强
-
法律查询需要精确定位条款号 -
向量相似度容易混淆相似条款 -
关键词匹配更符合法律逻辑 -
文档结构重要
-
法律有明确的层级:法律 → 编 → 章 → 条 → 款 → 项 -
TreeSearch 完整保留这个结构 -
查询结果包含完整的法律路径 -
更新频率低
-
法律相对稳定,不需要频繁重新向量化 -
TreeSearch 增量索引,只处理修改的文件
性能指标
索引性能
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
搜索性能
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
何时选择 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 就是你的答案。
相关资源
-
GitHub:https://github.com/shibing624/TreeSearch -
文档:项目 README 和示例代码 -
适用场景:代码搜索、文档检索、RAG 系统、法律库、医学库等
下一次构建检索系统时,不妨试试 TreeSearch。你可能会惊讶于它的简洁和高效。
夜雨聆风