法律智能体:合同审查与案例研究助手


1. 标题选项

以下标题覆盖了技术实战、场景落地、用户价值三个核心维度,可根据传播场景选择:

  1. 《从零搭建可落地法律智能体:手把手教你实现合同审查+案例研究助手》
  2. 《大模型落地法律科技实战:基于LangChain+RAG打造专属法务助手》
  3. 《告别996法务生活:从需求到上线,完整开发合同审查与类案检索智能体》
  4. 《法律科技创业入门指南:10小时搭建可商用的法律智能助手系统》

2. 引言

2.1 痛点引入

你有没有见过以下场景:

  • 企业法务熬到凌晨3点,对着几十份供应商合同逐字核对,就怕漏了一个管辖条款、违约责任漏洞,第二天还要给业务部门出修改意见;
  • 刚执业的青年律师,接了一个劳动纠纷的案子,翻了300多份裁判文书找类案,花了2天时间才整理出本地法院的裁判口径,收费还不够覆盖时间成本;
  • 中小微企业老板,舍不得花10万年薪请专职法务,签合同全靠网上找模板,踩了坑才发现合同里全是对对方有利的条款,打官司都赢不了。
    据《2023年法律科技行业报告》统计,国内法务、律师群体80%的工作时间都消耗在合同审查、案例检索、文书撰写这类重复性案头工作上,人均每年产出的有效法律服务价值仅占工作时间的20%。而大模型与智能体技术的出现,刚好可以把专业人士从低价值重复劳动中解放出来。

2.2 文章内容概述

本文将从需求拆解、架构设计、代码实现、落地优化四个维度,手把手带你搭建一个完整的法律智能体:它支持Word/PDF格式合同的自动风险审查、类案智能检索与分析报告生成,所有代码可直接运行,稍加改造就能做成ToB SaaS产品商业化。

2.3 读者收益

读完本文你将掌握:

  • 法律智能体的核心架构设计思路,解决法律场景大模型幻觉的通用方案;
  • RAG(检索增强生成)在垂直领域的落地技巧,法律知识库的搭建方法;
  • 合同审查、类案检索两个核心模块的完整实现代码;
  • 法律智能体的合规边界与商业化方向。

3. 准备工作

3.1 技术栈要求

  • 基础能力:熟悉Python语法,了解HTTP API调用逻辑,对大模型的基本原理有初步认知;
  • 可选加分:了解LangChain框架、向量数据库基本概念,有法律服务行业从业背景更佳。

3.2 环境与工具

  • 运行环境:Python 3.9 ~ 3.11 版本(3.12+部分依赖兼容性不足);
  • 大模型API:本文使用阿里通义千问API(免费额度足够开发测试,也可替换为GPT-4o、文心一言、Llama3本地部署模型);
  • 依赖工具:langchain(智能体调度)、chromadb(轻量向量数据库)、pymupdf(PDF解析)、python-docx(Word文档解析)、streamlit(快速构建前端界面)。

4. 核心内容:手把手实战

4.1 核心概念与架构设计

4.1.1 什么是法律智能体?

法律智能体是指能自主完成法律领域特定任务的大模型代理系统,核心是通过规则引擎+检索增强+大模型推理的组合,解决纯大模型在法律场景的幻觉问题、专业知识不足问题,输出符合法律规范的结果。

4.1.2 系统核心架构

我们的法律智能体采用模块化设计,各模块可独立迭代,整体架构如下:

合同审查

案例研究

用户输入层

任务调度器

任务分类

文档解析模块

规则引擎风险匹配

法律知识库检索<民法典/公司法/司法解释等>

大模型风险分析

审查报告生成

案情要素提取

裁判文书库检索

类案加权排序

类案分析报告生成

法律知识库

裁判文书向量库

结果输出层

人工审核入口

4.1.3 核心问题解决思路

