运用目前的RAG系统,我试着问它 “房东卖房,租客怎么办?”它确实引用了相关文档 但我看文档是这个样子的:第一款第一项之规定,判决如下:\n驳回上诉,维持原判。\n二审案件受理费人民币100元,由某某某公司负担。\n本判决为终审判决。\n审
这是非常典型的垃圾进,垃圾出
如果 RAG 检索出的上下文是无意义的法律套话,那么它不仅没有实际作用,甚至会产生误导
问题根源:为什么会检索到无用的判决结果?
-
检索(Retrieval)是成功的:当用户问“房东卖房,租客怎么办?”,嵌入模型(Embedding Model)正确地将这个问题转换成了一个向量。然后,它在裁判文书库中搜索,发现有一篇或多篇文书的向量与这个问题最“邻近”。这些文书很可能就是关于房屋租赁纠纷的,所以从“主题”上来说,检索是成功的。
-
上下文(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 文件。
高级处理思路:
-
提取出“事实与理由”部分,存为 case_id_facts.txt。
-
提取出“本院认为”部分,存为 case_id_reasoning.txt。
-
在“本院认为”部分内部,可以按段落(以换行符分割)再次切分,每个段落成为一个独立的知识块。
这样,当用户提问时,RAG 系统就能精确地检索到包含具体法理分析的那个段落,而不是一整篇长文。
核心步骤三:丰富元数据 (Enrich Metadata)
虽然 AnythingLLM 的界面不支持直接添加复杂元数据,但在文件名或文件内容开头加入标签也是一种方法。例如,可以将处理后的文件内容保存为:
[来源: 事实与理由] [案件类型: 租赁纠纷] xxxxxxxx...
这能让大模型在生成答案时,更好地理解上下文的来源。

712

被折叠的 条评论
为什么被折叠?



