基于 RAG 和 Claude 的智能文档聊天系统实战指南

最近我和一个律师亲戚聊AI时,问了我应该怎么对现在律师事务所庞大的文档做AI检索,从技术上讲用现在的LLM+RAG可以满足需求,但细想不太对劲,因为这里面涉及到很多专业知识,还有律师的专有思维路径,一个不懂律师业务的程序员肯定是做不好的,于是有幸跟他们合伙人进行了深入沟通,合伙人说了一堆但我总结下来就这么一句话

"一个能回答我们所有文档相关问题的工具"。

比如:1)描述法庭上发生的事件,2)提供某个案件的最新进展,3)列出案件的时间线。

要知道,这可是家律师事务所,工具得处理海量的客户机密信息、法律诉讼资料等等,所以隐私和(尤其是)hallucinations(幻觉)是两个大难题。他们最初的想法是把所有数据塞进ChatGPT然后问问题,但这显然不行,因为完全没法解决隐私和准确性的问题。这个项目几周前交给我,我觉得自己做出来的东西还不错,成本也不高。这是一个RAG系统,能把扫描的法律文件分块、嵌入到本地的FAISS索引中,在查询时做最近邻检索,把排名靠前的、带引用的上下文喂给Claude,生成事实准确、带来源的答案,而且所有数据从没离开过事务所的网络。

我想分享一下这个经验,给你点灵感,如果你也在搞类似的项目,希望能帮到你。

为什么不直接使用LLM

把事务所的整个文档库直接丢进像ChatGPT/Deepseek这样的现成LLM显然很糟糕。主要问题有:

保密性:文档库里有密封证据、客户ID、医疗记录和特权策略备忘录。把这些推送到外部API会违反NDA,在我们国家还可能被制裁(同事告诉我的)。本地微调模型会安全点,但也得有严格的加密存储保障。通用云LLM啥都保证不了。

Hallucinations(幻觉) :LLM是概率序列生成器,生成的是"看起来对"的文本,不是"真对"的文本。在法庭上,一个捏造的引用可能毁掉一个案子。我们需要事实准确、带逐行出处的答案,基础模型没检索层和引用检查压根做不到。

Token限制:我们的语料库大概1TB,OCR和预处理后分成约100万个chunk。即使是"扩展上下文"的模型,也最多支持200k token------大概10份中等长度的诉状。直接用LLM要么得超级粗糙地总结,要么随机采样,必然漏掉关键事实。

输入杂乱:大部分证据是扫描的TIFF文件,邮件多是西班牙语或法语的法律术语。现成的LLM在干净网页文本上训练,面对OCR噪声和专业术语会翻车。得有预处理、双语嵌入和逐chunk的质量评分。

延迟:把兆字节的上下文塞进LLM,推理时间得飙到几秒,账单也可能几美元一次。本地向量搜索+针对性生成能把p95延迟控制在120ms左右,Claude的成本压到每次$0.02以下。

可审计性:每个答案都得在几个月后还能重现。原始LLM输出会随模型更新和temperature变化而漂移;带冻结嵌入和版本固定的prompt的RAG管道能提供可靠的审计追踪。

总结:普通LLM适合头脑风暴,但在律所的生产环境中,合规性差、成本高。我们需要带硬性隐私保证、确定性引用逻辑和低延迟的RAG系统,所以有了下面的架构。

系统架构

文档摄入

一个watcher脚本监控安全网络共享,记录每个新文件到一个只追加日志。对于每个文件d_i,我们计算:

scss 复制代码
sha256(d_i)  →  主键

同时捕获元数据(case_id, MIME, timestamp)。先存哈希能去重,避免重复OCR,还能提供不依赖文件名的审计追踪。

OCR与解析

根据MIME类型分流:

  • • 有文本层的PDF,用pdfplumber逐页提取。
  • • 扫描件/TIFF/PNG,用Tesseract的--psm 4"稀疏文本"模型,带自定义语言白名单[eng,spa,fre]。

每个页面返回纯UTF-8文本+边界框JSON;JSON不离开内网,但支持后续高亮渲染,保护隐私。

文本分块

页面用滑动窗口切分:

ini 复制代码
window_size = 1_024   # 字节
overlap     = 0.10    # 10%

每个chunk c_j生成一条记录:

csharp 复制代码
{
  "doc_id": sha256(d_i),
  "page":   p,
  "offset": byte_start,
  "text":   <1024-byte string>
}

为什么用字节而非token?字节窗口"lexer无关",更灵活,OCR噪声不会让chunk数量爆炸。实际平均每页约8个chunk。