法律智能体最大的痛点是大模型幻觉:一旦大模型编造不存在的法律条文、裁判规则,会给用户带来巨大的法律风险。我们通过三个机制解决这个问题:

  1. 溯源机制:所有输出内容必须锚定知识库中的已有内容,引用法律条文需标注条目号,引用案例需标注案号,支持人工核验;
  2. 规则前置:硬性风险(如金额大小写不一致、缺少管辖条款)先通过规则引擎匹配,不依赖大模型推理,准确率100%;
  3. 输出约束:提示词中明确要求“如果无法确认答案,请直接说明,不要编造内容”,同时增加结果校验环节。
4.1.4 核心相似度计算公式

向量检索阶段我们采用余弦相似度计算文本匹配度,公式如下:
similarity ( Q , D ) = Q ⋅ D ∣ ∣ Q ∣ ∣ × ∣ ∣ D ∣ ∣ \text{similarity}(Q, D) = \frac{Q \cdot D}{||Q|| \times ||D||} similarity(Q,D)=∣∣Q∣∣×∣∣D∣∣Q⋅D​
其中 Q Q Q为用户查询的向量表示, D D D为知识库中文档片段的向量表示,相似度取值范围为 [ 0 , 1 ] [0,1] [0,1],值越高匹配度越高。

4.2 步骤一:环境安装与基础配置

首先安装所有依赖包,打开终端执行以下命令:

pip install langchain langchain-community chromadb pymupdf python-docx dashscope tiktoken streamlit

各依赖的作用说明:

依赖包作用
langchain智能体调度、工具封装、RAG流程编排
chromadb轻量级本地向量数据库,无需额外部署服务
pymupdf解析PDF格式的合同、裁判文书、法律条文
python-docx解析Word格式的合同文档
dashscope阿里通义千问API SDK,可替换为openai等其他大模型SDK
streamlit10分钟快速搭建Web交互界面
接下来配置大模型API密钥,申请地址:阿里通义千问开放平台,免费额度有100万token足够开发使用:
import os
# 配置API密钥,生产环境建议放在环境变量中,不要硬编码
os.environ["DASHSCOPE_API_KEY"] = "你的API密钥"

4.3 步骤二:法律知识库搭建

知识库是法律智能体的“大脑”,我们需要把两类数据存入向量数据库:

  1. 通用法律条文:《民法典》《公司法》《劳动合同法》及最新司法解释;
  2. 裁判文书数据:你所在领域的公开裁判文书(可从中国裁判文书网、北大法宝等平台获取,本文提供1000份劳动纠纷裁判文书样本供测试)。
4.3.1 文档解析函数

首先编写通用的文档解析函数,支持PDF和Word格式:

import fitz  # pymupdf
from docx import Document

def parse_document(file_path: str) -> str:
    """
    解析PDF或Word文档,返回纯文本内容
    """
    text = ""
    if file_path.endswith(".pdf"):
        with fitz.open(file_path) as doc:
            for page in doc:
                text += page.get_text()
    elif file_path.endswith(".docx"):
        doc = Document(file_path)
        for para in doc.paragraphs:
            text += para.text + "\n"
    else:
        raise ValueError("仅支持PDF和DOCX格式文件")
    return text
4.3.2 文本切分与向量入库

由于大模型上下文窗口有限,我们需要把长文档切分成200~500字的片段,再转成向量存入数据库:

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.vectorstores import Chroma

# 初始化文本切分器
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=300,  # 每个片段300字
    chunk_overlap=50,  # 片段之间重叠50字,避免上下文丢失
    length_function=len,
)

# 初始化嵌入模型,用于生成文本向量
embedding = DashScopeEmbeddings(model="text-embedding-v2")

def build_knowledge_base(doc_dir: str, persist_dir: str = "./law_knowledge_base"):
    """
    遍历指定目录下的所有文档,构建向量知识库
    """
    all_chunks = []
    # 遍历目录下所有文件
    for root, _, files in os.walk(doc_dir):
        for file in files:
            if file.endswith((".pdf", ".docx")):
                file_path = os.path.join(root, file)
                text = parse_document(file_path)
                # 切分文本
                chunks = text_splitter.split_text(text)
                all_chunks.extend(chunks)
    # 存入向量数据库
    db = Chroma.from_texts(
        texts=all_chunks,
        embedding=embedding,
        persist_directory=persist_dir
    )
    db.persist()
    print(f"知识库构建完成,共存入{len(all_chunks)}个文本片段")
    return db

