基于RAG的智能法律咨询知识库搭建——从零到精准检索的实战指南

基于RAG的智能法律咨询知识库搭建——从零到精准检索的实战指南

编程文章jaq1232025-05-20 22:45:583A+A-


一、项目背景与需求

场景描述
某法律科技公司希望构建一个智能法律咨询系统,用户输入问题(如“劳动合同解除的赔偿标准?”),系统需快速检索相关法律条文、司法解释及典型案例,生成结构化答案。

核心痛点

  1. 法律文本专业性强,需精准匹配条款细节(如“《劳动合同法》第47条”)。
  2. 相似问题表述多样(如“辞退补偿” vs “解除合同赔偿”)。
  3. 法律更新频繁,需支持动态知识库更新。

二、知识库构建全流程

1. 数据准备与清洗

(1) 数据来源

  • 结构化数据
    • 国家法律法规数据库(XML格式,含条款层级)
    • 裁判文书网公开判决书(JSON格式,含案情与法条引用)
  • 非结构化数据
    • 法律解读文章(PDF/网页)
    • 律所内部案例汇编(Word文档)

(2) 数据清洗

# 示例:裁判文书关键信息提取  
import json  

def extract_judgment_info(file_path):  
    with open(file_path, 'r', encoding='utf-8') as f:  
        data = json.load(f)  
    return {  
        "case_id": data["caseNumber"],  
        "laws": [law["article"] for law in data["citedLaws"]],  # 提取引用法条  
        "outcome": data["judgmentResult"],  
        "keywords": data["keywords"]  
    }  

清洗策略

  • 过滤无效文书(如未公开详细内容的判决)
  • 标准化法条引用格式(如“劳动法47条” → “《劳动合同法》第四十七条”)

2. 文本分块与元数据增强

(1) 分块策略

  • 法律条款:按“法律-章-条-款”四级结构拆分,保留层级关系
《劳动合同法》/第四章/第三十六条/用人单位与劳动者协商一致,可以解除劳动合同。
  • 案例文书:按“案情描述-争议焦点-裁判结果”分块,附加案由标签

(2) 元数据设计

字段

示例值

用途

doc_type

law / case / article

区分数据类型

law_name

《劳动合同法》

快速过滤

article_num

第四十七条

精确检索

effective_date

2023-01-01

时效性过滤


3. Embedding模型优化

(1) 领域适配微调

  • 基模型选择:BAAI/bge-base-zh-v1.5(中文法律文本表现优异)
  • 微调数据:50万条法律QA对(如“问题: 工伤赔偿标准?答案: 依据《工伤保险条例》第三十条...”)

微调代码核心片段

from sentence_transformers import SentenceTransformer, InputExample, losses  
from torch.utils.data import DataLoader  

model = SentenceTransformer('BAAI/bge-base-zh-v1.5')  
train_examples = [InputExample(texts=[q, a]) for q,a in qa_pairs]  # QA对作为正样本  
train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=32)  
train_loss = losses.MultipleNegativesRankingLoss(model)  
model.fit(train_objectives=[(train_dataloader, train_loss)], epochs=3)  

(2) 多维度Embedding融合

  • 文本语义向量(768维)
  • 法律实体向量(通过法律NER提取的实体词嵌入)
  • 时效性权重(近3年文档权重+0.2)

融合公式

Final Embedding=0.7×Semantic+0.2×Entity+0.1×TimeWeightFinal Embedding=0.7×Semantic+0.2×Entity+0.1×TimeWeight


4. 检索策略设计

(1) 混合检索架构

(2) 查询扩展实现

def legal_query_expansion(query):  
    prompt = f"""  
    你是一名法律专家,请生成以下问题的3种专业表述:  
    原始问题:{query}  
    要求:  
    1. 包含法律条文编号(如《民法典》第XXX条)  
    2. 使用不同术语(如“赔偿”改为“补偿”)  
    """  
    expansions = llm.generate(prompt)  
    return [query] + expansions  

(3) 重排序模型

  • 使用领域专用重排序模型 law-bert-reranker
  • 输入:查询与文档的拼接文本
  • 输出:相关性分数(0-1)
from transformers import AutoModelForSequenceClassification  

reranker = AutoModelForSequenceClassification.from_pretrained('lexcoder/law-bert-reranker')  

def rerank_documents(query, documents):  
    scores = []  
    for doc in documents:  
        inputs = f"查询:{query} 文档:{doc['text']}"  
        score = reranker(inputs)[0][1]  # 获取正类概率  
        scores.append(score)  
    return sorted(zip(documents, scores), key=lambda x: -x[1])  

三、效果评估与优化

1. 测试数据集

  • 500个真实用户咨询问题
  • 人工标注的标准答案及关联法条

2. 核心指标对比

策略

Recall@5

MRR

响应时间

基础向量检索

62%

0.53

320ms

混合检索+重排序

89%

0.81

450ms

+查询扩展

93%

0.85

520ms

3. 典型优化案例

问题
“公司辞退孕妇怎么赔偿?”

原始检索失败原因

  • 未识别“孕妇”对应《女职工劳动保护特别规定》第5条
  • 关键词检索仅匹配到“辞退”相关条款

优化后流程

  1. 查询扩展生成:“用人单位解除孕期女职工劳动关系的补偿标准《女职工劳动保护特别规定》第五条”
  2. 混合检索同时命中:
  3. 《劳动合同法》第四十二条(禁止解除情形)
  4. 《女职工劳动保护特别规定》第五条(特殊保护)
  5. 重排序将后者置顶

四、工程落地关键点

1. 增量更新机制

# 监听法律数据库变更  
from watchdog.observers import Observer  
from watchdog.events import FileSystemEventHandler  

class LawUpdateHandler(FileSystemEventHandler):  
    def on_modified(self, event):  
        if event.src_path.endswith('.xml'):  
            process_new_laws(event.src_path)  # 触发自动解析入库  

observer = Observer()  
observer.schedule(LawUpdateHandler(), path='/laws/', recursive=True)  
observer.start()  

2. 缓存策略

  • 热点法条缓存:将Top 100高频检索法条的Embedding预加载至GPU显存
  • 查询结果缓存:使用Redis缓存相同问题的检索结果(TTL=1小时)

3. 安全合规设计

  • 敏感信息过滤
from presidio_analyzer import AnalyzerEngine  
analyzer = AnalyzerEngine()  
def redact_text(text):  
    results = analyzer.analyze(text=text, language='zh')  
    return anonymizer.anonymize(text, results).text 

五、总结与扩展方向

核心经验

  1. 领域适配是关键:法律文本需定制分块策略与微调Embedding
  2. 混合检索必要性:法条编号等精确匹配需结合关键词检索
  3. 动态更新机制:法律数据库变更需实时同步

扩展方向

  • 多模态扩展:接入司法解释的流程图/表格解析
  • 推理优化:基于法律逻辑的自动条款关联(如引用第A条时自动关联第B条)
点击这里复制本文地址 以上内容由jaq123整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

苍茫编程网 © All Rights Reserved.  蜀ICP备2024111239号-21