AI Hero Club

多模态 RAG · 第 8 章

已自行标记完成0 / 8

仅保存在当前浏览器;完成标记不代表通过项目验收。

本章提纲 3 个小节
全课目录 8 章
完整课程计划 ↗
多模态 RAG / 课程计划 ↗

CHAPTER 08 / 8建议学习 150 分钟

从下载项目到可复核图文资料助手

从新目录启动图文资料助手时,怎样确认索引、模型、回答和扰动结果来自同一版本?

本章要解决的 3 个问题
  • 运行实际文件到引用答案的完整接口
  • 用同一检查点复现评价和扰动
  • 检验所有参数、梯度、来源、泄漏与冻结边界
课程项目 ZIP ↓

从原始文件到可复跑的资料助手

最后一章把前七章拼成一个能独立运行的项目,而不是再加一段与正文无关的演示。下载目录包含rag_lab源码、原创原件、冻结模型与训练记录、查询和扰动报告、测试及依赖说明。学生不需要从另一门课复制文件,也不需要远程API密钥、GPU或预训练权重。读者最低条件是Python基础、向量和导数;课程导入PyTorch自动微分与卷积算子,并以解析小例、有限差分与真实测试核对使用方式。

环境要求Python至少三点十一:NumPy二点三点五本身要求这个范围,不能因为源码大多简单就写成支持Python三点九。requirements固定torch二点六、NumPy二点三点五和Pillow十二点三。作者实际环境Python三点十二、CPU单线程。依赖安装需要常规软件源网络,运行与验证数据则都在下载包内,没有运行中外发原件的路径。各平台浮点差异仍可能影响极近并列,不能宣传任意机器逐字节相同。

文件职责清晰但围绕同一个信息流。data负责原创PNG和Markdown生成、真实像素读取、固定特征、中文词法单位及文档位置提取;encoder负责真实两分支网络、双向损失、训练与冻结加载;retrieval负责建索引、BM25、RRF、覆盖重排、上下文选择、原件验证和支持回答;run把这些连接为单次查询与固定题评价;stress从原图生成真实扰动并比较两个分支。测试直接调用这些生产函数,不另外编一条只为通过的管线。

files→entries→BM25/dual encoder→RRF→coverage rank→whole context→validate→answer/refuse\text{files}\to\text{entries}\to\text{BM25/dual encoder}\to\text{RRF}\to\text{coverage rank}\to\text{whole context}\to\text{validate}\to\text{answer/refuse}
每个箭头对应可运行函数和有类型含义的中间产物;不是把不同课程的成绩拼在一起。

算例一:一条真实查询的全部中间状态

在项目根目录运行文字查询“借阅台 开放时间”。程序加载冻结模型并从实际文件建索引,词法找到借阅台对应原行,学习分支对没有域内几何词的查询不给图像候选,融合仍能保留文档。重排确认主题和字段逐字匹配,字符预算保留完整行,回答前检查原件散列和区间,最后输出原值与引用。若结果只是打印一句预写时间,却没有经过这些函数,就不满足本项目合同。

在课程项目目录运行这是实际端到端API,不读取评价标签。
from pathlib import Path
from rag_lab.encoder import load_checkpoint
from rag_lab.retrieval import build_index
from rag_lab.run import query_once
root=Path('data/inputs'); checkpoint=Path('evidence/encoder/encoder.pt')
model,vocab,_=load_checkpoint(checkpoint)
index=build_index(root,checkpoint)
r=query_once('借阅台 开放时间',index,model,vocab,root)
assert r['result']['status']=='answered'
assert r['result']['answer']=='周二至周五十四点到十七点。'
assert r['result']['citations'][0]['source']=='documents/borrowing.md'
print(r['context_ids'],r['result'])

接着把查询换成“红色 小 圆形”,同一个索引还包含真实像素向量,模型词袋可处理三个属性,最终支持检查逐项验证像素测量。把查询再加“材质”应拒答;把问题换成“测试台 开放时间”应保留冲突。它们共享同一入口query_once,区别来自资料与合同,不是为每题手写不同答案。输出的candidate_scores、context_ids与citations共同形成可检查轨迹。