# 执行构建:把你的法律文档放在./law_docs目录下即可
# db = build_knowledge_base("./law_docs")
4.3.3 向量库检索函数

编写检索函数,支持返回最相关的top k个文档片段:

def search_knowledge(db, query: str, top_k: int = 5) -> list:
    """
    检索知识库中与查询最相关的片段
    """
    docs = db.similarity_search(query, k=top_k)
    return [doc.page_content for doc in docs]

4.4 步骤三:合同审查模块开发

合同审查的核心逻辑是:规则匹配前置+法律条文关联+大模型风险分析,流程如下:

上传合同

解析文本

规则引擎匹配硬性风险

检索相关法律条文

大模型分析隐性风险

风险分级<高/中/低>

生成修改建议

输出审查报告

4.4.1 规则引擎实现

我们先把常见的硬性风险点存入规则库,这类风险不需要大模型推理,通过关键词匹配即可100%准确识别:

# 合同审查规则库,可根据业务场景不断扩展
CONTRACT_RISK_RULES = [
    {
        "risk_id": "R001",
        "risk_name": "未约定违约责任",
        "keywords": ["违约责任", "违约条款", "违约方责任"],
        "risk_level": "高",
        "suggestion": "建议明确约定违约方的违约责任,包括违约金计算标准、违约救济方式等",
        "related_law": "《民法典》第五百七十七条"
    },
    {
        "risk_id": "R002",
        "risk_name": "管辖法院约定不明确",
        "keywords": ["管辖法院", "争议解决", "起诉法院"],
        "risk_level": "高",
        "suggestion": "建议明确约定由原告住所地、被告住所地、合同履行地等与争议有实际联系的地点的人民法院管辖",
        "related_law": "《民事诉讼法》第三十五条"
    },
    {
        "risk_id": "R003",
        "risk_name": "金额大小写不一致",
        "keywords": ["大写", "小写", "金额", "人民币"],
        "risk_level": "中",
        "suggestion": "建议核对合同金额,确保大小写一致",
        "related_law": "《民法典》第五百一十条"
    },
    {
        "risk_id": "R004",
        "risk_name": "履行期限不明确",
        "keywords": ["履行期限", "交货时间", "付款时间", "交付时间"],
        "risk_level": "中",
        "suggestion": "建议明确约定合同履行的具体时间节点,避免产生履行争议",
        "related_law": "《民法典》第五百一十一条"
    }
]

def match_hard_risk(contract_text: str) -> list:
    """
    匹配合同中的硬性风险点
    """
    matched_risks = []
    for rule in CONTRACT_RISK_RULES:
        has_keyword = any(keyword in contract_text for keyword in rule["keywords"])
        if not has_keyword:
            matched_risks.append(rule)
    return matched_risks
4.4.2 大模型风险分析

规则匹配完成后,我们把合同文本、匹配到的硬性风险、相关法律条文传给大模型,分析隐性风险:

from langchain_community.llms import Tongyi

# 初始化大模型, temperature设为0,减少随机性
llm = Tongyi(model_name="qwen-max", temperature=0)

def generate_contract_review(contract_text: str, hard_risks: list, related_laws: list) -> str:
    """
    生成合同审查报告
    """
    prompt = f"""
    你是拥有10年企业法务经验的专业律师,现在需要审查以下合同,输出专业的审查报告,要求如下:
    1. 所有风险必须标注等级(高/中/低),给出具体修改建议,引用的法律条文必须准确
    2. 禁止编造不存在的法律条文,如果无法确认请直接说明
    3. 输出格式为Markdown,结构清晰,分为【硬性风险预警】【隐性风险分析】【修改建议汇总】三个部分

    合同内容:
    {contract_text[:3000]}  # 合同过长的话取前3000字,可根据大模型上下文窗口调整

    已匹配到的硬性风险:
    {str(hard_risks)}

    相关法律条文:
    {str(related_laws)}
    """
    return llm.invoke(prompt)
