用RAG技术做佛学戒律问答系统(进阶篇):分层架构与知识库升级
本文是《用RAG技术做佛学戒律问答系统》的进阶篇,建议先阅读入门篇了解基础概念。
项目背景
佛学戒律按身份分为比丘戒、沙弥戒、居士戒三大体系,条文数百条,术语密集且互有交叉。如果简单地把所有戒律丢进一个向量库,用户问"不杀生"时可能同时召回比丘戒和居士戒的条文,造成跨域混淆。
因此本项目的核心设计是按身份分层检索——用户选择自己的身份(居士/沙弥/比丘),系统只在对应向量库中检索,避免不同身份的戒律相互干扰。同时,戒律典籍多为 PDF 格式,手动逐条录入效率太低,需要一套自动解析流水线。
项目地址:https://github.com/moonlit-breeze/donglin_jielv_rag
技术架构
PDF典籍 → pdf_loader解析 → knowledge_base.json(结构化知识库)
↓
RecursiveCharacterTextSplitter 分块
↓
bge-small-zh 向量化(512维)
↓
┌──────────────┼──────────────┐
↓ ↓ ↓
比丘戒向量库 沙弥戒向量库 居士戒向量库
(Chroma/jie_lv) (Chroma/sha_mi) (Chroma/upasaka)
↓ ↓ ↓
用户提问 → 身份选择 → 分层检索 → Top-K 条戒律 → DeepSeek 生成回答
技术栈
| Embedding 模型 | BAAI/bge-small-zh | 开源中文轻量模型,512维,本地离线运行 |
| 向量数据库 | Chroma(langchain-chroma) | 轻量零配置,支持三层独立持久化 |
| 文本分割 | RecursiveCharacterTextSplitter | chunk_size=800,按段落/句子优先级切割 |
| 文本加载 | pypdf + 正则解析 | 支持 PDF 典籍导入,自动提取身份标签和出处 |
| LLM | DeepSeek Chat API | 中文能力强、性价比高,temperature=0.1 |
| CLI | rich | 彩色终端交互,支持身份选择 |
| Web 演示 | Gradio | 可视化界面,局域网可访问 |
核心实现
1. PDF 典籍自动解析(新增)
戒律典籍多为 PDF 格式,手写逐条录入效率太低。pdf_loader.py 实现了完整转换流水线:
- 逐页读取 PDF 文本(pypdf.PdfReader)
- 正则自动提取身份标签(【比丘戒】【沙弥戒】【居士戒】【比丘尼戒】)和出处(《四分律》等)
- 按身份分组归并连续页面为章节
- 输出统一 JSON 格式:{role, domain, source, content, category}
# pdf_loader.py 核心逻辑
text = page.extract_text()
match = re.search(r'【(比丘戒|沙弥戒|居士戒|比丘尼戒)】', text)
if match:
current_role = match.group(1)
2. 分层向量库架构(核心升级)
不再把所有戒律混在一起,而是按身份独立建库:
| 比丘戒 | jie_lv | ./chroma_db/jie_lv |
| 沙弥戒 | sha_mi | ./chroma_db/sha_mi |
| 居士戒 | upasaka | ./chroma_db/upasaka |
分层的好处:
- 用户选"居士戒"时只查居士库,不会误召回比丘戒条文
- 减少跨域噪声,提升检索精度
- 三层共享单例 BGE 模型,避免重复加载 95MB 模型
# vector_store.py 单例模式,强制离线
self._embedding = HuggingFaceEmbeddings(
model_name=model_name,
model_kwargs={"device": "cpu"},
encode_kwargs={"normalize_embeddings": True},
)
os.environ["HF_HUB_OFFLINE"] = "1"
3. 安全增强的检索与生成
检索侧:
- 相关度阈值过滤(MIN_RELEVANCE = 0.50):低于 0.5 的结果直接丢弃,实测戒律问题 0.55-0.67,无关问题 0.45-0.53
- 懒加载缓存:首次查询时才加载向量库,启动不卡顿
- MMR 算法去重,保证返回戒律多样化
生成侧(System Prompt 大幅增强):
- 参考资料能覆盖时严格依据知识库,不足时允许补充权威经典(需标注来源)
- 区分戒条适用条件——已受戒 vs 未受戒、性戒 vs 遮戒
- 强制双重来源标注:知识库引用 vs 外部补充
- 越界问题(如"怎么破戒不被发现")直接拒答
# generator.py 检索结果注入 Prompt
context = "\\n\\n—\\n".join([
f"[来源:{doc.metadata['source']},{doc.metadata['role']}]\\n{doc.page_content}"
for doc in docs
])
4. 一站式导入流水线
ingest.py 把 PDF 导入和向量库重建整合为一条命令:
python ingest.py data/your_sutra.pdf
自动完成:PDF 解析 → JSON 覆盖输出 → 清空旧库 → 按身份分组 → 重建三层向量库。
5. 双入口交互
| 命令行 | cli.py | 开发调试、本地快速查询 |
| Web 界面 | web_app.py | 可视化演示、局域网分享 |
CLI 支持身份选择(居士/沙弥/比丘/不限),超长问题提示成本警告,异常处理精细(认证/连接/超时/限流/API错误)。
Gradio Web 版提供身份下拉框、可调检索条数(1-5),并透明展示检索到的戒律原文片段。
知识库覆盖
当前 knowledge_base.json(153 行结构化数据)覆盖:
| 比丘戒 | 《四分律》比丘戒本(不杀、不盗等) |
| 沙弥戒 | 《沙弥十戒》(不杀生、不偷盗等) |
| 居士戒 | 五戒、八关斋戒、十善业道、菩萨戒(梵网经十重四十八轻) |
| 补充资料 | 净土持戒路线、印光大师/大安法师开示、东林寺戒律传承 |
效果展示
问:「比丘盗戒有哪些开缘条件?」
系统按比丘身份检索 → 从 jie_lv 向量库召回相关戒条 → DeepSeek 生成回答,标注每条引用出处(身份标签 + 原文来源),确保回答可溯源可验证。 
总结
这个项目验证了 RAG 在垂直领域知识问答中的可行性。相比纯 LLM 的三大优势:
适合法律、医学、佛学等对准确性和安全性要求高的领域。
下一步计划:支持更多律藏典籍 PDF 导入、优化 chunk 策略、加入重排序(Reranker)提升 Top-K 精度。


