欢迎光临
我们一直在努力

用RAG技术做佛学戒律问答系统(进阶篇):分层架构与知识库升级

用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. 分层向量库架构(核心升级)

不再把所有戒律混在一起,而是按身份独立建库:

身份Chroma 集合持久化目录
比丘戒 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 的三大优势:

  • 回答有据可查:每条引用指向具体戒律原文,不易幻觉
  • 分层安全隔离:按身份分库检索,杜绝跨域混淆
  • 离线可部署:BGE 模型本地运行,知识库完全可控
  • 适合法律、医学、佛学等对准确性和安全性要求高的领域。

    下一步计划:支持更多律藏典籍 PDF 导入、优化 chunk 策略、加入重排序(Reranker)提升 Top-K 精度。

    赞(0)
    未经允许不得转载:171主机测评 » 用RAG技术做佛学戒律问答系统(进阶篇):分层架构与知识库升级
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址