18-01 比较分块结果
题目
将块长度依次改成 80、120、200,打印块内容与来源;用同一组问题比较正确证据是否完整进入前两项,说明选择哪组参数的依据。
推导与做法
固定同一语料与同一问题,只改变 chunk_size=80、120、200,保持 overlap=20。每组都保存实际块数、前两块内容、来源和分数。
选择时先看完整操作是否落在证据里:例如“切片是视图”和“需要 copy”是否一起保留;再比较无关文本量与块数。较大块可能保住上下文,也可能稀释检索分数,不能只按最高分选。题解输出三组完整材料,沿材料读出选择理由。
过程图
%% 每个节点保留输入、执行位置或执行后的实际状态。
flowchart TD
S0["同一语料分别按80、120、200分块"]
S1["每组重新编码与建立索引"]
S0 --> S1
S2["同一问题取归属过滤后的前两块"]
S1 --> S2
S3["展开来源与正文,检查完整事实是否被保留"]
S2 --> S3
classDef default fill:#EEF0FB,stroke:#4657B5,color:#24324A
linkStyle default stroke:#4657B5
实现与运行
查看带注释实现。本题与相关处理函数放在同一章节代码文件中;启动工具负责定位相邻项目和选择题号。
在配套目录的 LangChain与AgentRuntime/study_agent 中运行。先按项目 README 执行 uv sync --locked。本章先执行 uv sync --locked --all-extras。18-06 还需执行 uv pip install -e "../../FastAPI/api_project",接入前面 API 声明的依赖;之后使用 --no-sync 保留这份组合环境。
# 使用项目解释器运行本题,题号决定执行哪一组演示。
uv run --no-sync python "../../学习索引/参考实现/代码/ch18.py" 18-01
程序按题号输出处理后的值、查询结果或状态。先和前面的手算比较,再修改一项输入重跑。
查看本题运行结果
# 与上面的手算状态和题目数值逐项比较。
[
{
"chunk_size": 80,
"chunks": 12,
"top2": [
{
"source": "numpy.md",
"text": "NumPy 切片与拷贝",
"score": 0.5
},
{
"source": "numpy.md",
"text": "NumPy 的基本切片通常得到视图,视图和原数组共享数据。修改切片中的元素可能改变原数组。希望保留原数组时,先调用 copy(),再修改新数组。",
"score": 0.3553711577967667
}
]
},
{
"chunk_size": 120,
"chunks": 8,
"top2": [
{
"source": "numpy.md",
"text": "NumPy 切片与拷贝\n\nNumPy 的基本切片通常得到视图,视图和原数组共享数据。修改切片中的元素可能改变原数组。希望保留原数组时,先调用 copy(),再修改新数组。",
"score": 0.4545454545454546
},
{
"source": "alice-plan.md",
"text": "Alice 的阅读计划\n\nAlice 本周准备先复习 NumPy 切片与 copy,再把学习记录保存到 SQLite。",
"score": 0.21875
}
]
},
{
"chunk_size": 200,
"chunks": 5,
"top2": [
{
"source": "numpy.md",
"text": "NumPy 切片与拷贝\n\nNumPy 的基本切片通常得到视图,视图和原数组共享数据。修改切片中的元素可能改变原数组。希望保留原数组时,先调用 copy(),再修改新数组。\n\n排查共享问题时,可以用 np.shares_memory 检查两个数组是否共享内存。先分别记录修改前后的数组值,再解释变化来自哪个对象。",
"score": 0.36997003669797196
},
{
"source": "alice-plan.md",
"text": "Alice 的阅读计划\n\nAlice 本周准备先复习 NumPy 切片与 copy,再把学习记录保存到 SQLite。",
"score": 0.21875
}
]
}
]