跳到主内容

course materials · 2026 秋季本科

练习二:上市公司年报的向量检索与召回(RAG)

Week 8 · 2026-10-27 · 上机材料

返回本周材料

30 家银行 2025 年报:按意思、按字检索农业银行的净息差,分清净利差,再问一个检索答不了的比大小问题。

下载 Markdown 原文
切换上机材料(3 篇)

练习二讲解录播(下载)

MP4 · 5 分 33 秒

本页可直接播放;需要离线看时下载。

下载材料包
本页目录

上机导航 · W08 材料入口

开始之前先看上机导航“开始之前”一节:解压留底、隐藏文件夹、工作空间选到哪一层。

任务

02_银行年报RAG/ 是一个做好的检索增强生成(RAG)小系统:资料是 30 家 A 股上市银行 2025 年年报的文字部分;切块、换成向量这两步已经算好,存在 向量库/ 里,共 7638 段。你要做的是第四、五步:检索,再让它只凭检索结果回答。

贯穿这个练习的是一个问题:“农业银行 2025 年的净息差是多少?出处在哪一页?”这里有个坑。净息差和净利差差一个字,不是一回事:净息差是利息净收入除以生息资产平均余额,净利差是生息资产收益率减付息负债付息率。农行的年报里一次都没写“净息差”这三个字,它写的是“净利息收益率”。

你会看到:按字找,找不到农行;按意思找,找到了,但找回来的段落里两个数挨在一起,像不等于对。最后再问一个比大小的问题,看它会不会承认检索答不了。

🎬 讲解录播:净息差还是净利差,用 RAG 与不用

录播 5 分 33 秒,带讲解和字幕,播放器右下角可以全屏。

准备

材料包 02_银行年报RAG/:

文件内容
CLAUDE.md、AGENTS.md规则文件,两份同内容:回答只用 检索.py 打印出来的段落,每个数写出处,没找到就直说
问题清单.md四个问题,下面几步用的就是这里的原话
资料库/30 家银行年报的文字部分,每份按原报告页码分节
向量库/切好的段落和算好的向量;另存了问题清单里四个问题、十几个常用词的向量
检索.py给问题,返回最相关的几段和出处。默认按意思;--按字 按字打分;--公司 农业银行 只在这一家里找;-k 8 改取几段
相似度.py几个词两两算余弦相似度,--细节 打出计算过程
向量化.py、嵌入接口.py切块、向量化和调接口的脚本,这次不用改
硅基流动key.txt放 API key 的地方,这次可以不填
招商银行2026半年报节选.md选做:有 key 时用 向量化.py --加 追加进向量库

不填 key 也能做:问题清单里四个问题和常用词的向量都预先算好了,只要问的是清单里的原话(一字不差,连问号),检索就能离线跑。换一种问法,脚本会提示“预先算好的问题里也没有”,这时让它改回清单原话。

要有 Python:脚本只用 Python 自带的库,不用装包。打开终端输入 python --version,显示 3.8 以上即可;Mac 上没有 python 命令、只有 python3 的,在第一条指令后面加一句“本机用 python3 跑脚本”。

工作空间选 02_银行年报RAG 这一层(见“开始之前”)。

第一步:按意思找

做什么:新建对话,发送:

农业银行 2025 年的净息差是多少?出处在哪一页?只用 检索.py 找段落,照检索结果答,每个数写出处。

做对了会看到

  • 它运行 python 检索.py "农业银行 2025 年的净息差是多少?"(Claude Code 里是一行 Bash(python 检索.py ...),按 Ctrl + O 展开看输出)。
  • 检索结果的前两段都是农行年报,第 26 页(余弦 0.777)和第 25 页(0.775)。第 25 页那段原文是:“净利息收益率 1.28%,净利差 1.16%,分别下降 14 个和 11 个基点”。第 26 页是半张表,指标名和数字分在不同行。
  • 回答写 1.28%,说明原文叫“净利息收益率”,出处是农业银行 2025 年年度报告第 25 页(或第 25、26 页);并且分清 1.16% 是净利差,不是净息差。

✅ 自查