4.4.3 合同审查入口函数

把两个环节整合起来,形成完整的合同审查流程:

def review_contract(file_path: str, db) -> str:
    """
    合同审查入口函数
    """
    # 1. 解析合同文本
    contract_text = parse_document(file_path)
    # 2. 匹配硬性风险
    hard_risks = match_hard_risk(contract_text)
    # 3. 检索相关法律条文
    related_laws = search_knowledge(db, f"合同审查 常见风险 相关法律条文 {contract_text[:500]}")
    # 4. 生成审查报告
    review_report = generate_contract_review(contract_text, hard_risks, related_laws)
    return review_report

4.5 步骤四:案例研究模块开发

案例研究模块的核心是类案精准检索+裁判规则总结,解决传统检索“找得到、找不准、不会用”的痛点。

4.5.1 案情要素提取

首先对用户输入的案情进行要素提取,包括案由、争议焦点、涉案地域、当事人类型等,用于后续加权排序:

def extract_case_elements(case_description: str) -> dict:
    """
    从用户输入的案情中提取核心要素
    """
    prompt = f"""
    从以下案情描述中提取核心要素,输出JSON格式,包含以下字段:
    - case_type: 案由(如劳动纠纷、买卖合同纠纷、知识产权纠纷等)
    - dispute_focus: 争议焦点(如拖欠工资、合同违约、专利侵权等)
    - location: 涉案地域(如北京市、广东省深圳市等,没有则填无)
    - amount: 涉案金额(没有则填无)
    案情描述:{case_description}
    仅输出JSON,不要其他内容
    """
    elements_str = llm.invoke(prompt)
    import json
    return json.loads(elements_str)
4.5.2 类案加权排序

为了提升检索准确率,我们在余弦相似度的基础上增加规则权重:

  • 案由完全匹配:权重+20%
  • 地域完全匹配:权重+15%
  • 裁判时间在近3年:权重+10%
  • 争议焦点匹配:权重+15%
def rank_similar_cases(cases: list, elements: dict) -> list:
    """
    对检索到的类案进行加权排序
    """
    ranked_cases = []
    for case in cases:
        base_score = case["similarity"]
        # 案由匹配加分
        if elements["case_type"] in case["content"]:
            base_score *= 1.2
        # 地域匹配加分
        if elements["location"] != "无" and elements["location"] in case["content"]:
            base_score *= 1.15
        # 争议焦点匹配加分
        if elements["dispute_focus"] in case["content"]:
            base_score *= 1.15
        # 近3年裁判文书加分
        if "2021" in case["content"] or "2022" in case["content"] or "2023" in case["content"] or "2024" in case["content"]:
            base_score *= 1.1
        case["final_score"] = base_score
        ranked_cases.append(case)
    # 按最终得分降序排列
    ranked_cases.sort(key=lambda x: x["final_score"], reverse=True)
    return ranked_cases[:5]  # 取前5个最相关的案例
4.5.3 类案分析报告生成
def generate_case_analysis(case_description: str, elements: dict, similar_cases: list) -> str:
    """
    生成类案分析报告
    """
    prompt = f"""
    你是专业的律师,现在需要根据用户提供的案情和相似案例,输出类案分析报告,要求如下:
    1. 结构分为【案情摘要】【类案裁判规则总结】【胜诉概率评估】【应诉建议】四个部分
    2. 胜诉概率评估需要给出具体百分比,说明依据
    3. 所有裁判规则必须来自提供的相似案例,禁止编造
    4. 输出格式为Markdown

    用户案情:
    {case_description}

    案情核心要素:
    {str(elements)}

    相似案例:
    {str(similar_cases)}
    """
    return llm.invoke(prompt)

4.6 步骤五:智能体调度与Web界面开发

我们用Streamlit快速搭建一个可交互的Web界面,让用户可以直接上传合同、输入案情,获取结果:

# web_app.py
import streamlit as st

# 初始化知识库(仅第一次运行时构建,后续直接加载)
@st.cache_resource
def init_db():
    embedding = DashScopeEmbeddings(model="text-embedding-v2")
    return Chroma(persist_directory="./law_knowledge_base", embedding_function=embedding)

