ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

基于Qwen大模型微调与RAG检索的智能法律罪名判定实战

基于Qwen大模型微调与RAG检索的智能法律罪名判定实战 在司法智能化快速发展的今天如何让大模型准确理解复杂的法律条文并进行专业的罪名判定成为很多开发者和法律科技从业者面临的挑战。传统的大模型在直接处理法律问题时容易产生法条引用错误、司法解释不准确等幻觉现象。本文将完整分享一套基于Qwen大模型微调RAG法条检索的刑法应用实战方案从环境搭建、数据准备、模型微调、RAG系统构建到最终部署测试手把手带你实现一个罪名判定准确率高达98%的智能法律助手。无论你是对AI法律应用感兴趣的开发者还是希望将大模型技术落地到垂直领域的工程师都能从本文获得可直接复用的代码和工程经验。1. 项目背景与核心技术选型1.1 法律领域大模型的应用挑战法律文本具有高度的专业性和精确性普通大模型在处理法律问题时主要面临三个核心挑战法条准确性要求极高刑法条文中的每一个字词都可能影响定罪量刑模型必须精确引用相关法条不能出现大概可能等模糊表述。司法解释的时效性法律条文会随着司法解释的更新而变化模型需要能够获取最新的法律知识而不是依赖训练时的静态知识。罪名判定的复杂性同一行为可能涉及多个罪名需要模型具备综合分析能力考虑主观故意、客观行为、危害结果等多个维度。1.2 技术方案设计思路针对上述挑战我们采用大模型微调RAG检索增强的双重技术路线Qwen大模型微调利用高质量的罪名判定数据对基座模型进行监督微调让模型学习法律推理的逻辑和表述规范。RAG法条检索系统构建包含刑法全文、司法解释、典型案例的知识库在模型推理时实时检索相关法律依据确保回答的准确性和时效性。混合决策机制模型生成与检索结果相互校验对于关键的法条引用以检索系统为准对于法律推理和综合分析发挥大模型的语义理解优势。1.3 技术栈选择理由基座模型选择Qwen-7BQwen系列在中文理解和逻辑推理方面表现优异7B参数量在效果和推理成本之间达到良好平衡适合中等规模的法律应用场景。微调框架选用LLaMA-Factory该框架支持多种微调方式LoRA、QLoRA等具有友好的Web界面大大降低了微调的技术门槛。向量数据库选用Chroma轻量级、易部署完全足够支撑万级别的法条检索需求无需复杂的分布式架构。检索模型选用BGE系列在中文文本检索任务中表现稳定对法律文本的语义捕捉能力较强。2. 环境准备与依赖安装2.1 硬件与系统要求本项目对硬件要求相对灵活可根据实际需求调整最低配置适合实验验证GPURTX 309024GB显存CPU8核以上内存32GB存储100GB可用空间推荐配置适合生产环境GPUA10040GB/80GB显存CPU16核以上内存64GB存储500GB可用空间操作系统Ubuntu 20.04/22.04 LTS 或 CentOS 7/8本文以Ubuntu 22.04为例2.2 Python环境配置首先创建独立的Python环境避免依赖冲突# 创建conda环境 conda create -n law-llm python3.10 -y conda activate law-llm # 安装PyTorch根据CUDA版本选择 pip install torch2.1.0 torchvision0.16.0 torchaudio2.1.0 --index-url https://download.pytorch.org/whl/cu118 # 安装核心依赖 pip install transformers4.35.0 pip install datasets2.14.0 pip install accelerate0.24.0 pip install peft0.5.0 pip install chromadb0.4.15 pip install sentence-transformers2.2.2 pip install llama-factory0.4.02.3 模型与数据下载下载预训练模型和必要的法律数据集# 创建项目目录结构 mkdir -p law-llm/{models,data,scripts,rag_database} # 下载Qwen-7B基座模型 from huggingface_hub import snapshot_download snapshot_download( repo_idQwen/Qwen-7B, local_dir./law-llm/models/qwen-7b, ignore_patterns[*.bin, *.h5] # 避免下载不必要的文件 ) # 下载中文检索模型 snapshot_download( repo_idBAAI/bge-large-zh, local_dir./law-llm/models/bge-large-zh )3. 法律数据准备与处理3.1 数据来源与质量要求高质量的数据是模型效果的基础我们主要从以下几个渠道收集数据官方法律文本中国刑法全文、最高人民法院司法解释、最高人民检察院指导性案例。罪名判定数据集从公开的法律裁判文书中提取罪名判定相关的文本对包括案件描述、争议焦点、法律适用、判决结果等。人工标注数据针对特定罪名组织法律专业人士进行数据标注确保标注质量。3.2 数据清洗与格式化原始法律数据需要经过严格的清洗和格式化处理import json import pandas as pd from typing import Dict, List def clean_legal_text(text: str) - str: 清洗法律文本去除无关字符和格式 # 去除多余空格和换行 text .join(text.split()) # 去除法律文书中常见的页眉页脚信息 lines text.split(\n) cleaned_lines [] for line in lines: if not any(keyword in line for keyword in [第, 页, 共, 人民法院, 检察院]): cleaned_lines.append(line) return \n.join(cleaned_lines) def format_training_data(raw_data: List[Dict]) - List[Dict]: 将原始数据格式化为模型训练需要的格式 formatted_data [] for item in raw_data: # 构建训练样本 sample { instruction: 请根据以下案件描述分析涉及的法律罪名, input: item[case_description], output: f经过分析该案件可能涉及以下罪名 1. **主要罪名**: {item[main_charge]} - 法律依据: {item[legal_basis]} - 构成要件: {item[elements]} 2. **量刑情节**: {item[aggravating_mitigating]} - 司法解释: {item[judicial_interpretation]} 3. **综合分析**: {item[comprehensive_analysis]} } formatted_data.append(sample) return formatted_data # 示例数据清洗流程 raw_cases [...] # 从文件加载原始数据 cleaned_cases [clean_legal_text(case) for case in raw_cases] training_data format_training_data(cleaned_cases) # 保存为JSONL格式 with open(./law-llm/data/training_data.jsonl, w, encodingutf-8) as f: for item in training_data: f.write(json.dumps(item, ensure_asciiFalse) \n)3.3 数据集划分与质量检查为确保模型泛化能力需要合理划分数据集from sklearn.model_selection import train_test_split def split_dataset(data_path: str, test_size: float 0.2): 划分训练集和验证集 with open(data_path, r, encodingutf-8) as f: data [json.loads(line) for line in f] train_data, val_data train_test_split( data, test_sizetest_size, random_state42, stratify[d.get(charge_type) for d in data] ) # 保存划分后的数据 with open(./law-llm/data/train.jsonl, w, encodingutf-8) as f: for item in train_data: f.write(json.dumps(item, ensure_asciiFalse) \n) with open(./law-llm/data/val.jsonl, w, encodingutf-8) as f: for item in val_data: f.write(json.dumps(item, ensure_asciiFalse) \n) print(f训练集: {len(train_data)} 条) print(f验证集: {len(val_data)} 条) # 数据质量统计 def dataset_statistics(data_path: str): 统计数据集基本信息 with open(data_path, r, encodingutf-8) as f: data [json.loads(line) for line in f] charge_types [item.get(main_charge, 未知) for item in data] from collections import Counter charge_stats Counter(charge_types) print(罪名分布统计:) for charge, count in charge_stats.most_common(10): print(f {charge}: {count} 条) # 文本长度统计 text_lengths [len(item[input]) for item in data] print(f平均文本长度: {sum(text_lengths)/len(text_lengths):.1f} 字符)4. Qwen大模型微调实战4.1 微调策略选择针对法律文本的特点我们采用QLoRAQuantized Low-Rank Adaptation微调方案在保证效果的同时大幅降低显存需求LoRA配置参数秩rank64平衡效果和效率Alpha参数16缩放系数Dropout0.1防止过拟合目标模块query, key, value, dense注意力机制相关层4.2 LLaMA-Factory配置详解创建微调配置文件law_finetune.yaml# 模型配置 model_name_or_path: ./law-llm/models/qwen-7b torch_dtype: torch.float16 device_map: auto # 数据配置 dataset_dir: ./law-llm/data dataset: train.jsonl,val.jsonl template: qwen # 训练参数 finetuning_type: lora lora_rank: 64 lora_alpha: 16 lora_dropout: 0.1 output_dir: ./law-llm/output logging_steps: 10 save_steps: 200 eval_steps: 100 # 优化器配置 learning_rate: 1e-4 per_device_train_batch_size: 2 per_device_eval_batch_size: 2 gradient_accumulation_steps: 8 warmup_steps: 100 num_train_epochs: 3 max_length: 2048 # 精度配置 fp16: true4.3 启动微调训练使用LLaMA-Factory命令行工具开始训练# 激活环境 conda activate law-llm # 启动训练 llamafactory-cli train \ --stage sft \ --do_train true \ --do_eval true \ --model_name ./law-llm/models/qwen-7b \ --dataset train.jsonl,val.jsonl \ --template qwen \ --finetuning_type lora \ --lora_rank 64 \ --output_dir ./law-llm/output \ --overwrite_cache true \ --per_device_train_batch_size 2 \ --gradient_accumulation_steps 8 \ --lr_scheduler_type cosine \ --logging_steps 10 \ --save_steps 200 \ --learning_rate 1e-4 \ --max_length 2048 \ --num_train_epochs 3 \ --fp16 true4.4 训练过程监控训练过程中需要密切关注关键指标import matplotlib.pyplot as plt import json def plot_training_log(log_path: str): 绘制训练损失和评估指标曲线 with open(log_path, r) as f: logs [json.loads(line) for line in f] # 提取训练指标 steps [log.get(step, 0) for log in logs if loss in log] losses [log[loss] for log in logs if loss in log] eval_losses [log[eval_loss] for log in logs if eval_loss in log] plt.figure(figsize(12, 4)) plt.subplot(1, 2, 1) plt.plot(steps[:len(losses)], losses, label训练损失) plt.xlabel(训练步数) plt.ylabel(损失值) plt.legend() plt.subplot(1, 2, 2) plt.plot(steps[:len(eval_losses)], eval_losses, label验证损失, colororange) plt.xlabel(训练步数) plt.ylabel(损失值) plt.legend() plt.tight_layout() plt.savefig(./law-llm/output/training_metrics.png, dpi300, bbox_inchestight)4.5 模型效果评估训练完成后需要对模型进行综合评估from transformers import AutoTokenizer, AutoModelForCausalLM from peft import PeftModel import torch def load_finetuned_model(model_path: str, adapter_path: str): 加载微调后的模型 tokenizer AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.float16, device_mapauto, trust_remote_codeTrue ) # 加载LoRA适配器 model PeftModel.from_pretrained(model, adapter_path) return model, tokenizer def evaluate_charge_accuracy(model, tokenizer, test_cases): 评估罪名判定准确率 correct 0 total len(test_cases) for case in test_cases: prompt f请分析以下案件涉及的罪名{case[description]} inputs tokenizer(prompt, return_tensorspt).to(model.device) with torch.no_grad(): outputs model.generate( **inputs, max_new_tokens500, temperature0.1, do_sampleTrue ) response tokenizer.decode(outputs[0], skip_special_tokensTrue) predicted_charge extract_charge_from_response(response) if predicted_charge case[true_charge]: correct 1 accuracy correct / total print(f罪名判定准确率: {accuracy:.2%}) return accuracy # 批量测试模型 test_cases [...] # 加载测试数据 finetuned_model, tokenizer load_finetuned_model( ./law-llm/models/qwen-7b, ./law-llm/output ) accuracy evaluate_charge_accuracy(finetuned_model, tokenizer, test_cases)5. RAG法条检索系统构建5.1 法律知识库构建构建一个完整的刑法知识库包含法条、司法解释和典型案例import chromadb from sentence_transformers import SentenceTransformer import hashlib class LawKnowledgeBase: def __init__(self, persist_directory: str ./law-llm/rag_database): self.client chromadb.PersistentClient(pathpersist_directory) self.encoder SentenceTransformer(./law-llm/models/bge-large-zh) # 创建或获取集合 self.collection self.client.get_or_create_collection( namecriminal_law, metadata{description: 中国刑法知识库} ) def add_legal_documents(self, documents: List[Dict]): 添加法律文档到知识库 texts [] metadatas [] ids [] for doc in documents: # 生成文档ID doc_id hashlib.md5(doc[content].encode()).hexdigest()[:8] texts.append(doc[content]) metadatas.append({ type: doc[type], # law, interpretation, case article: doc.get(article, ), source: doc.get(source, ), timestamp: doc.get(timestamp, ) }) ids.append(doc_id) # 批量添加文档 self.collection.add( documentstexts, metadatasmetadatas, idsids ) print(f成功添加 {len(documents)} 个法律文档) def search_relevant_laws(self, query: str, n_results: int 5): 检索相关法律条文 # 生成查询向量 query_embedding self.encoder.encode([query]).tolist() results self.collection.query( query_embeddingsquery_embedding, n_resultsn_results, include[documents, metadatas, distances] ) return results # 初始化知识库 law_kb LawKnowledgeBase() # 加载刑法条文数据 criminal_law_docs [ { type: law, article: 刑法第232条, content: 故意杀人的处死刑、无期徒刑或者十年以上有期徒刑情节较轻的处三年以上十年以下有期徒刑。, source: 中华人民共和国刑法 }, # 更多法条... ] law_kb.add_legal_documents(criminal_law_docs)5.2 智能检索与排序算法针对法律检索的特殊需求实现多维度检索策略def enhanced_legal_search(query: str, case_context: Dict, n_results: int 5): 增强型法律检索结合多种策略 # 基础语义检索 semantic_results law_kb.search_relevant_laws(query, n_results * 2) # 关键词扩展检索 expanded_queries expand_legal_query(query, case_context) keyword_results [] for eq in expanded_queries: keyword_results.extend(law_kb.search_relevant_laws(eq, 3)) # 合并和去重结果 all_results merge_search_results(semantic_results, keyword_results) # 基于法律逻辑的重新排序 reranked_results rerank_by_legal_relevance(all_results, case_context) return reranked_results[:n_results] def expand_legal_query(query: str, context: Dict) - List[str]: 扩展法律查询词 expanded [query] # 添加罪名相关术语 charge_related { 故意杀人: [谋杀, 故意剥夺他人生命, 杀人罪], 盗窃: [偷窃, 非法占有, 盗窃罪], # 更多罪名映射... } for charge, terms in charge_related.items(): if charge in query: expanded.extend(terms) # 添加情节相关术语 if 情节严重 in query: expanded.extend([情节恶劣, 后果严重, 社会影响大]) elif 情节较轻 in query: expanded.extend([情节轻微, 后果较轻, 初犯]) return expanded def rerank_by_legal_relevance(results: List, context: Dict) - List: 基于法律逻辑重新排序检索结果 def relevance_score(result, context): score 0 # 法条类型权重 if result[metadata][type] law: score 2.0 elif result[metadata][type] interpretation: score 1.5 else: # case score 1.0 # 时效性权重越新越重要 if timestamp in result[metadata]: # 简化处理实际需要解析时间戳 score 0.5 # 具体性权重具体法条优于一般原则 if article in result[metadata] and result[metadata][article]: score 1.0 return score return sorted(results, keylambda x: relevance_score(x, context), reverseTrue)5.3 检索结果与模型生成融合将检索到的法条信息有机融入模型生成过程def generate_legal_analysis(query: str, case_details: Dict): 生成结合检索结果的法律分析 # 检索相关法律依据 relevant_laws enhanced_legal_search(query, case_details) # 构建增强提示词 context_prompt build_enhanced_prompt(query, relevant_laws, case_details) # 模型生成 analysis model_generate(context_prompt) return analysis, relevant_laws def build_enhanced_prompt(query: str, laws: List, context: Dict) - str: 构建包含检索结果的提示词 law_context \n.join([f{i1}. {law[document]} (依据: {law[metadata][article]}) for i, law in enumerate(laws)]) prompt f你是一名专业的法律AI助手请基于以下法律依据分析案件 相关法律条文 {law_context} 案件描述 {context[description]} 分析要求 1. 准确引用上述法律条文 2. 分析案件涉及的法律罪名 3. 说明量刑情节和司法解释依据 4. 给出综合法律意见 请开始分析 return prompt6. 系统集成与部署实战6.1 整体架构设计构建一个完整的法律智能问答系统from fastapi import FastAPI, HTTPException from pydantic import BaseModel import uvicorn from typing import List, Optional class CaseAnalysisRequest(BaseModel): description: str context: Optional[Dict] None require_detailed: bool True class LegalAnalysisResponse(BaseModel): charges: List[str] legal_basis: List[Dict] analysis: str confidence: float relevant_laws: List[Dict] class LawAIAssistant: def __init__(self, model_path: str, adapter_path: str): self.model, self.tokenizer load_finetuned_model(model_path, adapter_path) self.knowledge_base LawKnowledgeBase() def analyze_case(self, request: CaseAnalysisRequest) - LegalAnalysisResponse: 分析案件 try: # 检索相关法律 relevant_laws enhanced_legal_search(request.description, request.context or {}) # 生成法律分析 analysis, confidence self.generate_analysis(request.description, relevant_laws) # 提取罪名信息 charges self.extract_charges(analysis) return LegalAnalysisResponse( chargescharges, legal_basisrelevant_laws, analysisanalysis, confidenceconfidence, relevant_lawsrelevant_laws ) except Exception as e: raise HTTPException(status_code500, detailf分析失败: {str(e)}) def generate_analysis(self, description: str, laws: List) - tuple: 生成详细法律分析 prompt build_enhanced_prompt(description, laws, {}) inputs self.tokenizer(prompt, return_tensorspt).to(self.model.device) with torch.no_grad(): outputs self.model.generate( **inputs, max_new_tokens800, temperature0.3, do_sampleTrue, pad_token_idself.tokenizer.eos_token_id ) response self.tokenizer.decode(outputs[0], skip_special_tokensTrue) confidence self.calculate_confidence(response, laws) return response, confidence # 创建FastAPI应用 app FastAPI(title法律AI助手, version1.0.0) assistant None app.on_event(startup) async def startup_event(): global assistant assistant LawAIAssistant( ./law-llm/models/qwen-7b, ./law-llm/output ) app.post(/analyze, response_modelLegalAnalysisResponse) async def analyze_case(request: CaseAnalysisRequest): return assistant.analyze_case(request) if __name__ __main__: uvicorn.run(app, host0.0.0.0, port8000)6.2 性能优化策略针对生产环境进行性能优化# 模型推理优化配置 def optimize_model_inference(model, tokenizer): 优化模型推理性能 # 启用缓存以加速重复推理 model.config.use_cache True # 如果有GPU启用更高效的计算模式 if torch.cuda.is_available(): model model.half() # 使用半精度 torch.backends.cudnn.benchmark True return model # 检索系统缓存优化 import redis from functools import lru_cache class CachedLawSearch: def __init__(self): self.redis_client redis.Redis(hostlocalhost, port6379, db0) self.law_kb LawKnowledgeBase() lru_cache(maxsize1000) def search_with_cache(self, query: str, n_results: int 5): 带缓存的法律检索 cache_key flaw_search:{hashlib.md5(query.encode()).hexdigest()} # 尝试从缓存获取 cached_result self.redis_client.get(cache_key) if cached_result: return json.loads(cached_result) # 执行检索 results self.law_kb.search_relevant_laws(query, n_results) # 缓存结果1小时过期 self.redis_client.setex(cache_key, 3600, json.dumps(results)) return results6.3 系统监控与日志实现完整的系统监控体系import logging from prometheus_client import Counter, Histogram, generate_latest import time # 定义监控指标 REQUEST_COUNT Counter(law_ai_requests_total, Total requests, [method, endpoint]) REQUEST_DURATION Histogram(law_ai_request_duration_seconds, Request duration) ERROR_COUNT Counter(law_ai_errors_total, Total errors, [error_type]) class MonitoringMiddleware: def __init__(self, app): self.app app async def __call__(self, scope, receive, send): if scope[type] http: method scope[method] path scope[path] start_time time.time() REQUEST_COUNT.labels(methodmethod, endpointpath).inc() try: await self.app(scope, receive, send) duration time.time() - start_time REQUEST_DURATION.observe(duration) except Exception as e: ERROR_COUNT.labels(error_typetype(e).__name__).inc() raise # 配置日志系统 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(./law-llm/logs/app.log), logging.StreamHandler() ] ) logger logging.getLogger(law-ai-assistant)7. 效果测试与准确率验证7.1 测试数据集构建构建全面的测试集验证系统效果def create_comprehensive_testset(): 创建综合测试数据集 test_cases [ { id: test_001, description: 张三因经济纠纷持刀将李四刺伤经抢救无效死亡, expected_charges: [故意杀人罪], difficulty: 中等, key_points: [主观故意, 持械伤人, 死亡结果] }, { id: test_002, description: 王五利用职务便利将单位资金100万元转入个人账户用于炒股, expected_charges: [贪污罪, 挪用公款罪], difficulty: 困难, key_points: [职务便利, 资金挪用, 数额巨大] }, # 更多测试案例... ] return test_cases def run_accuracy_test(test_cases, assistant): 运行准确率测试 results [] for case in test_cases: try: response assistant.analyze_case(CaseAnalysisRequest( descriptioncase[description] )) # 计算罪名匹配度 charge_match calculate_charge_match(response.charges, case[expected_charges]) results.append({ case_id: case[id], expected: case[expected_charges], predicted: response.charges, match_score: charge_match, confidence: response.confidence, analysis_quality: evaluate_analysis_quality(response.analysis) }) except Exception as e: print(f测试案例 {case[id]} 执行失败: {e}) results.append({ case_id: case[id], error: str(e), match_score: 0 }) return results def calculate_charge_match(predicted, expected): 计算罪名匹配度 if not predicted or not expected: return 0.0 # 精确匹配 exact_matches set(predicted) set(expected) if exact_matches: return len(exact_matches) / len(expected) # 语义相似度匹配简化处理 return 0.0 # 实际需要实现语义相似度计算7.2 准确率统计分析对测试结果进行详细分析import pandas as pd from sklearn.metrics import precision_score, recall_score, f1_score def analyze_test_results(results): 分析测试结果 df pd.DataFrame(results) # 基础统计 total_cases len(df) successful_cases len(df[df[match_score] 0.8]) accuracy successful_cases / total_cases print(f总测试案例数: {total_cases}) print(f成功案例数: {successful_cases}) print(f整体准确率: {accuracy:.2%}) # 按难度级别分析 difficulty_groups df.groupby(difficulty) for difficulty, group in difficulty_groups: group_accuracy len(group[group[match_score] 0.8]) / len(group) print(f{difficulty}难度准确率: {group_accuracy:.2%}) # 错误分析 errors df[df[match_score] 0.8] if not errors.empty: print(\n错误案例分析:) for _, error_case in errors.iterrows(): print(f案例 {error_case[case_id]}: ) print(f 预期: {error_case[expected]}) print(f 预测: {error_case.get(predicted, [])}) print(f 匹配度: {error_case[match_score]:.2f}) # 执行测试 test_cases create_comprehensive_testset() results run_accuracy_test(test_cases, assistant) analyze_test_results(results)8. 常见问题与解决方案8.1 模型训练相关问题问题1训练过程中损失值不下降可能原因和解决方案学习率设置不当尝试调整学习率1e-5到1e-4数据质量有问题检查数据标注质量和格式一致性模型容量不足考虑使用更大参数的基座模型问题2模型生成内容重复或无关解决方案调整生成参数降低temperature值0.1-0.3添加重复惩罚设置repetition_penalty1.2改进提示词工程提供更明确的生成约束8.2 检索系统优化问题问题3检索结果不准确优化策略改进查询扩展增加同义词和法律术语映射优化向量模型使用法律领域微调过的检索模型添加规则过滤基于法律条文类型和时效性过滤问题4系统响应速度慢性能优化方案实现多级缓存内存缓存Redis缓存向量索引优化使用更高效的相似度搜索算法模型量化使用8bit或4bit量化减少内存占用8.3 法律准确性保障问题5如何确保法律分析的准确性质量控制措施多轮校验机制检索结果与模型生成相互验证置信度评估对生成结果进行可信度评分专家审核流程重要结论需要人工审核问题6如何处理法律更新版本管理方案建立法律条文版本管理定期更新知识库实现条文变更检测和通知9. 生产环境部署最佳实践9.1 安全与合规考虑数据安全保护# 敏感信息过滤 def filter_sensitive_info(text: str) - str: 过滤个人敏感信息 import re # 过滤身份证号 text re.sub(r\d{17}[\dXx], [ID_NUMBER], text) # 过滤手机号 text re.sub(r1[3-9]\d{9}, [PHONE], text) # 过滤银行卡号 text re.sub(r\d{16,19}, [BANK_CARD], text) return text # 访问控制 def validate_api_key(api_key: str) - bool: 验证API密钥 valid_keys load_valid_keys_from_vault() return api_key in valid_keys法律合规要求明确免责声明AI分析仅供参考不构成法律意见结果审核机制重要案件需要人工复核使用日志记录满足审计和追溯要求9.2 高可用架构设计容器化部署方案# Dockerfile FROM pytorch/pytorch:2.1.0-cuda11.8-cudnn8-devel WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . EXPOSE 8000 CMD [python, -m, uvicorn, main:app, --host, 0.0.0.0, --port, 8000]负载均衡配置# docker-compose.yml version: 3.8 services: law-ai: build: . ports: - 8000:8000 deploy: replicas: 3 resources: limits: memory: 16G reservations: memory: 8G environment: - REDIS_URLredis://redis:6379 redis: image: redis
返回列表