Agentic AI赋能法律检索:上下文工程驱动的相似案例关联分析实战

一、引言:法律案例检索的“痛”与“解”

1. 痛点引入:为什么相似案例检索这么难?

作为法律从业者,你是否遇到过这样的场景:

  • 用“买卖合同纠纷 逾期交货”关键词检索,返回的案例要么是“房屋买卖合同”(案由不符),要么是“逾期付款”(争议焦点偏差);
  • 手动筛选100个案例,才能找到3个真正相关的“逾期交货违约责任”案例,耗时2小时;
  • 想参考“同地域、同案由”的最新判决,却因缺乏上下文理解,只能靠运气碰。

传统法律案例检索的核心问题在于:仅能匹配字面关键词,无法理解“法律要件的上下文关联”。比如“代位求偿权”和“代位权”的语义差异、“逾期交货”与“迟延履行”的法律逻辑关联,这些都需要对法律场景的深度上下文理解才能解决。

2. 本文要解决的问题:用Agentic AI上下文工程破解相似案例关联

本文将带你走进Agentic AI(智能体AI)在法律案例检索中的应用,重点讲解上下文工程如何驱动相似案例的精准关联。简单来说,我们要让AI像资深律师一样:

  • 理解用户的需求上下文(比如“我要找‘广东省2023年’的‘机动车交通事故’‘代位求偿权’案例”);
  • 解析案例的法律上下文(案由、争议焦点、法律适用、判决结果等);
  • 动态关联相似性上下文(案由相同、争议焦点语义相似、判决逻辑一致)。

3. 读者收益:读完这篇文章你能做什么?

  • 掌握Agentic AI在法律场景的核心逻辑:如何让AI“懂法律”“懂用户”;
  • 学会上下文工程的构建方法:从数据预处理到相似性关联的完整流程;
  • 实现可落地的相似案例检索原型:用代码构建一个能理解法律上下文的智能检索工具;
  • 理解Agentic AI的优势:比传统关键词检索更准、比规则引擎更灵活。

二、准备工作:你需要这些基础

1. 技术栈/知识储备

  • Agentic AI框架:熟悉LangChain(推荐)或AutoGPT(用于构建智能体);
  • NLP基础:了解向量表示(Embedding)、语义相似度计算(余弦相似度);
  • 法律知识:理解法律案例的核心结构(案由、争议焦点、判决结果等);
  • 编程基础:Python(用于实现代码逻辑)。

2. 环境/工具

  • 开发环境:Python 3.8+、pip;
  • AI框架:LangChain(pip install langchain)、OpenAI(pip install openai);
  • 向量数据库:FAISS(轻量级,pip install faiss-cpu);
  • 法律数据集:可从中国裁判文书网下载公开裁判文书,或使用开源法律数据集(如LawNet)。

三、核心实战:上下文工程驱动的相似案例关联流程

(一)第一步:数据预处理——从“ raw文本”到“法律上下文结构”

相似案例关联的前提是将法律案例转化为AI能理解的“上下文表示”。法律案例的核心结构是:

{
  "case_id": "(2023)沪01民终1234号",
  "cause_of_action": "机动车交通事故责任纠纷",  // 案由
  "dispute_points": "保险公司在赔付后能否向侵权人行使代位求偿权",  // 争议焦点
  "legal_application": "《保险法》第六十条",  // 法律适用
  "judgment_result": "支持保险公司的代位求偿请求"  // 判决结果
}
1. 数据提取:从裁判文书中抓取法律要件

裁判文书通常是长文本,需要用规则+NLP提取关键信息:

  • 案由:通常在文书开头(如“原告XX与被告XX因机动车交通事故责任纠纷一案”);
  • 争议焦点:通常在“本院认为”部分(如“本案的争议焦点为:保险公司是否享有代位求偿权”);
  • 判决结果:在“判决如下”部分(如“被告XX于本判决生效之日起十日内支付原告XX保险赔偿金10万元”)。

代码示例(用正则提取案由)

import re

def extract_cause_of_action(text):
    pattern = r"因(.*?)纠纷一案"
    match = re.search(pattern, text)
    return match.group(1) if match else None

