AI Agent法律助手:法律咨询也能AI化

9次阅读
没有评论

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正在改变各行各业,这是技术的未来,也是我们的机遇。


往期回顾

正文完
 0
技术老金
版权声明:本站原创文章,由 技术老金 于2026-03-31发表,共计12586字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)