bert-base-chinese应用案例法院判决文书要素抽取与类案推荐系统想象一下一位法官或律师面对堆积如山的卷宗需要快速找到与当前案件相似的过往判例。过去这需要人工逐字逐句地阅读、比对耗时耗力。而现在借助人工智能我们可以让机器自动理解判决文书精准抽取关键要素并智能推荐相似案例。今天我们就来聊聊如何利用经典的bert-base-chinese预训练模型构建一个法院判决文书的智能分析系统。这个系统能做什么简单来说它能像一位经验丰富的法律助理自动从一份冗长的判决书中提取出“当事人”、“案由”、“争议焦点”、“判决结果”等核心要素并基于这些要素从海量历史文书中找到最相似的案例。这不仅极大提升了法律工作者的效率也为司法公正和统一裁判尺度提供了有力的技术支撑。1. 系统核心价值与设计思路在深入技术细节之前我们先明确这个系统要解决的核心问题。1.1 传统文书处理的痛点法律文书尤其是判决书具有篇幅长、专业术语多、逻辑结构严谨的特点。传统的人工处理方式面临几个明显挑战效率低下人工阅读和提取信息速度慢难以应对海量文书。主观性强不同人员对同一文书的关键信息理解可能存在偏差。检索困难基于关键词的检索方式难以捕捉“语义相似性”。例如“交通事故”和“机动车肇事”在语义上高度相关但关键词匹配可能失效。1.2 基于BERT的解决方案bert-base-chinese模型的出现为我们提供了强大的语义理解能力。它的核心优势在于深度语义理解不同于传统的词袋模型BERT能理解词语在上下文中的具体含义。强大的特征提取其输出的向量768维能够很好地表征一个句子或一段文本的语义信息。开箱即用的中文支持作为专门针对中文训练的预训练模型它对中文法律文本有良好的基础理解能力。我们的系统设计思路非常清晰利用BERT模型将非结构化的判决文书文本转化为结构化的要素信息和可计算的语义向量进而实现精准的要素抽取和语义层面的类案匹配。2. 环境准备与模型快速调用我们将基于已部署好的bert-base-chinese镜像进行开发。你已经无需关心复杂的模型下载和环境配置可以直接进入应用开发阶段。2.1 启动与验证假设你已经在CSDN星图或类似平台启动了该镜像。首先我们验证一下模型和基础功能是否正常。进入模型目录并运行内置的演示脚本这能帮你快速建立直观感受cd /root/bert-base-chinese python test.py运行后你会看到脚本演示了三个功能完型填空、语义相似度计算和特征提取。这证明了模型已就绪我们可以在此基础上构建更复杂的应用。2.2 基础模型加载接下来我们编写自己的应用脚本。首先学习如何加载模型并进行基本的文本编码。创建一个名为legal_bert_app.py的新文件。# legal_bert_app.py from transformers import BertTokenizer, BertModel import torch # 1. 加载分词器和模型模型文件已在镜像中 model_path /root/bert-base-chinese tokenizer BertTokenizer.from_pretrained(model_path) model BertModel.from_pretrained(model_path) # 2. 切换到评估模式如果只做推理不是训练 model.eval() # 3. 准备一个示例句子一段简化的判决书摘要 text 原告张三诉称被告李四驾驶机动车发生交通事故致其受伤要求赔偿医疗费、误工费共计十万元。 print(原始文本, text) # 4. 对文本进行编码分词并转换为模型可输入的ID inputs tokenizer(text, return_tensorspt, paddingTrue, truncationTrue, max_length512) print(分词后输入ID的形状, inputs[input_ids].shape) # 5. 不计算梯度进行前向传播获取文本特征 with torch.no_grad(): outputs model(**inputs) # 6. 获取整个句子层面的语义向量通常取[CLS]标记对应的输出 sentence_embedding outputs.last_hidden_state[:, 0, :] # 取第一个token ([CLS]) 的向量 print(句子语义向量的形状, sentence_embedding.shape) print(句子向量前10维: , sentence_embedding[0, :10])这段代码完成了最基础的一步将一段法律文本转换成了一个768维的语义向量。这个向量就像是这段文本的“数字指纹”包含了其核心语义信息。3. 判决文书关键要素抽取实战要素抽取是类案推荐的基础。我们需要从文书中识别出结构化的信息。这里我们以抽取“当事人”、“案由”和“诉讼请求”为例。我们可以将这个问题转化为一个序列标注任务Named Entity Recognition, NER但为了简化入门我们先演示一个基于规则和BERT语义匹配的启发式方法。3.1 定义要素与关键词模板对于法律文书某些要素有相对固定的表述方式。我们可以先构建一个简单的要素-关键词词典。# 继续在 legal_bert_app.py 中 element_keywords { 当事人: [原告, 被告, 上诉人, 被上诉人, 申请人, 被申请人], 案由: [交通事故, 合同纠纷, 劳动争议, 离婚纠纷, 借款合同], 诉讼请求: [请求判令, 要求赔偿, 诉请, 支付, 返还], 争议焦点: [争议在于, 双方分歧, 本案焦点], 判决结果: [判决如下, 裁定如下, 驳回, 支持] } def extract_elements_by_keyword(text, element_keywords): 基于关键词触发和简单上下文滑窗的要素抽取 extracted {} for element, keywords in element_keywords.items(): for keyword in keywords: if keyword in text: # 找到关键词位置并截取前后一段文字作为要素内容简化处理 idx text.find(keyword) start max(0, idx - 20) # 取关键词前20个字 end min(len(text), idx len(keyword) 50) # 取关键词后50个字 snippet text[start:end] if element not in extracted: extracted[element] [] extracted[element].append(snippet) # 对每个要素只保留最可能的一个片段这里取第一个 for element in extracted: extracted[element] extracted[element][0] if extracted[element] else 未明确提及 return extracted # 测试抽取 sample_judgment 北京市海淀区人民法院民事判决书 2023京0108民初12345号 原告王五男1990年出生。 被告北京快运科技有限公司。 原告王五诉被告北京快运科技有限公司劳动争议一案本院受理后依法适用简易程序公开开庭进行了审理。 原告诉称被告违法解除劳动合同要求支付赔偿金五万元及拖欠工资。 被告辩称解除合同系因原告严重违纪。 本案争议焦点在于解除劳动合同是否合法。 本院认为被告举证不足。判决如下被告支付原告违法解除劳动合同赔偿金四万八千元。 elements extract_elements_by_keyword(sample_judgment, element_keywords) print(\n--- 基于关键词的要素抽取结果 ---) for ele, content in elements.items(): print(f{ele}: {content})这种方法简单快速但精度有限。接下来我们升级方案利用BERT的语义相似度计算能力进行更智能的要素定位。3.2 基于BERT语义相似度的要素定位思路是为每个要素定义一些标准的“问句”或“描述”然后计算文书每一句话与这些标准描述的语义相似度相似度最高的句子即可能包含该要素。# 继续在 legal_bert_app.py 中 from sklearn.metrics.pairwise import cosine_similarity import numpy as np def get_sentence_embedding(sentence, tokenizer, model): 获取单个句子的BERT向量 inputs tokenizer(sentence, return_tensorspt, truncationTrue, max_length128) with torch.no_grad(): outputs model(**inputs) return outputs.last_hidden_state[:, 0, :].squeeze().numpy() # 定义要素的“标准描述” element_queries { 当事人: 本案涉及哪些诉讼参与人包括原告和被告。, 案由: 这是一起什么类型的法律纠纷案件。, 诉讼请求: 原告向法院提出的具体请求是什么。, 判决结果: 法院最终作出的裁判决定是什么。 } # 将判决书按句号、分号等粗略分割成句子实际应用可用更精细的分句工具 def split_into_sentences(text): import re sentences re.split(r[。], text) return [s.strip() for s in sentences if len(s.strip()) 5] # 过滤过短句子 sentences split_into_sentences(sample_judgment) print(f\n将文书分割成 {len(sentences)} 个句子。) # 计算每个要素查询与每个句子的相似度 element_to_sentence {} for element, query in element_queries.items(): query_vec get_sentence_embedding(query, tokenizer, model).reshape(1, -1) max_sim -1 best_sentence for sent in sentences: sent_vec get_sentence_embedding(sent, tokenizer, model).reshape(1, -1) sim cosine_similarity(query_vec, sent_vec)[0][0] if sim max_sim: max_sim sim best_sentence sent element_to_sentence[element] (best_sentence, max_sim) print(\n--- 基于BERT语义相似度的要素定位结果 ---) for element, (sent, sim) in element_to_sentence.items(): print(f{element} (相似度:{sim:.3f}): {sent})这种方法比单纯的关键词匹配更智能它能找到语义上最相关的句子即使句子中没有出现预设的关键词。4. 构建类案推荐系统有了要素抽取和文本向量化的能力我们就可以构建核心的类案推荐功能了。其核心思想是将历史案例库中的所有判决书都通过BERT转化为语义向量并存储起来。当有新的查询案件时同样将其转化为向量然后在向量空间中查找“距离”最近即最相似的历史案例。4.1 构建简易案例库与向量化我们首先模拟一个小型案例库。# 继续在 legal_bert_app.py 中 # 模拟一个微型历史案例库每个案例包含ID和文书全文 case_database { 1: 原告因交通事故受伤起诉被告驾驶员及保险公司要求赔偿医疗费、残疾赔偿金等共计三十万元。法院认定被告全责判决支持原告诉讼请求。, 2: 劳动者因公司未足额支付加班费提起劳动仲裁后诉至法院。法院审理后判决公司支付拖欠的加班费及经济补偿金。, 3: 买卖合同纠纷买方以货物质量不符约定为由拒付尾款。卖方起诉。法院委托鉴定后认定货物存在瑕疵判决买方支付部分货款。, 4: 离婚纠纷中双方主要争议在于子女抚养权和房产分割。法院从有利于子女成长角度判决抚养权归女方房产按比例分割。, 5: 知识产权侵权案原告指控被告软件界面抄袭。法院经比对认为不构成实质性相似判决驳回原告诉讼请求。 } # 将案例库中的所有文书向量化并存储 case_vectors {} case_texts {} print(\n开始向量化历史案例库...) for case_id, text in case_database.items(): vec get_sentence_embedding(text, tokenizer, model) case_vectors[case_id] vec case_texts[case_id] text print(f案例库向量化完成共 {len(case_vectors)} 个案例。)4.2 实现语义相似度检索当新的查询案件到来时计算其与库中所有案例的相似度并返回最相似的几个。def recommend_similar_cases(query_text, case_vectors, case_texts, top_k3): 推荐相似案例 # 1. 将查询文本向量化 query_vec get_sentence_embedding(query_text, tokenizer, model).reshape(1, -1) # 2. 计算与库中每个案例的余弦相似度 similarities {} for case_id, case_vec in case_vectors.items(): # 将case_vec从(768,)变为(1,768) case_vec_reshaped case_vec.reshape(1, -1) sim cosine_similarity(query_vec, case_vec_reshaped)[0][0] similarities[case_id] sim # 3. 按相似度降序排序 sorted_cases sorted(similarities.items(), keylambda x: x[1], reverseTrue) # 4. 返回Top-K结果 results [] for i in range(min(top_k, len(sorted_cases))): case_id, sim sorted_cases[i] results.append({ case_id: case_id, similarity: sim, text: case_texts[case_id][:150] ... # 截取前150字符预览 }) return results # 测试一个新的查询案件 new_case 员工被公司以严重违纪为由辞退员工认为公司属于违法解除劳动合同要求支付赔偿金。 print(f\n查询案件{new_case}) recommendations recommend_similar_cases(new_case, case_vectors, case_texts, top_k2) print(\n--- 类案推荐结果 ---) for idx, rec in enumerate(recommendations, 1): print(f\n推荐 {idx} (相似度: {rec[similarity]:.4f}) - 案例ID: {rec[case_id]}) print(f案例摘要{rec[text]})你会看到系统成功地将这起新的“劳动争议”案件与案例库中的劳动争议案例ID:2匹配了起来并且相似度最高。而其他类型的案件如交通事故、离婚纠纷相似度则较低。这证明了基于BERT语义向量的检索是有效的。5. 系统优化与实践建议上面我们完成了一个最基础的原理验证系统。在实际工业部署中还需要考虑很多优化点。5.1 性能与精度优化使用更专业的法律BERT模型bert-base-chinese是通用模型。可以尝试在大量法律文书上进一步微调Fine-tuning得到领域专用模型效果会显著提升。Hugging Face上可能有类似law-bert-zh的开源模型。优化要素抽取模型将要素抽取作为真正的序列标注任务使用BERTCRF等模型进行训练可以精准地标注出文本中“当事人”、“金额”、“时间”等实体的边界。引入结构化信息判决文书有固定的章节如“原告诉称”、“本院查明”、“判决如下”。可以结合规则正则表达式先进行粗粒度章节划分再在各章节内应用模型提高准确性。5.2 工程化部署考量向量索引加速当案例库达到百万级时逐一遍历计算相似度是不可行的。需要使用专业的向量数据库如Milvus, FAISS, Elasticsearch with vector plugin来建立向量索引实现毫秒级的近似最近邻搜索。服务化封装将模型封装成API服务如使用FastAPI提供“要素抽取”和“类案推荐”两个端点方便前端或其他系统调用。流水线设计完整的系统可以设计为一个流水线文书上传 → 文本预处理去噪、分句→ 要素抽取 → 向量化 → 入库/检索。每一步都可以独立扩展和优化。6. 总结通过这个实战案例我们看到了bert-base-chinese这样一个基础预训练模型在法律科技领域焕发出的强大生命力。我们从零开始一步步构建了一个具备判决文书要素抽取和类案推荐能力的原型系统。回顾核心步骤环境与模型准备利用预置镜像跳过了繁琐的部署环节直接进入应用开发。文本语义理解使用BERT将非结构化的法律文本转化为富含语义的向量这是所有智能功能的基础。关键要素抽取结合关键词规则和BERT语义相似度计算从长文本中定位关键信息片段。类案智能推荐通过计算文书向量之间的余弦相似度实现基于语义的、而非关键词的精准案例匹配。这个系统的价值是显而易见的它不仅是效率工具更能通过统一的算法标准辅助减少类案不同判的现象促进司法公正。虽然我们的示例代码为了易懂做了简化但已经清晰地勾勒出了技术路径和实现逻辑。你可以在此基础上接入更丰富的案例数据采用更先进的微调模型并利用向量数据库进行工程化升级最终打造出真正实用的智能法律辅助系统。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
bert-base-chinese应用案例:法院判决文书要素抽取与类案推荐系统
bert-base-chinese应用案例法院判决文书要素抽取与类案推荐系统想象一下一位法官或律师面对堆积如山的卷宗需要快速找到与当前案件相似的过往判例。过去这需要人工逐字逐句地阅读、比对耗时耗力。而现在借助人工智能我们可以让机器自动理解判决文书精准抽取关键要素并智能推荐相似案例。今天我们就来聊聊如何利用经典的bert-base-chinese预训练模型构建一个法院判决文书的智能分析系统。这个系统能做什么简单来说它能像一位经验丰富的法律助理自动从一份冗长的判决书中提取出“当事人”、“案由”、“争议焦点”、“判决结果”等核心要素并基于这些要素从海量历史文书中找到最相似的案例。这不仅极大提升了法律工作者的效率也为司法公正和统一裁判尺度提供了有力的技术支撑。1. 系统核心价值与设计思路在深入技术细节之前我们先明确这个系统要解决的核心问题。1.1 传统文书处理的痛点法律文书尤其是判决书具有篇幅长、专业术语多、逻辑结构严谨的特点。传统的人工处理方式面临几个明显挑战效率低下人工阅读和提取信息速度慢难以应对海量文书。主观性强不同人员对同一文书的关键信息理解可能存在偏差。检索困难基于关键词的检索方式难以捕捉“语义相似性”。例如“交通事故”和“机动车肇事”在语义上高度相关但关键词匹配可能失效。1.2 基于BERT的解决方案bert-base-chinese模型的出现为我们提供了强大的语义理解能力。它的核心优势在于深度语义理解不同于传统的词袋模型BERT能理解词语在上下文中的具体含义。强大的特征提取其输出的向量768维能够很好地表征一个句子或一段文本的语义信息。开箱即用的中文支持作为专门针对中文训练的预训练模型它对中文法律文本有良好的基础理解能力。我们的系统设计思路非常清晰利用BERT模型将非结构化的判决文书文本转化为结构化的要素信息和可计算的语义向量进而实现精准的要素抽取和语义层面的类案匹配。2. 环境准备与模型快速调用我们将基于已部署好的bert-base-chinese镜像进行开发。你已经无需关心复杂的模型下载和环境配置可以直接进入应用开发阶段。2.1 启动与验证假设你已经在CSDN星图或类似平台启动了该镜像。首先我们验证一下模型和基础功能是否正常。进入模型目录并运行内置的演示脚本这能帮你快速建立直观感受cd /root/bert-base-chinese python test.py运行后你会看到脚本演示了三个功能完型填空、语义相似度计算和特征提取。这证明了模型已就绪我们可以在此基础上构建更复杂的应用。2.2 基础模型加载接下来我们编写自己的应用脚本。首先学习如何加载模型并进行基本的文本编码。创建一个名为legal_bert_app.py的新文件。# legal_bert_app.py from transformers import BertTokenizer, BertModel import torch # 1. 加载分词器和模型模型文件已在镜像中 model_path /root/bert-base-chinese tokenizer BertTokenizer.from_pretrained(model_path) model BertModel.from_pretrained(model_path) # 2. 切换到评估模式如果只做推理不是训练 model.eval() # 3. 准备一个示例句子一段简化的判决书摘要 text 原告张三诉称被告李四驾驶机动车发生交通事故致其受伤要求赔偿医疗费、误工费共计十万元。 print(原始文本, text) # 4. 对文本进行编码分词并转换为模型可输入的ID inputs tokenizer(text, return_tensorspt, paddingTrue, truncationTrue, max_length512) print(分词后输入ID的形状, inputs[input_ids].shape) # 5. 不计算梯度进行前向传播获取文本特征 with torch.no_grad(): outputs model(**inputs) # 6. 获取整个句子层面的语义向量通常取[CLS]标记对应的输出 sentence_embedding outputs.last_hidden_state[:, 0, :] # 取第一个token ([CLS]) 的向量 print(句子语义向量的形状, sentence_embedding.shape) print(句子向量前10维: , sentence_embedding[0, :10])这段代码完成了最基础的一步将一段法律文本转换成了一个768维的语义向量。这个向量就像是这段文本的“数字指纹”包含了其核心语义信息。3. 判决文书关键要素抽取实战要素抽取是类案推荐的基础。我们需要从文书中识别出结构化的信息。这里我们以抽取“当事人”、“案由”和“诉讼请求”为例。我们可以将这个问题转化为一个序列标注任务Named Entity Recognition, NER但为了简化入门我们先演示一个基于规则和BERT语义匹配的启发式方法。3.1 定义要素与关键词模板对于法律文书某些要素有相对固定的表述方式。我们可以先构建一个简单的要素-关键词词典。# 继续在 legal_bert_app.py 中 element_keywords { 当事人: [原告, 被告, 上诉人, 被上诉人, 申请人, 被申请人], 案由: [交通事故, 合同纠纷, 劳动争议, 离婚纠纷, 借款合同], 诉讼请求: [请求判令, 要求赔偿, 诉请, 支付, 返还], 争议焦点: [争议在于, 双方分歧, 本案焦点], 判决结果: [判决如下, 裁定如下, 驳回, 支持] } def extract_elements_by_keyword(text, element_keywords): 基于关键词触发和简单上下文滑窗的要素抽取 extracted {} for element, keywords in element_keywords.items(): for keyword in keywords: if keyword in text: # 找到关键词位置并截取前后一段文字作为要素内容简化处理 idx text.find(keyword) start max(0, idx - 20) # 取关键词前20个字 end min(len(text), idx len(keyword) 50) # 取关键词后50个字 snippet text[start:end] if element not in extracted: extracted[element] [] extracted[element].append(snippet) # 对每个要素只保留最可能的一个片段这里取第一个 for element in extracted: extracted[element] extracted[element][0] if extracted[element] else 未明确提及 return extracted # 测试抽取 sample_judgment 北京市海淀区人民法院民事判决书 2023京0108民初12345号 原告王五男1990年出生。 被告北京快运科技有限公司。 原告王五诉被告北京快运科技有限公司劳动争议一案本院受理后依法适用简易程序公开开庭进行了审理。 原告诉称被告违法解除劳动合同要求支付赔偿金五万元及拖欠工资。 被告辩称解除合同系因原告严重违纪。 本案争议焦点在于解除劳动合同是否合法。 本院认为被告举证不足。判决如下被告支付原告违法解除劳动合同赔偿金四万八千元。 elements extract_elements_by_keyword(sample_judgment, element_keywords) print(\n--- 基于关键词的要素抽取结果 ---) for ele, content in elements.items(): print(f{ele}: {content})这种方法简单快速但精度有限。接下来我们升级方案利用BERT的语义相似度计算能力进行更智能的要素定位。3.2 基于BERT语义相似度的要素定位思路是为每个要素定义一些标准的“问句”或“描述”然后计算文书每一句话与这些标准描述的语义相似度相似度最高的句子即可能包含该要素。# 继续在 legal_bert_app.py 中 from sklearn.metrics.pairwise import cosine_similarity import numpy as np def get_sentence_embedding(sentence, tokenizer, model): 获取单个句子的BERT向量 inputs tokenizer(sentence, return_tensorspt, truncationTrue, max_length128) with torch.no_grad(): outputs model(**inputs) return outputs.last_hidden_state[:, 0, :].squeeze().numpy() # 定义要素的“标准描述” element_queries { 当事人: 本案涉及哪些诉讼参与人包括原告和被告。, 案由: 这是一起什么类型的法律纠纷案件。, 诉讼请求: 原告向法院提出的具体请求是什么。, 判决结果: 法院最终作出的裁判决定是什么。 } # 将判决书按句号、分号等粗略分割成句子实际应用可用更精细的分句工具 def split_into_sentences(text): import re sentences re.split(r[。], text) return [s.strip() for s in sentences if len(s.strip()) 5] # 过滤过短句子 sentences split_into_sentences(sample_judgment) print(f\n将文书分割成 {len(sentences)} 个句子。) # 计算每个要素查询与每个句子的相似度 element_to_sentence {} for element, query in element_queries.items(): query_vec get_sentence_embedding(query, tokenizer, model).reshape(1, -1) max_sim -1 best_sentence for sent in sentences: sent_vec get_sentence_embedding(sent, tokenizer, model).reshape(1, -1) sim cosine_similarity(query_vec, sent_vec)[0][0] if sim max_sim: max_sim sim best_sentence sent element_to_sentence[element] (best_sentence, max_sim) print(\n--- 基于BERT语义相似度的要素定位结果 ---) for element, (sent, sim) in element_to_sentence.items(): print(f{element} (相似度:{sim:.3f}): {sent})这种方法比单纯的关键词匹配更智能它能找到语义上最相关的句子即使句子中没有出现预设的关键词。4. 构建类案推荐系统有了要素抽取和文本向量化的能力我们就可以构建核心的类案推荐功能了。其核心思想是将历史案例库中的所有判决书都通过BERT转化为语义向量并存储起来。当有新的查询案件时同样将其转化为向量然后在向量空间中查找“距离”最近即最相似的历史案例。4.1 构建简易案例库与向量化我们首先模拟一个小型案例库。# 继续在 legal_bert_app.py 中 # 模拟一个微型历史案例库每个案例包含ID和文书全文 case_database { 1: 原告因交通事故受伤起诉被告驾驶员及保险公司要求赔偿医疗费、残疾赔偿金等共计三十万元。法院认定被告全责判决支持原告诉讼请求。, 2: 劳动者因公司未足额支付加班费提起劳动仲裁后诉至法院。法院审理后判决公司支付拖欠的加班费及经济补偿金。, 3: 买卖合同纠纷买方以货物质量不符约定为由拒付尾款。卖方起诉。法院委托鉴定后认定货物存在瑕疵判决买方支付部分货款。, 4: 离婚纠纷中双方主要争议在于子女抚养权和房产分割。法院从有利于子女成长角度判决抚养权归女方房产按比例分割。, 5: 知识产权侵权案原告指控被告软件界面抄袭。法院经比对认为不构成实质性相似判决驳回原告诉讼请求。 } # 将案例库中的所有文书向量化并存储 case_vectors {} case_texts {} print(\n开始向量化历史案例库...) for case_id, text in case_database.items(): vec get_sentence_embedding(text, tokenizer, model) case_vectors[case_id] vec case_texts[case_id] text print(f案例库向量化完成共 {len(case_vectors)} 个案例。)4.2 实现语义相似度检索当新的查询案件到来时计算其与库中所有案例的相似度并返回最相似的几个。def recommend_similar_cases(query_text, case_vectors, case_texts, top_k3): 推荐相似案例 # 1. 将查询文本向量化 query_vec get_sentence_embedding(query_text, tokenizer, model).reshape(1, -1) # 2. 计算与库中每个案例的余弦相似度 similarities {} for case_id, case_vec in case_vectors.items(): # 将case_vec从(768,)变为(1,768) case_vec_reshaped case_vec.reshape(1, -1) sim cosine_similarity(query_vec, case_vec_reshaped)[0][0] similarities[case_id] sim # 3. 按相似度降序排序 sorted_cases sorted(similarities.items(), keylambda x: x[1], reverseTrue) # 4. 返回Top-K结果 results [] for i in range(min(top_k, len(sorted_cases))): case_id, sim sorted_cases[i] results.append({ case_id: case_id, similarity: sim, text: case_texts[case_id][:150] ... # 截取前150字符预览 }) return results # 测试一个新的查询案件 new_case 员工被公司以严重违纪为由辞退员工认为公司属于违法解除劳动合同要求支付赔偿金。 print(f\n查询案件{new_case}) recommendations recommend_similar_cases(new_case, case_vectors, case_texts, top_k2) print(\n--- 类案推荐结果 ---) for idx, rec in enumerate(recommendations, 1): print(f\n推荐 {idx} (相似度: {rec[similarity]:.4f}) - 案例ID: {rec[case_id]}) print(f案例摘要{rec[text]})你会看到系统成功地将这起新的“劳动争议”案件与案例库中的劳动争议案例ID:2匹配了起来并且相似度最高。而其他类型的案件如交通事故、离婚纠纷相似度则较低。这证明了基于BERT语义向量的检索是有效的。5. 系统优化与实践建议上面我们完成了一个最基础的原理验证系统。在实际工业部署中还需要考虑很多优化点。5.1 性能与精度优化使用更专业的法律BERT模型bert-base-chinese是通用模型。可以尝试在大量法律文书上进一步微调Fine-tuning得到领域专用模型效果会显著提升。Hugging Face上可能有类似law-bert-zh的开源模型。优化要素抽取模型将要素抽取作为真正的序列标注任务使用BERTCRF等模型进行训练可以精准地标注出文本中“当事人”、“金额”、“时间”等实体的边界。引入结构化信息判决文书有固定的章节如“原告诉称”、“本院查明”、“判决如下”。可以结合规则正则表达式先进行粗粒度章节划分再在各章节内应用模型提高准确性。5.2 工程化部署考量向量索引加速当案例库达到百万级时逐一遍历计算相似度是不可行的。需要使用专业的向量数据库如Milvus, FAISS, Elasticsearch with vector plugin来建立向量索引实现毫秒级的近似最近邻搜索。服务化封装将模型封装成API服务如使用FastAPI提供“要素抽取”和“类案推荐”两个端点方便前端或其他系统调用。流水线设计完整的系统可以设计为一个流水线文书上传 → 文本预处理去噪、分句→ 要素抽取 → 向量化 → 入库/检索。每一步都可以独立扩展和优化。6. 总结通过这个实战案例我们看到了bert-base-chinese这样一个基础预训练模型在法律科技领域焕发出的强大生命力。我们从零开始一步步构建了一个具备判决文书要素抽取和类案推荐能力的原型系统。回顾核心步骤环境与模型准备利用预置镜像跳过了繁琐的部署环节直接进入应用开发。文本语义理解使用BERT将非结构化的法律文本转化为富含语义的向量这是所有智能功能的基础。关键要素抽取结合关键词规则和BERT语义相似度计算从长文本中定位关键信息片段。类案智能推荐通过计算文书向量之间的余弦相似度实现基于语义的、而非关键词的精准案例匹配。这个系统的价值是显而易见的它不仅是效率工具更能通过统一的算法标准辅助减少类案不同判的现象促进司法公正。虽然我们的示例代码为了易懂做了简化但已经清晰地勾勒出了技术路径和实现逻辑。你可以在此基础上接入更丰富的案例数据采用更先进的微调模型并利用向量数据库进行工程化升级最终打造出真正实用的智能法律辅助系统。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。