# 测试:
doc_text = "原告张三与被告李四因机动车交通事故责任纠纷一案,本院于2023年5月10日受理。"
print(extract_cause_of_action(doc_text))  # 输出:机动车交通事故责任纠纷
2. 上下文表示:将法律要件转化为向量

为了让AI理解“争议焦点”的语义,需要将文本转化为向量(Embedding)。这里推荐使用法律领域预训练模型(如LawBERT)或通用大模型Embedding(如OpenAI的text-embedding-3-small)。

代码示例(用OpenAI Embedding生成争议焦点向量)

from openai import OpenAI
import os
from dotenv import load_dotenv

load_dotenv()  # 加载.env文件中的OPENAI_API_KEY
client = OpenAI()

def get_embedding(text):
    response = client.embeddings.create(
        input=text,
        model="text-embedding-3-small"
    )
    return response.data[0].embedding

# 测试:
dispute_point = "保险公司在赔付后能否向侵权人行使代位求偿权"
embedding = get_embedding(dispute_point)
print(len(embedding))  # 输出:1536(text-embedding-3-small的向量维度)

(二)第二步:构建Agentic AI上下文模型——让AI“懂法律”

Agentic AI的核心是**“智能体+上下文记忆+工具调用”**。在法律案例检索中,我们需要构建一个能:

  • 记忆案例的法律上下文(案由、争议焦点向量等);
  • 理解用户的需求上下文(比如“我要找广东省2023年的案例”);
  • 调用相似案例检索工具(基于向量数据库)的智能体。
1. 组件1:上下文记忆——用向量数据库存储案例

我们用FAISS(轻量级向量数据库)存储案例的向量表示,方便快速检索相似案例。

代码示例(构建案例向量数据库)

from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings

# 假设我们有预处理后的案例列表(每个案例包含dispute_point和embedding)
cases = [
    {
        "case_id": "(2023)沪01民终1234号",
        "cause_of_action": "机动车交通事故责任纠纷",
        "dispute_point": "保险公司在赔付后能否向侵权人行使代位求偿权",
        "embedding": get_embedding("保险公司在赔付后能否向侵权人行使代位求偿权")
    },
    {
        "case_id": "(2022)粤02民终5678号",
        "cause_of_action": "买卖合同纠纷",
        "dispute_point": "卖方逾期交货的违约责任如何认定",
        "embedding": get_embedding("卖方逾期交货的违约责任如何认定")
    }
]

# 提取文本和向量(FAISS需要文本作为索引,向量作为数据)
texts = [case["dispute_point"] for case in cases]
embeddings = [case["embedding"] for case in cases]

# 构建FAISS向量库
embedding_model = OpenAIEmbeddings()  # 用于后续检索的Embedding模型(需与存储时一致)
vector_store = FAISS.from_texts(texts, embedding_model, metadatas=cases)

# 保存向量库(可选)
vector_store.save_local("legal_case_vector_store")
2. 组件2:智能体(Agent)——控制检索逻辑

我们用LangChain的Agent框架构建智能体,它的核心功能是:

  • 解析用户的查询上下文(比如“我要找广东省2023年的机动车交通事故代位求偿权案例”);
  • 调用向量数据库工具,检索相似案例;
  • 将结果整理成自然语言回答。

代码示例(初始化智能体)

from langchain.agents import initialize_agent, Tool
from langchain.llms import OpenAI
from langchain.memory import ConversationBufferMemory

# 初始化LLM(用于理解用户需求和生成回答)
llm = OpenAI(temperature=0, model_name="gpt-3.5-turbo-instruct")

# 初始化记忆(存储用户的历史查询上下文)
memory = ConversationBufferMemory(memory_key="chat_history")

# 定义相似案例检索工具(调用FAISS向量库)
def retrieve_similar_cases(query):
    # 生成查询的向量
    query_embedding = get_embedding(query)
    # 从向量库中检索相似案例(k=3表示返回Top3)
    similar_cases = vector_store.similarity_search_by_vector(query_embedding, k=3)
    # 整理结果(提取case_id、cause_of_action、dispute_point)
    result = []
    for case in similar_cases:
        result.append({
            "case_id": case.metadata["case_id"],
            "cause_of_action": case.metadata["cause_of_action"],
            "dispute_point": case.metadata["dispute_point"]
        })
    return result

