AI Agent法律助手:法律咨询也能AI化
一、开场:法律咨询太贵了
大家好,我是老金。
去年有个朋友遇到租房纠纷:
- 房东不退押金
- 咨询律师:500元/小时,最少2小时起
- 想要起诉:律师费3000元起步
- 最后算了,押金才2000元
这就是普通人的法律困境:
- 律师费太贵,动辄几千上万
- 法律条文复杂,普通人看不懂
- 不知道去哪找靠谱律师
- 小额纠纷不值得打官司
AI法律助手正在改变这一切:
- 24小时免费咨询
- 快速解答法律问题
- 生成法律文书
- 匹配专业律师
今天分享AI Agent在法律服务中的应用。
二、法律助手Agent架构
系统架构
┌─────────────────────────────────────────────────────────┐
│ AI法律助手Agent架构 │
├─────────────────────────────────────────────────────────┤
│ │
│ 用户接口层 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 法律咨询 │ │ 文书生成 │ │ 案例检索 │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ └────────────┼────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 理解分析层 │ │
│ │ • 事实提取 │ │
│ │ • 法律关系识别 │ │
│ │ • 争议焦点归纳 │ │
│ └────────────────────┬────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 法律推理层 │ │
│ │ • 法条检索 │ │
│ │ • 案例匹配 │ │
│ │ • 法律适用 │ │
│ └────────────────────┬────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 结果输出层 │ │
│ │ • 建议方案 │ │
│ │ • 文书模板 │ │
│ │ • 律师推荐 │ │
│ │ • ⚠️ 免责声明 │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ 【重要:仅供参考,不构成正式法律意见】 │
│ │
└─────────────────────────────────────────────────────────┘
三、法律咨询Agent
智能问答
class LegalConsultationAgent:
"""法律咨询Agent"""
def __init__(self, llm, legal_knowledge):
self.llm = llm
self.knowledge = legal_knowledge
async def consult(self, question: str,
context: dict = None) -> dict:
"""法律咨询"""
# 1. 分析问题
analysis = await self._analyze_question(question)
# 2. 检索相关法条
laws = await self._retrieve_laws(analysis)
# 3. 检索相关案例
cases = await self._retrieve_cases(analysis)
# 4. 生成回答
answer = await self._generate_answer(
question, analysis, laws, cases, context
)
return {
"question": question,
"legal_area": analysis['legal_area'],
"answer": answer['content'],
"relevant_laws": laws[:5],
"similar_cases": cases[:3],
"suggested_actions": answer['actions'],
"risk_warning": answer['risks'],
"disclaimer": self._get_disclaimer()
}
async def _analyze_question(self, question: str) -> dict:
"""分析法律问题"""
prompt = f"""
分析以下法律问题:
问题:{question}
提取信息:
1. 法律领域(民事/刑事/行政/劳动/合同/婚姻/房产等)
2. 关键事实
3. 争议焦点
4. 当事人角色
5. 紧急程度
输出JSON格式。
"""
response = await self.llm.generate(prompt)
return json.loads(response)
async def _retrieve_laws(self, analysis: dict) -> list:
"""检索法条"""
# 从法律知识库检索
query = f"{analysis['legal_area']} {analysis['dispute_focus']}"
laws = await self.knowledge.search_laws(query, top_k=10)
return [
{
"law_name": law['source'],
"article": law['article'],
"content": law['content'],
"relevance": law['score']
}
for law in laws
]
async def _retrieve_cases(self, analysis: dict) -> list:
"""检索案例"""
# 从案例库检索相似案例
cases = await self.knowledge.search_cases(
analysis['legal_area'],
analysis['dispute_focus'],
top_k=5
)
return [
{
"case_name": case['name'],
"court": case['court'],
"date": case['date'],
"result": case['result'],
"key_points": case['key_points']
}
for case in cases
]
async def _generate_answer(self, question: str, analysis: dict,
laws: list, cases: list,
context: dict) -> dict:
"""生成回答"""
prompt = f"""
你是专业的法律顾问,回答以下法律问题:
问题:{question}
法律领域:{analysis['legal_area']}
争议焦点:{analysis['dispute_focus']}
相关法条:
{json.dumps(laws[:5], ensure_ascii=False, indent=2)}
相似案例:
{json.dumps(cases[:3], ensure_ascii=False, indent=2)}
请提供:
1. 法律分析(引用相关法条)
2. 解决建议
3. 注意事项/风险提示
4. 如需诉讼,可能的诉讼策略
注意:
- 用通俗易懂的语言
- 引用具体法条
- 给出可操作建议
- 明确说明局限性
"""
response = await self.llm.generate(prompt)
return {
"content": response,
"actions": await self._extract_actions(response),
"risks": await self._extract_risks(response)
}
def _get_disclaimer(self) -> str:
"""免责声明"""
return """
⚠️ 重要声明:
1. 本AI助手提供的建议仅供参考,不构成正式法律意见
2. 具体案件请咨询执业律师
3. 法律规定可能更新,请以最新法规为准
4. 本系统不承担任何法律责任
"""
多轮对话
class MultiTurnLegalConsultation:
"""多轮法律咨询"""
async def consult_with_clarification(self, initial_question: str,
session_id: str = None) -> dict:
"""带澄清的咨询"""
# 1. 初步分析
analysis = await self._analyze_question(initial_question)
# 2. 判断是否需要更多信息
missing_info = self._identify_missing_info(analysis)
if missing_info:
# 需要追问
clarifying_questions = await self._generate_clarifying_questions(
missing_info
)
return {
"status": "need_clarification",
"questions": clarifying_questions,
"session_id": session_id or str(uuid.uuid4())
}
else:
# 直接回答
answer = await self.consult(initial_question)
return {
"status": "answered",
"answer": answer
}
async def _generate_clarifying_questions(self,
missing_info: list) -> list:
"""生成澄清问题"""
questions = []
for info in missing_info:
question = {
"field": info['field'],
"question": info['question'],
"type": info.get('type', 'text'), # text/choice/date
"options": info.get('options', [])
}
questions.append(question)
return questions
async def continue_consultation(self, session_id: str,
answers: dict) -> dict:
"""继续咨询"""
# 获取之前的对话
history = await self._get_session_history(session_id)
# 合并信息
full_context = {
"initial_question": history['question'],
"clarifications": answers
}
# 基于完整信息回答
return await self.consult(
full_context['initial_question'],
context=full_context
)
四、文书生成Agent
法律文书生成
class LegalDocumentAgent:
"""法律文书生成Agent"""
DOCUMENT_TEMPLATES = {
"complaint": "起诉状",
"answer": "答辩状",
"contract": "合同",
"letter_demand": "律师函/催告函",
"application": "申请书",
"agreement": "协议书"
}
async def generate_document(self, doc_type: str,
facts: dict) -> dict:
"""生成法律文书"""
if doc_type not in self.DOCUMENT_TEMPLATES:
return {"error": f"不支持的文书类型:{doc_type}"}
# 1. 验证必要信息
validation = self._validate_facts(doc_type, facts)
if not validation['valid']:
return {
"error": "信息不完整",
"missing_fields": validation['missing']
}
# 2. 生成文书
document = await self._generate(doc_type, facts)
# 3. 格式化
formatted = self._format_document(document, doc_type)
return {
"doc_type": doc_type,
"doc_name": self.DOCUMENT_TEMPLATES[doc_type],
"content": formatted,
"preview": formatted[:500] + "...",
"download_format": ["txt", "docx", "pdf"],
"disclaimer": "本文书仅供参考,具体内容请咨询律师后确认"
}
async def _generate(self, doc_type: str, facts: dict) -> str:
"""生成文书内容"""
template = self._get_template(doc_type)
prompt = f"""
根据以下信息生成{self.DOCUMENT_TEMPLATES[doc_type]}:
模板格式:
{template}
当事人信息:
{json.dumps(facts, ensure_ascii=False, indent=2)}
要求:
1. 严格按照法律文书格式
2. 事实描述客观准确
3. 法律依据充分
4. 诉求明确具体
5. 语言正式规范
生成完整文书。
"""
return await self.llm.generate(prompt)
def _get_template(self, doc_type: str) -> str:
"""获取文书模板"""
templates = {
"complaint": """
民事起诉状
原告:[姓名/名称]
被告:[姓名/名称]
诉讼请求:
1. ...
2. ...
事实与理由:
...
此致
[法院名称]
起诉人:[签名]
日期:[年月日]
""",
"letter_demand": """
催告函
[接收人名称]:
[事由描述]
[法律依据]
现正式催告如下:
1. ...
2. ...
如逾期未处理,将采取法律手段维护权益。
特此函告。
[发函人]
[日期]
"""
}
return templates.get(doc_type, "")
async def generate_contract(self, contract_type: str,
parties: dict,
terms: dict) -> dict:
"""生成合同"""
prompt = f"""
生成{contract_type}合同:
甲方:{parties['party_a']}
乙方:{parties['party_b']}
合同条款:
{json.dumps(terms, ensure_ascii=False, indent=2)}
要求:
1. 条款完整,包括但不限于:
- 标的
- 价款/报酬
- 履行期限
- 违约责任
- 争议解决
2. 语言严谨
3. 保护双方权益
生成正式合同文本。
"""
contract = await self.llm.generate(prompt)
return {
"doc_type": "contract",
"contract_type": contract_type,
"content": contract,
"key_terms": self._extract_key_terms(contract),
"risk_points": await self._analyze_contract_risks(contract)
}
async def _analyze_contract_risks(self, contract: str) -> list:
"""分析合同风险点"""
prompt = f"""
分析以下合同的风险点:
{contract}
从以下维度分析:
1. 条款不明确或歧义
2. 权责不对等
3. 违约责任缺失或不当
4. 法律风险
5. 建议修改的地方
输出风险列表和建议。
"""
return await self.llm.generate(prompt)
五、案例检索Agent
智能案例检索
class CaseRetrievalAgent:
"""案例检索Agent"""
def __init__(self, vector_store, llm):
self.vector_store = vector_store
self.llm = llm
async def search_similar_cases(self, facts: dict,
top_k: int = 10) -> dict:
"""检索相似案例"""
# 1. 构建查询
query = self._build_query(facts)
# 2. 向量检索
results = await self.vector_store.search(query, top_k=top_k)
# 3. 重排序
ranked = await self._rerank(results, facts)
# 4. 提取关键信息
analyzed_cases = []
for case in ranked[:5]:
analysis = await self._analyze_case(case, facts)
analyzed_cases.append({
**case,
"analysis": analysis
})
return {
"total": len(results),
"cases": analyzed_cases,
"summary": await self._summarize_cases(analyzed_cases)
}
def _build_query(self, facts: dict) -> str:
"""构建查询"""
parts = []
if facts.get('legal_area'):
parts.append(facts['legal_area'])
if facts.get('dispute_type'):
parts.append(facts['dispute_type'])
if facts.get('key_facts'):
parts.extend(facts['key_facts'])
return ' '.join(parts)
async def _analyze_case(self, case: dict, facts: dict) -> dict:
"""分析案例相关性"""
prompt = f"""
分析案例与当前案件的相似性:
当前案件事实:
{json.dumps(facts, ensure_ascii=False)}
参考案例:
案件名称:{case['name']}
案件事实:{case['facts']}
裁判结果:{case['judgment']}
裁判理由:{case['reasoning']}
分析:
1. 案件相似度(0-100%)
2. 关键相似点
3. 关键不同点
4. 对本案的参考价值
5. 可借鉴的诉讼策略
"""
response = await self.llm.generate(prompt)
return self._parse_analysis(response)
async def _summarize_cases(self, cases: list) -> dict:
"""总结案例规律"""
if not cases:
return {"summary": "未找到相关案例"}
prompt = f"""
总结以下案例的规律:
{json.dumps([{
'name': c['name'],
'result': c['judgment'],
'reasoning': c['reasoning']
} for c in cases], ensure_ascii=False, indent=2)}
请总结:
1. 胜诉条件和败诉原因
2. 法院关注的关键证据
3. 常见的裁判倾向
4. 对当事人的建议
"""
return await self.llm.generate(prompt)
六、法条检索Agent
法条检索
class LawRetrievalAgent:
"""法条检索Agent"""
def __init__(self, law_database, llm):
self.law_db = law_database
self.llm = llm
async def search_laws(self, query: str,
category: str = None) -> dict:
"""检索法条"""
# 1. 理解查询意图
intent = await self._understand_query(query)
# 2. 检索相关法条
laws = await self.law_db.search(
keywords=intent['keywords'],
category=category or intent['category'],
top_k=20
)
# 3. 排序和解释
explained_laws = []
for law in laws[:10]:
explanation = await self._explain_law(law, query)
explained_laws.append({
**law,
"explanation": explanation,
"relevance": law['score']
})
return {
"query": query,
"understood_intent": intent,
"laws": explained_laws,
"related_regulations": await self._find_related(laws)
}
async def _understand_query(self, query: str) -> dict:
"""理解查询意图"""
prompt = f"""
理解法律查询意图:
查询:{query}
分析:
1. 涉及的法律领域(民法/刑法/行政法等)
2. 具体法律问题
3. 关键词
4. 可能适用的法律
输出JSON格式。
"""
response = await self.llm.generate(prompt)
return json.loads(response)
async def _explain_law(self, law: dict, query: str) -> str:
"""解释法条"""
prompt = f"""
用通俗语言解释以下法条,并说明与用户问题的关系:
法条:
《{law['source']}》第{law['article']}条
{law['content']}
用户问题:{query}
请解释:
1. 法条的含义
2. 适用条件
3. 与用户问题的关系
"""
return await self.llm.generate(prompt)
async def get_law_updates(self, category: str = None) -> list:
"""获取法律更新"""
# 查询最新的法律修订
updates = await self.law_db.get_recent_updates(category)
return [
{
"law_name": update['name'],
"update_type": update['type'], # 新增/修改/废止
"effective_date": update['date'],
"summary": update['summary']
}
for update in updates
]
七、律师匹配Agent
智能律师推荐
class LawyerMatchingAgent:
"""律师匹配Agent"""
async def find_lawyer(self, case_info: dict,
preferences: dict = None) -> dict:
"""匹配合适的律师"""
# 1. 分析案件需求
requirements = await self._analyze_requirements(case_info)
# 2. 筛选候选律师
candidates = await self._search_lawyers(requirements)
# 3. 评分排序
scored = await self._score_lawyers(candidates, case_info, preferences)
# 4. 返回推荐
recommendations = sorted(scored, key=lambda x: x['score'], reverse=True)[:5]
return {
"case_type": requirements['case_type'],
"recommendations": recommendations,
"selection_tips": self._get_selection_tips(requirements)
}
async def _analyze_requirements(self, case_info: dict) -> dict:
"""分析案件需求"""
return {
"case_type": case_info.get('legal_area', '民事'),
"complexity": self._assess_complexity(case_info),
"location": case_info.get('location', None),
"budget": case_info.get('budget', None),
"required_experience": self._estimate_experience_needed(case_info)
}
async def _score_lawyers(self, lawyers: list, case_info: dict,
preferences: dict) -> list:
"""律师评分"""
scored = []
for lawyer in lawyers:
score = 0
# 专业匹配(40%)
if case_info['legal_area'] in lawyer['specialties']:
score += 40
# 经验(30%)
years = lawyer.get('years_of_experience', 0)
score += min(30, years * 2)
# 成功率(20%)
success_rate = lawyer.get('success_rate', 0.5)
score += success_rate * 20
# 评分/口碑(10%)
rating = lawyer.get('rating', 3)
score += rating * 2
scored.append({
**lawyer,
"score": score,
"match_reasons": self._get_match_reasons(lawyer, case_info)
})
return scored
def _get_match_reasons(self, lawyer: dict, case_info: dict) -> list:
"""获取匹配原因"""
reasons = []
if case_info['legal_area'] in lawyer.get('specialties', []):
reasons.append(f"擅长{case_info['legal_area']}案件")
if lawyer.get('years_of_experience', 0) >= 10:
reasons.append("执业经验丰富")
if lawyer.get('success_rate', 0) >= 0.8:
reasons.append("案件胜诉率高")
return reasons
八、风险与合规
使用边界
LEGAL_BOUNDARIES = {
"can_do": [
"解答法律问题",
"检索法条和案例",
"生成文书初稿",
"提供法律信息",
"推荐律师资源"
],
"cannot_do": [
"出庭代理",
"签署法律文件",
"承诺案件结果",
"收费提供法律服务", # 需要律师执业证
"替代律师执业"
]
}
质量保障
class LegalQualityControl:
"""法律质量控制"""
async def verify_answer(self, answer: dict) -> dict:
"""验证回答质量"""
issues = []
# 检查法条引用准确性
for law in answer.get('relevant_laws', []):
verified = await self._verify_law_citation(law)
if not verified:
issues.append(f"法条引用可能有误:{law['law_name']}")
# 检查逻辑一致性
if not self._check_logical_consistency(answer):
issues.append("回答逻辑存在不一致")
return {
"verified": len(issues) == 0,
"issues": issues,
"confidence": self._calculate_confidence(answer, issues)
}
async def _verify_law_citation(self, law: dict) -> bool:
"""验证法条引用"""
# 检查法条是否存在、是否有效
actual = await self.law_db.get_law(law['source'], law['article'])
return actual is not None
九、最佳实践
服务对比
| 指标 | 传统律师 | AI法律助手 |
|---|---|---|
| 咨询费用 | 500-2000元/小时 | 免费 |
| 响应时间 | 1-3天 | 即时 |
| 服务时间 | 工作时间 | 24/7 |
| 文书生成 | 1-3天 | 5分钟 |
| 案例检索 | 数小时 | 数秒 |
适用场景
SUITABLE_SCENARIOS = [
"初步法律咨询",
"了解法律知识",
"生成文书模板",
"案例参考研究",
"判断是否需要请律师",
"小额纠纷评估"
]
UNSUITABLE_SCENARIOS = [
"重大刑事案件",
"复杂商业诉讼",
"需要出庭代理",
"涉及重大利益",
"法律关系复杂"
]
十、总结
核心价值
- 法律普惠:让每个人都能获得基础法律服务
- 效率提升:秒级响应,快速解答
- 知识普及:帮助公众了解法律
- 降低门槛:小额纠纷也能获得帮助
效果评估
- 用户满意度:90%+
- 咨询响应时间:< 10秒
- 文书生成准确率:85%+
- 法条引用准确率:95%+
系列结语
至此,我们完成了50篇AI Agent系列文章,从核心技术到实战应用,覆盖了:
- 核心技术:上下文管理、安全防护、Function Calling…
- 进阶主题:评估测试、成本控制、RAG知识库…
- 实战案例:客服系统、代码助手、数据分析、内容创作、个人助理、智能运维、教育辅导、医疗问诊、金融顾问、法律助手
AI Agent正在改变各行各业,这是技术的未来,也是我们的机遇。
往期回顾
正文完