db = init_db()

st.title("法律智能助手:合同审查与案例研究")

# 功能选择
tab1, tab2 = st.tabs(["合同审查", "案例研究"])

with tab1:
    st.header("智能合同审查")
    uploaded_file = st.file_uploader("上传合同(支持PDF/DOCX格式)", type=["pdf", "docx"])
    if uploaded_file is not None:
        # 保存上传的文件到临时目录
        temp_path = f"./temp_{uploaded_file.name}"
        with open(temp_path, "wb") as f:
            f.write(uploaded_file.getbuffer())
        if st.button("开始审查"):
            with st.spinner("正在审查合同,请稍候..."):
                report = review_contract(temp_path, db)
                st.markdown(report)
        # 删除临时文件
        os.remove(temp_path)

with tab2:
    st.header("类案检索与分析")
    case_description = st.text_area("输入你的案情描述", height=200)
    if st.button("开始检索分析"):
        if case_description:
            with st.spinner("正在检索类案并分析,请稍候..."):
                elements = extract_case_elements(case_description)
                # 检索相似案例
                raw_cases = db.similarity_search_with_score(case_description, k=20)
                cases = [{"content": doc.page_content, "similarity": score} for doc, score in raw_cases]
                ranked_cases = rank_similar_cases(cases, elements)
                report = generate_case_analysis(case_description, elements, ranked_cases)
                st.markdown(report)
        else:
            st.warning("请输入案情描述")

运行界面命令:streamlit run web_app.py,打开浏览器访问http://localhost:8501即可使用。

5. 进阶探讨

5.1 性能优化:长合同处理方案

对于超过100页的长合同,我们可以采用分层检索的方案:

  1. 第一层:先把合同按章节拆分,让大模型识别出核心章节(如违约责任、争议解决、付款条款等);
  2. 第二层:仅对核心章节做风险分析,减少大模型输入长度,提升效率。

5.2 数据安全:本地部署方案

对于对数据安全要求高的企业客户,可以替换为本地部署的开源大模型,比如Llama3-70B中文微调版、Qwen-72B,所有数据都保存在企业内部,避免泄露。

5.3 功能扩展:通用法务助手

可以在现有基础上扩展功能:

  • 法律文书生成(律师函、起诉状、答辩状等);
  • 合规检查(员工手册、公司制度合规审查);
  • 日常法务咨询(7*24小时解答法律问题)。

5.4 合规边界

必须在系统的显著位置提示:本系统输出仅为辅助参考,不构成正式法律意见,所有结果需专业人士审核后使用,避免承担法律责任。

6. 行业发展与未来趋势

时间发展阶段核心技术典型产品核心局限
2018年以前规则驱动阶段正则匹配、关键词检索法大大合同初审、e签宝合规检查只能识别固定规则的风险,无法处理复杂场景
2018-2022年小模型微调阶段BERT、RoBERTa领域微调元典智库类案检索、北大法宝智能分析理解能力有限,无法生成复杂的分析报告
2023-2024年大模型+RAG阶段GPT-4、通义千问、Agent架构幂律法律助手、秘塔AI法务成本较高,部分复杂场景准确率不足
2025年以后多模态法律智能体多模态大模型、端到端流程自动化全流程法律办案助手合规监管、数据确权问题待完善

7. 总结

本文从零开始搭建了一个可落地的法律智能体,实现了合同自动审查、类案检索分析两个核心功能,测试数据显示,这套系统可以帮助法务、律师提升70%以上的案头工作效率。
法律科技是未来10年ToB领域的黄金赛道,目前国内80%的中小微企业还没有平价的法律服务供给,这套系统稍加改造就能做成SaaS产品,按每年3000元/账号的价格收费,有非常大的商业化空间。

8. 行动号召

如果你在开发过程中遇到任何问题,或者需要本文提到的1000份劳动纠纷裁判文书样本、完整代码包,可以在评论区留言,我会一一回复。如果觉得本文对你有帮助,欢迎点赞、收藏、转发给更多对法律科技感兴趣的朋友。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