# 将工具封装成LangChain的Tool对象
tools = [
    Tool(
        name="SimilarCaseRetriever",
        func=lambda query: retrieve_similar_cases(query),
        description="用于检索相似法律案例,输入是用户的查询内容(如“机动车交通事故代位求偿权”),输出是相似案例列表(包含案号、案由、争议焦点)"
    )
]

# 初始化智能体(使用“conversational-react-description”类型,支持对话和工具调用)
agent = initialize_agent(
    tools,
    llm,
    agent="conversational-react-description",
    memory=memory,
    verbose=True  # 开启 verbose 模式,查看智能体的思考过程
)

(三)第三步:相似案例关联——让AI“找对”案例

现在,智能体已经具备了“记忆案例上下文”和“调用检索工具”的能力,接下来需要测试它能否精准关联相似案例

1. 测试1:基础相似性关联

用户查询:“我要找机动车交通事故责任纠纷中,保险公司的代位求偿权案例。”
智能体思考过程(verbose模式输出):

> Entering new AgentExecutor chain...
Thought: 我需要帮用户找机动车交通事故责任纠纷中关于保险公司代位求偿权的案例。首先,用户的问题涉及两个关键部分:案由是机动车交通事故责任纠纷,争议焦点是保险公司的代位求偿权。我应该使用SimilarCaseRetriever工具来检索相似案例。
Action:
{
  "action": "SimilarCaseRetriever",
  "action_input": "机动车交通事故责任纠纷 保险公司代位求偿权"
}

工具返回结果

[
  {
    "case_id": "(2023)沪01民终1234号",
    "cause_of_action": "机动车交通事故责任纠纷",
    "dispute_point": "保险公司在赔付后能否向侵权人行使代位求偿权"
  },
  {
    "case_id": "(2022)京03民终7890号",
    "cause_of_action": "机动车交通事故责任纠纷",
    "dispute_point": "保险公司代位求偿权的行使条件"
  },
  {
    "case_id": "(2023)粤01民终4567号",
    "cause_of_action": "机动车交通事故责任纠纷",
    "dispute_point": "保险公司代位求偿权的诉讼时效"
  }
]

智能体最终回答
“根据你的需求,找到以下相似案例:

  1. (2023)沪01民终1234号:机动车交通事故责任纠纷,争议焦点是保险公司在赔付后能否向侵权人行使代位求偿权;
  2. (2022)京03民终7890号:机动车交通事故责任纠纷,争议焦点是保险公司代位求偿权的行使条件;
  3. (2023)粤01民终4567号:机动车交通事故责任纠纷,争议焦点是保险公司代位求偿权的诉讼时效。”
2. 测试2:上下文增强的相似性关联

用户后续查询:“这些案例都是2023年的吗?我想找广东省的。”
智能体思考过程

> Entering new AgentExecutor chain...
Thought: 用户之前问过机动车交通事故责任纠纷中保险公司代位求偿权的案例,现在想知道这些案例是否是2023年的,并且想找广东省的。首先,我需要回顾之前的对话历史,用户之前的查询是关于机动车交通事故责任纠纷中的代位求偿权,我使用了SimilarCaseRetriever工具返回了三个案例。现在用户的新问题涉及两个条件:年份2023年和地域广东省。

首先,我需要检查之前返回的案例是否符合这两个条件。看一下之前的案例:
1. (2023)沪01民终1234号:年份是2023年,但地域是上海(沪),不符合广东省的要求;
2. (2022)京03民终7890号:年份是2022年,地域是北京(京),都不符合;
3. (2023)粤01民终4567号:年份是2023年,地域是广东(粤),符合要求。

所以,只有第三个案例符合用户的新条件。但是用户可能需要更多的案例,所以我应该再次调用SimilarCaseRetriever工具,这次在查询中加入“2023年 广东省”的条件,以获取更多符合要求的案例。

需要确认的是,SimilarCaseRetriever工具是否支持在查询中加入年份和地域条件。根据工具的描述,输入是用户的查询内容,所以我可以将查询修改为“2023年 广东省 机动车交通事故责任纠纷 保险公司代位求偿权”,这样工具会根据新的查询向量检索更符合条件的案例。

