这道题其实问的是,当[[RAG]]落到医疗、法律这种高价值、高风险的垂直领域时,到底要怎么搭一条能真正跑通的链路。核心已经不是通用RAG那套“文档切一切、向量存一存、召回来拼Prompt”了,而是怎么把领域知识的结构化、查询的复杂意图、还有最终答案的可靠性串起来。
我先说知识处理这块,这是最花功夫的。通用RAG里往往一刀切[[Chunk]],但垂直领域不行。我的做法是把数据分成三层来对待:结构化数据,比如药品库、法条,直接做成[[Knowledge Graph]],存实体和关系;半结构化数据,像病历模板、合同范本,我会抽成标准字段,比如病历里的主诉、现病史,合同里的当事人、标的额;非结构化数据,比如医学文献、裁判文书,才做语义切块。切块策略也得按场景来,医疗我倾向按就诊流程切,比如主诉、检查、诊断、治疗各一段;法律按争议焦点切,比如“是否构成违约”“赔偿金额计算”各一段。这样检索时命中率更高。
再一个,领域[[Embedding]]不能直接用通用模型。我会拿PubMed或者裁判文书继续做[[SFT]],或者构造对比学习数据,让“心肌梗死”和“MI”映射到相近向量。这是个大前提,如果直接拿通用Embedding去搜,专有名词匹配会非常差。
说回检索策略。我倾向于多路召回加精排,而不是单靠向量。具体来说,我会开三路:第一路是稠密向量,用微调后的Embedding配合[[Faiss]]做[[ANN]],解决语义相似但字面不同的问题;第二路是[[BM25]],走精确关键词,专治药品名、法条序号这种必须精确匹配的;第三路是知识图谱,走[[实体链接]]加[[Relation Extraction]],比如用户问“阿司匹林和布洛芬能一起吃吗”,知识图谱直接返回药物相互作用关系。三路结果用RRF融合,简单有效。如果只靠向量,精确匹配会漏;只靠关键词,同义表达会漏,说白了,真正落地都是混合着上。
查询理解这块也不能省。我会先做意图识别,区分用户是想查诊断建议还是用药禁忌,或者查法条还是找类案。然后做Query扩展,用领域词典把“新冠”扩展成“COVID-19/新型冠状病毒肺炎”。如果意图置信度低,我会主动追问,比如“您指的是刑法第X条还是民法第X条?”,这样能减少后面检索的噪音。
生成阶段,我特别关注事实性校验和引用溯源。我会强制模型输出时带上来源索引,用户能点过去看原文。同时做实体一致性检查,医疗场景用UMLS知识库,看生成结果里的药物、症状是不是匹配;法律场景用法条时效库,过滤掉已废止的条款。这里有个坑:如果知识库里混了过时的诊疗指南或废止的法条,生成结果直接会错。所以上线前我会特别关注知识库的版本管理和权威性标注,比如给每条数据打上“来源等级”和“有效期”,检索时按需过滤。
最后,落地后我会建一个bad case闭环。线上收集错误案例,归因到是检索漏召、排序错位还是生成[[幻觉]],然后针对性补数据或调策略。
另外,当用户问“我该用什么药”这种涉及诊断的问题时,我倾向在系统层面设置边界:直接拒答,或者输出前置风险提示,并触发人工复核。这个边界怎么划、怎么落地,其实挺值得细聊的。
所以整体上,我更愿意把垂直领域RAG看成一套“知识结构化+多路检索+强校验”的组合,而不是单纯的检索加生成流水线。