嵌入

用在英/西/法语法律语句上微调的'tri-lingual' MiniLM(all-MiniLM-L6-v2)生成嵌入:

ini 复制代码
e = φ(text)  ∈  ℝ^n        # n是向量长度
e ← e / ||e||₂             # 单位归一化,cosine = dot

向量长度得让索引够小,n = 350是个好选择;100万个chunk占约2.7GB RAM,保留>0.86的平均cosine相似度。

向量数据库

嵌入存到FAISS IVF-PQ索引:

ini 复制代码
nlist        = 256     # 粗聚类中心
pq_m         = 8       # 子向量
pq_bits      = 10      # 每子向量位数
nprobe       = 8       # 每次查询探查的列表

这配置在单GPU上中位召回时间约18ms,RAM占用大幅减少。

k-NN搜索

对查询q,嵌入一次(e_q),执行:

scss 复制代码
S_k(q) = topk_cosine(e_q, k = 40)

丢弃相似度<0.20的候选,低于这个阈值答案质量会变差。若S_k为空,直接返回"无匹配证据",省下Claude调用费用。

重新排序

用INT8量化的cross-encoder(mxbai-reranker-base)对S_k中的(q, c)对评分:

css 复制代码
score = σ(W · BERT(q, c) + b)

保留前10个最高分。量化大幅降低CPU推理时间。

提示构建

用严格模板拼接10个chunk:

xml 复制代码
<SYSTEM>
You are an expert paralegal...
</SYSTEM>
<CONTEXT>
[doc:a5f9...:p12]  ...chunk text...
[doc:c1b3...:p 3]  ...chunk text...
...
</CONTEXT>
<USER> {original question} </USER>

提示大小控制在15kB以下,留出512 token的回答空间,避开Claude 32k上下文上限。

LLM调用

用temperature=0.0(完全确定性)和max_tokens=512调用Claude-3-Opus。按当前定价和平均上下文长度,每次调用约$0.018,耗时约90ms。

引用检查

生成后进行两项检查:

  • Regex:每句必须以"[doc:page]"结尾。
  • 编辑距离:每个引用的Levenshtein(sentence, cited_chunk) ≤ 10,防止paraphrase幻觉。

若任一检查失败,返回"Insufficient context"。通过则带引用交付答案。所有原始文本留在隔离VLAN,输出可追溯到磁盘上的chunk。

组件详解与设计选择

文档摄入与去重

每个文件进入"new-evidence"共享后通过watcher脚本处理:

    1. 计算原始字节的sha256哈希作为主键,避免文件名变化影响。
    1. 捕获不可变元数据,存到只追加的SQLite日志。
    1. 去重:若哈希已存在,跳过OCR,节省时间。
    1. 队列文件给下游OCR/解析。

日志状态是语料库字节内容的确定性函数,方便后续审计。

OCR与解析

新文件交给OCR工作池,按MIME快速分流。页面对象包含:

json 复制代码
{
  "pk":        <sha256>,
  "page_no":   17,
  "mime":      "application/pdf",
  "text":      "...plain UTF-8...",
  "bbox_json": [...],
  "lang":      "spa",
  "ocr_conf":  0.93
}

保留bbox_json方便UI高亮引用行。若ocr_conf<0.60,标记页面需人工QA,跳过嵌入,减少垃圾token。

文本分块与窗口几何

页面文本切成固定大小、带重叠的窗口:

css 复制代码
WINDOW_BYTES = 1_024
OVERLAP_PCT  = 0.10
for each page_text:
    i = 0
    while i < len(page_text):
        chunk = page_text[i : i + WINDOW_BYTES]
        emit({
            "doc_id": sha256(file_bytes),
            "page":   page_number,
            "offset": i,
            "text":   chunk
        })
        i += int(WINDOW_BYTES * (1 - OVERLAP_PCT))

用字节窗口避免OCR噪声导致chunk数量不稳定。1024B大小能装两段文本,适合"接下来发生了什么"类问题。

嵌入

用微调的MiniLM编码器处理chunk,生成n=350维向量,归一化后cosine相似度即点积。100万个chunk占2.7GB RAM,保持>0.86的cosine相似度。

向量索引

嵌入存到FAISS IVF-PQ索引,配置如上。相比平坦索引,IVF-PQ内存占用从11GB降到2.7GB,查询时间从70ms降到<20ms,冷启动<3s。

k-NN检索