因此,下一步应该是调用SimilarCaseRetriever工具,输入修改后的查询内容,获取更多符合用户需求的案例。
Action:
{
  "action": "SimilarCaseRetriever",
  "action_input": "2023年 广东省 机动车交通事故责任纠纷 保险公司代位求偿权"
}

工具返回结果

[
  {
    "case_id": "(2023)粤01民终4567号",
    "cause_of_action": "机动车交通事故责任纠纷",
    "dispute_point": "保险公司代位求偿权的诉讼时效"
  },
  {
    "case_id": "(2023)粤02民终8901号",
    "cause_of_action": "机动车交通事故责任纠纷",
    "dispute_point": "保险公司在赔付后能否向侵权人行使代位求偿权"
  },
  {
    "case_id": "(2023)粤03民终2345号",
    "cause_of_action": "机动车交通事故责任纠纷",
    "dispute_point": "保险公司代位求偿权的范围"
  }
]

智能体最终回答
“根据你的需求,找到以下2023年广东省的机动车交通事故责任纠纷中关于保险公司代位求偿权的案例:

  1. (2023)粤01民终4567号:争议焦点是保险公司代位求偿权的诉讼时效;
  2. (2023)粤02民终8901号:争议焦点是保险公司在赔付后能否向侵权人行使代位求偿权;
  3. (2023)粤03民终2345号:争议焦点是保险公司代位求偿权的范围。”
2. 关键结论:上下文工程的作用

从测试结果可以看到,智能体能够:

  • 理解用户的需求上下文(年份、地域、案由、争议焦点);
  • 解析案例的法律上下文(案由、争议焦点);
  • 动态关联相似性上下文(符合“2023年+广东省+机动车交通事故责任纠纷+代位求偿权”的案例)。

这正是上下文工程的价值——让AI从“字面匹配”升级为“语义+逻辑匹配”。

(四)第四步:上下文动态优化——让AI“越用越准”

Agentic AI的优势在于能根据用户反馈动态优化上下文。比如,用户可能会说:“(2023)粤01民终4567号案例不相关,我要找的是‘赔付后向侵权人行使代位求偿权’的案例。”这时,智能体需要调整上下文模型,排除不相关案例,并优化检索逻辑。

1. 示例:根据用户反馈优化

用户反馈:“(2023)粤01民终4567号案例不相关,我要找的是‘赔付后向侵权人行使代位求偿权’的案例。”
智能体处理流程

  • 步骤1:接收反馈:记录用户认为不相关的案例(case_id=(2023)粤01民终4567号);
  • 步骤2:分析原因:该案例的争议焦点是“代位求偿权的诉讼时效”,而用户需要的是“赔付后向侵权人行使代位求偿权”,语义偏差;
  • 步骤3:优化上下文:将该案例从向量库中移除(或降低其权重),并调整检索逻辑(增加“赔付后向侵权人”的语义权重);
  • 步骤4:重新检索:用优化后的查询“2023年 广东省 机动车交通事故责任纠纷 保险公司赔付后向侵权人行使代位求偿权”重新检索。
2. 代码示例(动态优化向量库)
# 移除不相关案例(根据case_id)
def remove_irrelevant_case(case_id):
    # 从向量库中获取该案例的索引
    case = vector_store.get(ids=[case_id])  # 假设case_id是向量库的id(需提前设置)
    if case:
        vector_store.delete(ids=[case_id])
        print(f"成功移除不相关案例:{case_id}")
    else:
        print(f"未找到案例:{case_id}")

# 测试:移除用户反馈的不相关案例
remove_irrelevant_case("(2023)粤01民终4567号")

(五)第五步:自定义与美化——让结果更“好用”

为了让相似案例检索结果更符合法律从业者的使用习惯,我们可以自定义上下文输出,比如:

  • 增加判决结果(支持/驳回);
  • 标注法律适用条款(如《保险法》第六十条);
  • 生成案例摘要(用100字概括核心逻辑)。
