4. 模型与提示词管理
4.1 多模型路由
模型选择策略
智能法律解决方案需要根据不同的业务场景选择合适的AI模型:
模型类型和应用场景
1. 大语言模型(LLM)
-
GPT-4:
- 适用场景:复杂法律分析、法律推理、报告生成
- 优势:理解能力强,推理能力好,支持长文本
- 劣势:成本较高,响应速度较慢
- 使用场景:合同审查、法律分析、报告生成
-
Claude 3:
- 适用场景:长文档处理、法律文档审查
- 优势 :支持超长上下文(200K tokens),理解能力强
- 劣势:成本较高
- 使用场景:大型合同审查、长文档分析
-
通义千问:
- 适用场景:中文法律文本处理、成本敏感场景
- 优势:中文理解好,成本较低,响应速度快
- 劣势:推理能力相对较弱
- 使用场景:法条匹配、案例检索、常规审查
-
本地部署模型(Qwen、ChatGLM等):
- 适用场景:数据安全要求高、成本敏感场景
- 优势:数据不出域,成本可控
- 劣势:性能相对较弱,需要GPU资源
- 使用场景:企业内部法律系统、敏感数据处理
2. Embedding模型
-
OpenAI text-embedding-3-large:
- 适用场景:高质量向量检索
- 优势:检索准确率高,支持多语言
- 劣势:成本较高
- 使用场景:案例检索、法条匹配
-
法律领域微调模型(BGE-Legal等):
- 适用场景:法律领域专业检索
- 优势:对法律领域理解深入,检索准确率高
- 劣势:需要训练和维护
- 使用场景:法律知识库检索
3. 分类模型
- BERT/RoBERTa法律领域微调:
- 适用场景:文档分类、实体识别
- 优势:准确率高,速度快
- 使用场景:合同类型分类、法律实体识别
模型选择规则
基于任务复杂度:
- 简单任务(法条匹配、关键词检索):使用成本较低的模型(通义千问、本地模型)
- 中等任务(合同审查、案例检索):使用中等性能模型(GPT-3.5、Claude Haiku)
- 复杂任务(法律分析、报告生成):使用高性能模型(GPT-4、Claude Opus)
基于数据敏感性:
- 公开数据:可以使用云端模型(GPT-4、Claude等)
- 敏感数据:使用本地部署模型或私有化部署
基于成本考虑:
- 高频任务:优先使用成本较低的模型
- 低频高价值任务:可以使用成本较高的模型
基于响应时间要求:
- 实时任务:优先使用响应速度快的模型
- 批量任务:可以使用响应速度较慢但性能更好的模型
路由规则
路由策略
1. 基于任务类型的路由
routing_rules:
- task_type: "contract_review"
model: "gpt-4"
fallback: "claude-3"
conditions:
- condition: "document_length > 10000"
model: "claude-3" # 长文档使用Claude
- condition: "document_length < 1000"
model: "qwen-plus" # 短文档使用通义千问
- task_type: "case_retrieval"
model: "qwen-plus"
fallback: "gpt-3.5-turbo"
conditions:
- condition: "query_complexity > 0.8"
model: "gpt-4" # 复杂查询使用GPT-4
- task_type: "legal_analysis"
model: "gpt-4"
fallback: "claude-3"
conditions:
- condition: "analysis_depth == 'deep'"
model: "gpt-4"
- condition: "analysis_depth == 'standard'"
model: "claude-3"
2. 基于用户等级的路由
- VIP用户:优先使用高性能模型(GPT-4、Claude Opus)
- 普通用户:使用标准模型(GPT-3.5、通义千问)
- 免费用户:使用成本较低的模型(本地模型)
3. 基于负载的路由
- 低负载:使用高性能模型
- 高负载:自动降级到成本较低的模型
- 负载均衡:在多个模型实例间负载均衡
路由实现
路由服务架构:
from typing import Dict, Any
from enum import Enum
class ModelType(Enum):
GPT4 = "gpt-4"
CLAUDE3 = "claude-3"
QWEN_PLUS = "qwen-plus"
LOCAL_MODEL = "local-model"
class ModelRouter:
def __init__(self):
self.routing_rules = self._load_routing_rules()
self.model_clients = self._init_model_clients()
def route(self, task_type: str, **kwargs) -> ModelType:
"""根据任务类型和条件选择模型"""
rule = self.routing_rules.get(task_type)
if not rule:
return ModelType.QWEN_PLUS # 默认模型
# 检查条件
for condition in rule.get("conditions", []):
if self._evaluate_condition(condition, kwargs):
return ModelType(condition["model"])
# 返回默认模型
return ModelType(rule["model"])
def _evaluate_condition(self, condition: Dict, kwargs: Dict) -> bool:
"""评估路由条件"""
# 实现条件评估逻辑
pass
负载均衡
负载均衡策略
1. 轮询(Round Robin)
- 依次分配请求到各个模型实例
- 简单高效,适用于性能相近的实例
2. 加权轮询(Weighted Round Robin)
- 根据模型实例性能分配权重
- 高性能实例分配更多请求
3. 最少连接(Least Connections)
- 分配请求到连接数最少的实例
- 适用于长连接场景
4. 响应时间(Response Time)
- 分配请求到响应时间最短的实例
- 提升用户体验
负载均衡实现
使用Nginx进行负载均衡:
upstream llm_backend {
least_conn; # 最少连接策略
server gpt4-instance1:8000 weight=3;
server gpt4-instance2:8000 weight=3;
server qwen-instance1:8000 weight=1;
server qwen-instance2:8000 weight=1;
}
server {
listen 80;
location /api/llm {
proxy_pass http://llm_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
4.2 Prompt工程化
Prompt模板设计
法律领域Prompt模板
1. 合同审查Prompt模板
CONTRACT_REVIEW_PROMPT = """
你是一位经验丰富的法律专家,专门负责合同审查。
请审查以下合同,并完成以下任务:
1. **合同类型识别**:识别合同类型(如买卖合同、租赁合同、服务合同等)
2. **关键条款识别**:识别合同中的关键条款,包括:
- 合同主体信息
- 标的物或服务描述
- 价格和支付方式
- 履行期限和方式
- 违约责任
- 争议解决方式
- 其他重要条款
3. **风险识别**:识别合同中的潜在风险,包括:
- 法律风险:违反法律法规的条款
- 商业风险:对己方不利的条款
- 执行风险:难以执行的条款
- 其他风险
4. **合规检查**:对照相关法律法规,检查合同合规性
5. **修改建议**:针对识别出的风险,提供具体的修改建议
**合同内容**:
{contract_content}
**标准模板**(可选):
{standard_template}
**审查要求**:
- 风险等级:{risk_level}(高/中/低)
- 重点关注:{focus_areas}
- 输出格式:JSON格式
请按照以下JSON格式输出审查结果:
{{
"contract_type": "合同类型",
"key_clauses": [
{{
"clause_name": "条款名称",
"clause_content": "条款内容",
"clause_type": "条款类型"
}}
],
"risks": [
{{
"risk_type": "风险类型",
"risk_level": "风险等级",
"risk_description": "风险描述",
"risk_location": "风险位置(条款编号或位置)",
"suggestion": "修改建议"
}}
],
"compliance_check": {{
"is_compliant": true/false,
"violations": [
{{
"law_name": "违反的法律法规",
"violation_description": "违反内容"
}}
]
}},
"modification_suggestions": [
{{
"clause_location": "条款位置",
"original_text": "原文",
"suggested_text": "建议修改为",
"reason": "修改原因"
}}
]
}}
"""
2. 案例检索Prompt模板
CASE_RETRIEVAL_PROMPT = """
你是一位法律检索专家,负责从案例库中检索相似案例。
**案情描述**:
{case_description}
**检索要求**:
- 案件类型:{case_type}
- 争议焦点:{dispute_focus}
- 关键事实:{key_facts}
- 检索数量:{retrieval_count}
**检索到的案例**:
{retrieved_cases}
请分析检索到的案例,并完成以下任务:
1. **案例相关性分析**:评估每个案例与当前案情的相关性(0-1分)
2. **案例相似度排序**:按照相似度对案例进行排序
3. **法条匹配**:为每个案例匹配相关的法律法规
4. **法律分析**:基于检索到的案例和法条,进行法律分析
请按照以下JSON格式输出:
{{
"case_analysis": [
{{
"case_id": "案例ID",
"case_name": "案例名称",
"relevance_score": 0.95,
"similarity_reasons": ["相似原因1", "相似原因2"],
"relevant_laws": [
{{
"law_name": "法律名称",
"article": "条文内容",
"applicability": "适用性分析"
}}
],
"legal_analysis": "法律分析"
}}
],
"summary": "检索总结"
}}
"""
3. 法条匹配Prompt模板
LAW_MATCHING_PROMPT = """
你是一位法律专家,负责匹配相关的法律法规。
**法律问题**:
{legal_question}
**案件描述**(可选):
{case_description}
**检索到的法条**:
{retrieved_laws}
请完成以下任务:
1. **法条相关性分析**:评估每个法条与法律问题的相关性
2. **法条适用性分析**:分析法条的适用性和适用条件
3. **法条冲突检查**:检查法条之间是否存在冲突
4. **法条优先级排序**:按照适用优先级对法条进行排序
5. **法律依据总结**:总结适用的法律依据
请按照以下JSON格式输出:
{{
"matched_laws": [
{{
"law_name": "法律名称",
"article_number": "条文编号",
"article_content": "条文内容",
"relevance_score": 0.95,
"applicability": "适用性分析",
"application_conditions": "适用条件",
"priority": 1
}}
],
"law_conflicts": [
{{
"law1": "法律1",
"law2": "法律2",
"conflict_description": "冲突描述",
"resolution": "解决建议"
}}
],
"legal_basis_summary": "法律依据总结"
}}
"""
版本管理
Prompt版本管理策略
1. 语义版本控制
- 使用语义版本号(如v1.0.0、v1.1.0等)
- 主版本号:重大变更(如Prompt结构变化)
- 次版本号:功能增加(如新增字段)
- 修订版本号:错误修复或优化
2. 版本标签
- stable:稳定版本,用于生产环境
- beta:测试版本,用于测试环境
- experimental:实验版本,用于A/B测试
3. 版本对比
- 支持不同版本Prompt的对比
- 可视化版本差异
- 支持版本回滚
Prompt版本管理实现
Prompt版本存储:
class PromptVersion:
def __init__(self, prompt_id: str, version: str, content: str, metadata: Dict):
self.prompt_id = prompt_id
self.version = version
self.content = content
self.metadata = metadata
self.created_at = datetime.now()
def to_dict(self):
return {
"prompt_id": self.prompt_id,
"version": self.version,
"content": self.content,
"metadata": self.metadata,
"created_at": self.created_at.isoformat()
}
Prompt版本管理服务:
class PromptVersionManager:
def __init__(self):
self.versions = {} # {prompt_id: [versions]}
def create_version(self, prompt_id: str, content: str, metadata: Dict):
"""创建新版本"""
version = self._generate_version(prompt_id)
prompt_version = PromptVersion(prompt_id, version, content, metadata)
if prompt_id not in self.versions:
self.versions[prompt_id] = []
self.versions[prompt_id].append(prompt_version)
return prompt_version
def get_version(self, prompt_id: str, version: str = "latest"):
"""获取指定版本"""
if version == "latest":
return self.versions[prompt_id][-1]
return next(v for v in self.versions[prompt_id] if v.version == version)
def compare_versions(self, prompt_id: str, version1: str, version2: str):
"""对比两个版本"""
v1 = self.get_version(prompt_id, version1)
v2 = self.get_version(prompt_id, version2)
return self._diff(v1.content, v2.content)
A/B测试
A/B测试策略
1. 测试目标
- 准确率提升:测试不同Prompt对准确率的影响
- 成本优化:测试不同Prompt对成本的影响
- 响应时间优化:测试不同Prompt对响应时间的影响
2. 测试设计
- 对照组:使用当前生产版本的Prompt
- 实验组:使用新版本的Prompt
- 分流比例:通常50/50,或根据流量调整
3. 测试指标
- 准确率:审查准确率、检索准确率、匹配准确率
- 用户满意度:用户评分、NPS
- 业务指标:审查效率、成本、响应时间
A/B测试实现
A/B测试框架:
class ABTestManager:
def __init__(self):
self.experiments = {}
def create_experiment(self, experiment_id: str, variants: List[Dict]):
"""创建A/B测试实验"""
experiment = {
"experiment_id": experiment_id,
"variants": variants,
"traffic_split": {v["id"]: v["traffic"] for v in variants},
"metrics": [],
"status": "running"
}
self.experiments[experiment_id] = experiment
return experiment
def get_variant(self, experiment_id: str, user_id: str):
"""为用户分配实验组"""
experiment = self.experiments[experiment_id]
# 基于用户ID的哈希值分配
hash_value = hash(user_id) % 100
cumulative = 0
for variant_id, traffic in experiment["traffic_split"].items():
cumulative += traffic
if hash_value < cumulative:
return variant_id
return list(experiment["traffic_split"].keys())[0]
def record_metric(self, experiment_id: str, variant_id: str, metric_name: str, value: float):
"""记录指标"""
experiment = self.experiments[experiment_id]
experiment["metrics"].append({
"variant_id": variant_id,
"metric_name": metric_name,
"value": value,
"timestamp": datetime.now()
})
def analyze_results(self, experiment_id: str):
"""分析A/B测试结果"""
experiment = self.experiments[experiment_id]
# 统计分析各组的指标
# 计算显著性检验
# 返回分析报告
pass
4.3 微调与持续学习
微调策略
法律领域模型微调
1. 数据准备
- 训练数据:法律文档、案例、法条等
- 数据标注:法律实体标注、关系标注、分类标注
- 数据质量:确保数据准确性和完整性
2. 微调方法
- 全量微调(Full Fine-tuning):微调所有参数
- LoRA微调:只微调少量参数,成本低
- Prompt Tuning:只微调Prompt,成本最低
3. 微调评估
- 准确率:在测试集上评估准确率
- F1分数:评估分类任务的F1分数
- BLEU/ROUGE:评估生成任务的质量