周末改了 chunk 尺寸,周一客服说答案全是碎片:我补完生成式 AI 才找到检索的黄金参数
周末改了 chunk 尺寸,周一客服说答案全是碎片:我补完生成式 AI 才找到检索的黄金参数
周五下午,内部 AI 客服试点上线在即。我打开代码编辑器,用 Amazon CodeWhisperer 三下两下就拉起了整套 RAG 检索流程--向量化、相似度检索、上下文拼接,总共不到 40 分钟。当时心想:AI 编程助手果然省力,以后这种活半小时就能交差。
但那天我缺的不是代码生成速度,而是对生成式 AI 系统底层机制的真正理解。如果早点接触 生成式AI 课程,里面的 chunk 分割原理、检索质量评估方法论我就能提前掌握,后面那一地鸡毛本可避免。
起因:RAG 原型三天搭完,测试集准确率 92%
部门要求做一个内部合同与政策问答机器人。我负责技术选型,后端出身,平时用 Amazon CodeWhisperer 写 Python 已经比手敲快 60% 以上。这次自然让它帮我出骨架:用 langchain 的 RecursiveCharacterTextSplitter 切文档,OpenAIEmbeddings 做向量化,FAISS 做检索,最后拼接 prompt 丢给大模型生成答案。
代码很快跑通,测试集上准确率到了 92%。我满意地提交了上线单,并告诉客服主管:下周就能用上 AI 自动应答。当时测试集只有内部整理的 50 条常见问题,评估指标用的是简单的答案关键词覆盖和人工判分--只要模型返回的文本里包含了预期答案的最长公共子串就算“正确”。这种评估方式完全没考虑回答是否语义完整、上下文是否连贯,其实已经为后面的翻车埋下了隐患。
踩坑:周末调整 chunk 尺寸后,答案碎成单词卡
上线前最后一道工序是优化 chunk 大小。文档平均 2000 字,我担心单 chunk 太大会塞进太多无关内容导致幻觉,于是周六把 chunk_size 从默认 1000 调到 300,chunk_overlap 设成 10。
# 原始代码:Amazon CodeWhisperer 生成的快速实现
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=300, # 这里我凭直觉改小了
chunk_overlap=10
)
chunks = splitter.split_documents(docs)
周一早上 9 点半,客服主管打电话过来:“这机器人回答的都是什么?问‘年假如何计算’,它回‘入职满一年可享受;具体天数详见;每年重新核算;注意’,全是碎句子,根本没法给员工看!”
我赶紧看日志,发现检索回来的 chunk 被切割得过碎,语义不完整。即使 top-k 取 5 个,拼起来依然前言不搭后语。我当时误判以为是小模型的问题,想把 gpt-3.5-turbo 换成 gpt-4 试试--其实根源在 chunk 策略。直到我把检索到的前 5 个 chunk 打印出来,看到每个片段几乎都是一句话被拦腰斩断,才意识到原来是文档切割时强制按字符数断开,把完整的条款拆成了毫无逻辑关联的碎片。最典型的一条年假政策原文是“入职满一年可享受 5 天带薪年假,每年 1 月 1 日重新核算”,被切成了三个 chunk,分别只包含前半句、中间数字和后半句,拼回去当然支离破碎。
这次翻车让我意识到:会用 Amazon CodeWhisperer 生成代码不叫会做 AI,能理解检索增强生成的全链路才叫入门。
回头补课:生成式 AI 课程教我的 chunk 三原则
当晚我暂停上线,去看了 生成式AI 课程中专门讲 RAG 的模块。课程用真实案例对比了不同 chunk 尺寸对检索质量的影响,并给出了三条铁律:
- chunk_size 应匹配文档语义单元:合同类文档,条、款、项天然是完整单元,500~800 token 最稳;拆成 300 等于把一句话砍成两半。课程还演示了如何利用文档自带的标题、段前缩进等结构信息,通过自定义分隔符实现语义边界优先的分割,远比纯按字符截断可靠。
- chunk_overlap 必须保证跨块连贯:过低会导致边界信息丢失,课程推荐 10%~20% 的重叠率。同时实验对比显示,10% 的重叠率在段落型文档上已经能覆盖绝大多数跨块的关键词链接,而 5% 以下时会频繁出现检索断点。
- 检索时加入多样性算法:最大边际相关性(MMR)可以避免返回高度相似的 chunk,这正是碎片化问题的根源之一。课程中用可视化展示了一个真实例子:未启用 MMR 时,返回的 5 个 chunk 几乎都是同一段话的变体;启用后,内容覆盖的信息量直接翻倍。
同时课程还介绍了 机器学习基础 中对向量空间和相似度度量的讲解,让我明白为什么余弦相似度在短 chunk 上会失效--因为过短的文本生成的向量往往只捕捉了局部词频特征,丢失了整份条款的语义指向。这些知识在我前期的技术选型里完全空白。课程里甚至有一个完整的 notebook,直接展示了 chunk 尺寸从 100 到 2000 的场景对比,检索完整度从 0.4 飙升到 0.9 的曲线让我印象极深,而且还可以直接调整参数复现不同文档类型的效果,这种实验驱动的教学比读十篇博客都管用。
止血:基于课程知识重构检索管道
我用课程里学到的 chunk 划分策略重写了文档处理部分,并引入 MMR 检索。新代码如下:
# 重构后的 chunk 分割:基于语义单元
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=600,
chunk_overlap=100,
separators=["\n\n", "\n", "。", ";", " "]
)
chunks = splitter.split_documents(docs)
# 检索时加入 MMR 去重
from langchain.vectorstores import FAISS
retriever = FAISS.from_documents(chunks, embeddings)
results = retriever.max_marginal_relevance_search(
query, k=5, fetch_k=10, lambda_mult=0.6
)
在参数选择上,我借助课程 notebook 里的评估函数快速迭代:先后试了 chunk_size 为 500、600、800 三种配置,搭配 overlap 从 60 到 120,最终根据检索完整度得分锁定了 600/100 的组合。Lambda_mult 选 0.6 也并不是拍脑袋,课程实验表明 0.5~0.7 区间在中文制度类文档上能较好地平衡相关性与多样性,我直接复用了这个经验值。
同时我回看了 人工智能入门 课程中关于模型评估的章节,重新设计了离线测试集,模拟了 20 种真实员工提问场景,并引入检索命中率、答案完整度两个指标。新测试集尤其覆盖了需要跨段落拼接答案的复杂问题,比如“入职满三年的员工年假天数是多少?”,过去由于 chunk 过碎,即使检索到多个片段也无法拼接出完整答案,现在通过语义分割和 MMR,能一次性召回所有必要的条款原文。
# 新增评估脚本片段
def evaluate_retrieval(query, expected_chunks):
retrieved = retriever.get_relevant_documents(query)
hit_count = sum(1 for chunk in retrieved if chunk in expected_chunks)
completeness = len(set(str(r) for r in retrieved) & set(str(e) for e in expected_chunks)) / len(expected_chunks)
return hit_count, round(completeness, 3)
上线前我跑了所有新用例,检索完整度从 0.41 提升到 0.89,幻觉率也从之前的 35% 压到 6% 以下。这次修改只花了我半天,但背后是那套 生成式人工智能 课程带给我的系统知识框架。我还顺便对文档预处理做了优化,去掉了页眉页脚和重复的免责声明,这些数据清洗的细节同样是课程中强调的基础动作。
如果再来一次:没有生成式 AI 课程我会继续盲调
这次事故最深的教训是:工具很好,但脱离领域知识就是盲调。 Amazon CodeWhisperer 能帮我写出语法正确的代码,却不能告诉我 chunk_size=300 会毁掉语义完整性。 AWS机器学习 提供的 SageMaker 平台让我有能力自行评测不同嵌入模型,但如果没学过 深度学习基础 中关于 Transformer 编码器的机理,我可能连选哪个维度都不知道。更可怕的是,我后来发现团队里另一个同事直接用 Amazon CodeWhisperer 生成了全部检索代码,连 embedding 模型都选错了--把用于英文的模型用在了中文文档上,相似度分数完全不可信。要不是我在课程里学过多语言 embedding 的选择建议,发现分数分布异常后紧急排查,一旦上线,可能引发出合同条款误读的法律风险。如果有机会提前学一遍 人工智能基础 ,这类低级错误本可以完全避免。最让我后怕的是,如果问题在百名员工同时使用时爆发,客服工单量会瞬间冲垮 IT 支持队列,信任重建的成本远比技术返工高得多。
更具体地说, 生成式人工智能 课程还教会我一套 RAG 系统上线前的检查清单: - 检索结果是否覆盖问题的全部关键信息 - 拼接上下文后是否超过模型 token 上限 - 是否针对文档类型调整了 chunk 策略
这门课不只是讲概念,每一个知识点后面都跟着一个可直接运行的 notebook,我后来把其中的 RAG 实验模板改巴改巴就直接用在了自己的项目里。这种从“学到了”到“直接用上了”的距离短得让人吃惊,而且模板里的评估指标直接帮我省掉了至少两周的试错时间。
可执行建议
- 先用 Amazon CodeWhisperer 快速生成原型验证想法,但立刻用 生成式AI 课程中的检查节点卡一下质量。
- chunk 尺寸不要凭感觉选,先去课程里看「RAG 实战」模块对不同文档类型的推荐范围。
- 检索一定要加 MMR 或相似度阈值过滤--碎片化答案多半是这一步缺位。
- 上线前必须设计覆盖真实问答场景的测试集, 机器学习入门 中的评估矩阵(精确率、召回率)可以复用到这里。
- 如果你和我一样是后端转 AI 应用开发,先补 人工智能基础 再动手写检索代码,方向对远比代码多重要。
- 遇到奇怪的检索结果,别急着换更大模型,回头看看 AWS深度学习 里对向量空间的解释,可能是嵌入维度或相似度公式在作祟。
- 最后始终记住: Amazon CodeWhisperer 省下的编码时间,应该用来学那门 生成式AI 课程--这才是 ROI 最高的配置项。那个课程里关于检索质量调优的完整实验,点开就能跑,省掉的不只是加班的时间,更是上线后返工的信任成本。
- 每做一个 AI 应用,务必同步搭建评估流水线,并用可视化呈现检索完整度与幻觉率的变化曲线,让每次调参都有据可依,不再凭直觉盲猜。
从这次事故中走出来,我不再只是能快速调 API 的程序员,而是开始具备系统性诊断 RAG 管线能力的 AI 应用开发者。工具依然是加速器,但方向盘握在理解底层原理的人手里,这才是我把那个周五下午的翻车经历,真正转化成职业护城河的开始。
更多推荐




所有评论(0)