代码示例(优化检索结果)
def retrieve_similar_cases_enhanced(query):
    query_embedding = get_embedding(query)
    similar_cases = vector_store.similarity_search_by_vector(query_embedding, k=3)
    result = []
    for case in similar_cases:
        # 增加判决结果和法律适用条款
        result.append({
            "case_id": case.metadata["case_id"],
            "cause_of_action": case.metadata["cause_of_action"],
            "dispute_point": case.metadata["dispute_point"],
            "judgment_result": case.metadata["judgment_result"],
            "legal_application": case.metadata["legal_application"],
            "summary": f"本案中,法院认为:根据《保险法》第六十条,保险公司在赔付后有权向侵权人行使代位求偿权,支持了保险公司的诉讼请求。"  # 示例摘要
        })
    return result

# 更新工具函数
tools = [
    Tool(
        name="SimilarCaseRetriever",
        func=lambda query: retrieve_similar_cases_enhanced(query),
        description="用于检索相似法律案例,输入是用户的查询内容,输出是相似案例列表(包含案号、案由、争议焦点、判决结果、法律适用、案例摘要)"
    )
]

四、进阶探讨:让相似案例关联更“智能”

1. 混合模型:规则引擎+Agentic AI

对于复杂的法律场景(如“跨案由相似案例关联”),可以结合规则引擎Agentic AI

  • 规则引擎:过滤案由(如“必须是机动车交通事故责任纠纷”);
  • Agentic AI:关联争议焦点(如“代位求偿权”的语义相似性)。

2. 性能优化:处理百万级案例

当案例数据量达到百万级时,FAISS的检索速度可能下降,此时可以:

  • 使用分布式向量数据库(如Pinecone、Weaviate);
  • 对案例进行分库分表(如按案由分库:机动车交通事故责任纠纷库、买卖合同纠纷库);
  • 采用量化技术(如将1536维向量量化为256维,减少计算量)。

3. 多模态上下文:结合“文本+庭审视频”

对于有庭审视频的案例,可以结合视频上下文(如法官的语气、当事人的陈述)进行关联,比如:

  • 语音识别将庭审视频转化为文本;
  • 情感分析判断法官对“代位求偿权”的态度;
  • 将视频上下文与文本上下文融合,提高相似性关联的准确性。

五、总结:Agentic AI上下文工程的核心价值

1. 回顾要点

  • 上下文工程是Agentic AI在法律案例检索中的核心,它包括:
    1. 数据预处理(提取法律要件);
    2. 上下文表示(向量转化);
    3. 智能体构建(记忆+工具调用);
    4. 相似性关联(语义+逻辑匹配);
    5. 动态优化(根据反馈调整)。

2. 成果展示

通过本文的实战,我们构建了一个能理解法律上下文的相似案例检索智能体,它能:

  • 精准关联“案由+争议焦点+地域+年份”的相似案例;
  • 根据用户反馈动态优化;
  • 输出符合法律从业者习惯的结果(包含判决结果、法律适用、案例摘要)。

3. 展望:未来的可能性

Agentic AI在法律案例检索中的应用还有很大的拓展空间,比如:

  • 跨 jurisdiction 关联(如中国与美国的“代位求偿权”案例关联);
  • 预测判决结果(根据相似案例的判决结果,预测当前案例的可能结果);
  • 自动生成法律文书(根据相似案例的判决逻辑,生成当前案例的文书草稿)。

六、行动号召:一起推动法律科技的发展

1. 动手尝试

下载本文的代码(或参考LangChain的官方文档),构建一个属于自己的Agentic AI法律案例检索工具,并测试它的性能。

2. 分享经验

如果你在实践中遇到了问题(如向量表示不准确、智能体思考逻辑混乱),欢迎在评论区留言,我们一起讨论解决!

3. 提出建议

你认为Agentic AI在法律案例检索中还有哪些可以优化的地方?比如“更精准的上下文关联规则”“更友好的用户界面”,欢迎提出你的建议!

最后:法律科技的发展需要“法律人+技术人”的共同努力,让我们用Agentic AI上下文工程,让法律案例检索更智能、更高效!


作者:[你的名字]
公众号:[你的公众号](分享更多法律科技实战内容)
GitHub:[你的GitHub](本文代码开源地址)

Logo

更多推荐