它要是绕开检索脚本直接翻资料库,Claude Code 里按 Esc 打断,提醒它“只用 检索.py”。

第二步:按字找,再加公司条件

做什么:同一个对话,接着发送:

同一问,加 --按字 再查一次,只列前 5 段的银行和页码。再加上 --公司 农业银行,按字、按意思各查一次,看第 25 页那段各排第几。最后告诉我:按字为什么找不到农行的净息差?

做对了会看到

  • 按字、不限公司:前 5 段是上海银行、民生银行、华夏银行、建设银行、渝农商行,一段农行都没有。
  • 加上 --公司 农业银行:按意思时第 25 页那段排第 2;按字时前 5 段是第 12、10、49、95 页等,第 25 页那段不在其中。
  • 它说得出原因:按字是数问题里相邻两个字在段落里出现几次,“净息”“息差”在农行年报里一次都没出现;农行写的是“净利息收益率”。叫法不同,意思一样,要靠向量才找得回来。

✅ 自查

第三步:像不等于对

做什么:接着发送:

用 相似度.py 算一下 净息差、净利息收益率、净利差 三个词两两的相似度。“净息差”离哪个更近?这对刚才的回答意味着什么?

做对了会看到

  • 它运行 python 相似度.py 净息差 净利息收益率 净利差,得到:净息差—净利差 0.892,净息差—净利息收益率 0.812。
  • 在向量上,“净息差”离“净利差”比离它的同义词“净利息收益率”还近。它说得出:按意思找回来的段落里两个数挨在一起,找得像,不等于挑的数对;答案要回到原文按定义核。

✅ 自查

第四步:问一个检索答不了的

做什么:接着发送:

30 家银行里,2025 年末不良贷款率最低的是哪家?只凭 检索.py 的结果答;如果检索结果不够回答,直说不够,说明缺什么。

做对了会看到

  • 它用问题清单的原话检索,前 5 段只落在 4 家银行(平安银行占两段,另有邮储、农业、杭州银行)。
  • 它说明:前 5 段覆盖不了 30 家,凭这些比不出“最低”,没有硬答出一个银行名。做得好的还会提出换办法,比如用 --公司 一家一家查,或者回资料库逐份核。

✅ 自查

选做

  • 问清单第二问“招商银行 2025 年末信用卡贷款不良率是多少?”,看检索回来的段落里有没有切块断开的表格:后半段只剩数字,看不出是哪一项、哪一年。
  • 有硅基流动 API key 的,把 key 粘进 硅基流动key.txt(替换那一行说明),就能问自己的问题、算任意词的相似度;再用 python 向量化.py --加 招商银行2026半年报节选.md 追加一份新资料,问一个 2026 年的问题。key 只放在这个文件里,不贴进对话。
  • 问第四问“哪几家银行在年报里写了用大模型做风控?”,看前 5 段能不能回答“哪几家”这种列名单的问题。

想一想

  • 练习一的知识库是“问的时候让模型自己翻目录”,练习二是“问的时候让程序按像不像挑段落”。同一个“净息差”的问题,放进练习一那种带索引的文件夹,它会怎么找?哪种更容易错,错在哪?
  • 比大小、列名单这类问题,RAG 为什么天生不擅长?换成什么做法更合适?

常见问题

报错“没有设 API key,预先算好的问题里也没有……”。 问的不是清单原话。让它照 问题清单.md 一字不差重跑,问号也要一样。

报错 python: command not found 或打开了微软商店。 本机的 Python 命令叫 python3,或者没装 Python。告诉它“用 python3 跑”;没装的按 W01 环境安装手册装好。

Windows 上输出是乱码。 让它在 PowerShell 里先运行 chcp 65001 再跑脚本,或者改用 VS Code 的终端。

它每次跑脚本都要我确认。 Claude Code 读 .claude/settings.json 里的放行规则,只放行 python 检索.py 等三条;它用的是 python3 或加了别的参数时还会问,看清命令再允许。WorkBuddy 按它自己的权限设置。

它打开了 硅基流动key.txt。 规则文件写了不读这份文件,Claude Code 的设置里也禁了读取。它要是试图读,拒绝并提醒它;这份文件这次可以不填。