前言
本阶段聚焦于RAG知识库的落地。我们完成了中医古籍、现代文献、食疗等知识库的向量化构建,实现了基于语义的实时检索。每个Agent在执行前自动获取权威知识片段,有效杜绝了AI“杜撰”条文,为辨证、推荐提供了可溯源的依据,让诊疗结果更专业、可信。
全文将从项目架构、RAG 全流程、知识库构建、检索优化等方面,完整介绍系统设计与落地实现。
1. 项目概述
1.1 项目目标
- 基于中医经典与教材,构建专业、安全、可解释的中医养生助手系统
- 实现多智能体分工:古籍、辨证、现代文献、食疗建议、食疗安全审核、调养方案
- 通过 RAG 解决大模型辨证错误、食疗禁忌不安全等问题
1.2 系统架构
本项目采用多智能体 +增强型 RAG 混合检索架构:
- 前端:分步问诊、历史会话、诊疗报告、报告导出
- 后端:多智能体调度、会话记忆、增强型RAG 检索、向量数据库
- 知识库:中医古籍、十四五规划教材、中国药典、食疗食忌专籍
2. 核心技术:RAG 检索增强全流程
采用经典 RAG 架构 + 高级检索优化策略,并进行中医领域深度适配。
2.1 文档加载与预处理(Loader 层)
为适配中医多类型文献,我们实现统一文档加载器:
支持格式:TXT / JSON / MD / DOCX
功能:文本清洗、编码自适应、噪音去除
文件识别:遍历knowledge目录,按文件后缀匹配专属处理函数
内容加载:兼容多编码 / 多库读取文件原始文本
文本清洗:去除页码、冗余换行、乱码、页眉页脚等噪音
智能分块:按文档类型(古籍txt / 教材md / 药典doc)做层级 / 长度 / 语义分块
结构化输出:生成统一格式的知识块(含标题、来源、原文、标签等)
统一封装:所有格式最终输出为List[Dict],适配后续向量化检索
各格式文件详细处理逻辑:
- JSON 文件(.json):已预处理好的标准知识文件,直接读取复用
处理步骤:UTF-8 编码直接读取 JSON 数据
兼容两种格式:单个 JSON 对象 / JSON 数组
自动添加来源目录元数据,直接并入知识块列表
无清洗、无分块,原样保留结构化知识
适用场景:提前整理好的中医标准知识库、标注数据
- TXT 文件(.txt):中医古籍专用格式,纯文本无格式,需通用处理
处理函数:load_txt_file + load_ancient_txt + clean_ancient_text + split_with_overlap
处理步骤:
多编码兼容读取:自动尝试utf-8/gbk/gb2312/gb18030/latin-1,解决古籍乱码问题
古籍专属清洗:去除多余空格、连续换行、纯数字页码,保留原文结构
安全固定长度分块:512 字符 / 块 + 128 字符重叠,在句号 / 换行处智能断句,防止死循环
内存保护:最大分块数限制(500 块),避免溢出
结构化输出:标注「古籍」标签,生成「书名 + 段落号」标题
适用场景:专为古文优化,保留语义连贯性,兼容老旧编码文本
- Markdown 文件(.md):中医十四五规划教材专用格式,带层级标题结构
处理函数:load_md_textbook + clean_textbook_text + 层级拆分函数
处理步骤:通用 UTF-8 读取,去除 Markdown 标题标记(#)
教材专属清洗:删除目录、页码、冗余空行,只保留正文内容
四级智能层级分块:
- 一级:按第X章切分
- 二级:按第X节切分
- 三级:按一、/(一)小节切分
- 四级:按自然段落 + 1500 字符长度切分
结构化输出:生成章节>节>小节(段落)层级标题,绑定教材来源、多维度标签
关键特性:深度适配教材结构化内容,分块精准对应知识点,无格式冗余
- DOCX 文件(.docx)
核心定位:《中国药典》专用格式,带规范段落结构的 Word 文档
处理函数:load_yaodian_docx + parse_yaodian_entry + clean_yaodian_text
处理步骤:
依赖python-docx库读取段落文本
药典专属清洗:去除分页符、断行字符,合并被切断的语句
按单味药智能切分:识别「中文药名 + 拼音 + 拉丁名」固定格式,自动拆分每一味药
字段精准解析:提取【来源】【性味与归经】【功能与主治】【用法与用量】等标准字段
结构化输出:自动生成药名相关问题、白话解释、关键要点、禁忌标签(毒性 / 孕妇禁忌)
关键特性:药典定制化解析,将非结构化 Word 转为标准化中药知识库
2.2 中医知识库构建(Knowledge 层)
项目构建多个领域知识库:
agent_ancient
agent_diagnosis
agent_food_therapy
agent_food_inspection
agent_literature
agent_rehabilitation
为保证稳定构建,我们对大部头古籍做领域精简,仅保留领域相关内容。
2.3 混合检索策略(Retrieval 层)
为兼顾语义理解 + 关键词强匹配,我们使用:
- 向量检索:BAAI/bge-base-zh-v1.5(本地部署),负责语义相似度匹配
- 关键词检索:负责精准匹配食材名、古籍原文短语
- MMR 多路召回:在向量检索基础上引入最大边际相关性(MMR)算法,平衡相关性与多样性,避免检索结果冗余重复
融合策略:向量召回 + BM25 召回 + MMR 多样性召回 → 三路结果融合去重 → 送入重排层
MMR 核心价值:防止多个相似古籍条目挤占前列,保证知识来源的丰富性
2.4 检索优化策略(Enhance 层)
查询改写
口语提问 → 中医术语扩展
例:多梦 → 不寐、多梦、卧不安、心脾两虚
MMR 多样性重排
在检索召回阶段引入MMR(Maximal Marginal Relevance)算法:
核心公式:MMR=argmaxDi∈R∖S[λ⋅sim1(Di,Q)−(1−λ)⋅maxDj∈Ssim2(Di,Dj)]
λ 参数调优:λ=0.7 平衡相关性与多样性
作用:在保证检索结果与查询相关的前提下,惩罚与已选结果高度相似的内容,强制引入新信息
应用场景:
用户问"脾虚吃什么",传统检索返回10个"山药"相关结果;MMR 重排后返回:山药、莲子、茯苓、薏米、大枣等多样化食材
古籍检索时,避免只返回《千金要方》的相似段落,强制引入《食疗本草》《饮膳正要》等不同来源
3 .Rerank 精准重排
模型:BAAI/bge-reranker-base
作用:把最相关的证型、病因、食疗方、禁忌依据排到顶部,作为最终生成层的输入
两阶段重排流程:
MMR 多样性重排:在召回阶段做多样性过滤
Rerank 精准排序:对精简后的条目做深度相关性排序,输出 Top-10
3. 技术核心
三路召回 + 双重重排显著提升效果
向量负责语义理解
BM25 负责精准匹配
MMR 多路召回负责保证结果多样性
MMR 重排负责消除冗余
Rerank负责最终精准排序