查询嵌入后,取top 40相似chunk,丢弃相似度<0.20的,减少噪声。FAISS单GPU流处理,p95延迟<30ms。

重新排序

40个候选用INT8 cross-encoder重新评分,保留top 10,约10kB,适合Claude 32k上下文。

提示构建

用固定模板拼接:

makefile 复制代码
SYSTEM_MSG = (
    "You are an expert paralegal. "
    "Answer strictly from the context and cite every factual claim "
    "as [doc_id:page]. If the context is insufficient, reply "
    ""Insufficient grounded context.""
)

前置guardrails和chunk前缀引用降低幻觉,便于regex检查。

LLM调用

用Claude-3-Opus,temperature=0.0,max_tokens=512,确保确定性和审计可追溯。每次调用约$0.018,90ms。

引用检查

两项快速检查:

python 复制代码
CITE_RE = re.compile(r"[[0-9a-f]{6}:\d+]$")
LEV_THR = 10
  • • 每句需以"[abcdef:42]"结尾。
  • • 每个引用句与chunk的Levenshtein距离≤10。

失败返回"Insufficient context",宁缺勿滥。

性能与成本

整个管道在16GB RAM下几乎瞬时。向量搜索18ms,cross-encoder 85ms,Claude调用90ms,引用检查<5ms。端到端p95延迟<200ms,每次查询约,50预算可支持2500次查询。

总结

我不是NLP专家,这套方案是我边查资料边试出来的。结果很快、很便宜,还没泄露过任何机密或捏造引用,我挺满意的。如果你有更好的方法,欢迎分享!希望这篇文章对你有用。

我们该怎样系统的去转行学习大模型 ?

很多想入行大模型的人苦于现在网上的大模型老课程老教材,学也不是不学也不是, 基于此,我用做产品的心态来打磨这份大模型教程,深挖痛点并持续修改了近100余次后,终于把整个AI大模型的学习门槛,降到了最低!

在这个版本当中:

第一您不需要具备任何算法和数学的基础
第二不要求准备高配置的电脑
第三不必懂Python等任何编程语言

您只需要听我讲,跟着我做即可,为了让学习的道路变得更简单,这份大模型教程 已经给大家整理并打包,现在将这份 LLM大模型资料 分享出来: 😝有需要的小伙伴,可以 在这 拿到🆓**↓↓↓**

一、大模型经典书籍(免费分享)

AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源。

二、640套大模型报告(免费分享)

这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)

三、大模型系列视频教程(免费分享)

四、2025最新大模型学习路线(免费分享)

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

L1阶段:启航篇丨极速破界AI新时代

L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理、关键技术以及大模型应用场景。

L2阶段:攻坚篇丨RAG开发实战工坊

L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3阶段:跃迁篇丨Agent智能体架构设计

L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体。

L4阶段:精进篇丨模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调。

L5阶段:专题集丨特训篇 【录播课】

现在将这份 LLM大模型资料 分享出来: 😝有需要的小伙伴,可以 在这 拿到🆓**↓↓↓**

原文地址:https://mp.weixin.qq.com/s/xmYvsfGcmpc9c942aIsHfA

相关推荐
智泊AI44 分钟前
GPU并行计算是什么?GPU并行计算的原理是什么?
llm
yaocheng的ai分身2 小时前
主流大模型的Cache机制对比
llm
redreamSo3 小时前
AI Daily | AI日报:Altman:GPT - 5将引发就业与欺诈变革; OpenAI 新模型多场竞赛‘翻车’,谷歌躺赢!; 黄仁勋:报废50亿显卡,员工薪酬全加薪
程序员·aigc·资讯
数据智能老司机4 小时前
构建由 LLM 驱动的 Neo4j 应用程序——揭开 RAG 的神秘面纱
langchain·llm·aigc
数据智能老司机4 小时前
构建由 LLM 驱动的 Neo4j 应用程序——构建智能应用的知识图谱基础理解
langchain·llm·aigc
数据智能老司机4 小时前
构建由 LLM 驱动的 Neo4j 应用程序——使用电影数据集构建你的Neo4j图数据库
langchain·llm·aigc
曾曜5 小时前
大模型学习比较-优化提示词改善答疑机器人回答质量
llm
数据智能老司机5 小时前
构建由 LLM 驱动的 Neo4j 应用程序——LLM、RAG 与 Neo4j 知识图谱简介
langchain·llm·aigc
京东云开发者6 小时前
100%开源!行业首个企业级智能体
程序员
你的人类朋友12 小时前
1.为什么要写这个专栏
程序员