对原始数据进行“精加工”,把无格式的文本变成结构化的“知识块”

运用目前的RAG系统,我试着问它 “房东卖房,租客怎么办?”它确实引用了相关文档 但我看文档是这个样子的:第一款第一项之规定,判决如下:\n驳回上诉,维持原判。\n二审案件受理费人民币100元,由某某某公司负担。\n本判决为终审判决。\n审

这是非常典型的垃圾进,垃圾出

如果 RAG 检索出的上下文是无意义的法律套话,那么它不仅没有实际作用,甚至会产生误导

问题根源:为什么会检索到无用的判决结果?

  1. 检索(Retrieval)是成功的:当用户问“房东卖房,租客怎么办?”,嵌入模型(Embedding Model)正确地将这个问题转换成了一个向量。然后,它在裁判文书库中搜索,发现有一篇或多篇文书的向量与这个问题最“邻近”。这些文书很可能就是关于房屋租赁纠纷的,所以从“主题”上来说,检索是成功的。

  2. 上下文(Context)是失败的: “驳回上诉,维持原判...” 是裁判文书的末尾部分。问题在于,上传的原始数据没有经过精细化处理和有意义的切分 (Chunking)

    • AnythingLLM(或其他 RAG 系统)为了处理长文档,必须将其切分成小块。如果采用简单的固定长度切分,就很容易把一篇文书的“判决结果”部分单独切成一个数据块。

    • 这个数据块虽然也包含了“案件”、“判决”等法律词汇,在向量空间中离问题不远,但它完全没有包含案件的事实、争议焦点和法官的论证过程

解决方案:从“数据处理”到“知识工程”

要让 RAG 发挥真正的威力,我们必须对原始数据进行“精加工”,把无格式的文本变成结构化的“知识块”。

核心步骤一:精细化数据清洗和提取

在将 CSV 转换为 TXT 文件之前,你需要增加一个中间处理步骤。目标是只保留裁判文书中最有价值的部分

最有价值的部分是:

  • 事实与理由 (Facts and Reasoning)

  • 本院认为 (This Court's Opinion)

  • 争议焦点 (Point of Dispute)

最没有价值、需要被剔除的部分是:

  • 判决结果的套话(“驳回上诉,维持原判...”)

  • 书记员、审判员名单

  • 开庭日期、地址等程序性信息

  • 页眉、页脚、文书编号

使用正则表达式 (Regex) 是最有效的方法。需要编写脚本来识别这些关键部分的标题,并提取其内容。

Python 示例 (在 process_csv.py 中进行修改):

import pandas as pd
import os
import re

def extract_valuable_content(full_text):
    """
    使用正则表达式提取裁判文书中的核心内容。
    这是一个简化的例子,你可能需要根据实际文书格式调整。
    """
    # 尝试找到“本院认为”或“事实与理由”等关键部分的开始
    # re.S 让 '.' 可以匹配换行符
    match = re.search(r'(本院认为|事实和理由|事实与理由)(.*)', full_text, re.S)
    
    if match:
        content = match.group(2)
        # 移除最后的判决结果部分
        content = re.split(r'判决如下|裁定如下', content)[0]
        return content.strip()
    else:
        # 如果找不到特定部分,可以返回一个空字符串或原始文本的一部分作为降级策略
        return "" # 返回空,意味着这篇文书质量不高,不应被向量化

# ... (之前的代码) ...
# 读取 CSV
df = pd.read_csv('judgements.csv')

# 遍历每一行
for index, row in df.iterrows():
    case_id = row['case_id']
    case_content_raw = row['case_content']
    
    # !!! 新增的核心处理步骤 !!!
    valuable_content = extract_valuable_content(case_content_raw)
    
    # 只有当提取到有价值的内容时,才创建文件
    if valuable_content:
        file_path = os.path.join(output_dir, f"{case_id}.txt")
        with open(file_path, 'w', encoding='utf-8') as f:
            f.write(valuable_content)

print(f"处理完成!在 '{output_dir}' 文件夹下生成了高质量的案件文件。")
核心步骤二:实施逻辑切分 (Logical Chunking)

对于特别长的“本院认为”部分,直接整块喂给模型也可能效果不佳。更好的方法是进行逻辑切分

可以不把一篇文书处理成一个 .txt 文件,而是处理成多个有意义的 .txt 文件。

高级处理思路:

  1. 提取出“事实与理由”部分,存为 case_id_facts.txt。

  2. 提取出“本院认为”部分,存为 case_id_reasoning.txt。

  3. 在“本院认为”部分内部,可以按段落(以换行符分割)再次切分,每个段落成为一个独立的知识块。

这样,当用户提问时,RAG 系统就能精确地检索到包含具体法理分析的那个段落,而不是一整篇长文。

核心步骤三:丰富元数据 (Enrich Metadata)

虽然 AnythingLLM 的界面不支持直接添加复杂元数据,但在文件名或文件内容开头加入标签也是一种方法。例如,可以将处理后的文件内容保存为:
[来源: 事实与理由] [案件类型: 租赁纠纷] xxxxxxxx...

这能让大模型在生成答案时,更好地理解上下文的来源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值