法律 AI 应用——合同分析之外还能做什么
法律 AI 应用——合同分析之外还能做什么
适读人群:对法律 AI 感兴趣的工程师,以及在法律科技创业的人 | 阅读时长:约15分钟 | 核心价值:超越合同审查,法律 AI 的真实应用版图和工程要求
每次有人问我"法律 AI 能做什么",我发现十个人里有九个说的是"合同审查"。合同审查确实是法律 AI 最早落地的场景,但如果你以为这就是法律 AI 的全部,那就大大低估了这个领域。
我在研究法律 AI 的应用时,花了不少时间和几家法律科技公司的工程师聊,也拆解了一些头部产品的功能。这篇文章把我的观察整理出来,重点放在合同审查之外的场景,以及工程实践角度最关键的准确性问题。
法律信息的特殊性
在展开具体场景之前,先说一件很重要的事:法律信息不同于普通信息,它的错误有法律后果。
一个营养建议写错了,后果是用户吃了不太健康的食物。一个法律建议写错了,后果可能是当事人错过诉讼时效、签了不利于自己的合同、或者因为依赖错误法律信息做了决策而承担法律责任。
这不是危言耸听。国内已经有律师因为依赖 AI 生成的案例引用(实际上是幻觉出来的)在庭审中出现问题。
所以法律 AI 的工程有一个铁律:每一个法律信息点,必须有可追溯到真实来源的引用。没有引用的法律内容,不能呈现给用户。
场景一:法规变更跟踪
这是一个在技术上相对简单、但商业价值很大的场景。
法律不是静态的。税法每年都在改,劳动法有新司法解释,数据合规的要求也在不断更新。大企业的法务部门要花大量时间跟踪法规变化,确保公司的内部规章制度、合同模板、业务流程符合最新要求。
AI 可以做的:自动抓取官方来源(全国人大官网、国务院政策库、最高人民法院网站、各监管机构公告),识别变更内容,分析变更对特定业务场景的影响,推送给关注特定法规的人。
工程实现的关键点是可信来源管理:
import anthropic
import httpx
from dataclasses import dataclass
from typing import List, Optional
from datetime import datetime
@dataclass
class LegalSource:
source_id: str
name: str # 来源名称,如"全国人大官网"
base_url: str # 基础 URL
trust_level: int # 可信度等级(1-5,5最高)
is_official: bool # 是否官方来源
# 可信来源注册表
TRUSTED_SOURCES = [
LegalSource("npc", "全国人民代表大会官网", "https://www.npc.gov.cn", 5, True),
LegalSource("gov", "中国政府网", "https://www.gov.cn", 5, True),
LegalSource("court", "中国裁判文书网", "https://wenshu.court.gov.cn", 5, True),
LegalSource("pkulaw", "北大法宝", "https://www.pkulaw.com", 4, False),
]
@dataclass
class LegalChange:
law_name: str
change_type: str # 新增/修订/废止
effective_date: str
content_summary: str
affected_areas: List[str] # 受影响的业务领域
source_url: str # 原文链接(必须有)
source_name: str
def analyze_regulatory_change(
change_text: str,
source_url: str,
source_name: str,
business_context: str # 企业的业务背景,用于判断相关性
) -> LegalChange:
"""
分析一条法规变更,提取关键信息
注意:source_url 是必传参数,确保可溯源
"""
client = anthropic.Anthropic()
prompt = f"""你是一个法律分析助手。请分析以下法规变更内容,提取关键信息。
法规变更原文:
{change_text}
来源:{source_name}({source_url})
企业业务背景:{business_context}
请提取以下信息(JSON格式):
{{
"law_name": "法规名称",
"change_type": "新增/修订/废止",
"effective_date": "生效日期(YYYY-MM-DD格式)",
"content_summary": "变更内容摘要(200字以内)",
"affected_areas": ["受影响的业务领域列表"],
"urgency": "高/中/低(基于生效日期和影响范围)",
"action_required": "企业需要采取的行动建议"
}}
重要:如果原文信息不足以确定某项内容,请填 null,不要推测。"""
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=600,
messages=[{"role": "user", "content": prompt}]
)
import json, re
json_match = re.search(r'\{.*\}', response.content[0].text, re.DOTALL)
data = json.loads(json_match.group())
return LegalChange(
law_name=data["law_name"],
change_type=data["change_type"],
effective_date=data["effective_date"] or "待确认",
content_summary=data["content_summary"],
affected_areas=data.get("affected_areas", []),
source_url=source_url, # 确保来源 URL 被保留
source_name=source_name
)场景二:判例检索和分析
这个场景在国内比国外难做,因为中国的判例不像美国有 Westlaw 这样完善的商业数据库,但中国裁判文书网提供了海量公开判决,是可以利用的原始数据。
传统的判例检索是关键词搜索,局限在于:你不知道用什么关键词,相似的法律问题可能用不同的表述。LLM 可以做语义检索,把"类似的案件"这个模糊需求转化为精确的检索策略。
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
import openai
import json
class CaseLawRetriever:
"""
判例语义检索器
假设已经有一个向量化的判例数据库
"""
def __init__(self, qdrant_client: QdrantClient):
self.qdrant = qdrant_client
self.openai = openai.OpenAI()
self.anthropic = anthropic.Anthropic()
self.collection = "case_law"
def _embed_query(self, query: str) -> list:
response = self.openai.embeddings.create(
input=query,
model="text-embedding-3-small"
)
return response.data[0].embedding
def search_similar_cases(
self,
legal_question: str,
filters: dict = None, # 如 {"court_level": "高级", "year_range": [2020, 2024]}
top_k: int = 5
) -> list:
"""
根据法律问题,检索相似判例
"""
# 用 LLM 把用户的问题转化为更好的检索查询
enhanced_query = self._enhance_query(legal_question)
vector = self._embed_query(enhanced_query)
search_filter = None
if filters:
# 构建 Qdrant 过滤条件
conditions = []
if "court_level" in filters:
conditions.append({
"key": "court_level",
"match": {"value": filters["court_level"]}
})
if search_filter:
search_filter = {"must": conditions}
results = self.qdrant.search(
collection_name=self.collection,
query_vector=vector,
query_filter=search_filter,
limit=top_k,
with_payload=True
)
return [
{
"case_id": r.payload["case_id"],
"case_name": r.payload["case_name"],
"court": r.payload["court"],
"date": r.payload["date"],
"summary": r.payload["summary"],
"ruling": r.payload["ruling"],
"source_url": r.payload["source_url"], # 裁判文书网原文链接
"relevance_score": r.score
}
for r in results
]
def _enhance_query(self, legal_question: str) -> str:
"""用 LLM 把用户问题转化为更好的法律检索查询"""
prompt = f"""你是一个法律检索专家。请将以下法律问题转化为适合检索判例的专业表述,提取关键法律概念和争议焦点。
用户问题:{legal_question}
请返回一个用于检索的专业表述(50-100字),包含关键法律术语:"""
response = self.anthropic.messages.create(
model="claude-haiku-20240307",
max_tokens=150,
messages=[{"role": "user", "content": prompt}]
)
return response.content[0].text
def generate_case_analysis(
self,
legal_question: str,
similar_cases: list
) -> dict:
"""
基于检索到的判例,生成分析报告
每个结论都必须有判例引用
"""
if not similar_cases:
return {
"analysis": "未找到足够的相关判例,无法生成分析。",
"citations": [],
"confidence": "低"
}
cases_text = "\n\n".join([
f"【案例{i+1}】{c['case_name']}({c['court']},{c['date']})\n"
f"摘要:{c['summary']}\n裁判结果:{c['ruling']}\n来源:{c['source_url']}"
for i, c in enumerate(similar_cases)
])
prompt = f"""基于以下判例,分析以下法律问题。
法律问题:{legal_question}
相关判例:
{cases_text}
要求:
1. 每个分析结论必须引用具体判例(格式:[案例X])
2. 如果判例之间存在裁判不一致的情况,明确指出
3. 说明这些判例对当前问题的参考价值
4. 注明这是参考分析,不构成法律意见
请以结构化方式输出分析。"""
response = self.anthropic.messages.create(
model="claude-sonnet-4-5",
max_tokens=800,
messages=[{"role": "user", "content": prompt}]
)
return {
"analysis": response.content[0].text,
"citations": [{"case_name": c["case_name"], "url": c["source_url"]}
for c in similar_cases],
"confidence": "中" if len(similar_cases) >= 3 else "低"
}场景三:合规风险评估
这个场景的价值在于:企业在推出新产品、进入新市场、或者签一笔重要合同时,需要快速评估合规风险。传统做法是找律师做专项审查,费时费钱。
AI 可以做初步的合规扫描,识别明显的风险点,帮助企业决定哪些地方需要找律师深度审查(省钱),哪些地方可以直接过(省时)。
@dataclass
class ComplianceRisk:
risk_id: str
description: str
severity: str # 高/中/低
relevant_law: str # 相关法规
law_source: str # 法规来源 URL
recommendation: str
def assess_contract_compliance(
contract_text: str,
business_type: str, # 业务类型,如"消费金融"、"数据服务"
applicable_laws: list # 需要检查的法律法规列表
) -> List[ComplianceRisk]:
"""
合规风险扫描
注意:这是初步扫描,不替代专业法律意见
"""
client = anthropic.Anthropic()
laws_text = "\n".join([f"- {law['name']}:{law['key_requirements']}"
for law in applicable_laws])
prompt = f"""你是一个企业合规审查助手。请对以下合同进行初步合规风险扫描。
业务类型:{business_type}
需要检查的主要法规:
{laws_text}
合同内容:
{contract_text[:3000]} # 限制长度
请识别潜在的合规风险点,以 JSON 数组格式返回:
[{{
"description": "风险描述",
"severity": "高/中/低",
"relevant_clause": "合同中的相关条款(直接引用原文)",
"relevant_law": "相关法规条款",
"recommendation": "建议处理方式"
}}]
注意:
- 只指出有明确法规依据的风险,不要泛泛而谈
- 高风险指违反强制性法规条款,中风险指可能引发争议,低风险指建议优化
- 如果某条法规要求需要更多信息才能判断,请注明"""
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1500,
messages=[{"role": "user", "content": prompt}]
)
import json, re
json_match = re.search(r'\[.*\]', response.content[0].text, re.DOTALL)
risks_data = json.loads(json_match.group())
risks = []
for i, r in enumerate(risks_data):
# 查找对应法规的来源 URL
law_source = next(
(law["source_url"] for law in applicable_laws
if law["name"] in r.get("relevant_law", "")),
"需要进一步确认来源"
)
risks.append(ComplianceRisk(
risk_id=f"RISK-{i+1:03d}",
description=r["description"],
severity=r["severity"],
relevant_law=r.get("relevant_law", ""),
law_source=law_source,
recommendation=r["recommendation"]
))
return risks工程实践中最重要的事:引用追踪
我前面一直在强调引用,这里展开说一下工程上怎么实现。
法律 AI 的引用追踪要做到三点:
每个结论有出处。 AI 生成的每一个法律判断,必须能够指向一个具体的法规条文或判决书段落。不是"根据相关法律规定",而是"根据《个人信息保护法》第28条第2款"。
来源可验证。 这个条文引用是真实存在的,不是 AI 幻觉出来的。工程上的做法是:先用检索系统找到真实存在的相关条文,再让 LLM 基于检索结果生成分析,而不是让 LLM 凭空生成引用。
时效性标注。 法规是会修改的,今天正确的引用,明年可能就过时了。每个引用要标注对应的法规版本和有效期,过期引用要触发提醒。
@dataclass
class LegalCitation:
text: str # 引用的原文段落
law_name: str
article: str # 条款编号
effective_date: str
expiry_date: Optional[str] # None 表示仍然有效
source_url: str
is_verified: bool # 是否经过人工或系统验证
def verify_citation(citation: LegalCitation, law_database) -> bool:
"""
验证引用是否真实存在
law_database 是一个本地维护的权威法规数据库
"""
law = law_database.get(citation.law_name)
if not law:
return False
article_text = law.get_article(citation.article)
if not article_text:
return False
# 检查引用文本是否和数据库中的条文文本匹配
similarity = calculate_text_similarity(citation.text, article_text)
return similarity > 0.85这套引用追踪系统是法律 AI 和其他 AI 应用最不一样的地方,也是工程量最大的地方。没有这套系统,法律 AI 的风险敞口太大,不敢商业化。
法律 AI 最难的不是技术
最后说一个观察:法律 AI 创业公司死得最多的地方,不是技术做不出来,是获客和信任建立。
律师群体是一个相对保守的群体,他们的职业声誉依赖于准确性,对 AI 出错的容忍度极低。你要让一个执业律师相信你的工具足够可靠到值得在正式业务中使用,需要很长时间的口碑积累。
工程师可以做的,是把"AI 的局限性"透明化——不要把 AI 包装成全知全能的法律专家,而是清楚地标注每个结论的置信度、引用来源、以及建议何时寻求专业律师意见。
诚实的 AI,才是法律场景里最终能活下来的 AI。
