nbrag 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- nbrag-0.2.0/.gitignore +40 -0
- nbrag-0.2.0/AGENTS.md +130 -0
- nbrag-0.2.0/LICENSE +21 -0
- nbrag-0.2.0/PKG-INFO +324 -0
- nbrag-0.2.0/README.md +296 -0
- nbrag-0.2.0/config.example.yaml +18 -0
- nbrag-0.2.0/git_nbrag.py +45 -0
- nbrag-0.2.0/my_load_config.py +10 -0
- nbrag-0.2.0/nbrag/__init__.py +7 -0
- nbrag-0.2.0/nbrag/__main__.py +5 -0
- nbrag-0.2.0/nbrag/chunker.py +311 -0
- nbrag-0.2.0/nbrag/config.py +169 -0
- nbrag-0.2.0/nbrag/core.py +1059 -0
- nbrag-0.2.0/nbrag/loggers.py +4 -0
- nbrag-0.2.0/nbrag/server.py +594 -0
- nbrag-0.2.0/pub_pypi_nbrag.py +27 -0
- nbrag-0.2.0/pyproject.toml +42 -0
- nbrag-0.2.0/scripts/ingest_funboost.py +44 -0
- nbrag-0.2.0/scripts/ingest_funboost_one_md.py +25 -0
- nbrag-0.2.0/scripts/ingest_project.py +23 -0
- nbrag-0.2.0/scripts/start_http_rag_mcp.py +27 -0
- nbrag-0.2.0/skills/nbrag-workflow/SKILL.md +206 -0
- nbrag-0.2.0/skills/readme.md +1 -0
nbrag-0.2.0/.gitignore
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
*.egg-info/
|
|
7
|
+
*.egg
|
|
8
|
+
dist/
|
|
9
|
+
build/
|
|
10
|
+
*.whl
|
|
11
|
+
|
|
12
|
+
# Virtual environments
|
|
13
|
+
.venv/
|
|
14
|
+
venv/
|
|
15
|
+
env/
|
|
16
|
+
.env
|
|
17
|
+
|
|
18
|
+
# IDE
|
|
19
|
+
.idea/
|
|
20
|
+
.vscode/
|
|
21
|
+
*.swp
|
|
22
|
+
*.swo
|
|
23
|
+
*~
|
|
24
|
+
|
|
25
|
+
# OS
|
|
26
|
+
.DS_Store
|
|
27
|
+
Thumbs.db
|
|
28
|
+
|
|
29
|
+
# RAG data (user-generated, not tracked)
|
|
30
|
+
rag_db/
|
|
31
|
+
*.sqlite3
|
|
32
|
+
|
|
33
|
+
# Test data
|
|
34
|
+
tests/test_data/
|
|
35
|
+
|
|
36
|
+
# Auto-generated docs (by nb_ai_context)
|
|
37
|
+
*_all_docs_and_codes.md
|
|
38
|
+
|
|
39
|
+
# Distribution
|
|
40
|
+
*.tar.gz
|
nbrag-0.2.0/AGENTS.md
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# nbrag — AI Agent 指令
|
|
2
|
+
|
|
3
|
+
## 项目概览
|
|
4
|
+
|
|
5
|
+
Agentic RAG MCP Server。Python 3.11+,FastMCP,ChromaDB,SiliconFlow Embedding/Rerank。
|
|
6
|
+
|
|
7
|
+
架构:4 个核心模块,扁平包布局(无 `src/` 目录)。
|
|
8
|
+
|
|
9
|
+
| 模块 | 职责 |
|
|
10
|
+
|------|------|
|
|
11
|
+
| `nbrag/server.py` | 12 个 MCP 工具,CLI 入口 (`main()`) |
|
|
12
|
+
| `nbrag/core.py` | Embedding/Rerank API 调用,ChromaDB CRUD,文件导入 |
|
|
13
|
+
| `nbrag/chunker.py` | 文本切分,行号计算,Python AST 作用域解析 |
|
|
14
|
+
| `nbrag/config.py` | 配置加载:CLI > 环境变量 > YAML > 默认值 |
|
|
15
|
+
|
|
16
|
+
## 构建与测试
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
# 开发模式安装
|
|
20
|
+
pip install -e ".[dev]"
|
|
21
|
+
|
|
22
|
+
# 启动 MCP 服务(stdio 模式)
|
|
23
|
+
python -m nbrag
|
|
24
|
+
|
|
25
|
+
# 启动 MCP 服务(HTTP 模式)
|
|
26
|
+
python -m nbrag --transport streamable-http --port 9101
|
|
27
|
+
|
|
28
|
+
# 类型检查
|
|
29
|
+
mypy nbrag/
|
|
30
|
+
|
|
31
|
+
# 运行测试
|
|
32
|
+
python -m pytest tests/ -x -v
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## 代码规范
|
|
36
|
+
|
|
37
|
+
### 必须
|
|
38
|
+
|
|
39
|
+
- 数据导入函数使用 `ingest_` 前缀(不用 `import_`,避免与 Python 关键字混淆)。
|
|
40
|
+
- `core.py` 所有公开函数必须有文档字符串。
|
|
41
|
+
- MCP 工具描述必须用英文(AI 解析英文工具文档更准确)。
|
|
42
|
+
- MCP 工具文档字符串必须包含"后续工具"或"典型工作流"提示。
|
|
43
|
+
- 配置优先级:CLI 参数 > 环境变量 > YAML 文件 > 硬编码默认值。
|
|
44
|
+
- 存入 ChromaDB metadata 前,文件路径必须通过 `_normalize_path()` 统一格式。
|
|
45
|
+
- `chunker.py` 不允许依赖 ChromaDB 或 config 模块 —— 它只做文本处理。
|
|
46
|
+
|
|
47
|
+
### 禁止
|
|
48
|
+
|
|
49
|
+
- 禁止硬编码 API 密钥或敏感信息。
|
|
50
|
+
- 禁止使用 `import_` 作为函数前缀(用 `ingest_` 代替)。
|
|
51
|
+
- 禁止在文档字符串或 README 中使用 funboost 专属示例 —— 使用通用示例。
|
|
52
|
+
- 禁止向 `FastMCP()` 构造函数传 `port` 参数 —— 用 `mcp.settings.port` 动态设置。
|
|
53
|
+
- 禁止创建大而全的 MCP 工具加 `mode` 参数 —— 每个工具职责单一。
|
|
54
|
+
- 禁止从 `learn_agent` 导入任何内容 —— 本项目完全独立。
|
|
55
|
+
|
|
56
|
+
### 风格
|
|
57
|
+
|
|
58
|
+
- 可使用 Python 3.11+ 语法(match/case、`Self` 类型等)。
|
|
59
|
+
- 文档字符串:模块级用中文,MCP 工具描述用英文。
|
|
60
|
+
- 配置结构用 `dataclass`(不用 Pydantic,保持简洁)。
|
|
61
|
+
- MCP 工具参数用 `pydantic.Field`(FastMCP 要求)。
|
|
62
|
+
|
|
63
|
+
## 架构决策
|
|
64
|
+
|
|
65
|
+
### 双存储
|
|
66
|
+
|
|
67
|
+
ChromaDB 存向量化 chunks(有 overlap),用于语义搜索。
|
|
68
|
+
`raw_files/` 存原始文件快照(无 overlap),用于精确行号读取。
|
|
69
|
+
两者缺一不可,不要移除任何一个。
|
|
70
|
+
|
|
71
|
+
### 12 个工具,不是 3 个
|
|
72
|
+
|
|
73
|
+
每个 MCP 工具职责单一、参数最少。
|
|
74
|
+
一个大而全的 `rag_query(mode=...)` 会导致 AI 在参数选择上产生幻觉。
|
|
75
|
+
新增工具时遵循同样的模式:清晰的命名、聚焦的功能、文档字符串中的工作流提示。
|
|
76
|
+
|
|
77
|
+
### AST 作用域注入
|
|
78
|
+
|
|
79
|
+
Python 文件的 chunk 在 embedding 前注入 `[File:] [Scope:] [Sig:] [Lines:]` 头部。
|
|
80
|
+
这显著提升了代码查询的搜索精度。
|
|
81
|
+
逻辑在 `chunker.py` 中 —— 不要混入 `core.py`。
|
|
82
|
+
|
|
83
|
+
### Metadata 字段
|
|
84
|
+
|
|
85
|
+
每个 chunk 在 ChromaDB 中存储 8 个 metadata 字段:
|
|
86
|
+
`source`、`filename`、`doc_id`、`chunk_index`、`total_chunks`、`line_start`、`line_end`、`scope`。
|
|
87
|
+
|
|
88
|
+
不要删除或重命名这些字段 —— 下游工具依赖它们。
|
|
89
|
+
|
|
90
|
+
## 文件组织
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
nbrag/ # 包根目录
|
|
94
|
+
__init__.py # 仅版本号
|
|
95
|
+
__main__.py # python -m 入口
|
|
96
|
+
config.py # dataclass 配置 + YAML 加载
|
|
97
|
+
chunker.py # 文本切分 + AST(无存储依赖)
|
|
98
|
+
core.py # ChromaDB + Embedding + Rerank + ingest
|
|
99
|
+
server.py # 12 个 MCP 工具 + CLI main()
|
|
100
|
+
scripts/ # 用户便捷脚本(不属于包)
|
|
101
|
+
start_http_rag_mcp.py # 快速启动 HTTP 服务
|
|
102
|
+
ingest_project.py # 批量导入模板
|
|
103
|
+
ingest_funboost.py # 示例:导入 funboost 项目
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## 新增 MCP 工具步骤
|
|
107
|
+
|
|
108
|
+
1. 在 `core.py` 实现核心逻辑(返回 dict,不返回格式化字符串)。
|
|
109
|
+
2. 在 `server.py` 添加 MCP 包装器,使用 `@mcp.tool()` 装饰器。
|
|
110
|
+
3. 所有参数使用 `pydantic.Field`,写清晰的 `description`。
|
|
111
|
+
4. 文档字符串中包含工作流提示:下一步该调用什么工具。
|
|
112
|
+
5. 更新 `README.md` 中的工具表格。
|
|
113
|
+
6. 如果架构有变化,同步更新本文件的模块表格。
|
|
114
|
+
|
|
115
|
+
## 依赖
|
|
116
|
+
|
|
117
|
+
| 包 | 用途 | 版本 |
|
|
118
|
+
|----|------|------|
|
|
119
|
+
| `mcp` | FastMCP 服务框架 | >=1.0.0 |
|
|
120
|
+
| `httpx` | Embedding/Rerank HTTP 客户端 | >=0.24.0 |
|
|
121
|
+
| `chromadb` | 本地向量数据库 | >=0.4.0 |
|
|
122
|
+
| `langchain-text-splitters` | 代码感知文本切分 | >=0.2.0 |
|
|
123
|
+
| `pydantic` | MCP 工具参数校验 | >=2.0.0 |
|
|
124
|
+
| `pyyaml` | YAML 配置文件解析 | >=6.0 |
|
|
125
|
+
|
|
126
|
+
不要添加重型依赖(torch、transformers 等)—— embedding 通过 API 调用完成。
|
|
127
|
+
|
|
128
|
+
## python 解释器要求
|
|
129
|
+
|
|
130
|
+
ai运行此项目脚本时候使用我本地的python解释器 D:/ProgramData/miniconda3/envs/py312/python.exe d:/codes/nbrag/scripts/start_http_rag_mcp.py
|
nbrag-0.2.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 ydf
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
nbrag-0.2.0/PKG-INFO
ADDED
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: nbrag
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Agentic RAG MCP Server — 12 tools for AI-driven multi-round code retrieval that outperforms naive single-shot RAG
|
|
5
|
+
Project-URL: Homepage, https://github.com/ydf0509/nbrag
|
|
6
|
+
Project-URL: Repository, https://github.com/ydf0509/nbrag
|
|
7
|
+
Author-email: ydf <ydf0509@sohu.com>
|
|
8
|
+
License-Expression: MIT
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Keywords: agentic-rag,ai-agent,chromadb,code-search,embedding,mcp,mcp-server,rag
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
19
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
|
+
Requires-Dist: chromadb>=0.4.0
|
|
22
|
+
Requires-Dist: httpx>=0.24.0
|
|
23
|
+
Requires-Dist: langchain-text-splitters>=0.2.0
|
|
24
|
+
Requires-Dist: mcp>=1.0.0
|
|
25
|
+
Requires-Dist: pydantic>=2.0.0
|
|
26
|
+
Requires-Dist: pyyaml>=6.0
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
|
|
29
|
+
# nbrag
|
|
30
|
+
|
|
31
|
+
**Agentic RAG MCP Server** — 基于 MCP 协议的智能知识库,可导入代码、文档、小说等任意文本,尤其对 Python 项目有奇效(AST 自动解析 class/function 作用域,搜索精准度远超普通 RAG)。支持接入任何 MCP 兼容的 AI 产品:Cursor、OpenCode、Claude Code、Cherry Studio、Open WebUI、Dify、Cline 等,也可嵌入用户自己开发的具备 ReAct Loop 的 Agent 程序。
|
|
32
|
+
|
|
33
|
+
AI Agent 自主决定何时搜、搜什么、搜几次。12 个精心设计的互补 MCP 工具,吊打传统一轮检索的 Naive RAG。
|
|
34
|
+
|
|
35
|
+
## 为什么不是 Naive RAG?
|
|
36
|
+
|
|
37
|
+
| | Naive RAG | **Agentic RAG (本项目)** |
|
|
38
|
+
|---|-----------|----------------------|
|
|
39
|
+
| 检索触发 | 每次提问自动检索 top-5 注入 | AI 自主决定是否检索、用哪个工具 |
|
|
40
|
+
| 检索轮次 | 1 次 | 多轮(实测 m 次搜索 + n 次文件读取) |
|
|
41
|
+
| 查询构造 | 用户原文 | AI 重写查询、组合多种检索策略 |
|
|
42
|
+
| 工具种类 | 仅语义搜索 | 语义 + grep + AST 符号定位 + 原文读取 |
|
|
43
|
+
| 分析深度 | 浅层描述 | 完整的跨文件调用链图 |
|
|
44
|
+
| 准确度 | 浅层匹配,容易遗漏 | **显著优于 Naive RAG**,跨文件关联更完整 |
|
|
45
|
+
|
|
46
|
+
核心观点:**检索不是管道,是 Agent 的一种能力。**
|
|
47
|
+
|
|
48
|
+
## 快速开始
|
|
49
|
+
|
|
50
|
+
### 1. 安装
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# 方式 A: uvx (推荐,零安装)
|
|
54
|
+
uvx nbrag
|
|
55
|
+
|
|
56
|
+
# 方式 B: pip
|
|
57
|
+
pip install nbrag
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 2. 配置 API Key
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# SiliconFlow 免费 API Key (https://siliconflow.cn)
|
|
64
|
+
export NBRAG_API_KEY=sk-xxx
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 3. 在 Cursor / Claude Desktop 中配置 MCP
|
|
68
|
+
|
|
69
|
+
有三种配置方式,选一种即可:
|
|
70
|
+
|
|
71
|
+
#### 方式 A: uvx 启动(推荐,零安装)
|
|
72
|
+
|
|
73
|
+
```json
|
|
74
|
+
{
|
|
75
|
+
"mcpServers": {
|
|
76
|
+
"rag": {
|
|
77
|
+
"command": "uvx",
|
|
78
|
+
"args": ["nbrag"],
|
|
79
|
+
"env": {
|
|
80
|
+
"NBRAG_API_KEY": "sk-xxx"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
#### 方式 B: python 命令启动
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"mcpServers": {
|
|
92
|
+
"rag": {
|
|
93
|
+
"command": "python",
|
|
94
|
+
"args": ["-m", "nbrag"],
|
|
95
|
+
"env": {
|
|
96
|
+
"NBRAG_API_KEY": "sk-xxx"
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
#### 方式 C: HTTP 模式(推荐多项目共享)
|
|
104
|
+
|
|
105
|
+
> **为什么选 HTTP?** stdio 模式下每个 IDE 窗口会各起一个独立进程。如果你同时打开了几十个项目,
|
|
106
|
+
> 就是几十个 Python 进程 + 几十份 ChromaDB 内存。HTTP 模式只跑一个服务进程,所有 IDE 共享同一个端口,
|
|
107
|
+
> 省内存,也避免多进程并发写同一个 ChromaDB 数据库的锁冲突。
|
|
108
|
+
|
|
109
|
+
先启动服务:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# uvx 方式
|
|
113
|
+
uvx nbrag --transport streamable-http --port 9101
|
|
114
|
+
|
|
115
|
+
# 或 python 方式
|
|
116
|
+
python -m nbrag --transport streamable-http --port 9101
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
再配置客户端:
|
|
120
|
+
|
|
121
|
+
```json
|
|
122
|
+
{
|
|
123
|
+
"mcpServers": {
|
|
124
|
+
"rag": {
|
|
125
|
+
"type": "http",
|
|
126
|
+
"url": "http://localhost:9101/mcp"
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 4. 导入知识库
|
|
133
|
+
|
|
134
|
+
#### 方式 A: 让 AI 自动导入
|
|
135
|
+
|
|
136
|
+
告诉 AI:
|
|
137
|
+
|
|
138
|
+
> "帮我把 D:/codes/my_project 导入到 myproject 知识库,然后搜索 XXX"
|
|
139
|
+
|
|
140
|
+
AI 会自动调用 `nbrag_add_document` 导入,再用 `nbrag_search` + `nbrag_grep` + `nbrag_find_definition` 多轮检索回答你的问题。
|
|
141
|
+
|
|
142
|
+
#### 方式 B: 手动脚本导入(推荐大项目)
|
|
143
|
+
|
|
144
|
+
手动导入更灵活——可以精确指定目录、过滤文件后缀、控制 chunk 参数:
|
|
145
|
+
|
|
146
|
+
```python
|
|
147
|
+
from nbrag.core import batch_ingest
|
|
148
|
+
|
|
149
|
+
batch_ingest(
|
|
150
|
+
paths=[
|
|
151
|
+
"D:/codes/my_project/src", # 只导入 src 目录
|
|
152
|
+
"D:/codes/my_project/docs", # 加上文档目录
|
|
153
|
+
],
|
|
154
|
+
collection_name="my_project",
|
|
155
|
+
file_extensions=[".py", ".md"], # 只要 Python 和 Markdown 文件
|
|
156
|
+
delete_first=True, # 清空旧数据重新导入
|
|
157
|
+
verbose=True,
|
|
158
|
+
)
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
参见 `scripts/ingest_project.py` 获取完整示例。
|
|
162
|
+
|
|
163
|
+
## 12 个工具
|
|
164
|
+
|
|
165
|
+
| 类别 | 工具 | 功能 |
|
|
166
|
+
|------|------|------|
|
|
167
|
+
| **导入** | `nbrag_add_document` | 导入文件/目录(自动分块 + Embedding + 缓存原文) |
|
|
168
|
+
| **语义检索** | `nbrag_search` | 向量搜索 + Rerank 精排 |
|
|
169
|
+
| **语义检索** | `nbrag_search_and_fetch` | 搜索 + 自动取源码(省一次 round-trip) |
|
|
170
|
+
| **精确检索** | `nbrag_grep` | 关键词/正则搜索(和语义搜索互补) |
|
|
171
|
+
| **精确检索** | `nbrag_find_definition` | AST 精确定位 class/function 完整定义 |
|
|
172
|
+
| **上下文扩展** | `nbrag_get_file_chunks` | 按 chunk 分页浏览文件 |
|
|
173
|
+
| **上下文扩展** | `nbrag_get_raw_file` | 读取无 overlap 的原始文件 |
|
|
174
|
+
| **上下文扩展** | `nbrag_get_adjacent_chunks` | 获取相邻 chunks |
|
|
175
|
+
| **上下文扩展** | `nbrag_get_chunks_by_lines` | 按行号范围取 chunks |
|
|
176
|
+
| **管理** | `nbrag_list` | 列出知识库所有文档 |
|
|
177
|
+
| **管理** | `nbrag_delete` | 删除指定文档 |
|
|
178
|
+
| **管理** | `nbrag_stats` | 知识库统计信息 |
|
|
179
|
+
|
|
180
|
+
### Skill 指南(教 AI 打组合拳)
|
|
181
|
+
|
|
182
|
+
12 个工具暴露给 AI 后,AI 只知道"能调什么",不知道"按什么顺序调"。
|
|
183
|
+
项目附带一个 `skills/rag-workflow/SKILL.md` 文件,把最佳检索流程写成 AI 能读懂的指南。
|
|
184
|
+
|
|
185
|
+
**使用方法**:复制到你项目的 Skills 目录,AI 就自动学会多轮检索策略。
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
# Cursor
|
|
189
|
+
cp -r skills/rag-workflow/ .cursor/skills/
|
|
190
|
+
|
|
191
|
+
# Claude Code
|
|
192
|
+
cp -r skills/rag-workflow/ .claude/skills/
|
|
193
|
+
|
|
194
|
+
# nb_agent
|
|
195
|
+
cp -r skills/rag-workflow/ .nb_agent/skills/
|
|
196
|
+
|
|
197
|
+
# OpenAI Codex / Gemini CLI(跨平台标准)
|
|
198
|
+
cp -r skills/rag-workflow/ .agents/skills/
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
Skill 内容包括:发现(nbrag_stats)→ 检索(4 种策略选择)→ 深入(4 种上下文获取方式)→ 多轮重试策略。
|
|
202
|
+
|
|
203
|
+
### AI 推荐的深度分析工作流
|
|
204
|
+
|
|
205
|
+
```
|
|
206
|
+
1. nbrag_search → 找到相关文件和大致位置
|
|
207
|
+
2. nbrag_grep → 精确定位类名/方法名/常量(语义搜索漏掉的)
|
|
208
|
+
3. nbrag_find_definition → 获取完整的类/函数定义源码
|
|
209
|
+
4. nbrag_get_raw_file → 读取完整源码验证细节
|
|
210
|
+
5. 跨文件追踪:发现未知符号时重复 2-4 步
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## 向量数据库 Metadata 字段
|
|
214
|
+
|
|
215
|
+
每个 chunk 入库时除了 embedding 向量,还存储了丰富的 metadata。这是很多 RAG 方案忽略的关键设计——有了 metadata,才能实现按文件过滤、按行号定位、按作用域追踪等高级能力。
|
|
216
|
+
|
|
217
|
+
| 字段 | 类型 | 示例 | 说明 |
|
|
218
|
+
|------|------|------|------|
|
|
219
|
+
| `source` | str | `D:/codes/myproject/core.py` | 文件绝对路径(跨平台统一格式) |
|
|
220
|
+
| `filename` | str | `core.py` | 文件名(方便 `filter_filename` 过滤) |
|
|
221
|
+
| `doc_id` | str | `a1b2c3d4e5f6` | 路径 MD5 前 12 位(文件唯一标识) |
|
|
222
|
+
| `chunk_index` | int | `3` | 当前 chunk 在文件中的序号(0-based) |
|
|
223
|
+
| `total_chunks` | int | `15` | 该文件的总 chunk 数 |
|
|
224
|
+
| `line_start` | int | `45` | chunk 对应的起始行号(1-based) |
|
|
225
|
+
| `line_end` | int | `78` | chunk 对应的结束行号 |
|
|
226
|
+
| `scope` | str | `MyClass.my_method` | Python AST 解析的作用域(非 Python 文件为空) |
|
|
227
|
+
|
|
228
|
+
**chunk 头部注入示例**(embedding 前自动添加,提升搜索精度):
|
|
229
|
+
|
|
230
|
+
```
|
|
231
|
+
# [File: D:/codes/myproject/core.py] [Class: class MyClass(Base)] [Method: process] [Sig: def process(self, data: dict)] [Lines: 45-78]
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
有了这些 metadata + 头部注入,`nbrag_search` 搜 "process 方法" 就能精准命中 `MyClass.process`,而不是随机匹配到别的 "process" 字符串。
|
|
235
|
+
|
|
236
|
+
## 配置
|
|
237
|
+
|
|
238
|
+
### 环境变量
|
|
239
|
+
|
|
240
|
+
| 变量 | 必填 | 默认值 | 说明 |
|
|
241
|
+
|------|------|--------|------|
|
|
242
|
+
| `NBRAG_API_KEY` | **是** | | Embedding/Rerank API Key |
|
|
243
|
+
| `NBRAG_BASE_URL` | 否 | `https://api.siliconflow.cn/v1` | API Base URL |
|
|
244
|
+
| `NBRAG_EMBEDDING_MODEL` | 否 | `BAAI/bge-m3` | Embedding 模型 |
|
|
245
|
+
| `NBRAG_RERANK_MODEL` | 否 | `BAAI/bge-reranker-v2-m3` | Rerank 模型 |
|
|
246
|
+
| `NBRAG_DB_PATH` | 否 | `./rag_db` | ChromaDB 存储路径 |
|
|
247
|
+
| `NBRAG_CHUNK_SIZE` | 否 | `1500` | 分块大小 |
|
|
248
|
+
| `NBRAG_CHUNK_OVERLAP` | 否 | `200` | 分块重叠 |
|
|
249
|
+
|
|
250
|
+
### 配置文件 (可选)
|
|
251
|
+
|
|
252
|
+
支持 YAML 配置文件,自动搜索顺序:
|
|
253
|
+
1. `./nbrag_config.yaml`
|
|
254
|
+
2. `~/.config/nbrag/config.yaml`
|
|
255
|
+
|
|
256
|
+
```yaml
|
|
257
|
+
embedding:
|
|
258
|
+
api_key: ${NBRAG_API_KEY}
|
|
259
|
+
base_url: https://api.siliconflow.cn/v1
|
|
260
|
+
model: BAAI/bge-m3
|
|
261
|
+
|
|
262
|
+
rerank:
|
|
263
|
+
model: BAAI/bge-reranker-v2-m3
|
|
264
|
+
|
|
265
|
+
storage:
|
|
266
|
+
db_path: ./rag_db
|
|
267
|
+
|
|
268
|
+
chunking:
|
|
269
|
+
chunk_size: 1500
|
|
270
|
+
chunk_overlap: 200
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### CLI 参数
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
nbrag --help
|
|
277
|
+
nbrag --transport stdio # 默认
|
|
278
|
+
nbrag --transport streamable-http # HTTP 模式
|
|
279
|
+
nbrag --api-key sk-xxx # 直接传 API Key
|
|
280
|
+
nbrag --db-path /data/rag # 指定存储路径
|
|
281
|
+
nbrag --config ./my_config.yaml # 指定配置文件
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## 设计决策
|
|
285
|
+
|
|
286
|
+
### 为什么 chunk_size = 1500?
|
|
287
|
+
|
|
288
|
+
BGE-M3 的最佳召回区间是 700-3000 字符。如果 chunk_size 设太小(如 500),一个 8000 字符的大类会被切成 40+ 块,语义搜索碎片化严重、召回率下降。1500 是实测平衡点,大多数函数/类能完整落入 1-2 个 chunk 内。
|
|
289
|
+
|
|
290
|
+
即使 chunk 切分不完美,Agentic RAG 也不会像 Naive RAG 那样只用碎片凑答案。AI 会自主判断当前 chunk 信息不足,然后调用 `nbrag_get_raw_file` 读完整源码、用 `nbrag_find_definition` 精确定位类/函数定义、用 `nbrag_grep` 全文搜索关键词,多轮组合直到信息充分。这正是 "检索是 Agent 的能力" 而非固定管道的意义。
|
|
291
|
+
|
|
292
|
+
### 为什么双存储?
|
|
293
|
+
|
|
294
|
+
- **ChromaDB**:存向量 chunks(有 overlap),用于语义搜索
|
|
295
|
+
- **raw_files/**:存原始文件快照(无 overlap),用于精确行号读取
|
|
296
|
+
|
|
297
|
+
AI 经常需要看完整源码,如果只有 chunks 会有 overlap 重复,浪费 token 还容易困惑。
|
|
298
|
+
|
|
299
|
+
### 为什么 AST scope 注入?
|
|
300
|
+
|
|
301
|
+
每个 chunk 的 embedding 前注入 `[File: path] [Scope: MyClass.my_method] [Sig: def my_method(self, x)]`。
|
|
302
|
+
这样搜索 "process 方法" 时更容易命中 `class DataProcessor` 下的 `def process(self, data)`,而不是随机匹配到别的 "process" 字符串。
|
|
303
|
+
|
|
304
|
+
### 为什么 12 个工具而不是 3 个?
|
|
305
|
+
|
|
306
|
+
MCP 工具设计原则:**职责单一、参数最少、docstring 引导下一步**。
|
|
307
|
+
|
|
308
|
+
一个大而全的 `rag_query(mode="search|grep|raw|...")` 会导致 AI 幻觉——它不知道该传什么参数。
|
|
309
|
+
拆成 12 个小工具后,每个工具参数清晰,AI 的调用准确率大幅提升。
|
|
310
|
+
|
|
311
|
+
## 技术栈
|
|
312
|
+
|
|
313
|
+
| 组件 | 选择 |
|
|
314
|
+
|------|------|
|
|
315
|
+
| Embedding | SiliconFlow BGE-M3(免费、中文最强之一) |
|
|
316
|
+
| Rerank | SiliconFlow BGE-Reranker-v2-m3(免费) |
|
|
317
|
+
| 向量数据库 | ChromaDB(本地持久化,无需外部服务) |
|
|
318
|
+
| 分块 | LangChain TextSplitter + 自研 AST 增强 |
|
|
319
|
+
| MCP | FastMCP (Python) |
|
|
320
|
+
| 传输 | stdio / streamable-http / SSE |
|
|
321
|
+
|
|
322
|
+
## License
|
|
323
|
+
|
|
324
|
+
MIT
|