命令行直接使用Python模块入口,当前工作目录必须是项目根目录。单次查询用python -m rag_lab.run --query,三十九题用同一模块不带query并指定新的输出目录。重做评价不必重训,使用已经提供的encoder.pt即可。为了保存作者冻结证据,README把学生新报告写入runs/evaluation,不覆盖evidence。如果学生确实希望重新训练,另选runs/encoder输出,记录新检查点散列并用它贯穿后续所有评价。

终端命令先在项目根目录激活已安装依赖的Python环境;命令写新目录,保留冻结模型和报告。
python -m rag_lab.run --query '红色 小 圆形'
python -m rag_lab.run --output-dir runs/evaluation
python -m rag_lab.stress --output-dir runs/stress
python -m tests.run_tests

算例二:独立训练与冻结复现的区别

冻结复现读取作者同一权重,重新提取文件、算查询和扰动,检查结果与记录一致;它验证推理链与证据完整性。重新训练则从指定随机种子开始更新二十对图文,得到新权重,即便相同配置也应另记环境与散列。检查点torch保存容器的字节身份可能受输出文件名等序列化细节影响,不能把仅散列不同比较成模型数值必不同;要区分文件身份与参数逐张量比较。

作者训练二百二十步,测试套件为了快速集成验证另在临时目录训练八十步。后者检查训练损失下降、二十训练ID排除四留出ID、冻结推理不改权重、固定词法流程可通过,而不是用八十步成绩替换二百二十步论文式报告。测试创建原件与临时模型,结束后清理临时目录,学生不会因为跑测试而覆盖作者主检查点。测试本身的结果报告与时间写入evidence/test-results,若要保持原包完全只读,应在解压副本上运行。

参数总数也可独立逐层核对。第一卷积为8(3⋅3⋅3+1)=2248(3\cdot3\cdot3+1)=224,第二为16(8⋅3⋅3+1)=116816(8\cdot3\cdot3+1)=1168;图像线性层为32(1024+1)=3280032(1024+1)=32800。域内词有四颜色、三形状和两大小,共九个,再加未知项共十维,因此文字首层为32(10+1)=35232(10+1)=352,末层为32(32+1)=105632(32+1)=1056。五项相加得到3560035600。词表不能只数九个已知单位而漏掉未知项,也不能把查询里临时出现的未知词自动扩张进冻结词表;否则网络参数形状和检查点都不再匹配。这个逐层算例独立核对了程序的参数统计。

参数梯度测试先固定小批与种子,用双精度网络计算损失并反向传播,逐个参数张量要求梯度存在、有限、总绝对值正。再选文本输出层一个权重,分别加减很小扰动,用两次损失之差除两倍步长,和解析自动微分值比较。中心差分误差在光滑且远离ReLU转折的区域通常随步长平方下降,但太小会受浮点消去影响;当前仅在选定点以一乘十的负七容差核对,不能当作全参数梯度证明。

gFD=L(θ+εej)−L(θ−εej)2ε,ε=10−5g_{FD}=\frac{L(\theta+\varepsilon e_j)-L(\theta-\varepsilon e_j)}{2\varepsilon},\quad \varepsilon=10^{-5}
theta为全部参数,e_j只改变选中坐标;使用float64,和自动微分在同一批输入上比较。

为避免只在临时八十步模型上检查,本项目还有只读入口python -m rag_lab.audit。它按主检查点保存的seed二十三重新构造初始化网络,与同一个二百二十步模型逐张量比较,十个参数张量都至少一个坐标变化且数值有限;同时核对训练原图散列、配对表散列和训练ID恰为二十个、四个留出ID被排除。该审计不更新模型,也不把测试模型成绩代替主模型。

独立控制有不同作用。零分数二对样本验证损失log二和四项梯度;BM25两文档手算验证公式;RRF对换排名验证并列;实际文档区间重建验证引用;删标签表后重建索引验证运行时数据边界;更改散列与路径穿越验证失效拒答;未知属性、冲突与不可信便笺验证支持政策。测试覆盖这些机制,仍不构成任意输入安全、自然视觉或通用对话质量的保证。

复现报告要保留原始失败。三十九题中神经模式九道文档题失败,三种扰动中平移只有二张身份正确,变暗也有两张失败,灰度有大量不可恢复颜色问题。学生若只看训练loss下降会漏掉最有教学价值的部分。若修复某个模块,应保留旧报告,把新源码、权重、输入和全部新指标绑定到同一版本,不允许对每个图选择不同模型后拼出一张完美表。

工程边界同样具体。当前没有OCR、ASR或音频;没有真实CLIP权重、自然图像泛化、长文语义检索、向量数据库、LLM开放生成或多租户权限系统;上下文预算是正文字符,不是token。模型检查点用torch.load读取可信本项目文件,不能把未知外部pickle当可安全打开的数据。课程目的为可重建的多模态检索与证据流程,这些未实现能力不应藏在一句“以后可扩展”里冒充已经交付。

完成标准不是背出RAG、CLIP和RRF三个名称,而是能解释每个原件怎样被编码、排序、选择、验证和引用,能找出哪一层造成失败,能用相同入口复现一份好结果与一份失败。八章中的算例与项目函数在这个能力目标上相接:第一章定义来源,第二章建立强基线,第三章真正训练,第四章连接检索,第五章约束回答,第六章分层记账,第七章暴露分布失效,本章完成独立交付与复查。

TRY IT YOURSELF

练习一:冻结与再训练

只想核对39题和72扰动,必须运行encoder训练吗?怎样确保不覆盖作者证据?

提示 1
复现冻结评价需要加载已有权重,是否一定要重新训练?
提示 2
用新runs目录保存39题和72扰动结果,检查前后checkpoint身份;新训练另立版本,别覆盖作者证据。
对照参考解答
不需要。直接使用evidence/encoder/encoder.pt运行rag_lab.run与rag_lab.stress,将输出指定到runs目录。记录前后检查点散列,比较各模式分母、正确数和逐题错误。若重新训练,应另用输出目录并标明新权重,不能将新旧两模型成绩拼成同一复现结论。

TRY IT YOURSELF

练习二:失效追踪

文件borrowing.md改一字后,已有索引为什么应拒答?重建后是否立即证明新值真实?

提示 1
旧索引绑定的是改动前哪一份原件字节?
提示 2
先核hash不符应怎样处理,再区分重建恢复可追溯性与证明新值在现实中真实有效。
对照参考解答
旧索引绑定旧字节散列,核验发现不一致,不能沿用旧引用。重建能使新索引与新原件一致,但只恢复可追溯性,不证明现实事实真实、有效或已授权。当前资料为原创虚构文件。需要现实有效性时还要引入独立可信来源与版本政策。

TRY IT YOURSELF

练习三:部署声明

同学说“通过所有测试,因此支持任意照片和自然问题”。指出推论缺失,并给出当前能成立的验收陈述。

提示 1
列出实际测试域的像素尺寸、形状语法与查询方式。
提示 2
将固定域可复跑流程与未测自然照片/开放语言/OCR/语音分开,有限通过不能自动推出后者。
对照参考解答
测试覆盖固定32像素几何域、受控主题字段查询和若干边界;没有自然照片、开放语言、OCR和语音数据。可成立的是:在记录的软件版本与同一冻结权重下,原创原件到检索、引用和拒答流程可运行,固定题和扰动结果可重复,已知失败完整保留。测试不把有限计算变成总体能力证明。

CHECK YOUR UNDERSTANDING

检验理解

先作答,再决定是否展开解析。选择题用于发现理解缺口;独立实现与迁移任务仍需另行检验。

1. 只做冻结推理复现必须?

查看解析权重、原件与代码均随项目提供。
2. 测试80步与作者220步成绩关系?

查看解析不同训练轨迹的用途应分别标明。
3. 完整交付是否含音频识别?

查看解析实际主项目是PNG与Markdown,不宣称ASR。
4. 完成本课的操作能力是?

查看解析重建和检查信息流才是课程的最终能力。

自行标记用于记录学习进度,不代表通过项目验收。