<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>面试 on 老朱的赛博工位</title><link>https://blog.zjkun.top/tags/%E9%9D%A2%E8%AF%95/</link><description>Recent content in 面试 on 老朱的赛博工位</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Sat, 10 Oct 2026 08:30:00 +0800</lastBuildDate><atom:link href="https://blog.zjkun.top/tags/%E9%9D%A2%E8%AF%95/index.xml" rel="self" type="application/rss+xml"/><item><title>RAG 效果差怎么调试？面试官要听的排查思路</title><link>https://blog.zjkun.top/posts/rag-debug-playbook/</link><pubDate>Sat, 10 Oct 2026 08:30:00 +0800</pubDate><guid>https://blog.zjkun.top/posts/rag-debug-playbook/</guid><description>RAG 答得差，别急着换模型。我按「入库→检索→融合→精排→生成」五层给每层配了真实调试工具：三模式开关（召回策略唯一变量）、单路调试接口、retrieveOnly 只看检索、名次/得分日志。附七步建库链路对照的排查清单。</description><content:encoded><![CDATA[<p>「RAG 效果差」是个笼统病，直接开药都是瞎蒙。面试官爱听的不是你换过几个模型，而是<strong>会不会分层定位</strong>：答案质量差，可能死在入库、检索、融合、精排、生成任何一层。</p>
<p>我把自己 Nuxt3 知识库（my-nuxt-app）的调试工具链整个做成了一套排查方法，这篇按层过一遍。</p>
<h2 id="总原则控制变量--只看检索不生成">总原则：控制变量 + 只看检索不生成</h2>
<p>两条铁律贯穿所有排查：</p>
<ol>
<li><strong>召回策略是唯一变量</strong>。我把检索做成 <code>hybrid / bm25 / vector</code> 三档模式开关，同一问题各跑一遍，后面的精排、生成完全一致——谁拖后腿一眼看见。</li>
<li><strong>检索和生成分开验</strong>。有 <code>retrieveOnly</code> 开关：只看召回了哪些片段、名次如何，不跑生成。答案不对，先确认是「没捞到」还是「捞到了模型没用好」，这两件事的修法完全不同。</li>
</ol>
<h2 id="分层排查">分层排查</h2>
<h3 id="层-1入库文档分块向量">层 1：入库（文档→分块→向量）</h3>
<p>七步建库链路：知识整理 → 清理格式化 → <strong>内容切分</strong> → 向量化 → 挂元数据 → 载入向量库 → 集成。效果差的病根很多在这：切太碎丢上下文，切太粗检索不准。</p>
<p>我项目的真实分块参数：递归切分器 <code>chunker.ts</code>，目标 800 字符（标题→空行段落→句号→硬切四层降级，短文档直接一片不硬切）；BM25 侧启动全量预热——最新实测：<strong>172 个 chunk / 3015 个词项，建索引 2688ms</strong>（TiDB 拉取+分词+倒排全算上）。</p>
<p>排查动作：随机抽几个 chunk 看语义是否自包含；问一个已知有答案的问题，确认目标 chunk 的文本入库时没被解析器吃掉（表格/PDF 是重灾区）。</p>
<h3 id="层-2检索两路单测">层 2：检索（两路单测）</h3>
<p>关键词路和向量路各留了单路调试接口：<code>/api/rag/keyword-search</code>、<code>/api/rag/vector-search</code>——<strong>单路粗召、不精排</strong>，专治「不知道哪路烂」。</p>
<p>典型病症对照：</p>
<ul>
<li>专有名词/条款号/型号搜不到 → 关键词路问题：查分词（我的 BM25 用中文分词器切 query 和文档，分词烂则倒排全烂）、查索引预热是否成功（控制台看 docs/vocab 数）</li>
<li>换个说法就搜不到 → 只有 BM25 在干活，向量路没接上或阈值过严</li>
<li>召回一堆语义相近但没用的 → 向量路正常但缺精排，去层 4</li>
</ul>
<h3 id="层-3融合rrf-名次日志">层 3：融合（RRF 名次日志）</h3>
<p>两路各召 top20，RRF 融合（<code>score=Σ1/(60+rank)</code>）。<code>FusedResult</code> 里我专门存了每个 id 的 <code>ranks: [向量路名次, BM25路名次]</code>（未命中记 null），服务端控制台按模式打印——融合后排名怪，直接看是「一路强推」还是「两路共认」。</p>
<p>坑：别把余弦分和 BM25 分直接加权，量纲不同（0~1 vs 无上限），必须转名次。</p>
<h3 id="层-4精排">层 4：精排</h3>
<p>粗召本质是盲选——入库时分块单独算的向量，从没和你的问题同框比过。精排用 cross-encoder（bge-reranker-v2-m3）把「问题+候选」成对打分，融合 top20 → 精排 top5。</p>
<p>排查信号：召回明明有正确答案却排在 15 名开外进不了上下文 → 看 rerank 分数；rerank 服务挂了会自动降级按 RRF 分排，日志里有标记，别把降级的锅算到检索头上。</p>
<h3 id="层-5生成">层 5：生成</h3>
<p>检索没问题、答案还是烂，才轮到生成层：prompt 里资料怎么拼、有没有约束「只用资料作答、引用标来源页码」、模型是不是被无关片段带偏（top5 塞太多噪声也是病，回头减 FINAL_TOP_K）。</p>
<h2 id="常见三病因课件口径--我的实战对应">常见三病因（课件口径 + 我的实战对应）</h2>
<ol>
<li>文档处理和切割颗粒度问题 → 层 1</li>
<li>召回不准，想命中的片段排序太靠后 → 层 2/3/4</li>
<li>检索到了但整合生成没用对 → 层 5</li>
</ol>
<p>对应五个提准手段（我项目落了的标 ✓）：切分技巧 ✓（递归四层+短文档保护）、取相邻片段（父页面类方案，评估后我没做）、多召回+rerank ✓（20→5）、混合检索 ✓（BM25+向量）、Query 重写 ✓（改写只进检索）。</p>
<h2 id="面试话术一句话">面试话术一句话</h2>
<p>「我调试 RAG 的路径是分层二分：先用 retrieveOnly 把检索和生成切开，再用三模式开关把两路召回切开，每层都有接口和名次日志。定位到层之后，改参数—回归—再定位，不靠玄学。」</p>
<p>这就是面试官要听的：<strong>不是你知道多少技巧，而是你有能把问题范围每次减半的方法。</strong></p>
<blockquote>
<p>本篇最早于 2026 年 10 月 10 日发布于小红书，此为博客完整版。</p>
</blockquote>
]]></content:encoded></item><item><title>RAG 还是微调？大模型应用 3 种模式别选错</title><link>https://blog.zjkun.top/posts/rag-vs-finetune-3-modes/</link><pubDate>Fri, 09 Oct 2026 09:30:00 +0800</pubDate><guid>https://blog.zjkun.top/posts/rag-vs-finetune-3-modes/</guid><description>给大模型加能力有三层：Prompt 上下文、RAG、微调。我用 Nuxt3 企业知识库的真实选型讲清边界——为什么知识类需求 RAG 完胜微调：SFT 教的是行为不是知识，知识更新频率、可溯源、成本三笔账怎么算。</description><content:encoded><![CDATA[<p>做 AI 应用绕不开这道选择题：让模型「懂你的业务」，到底靠提示词、RAG，还是微调？</p>
<p>我把自己的企业知识库项目（Nuxt3 my-nuxt-app：私有制度文档问答，检索走向量+BM25 混合，生成走 deepseek-chat API）从头选到尾，这篇文章把三层的边界和我的决策过程讲清楚——这也是面试被问最多的一题。</p>
<h2 id="先摆认知地基训练范式在干嘛">先摆认知地基：训练范式在干嘛</h2>
<p>一张表说人话（来自我系统补的《语言模型训练范式》课件，老师一句话总结：<strong>大模型 = 会接话茬的机器（Pretrain）+ 会做任务的机器（SFT）+ 会自我评判的机器（RM/PPO/DPO）</strong>）：</p>
<table>
	<thead>
			<tr>
					<th>阶段</th>
					<th>在干嘛</th>
					<th>人肉类比</th>
					<th>数据量</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Pretrain</td>
					<td>海量文字学「预测下一个字」</td>
					<td>儿童大量阅读</td>
					<td>Llama3 用了 15 万亿 tokens</td>
			</tr>
			<tr>
					<td>SFT</td>
					<td>带标注问答，从接话茬变做任务</td>
					<td>老师布置带答案的作业</td>
					<td>几十万条 ≈ 预训练的 1/5000</td>
			</tr>
			<tr>
					<td>RM + PPO/DPO</td>
					<td>学会「说人该说的话」</td>
					<td>按批改意见反复改写</td>
					<td>较小</td>
			</tr>
	</tbody>
</table>
<p>硬核数字记一个就够：Llama 3.1 405B 预训练 = 16384 块 H100 跑 54 天，亿级人民币。所以<strong>普通企业和个人根本不碰预训练</strong>，选择题只在「现成模型 + 什么方式喂能力」之间做。</p>
<p>面试加分项也在这：<strong>SFT/微调 ≠ 给模型喂知识，是教模型「做任务」。</strong> 知识靠 Pretrain（通用）+ RAG（私有/新）供给。很多人把微调当成「把公司文档灌进模型」，方向从根上就错了。</p>
<h2 id="三层模式按成本从低到高">三层模式，按成本从低到高</h2>
<h3 id="第一层prompt--上下文工程">第一层：Prompt / 上下文工程</h3>
<p>把关键信息直接写进 system prompt。适合：全局规则、输出格式、角色设定。</p>
<p>局限：窗口有限，塞不进几十份制度文档；每轮都重复计费。我的项目里它只负责「只用资料作答、不编造、标注来源页码」这类约束。</p>
<h3 id="第二层rag知识在模型外面">第二层：RAG——知识在模型外面</h3>
<p>文档入库切块 → 向量化（我用 Chroma + bge-m3）→ 提问先检索（混合检索：BM25+向量，RRF 融合，reranker 精排取 top5）→ 检索结果拼进 prompt → 生成。</p>
<p><strong>知识更新 = 重新入库，分钟级。</strong> 文档改了版本，知识库表里状态机走一遍（草稿→发布→下架），不动模型一根手指。回答能带来源文件和页码——<strong>可溯源</strong>，这是企业场景的硬需求，微调给不了。</p>
<h3 id="第三层微调把能力焊进权重">第三层：微调——把能力焊进权重</h3>
<p>拿几百到几万条「输入→期望输出」对模型做 SFT。适合什么？<strong>固定的输出格式、领域语气、术语习惯</strong>——也就是「行为方式」，不是「知识内容」。</p>
<h2 id="我的真实三笔账为什么-my-nuxt-app-选了-rag微调碰都不碰">我的真实三笔账（为什么 my-nuxt-app 选了 RAG，微调碰都不碰）</h2>
<p><strong>1. 知识更新频率。</strong> 部门制度文档是活的：新考勤规则、修订的报销流程。RAG 重新入库就完事；微调要攒数据、排队训练、验证回归——为「上周改的那条婚假规定」重训一次模型，纯属行为艺术。</p>
<p><strong>2. 机器现实。</strong> 我的生产环境是 99 元/年的 2核2G 阿里云 ECS，内存预算排完（nginx 64MB + node-app 384MB + 系统 + swap）只剩 1G 出头。<strong>这台机器连一个 7B 模型都推理不动</strong>，更别说训练。我架构里所有重活全在云 API：Embedding 走 bge-m3、精排走硅基流动 bge-reranker-v2-m3、生成走 deepseek-chat。微调需要训练数据+算力+评测集三件套，对个人项目是三重成本。</p>
<p><strong>3. 可回滚性。</strong> RAG 答错了，改文档、调分块、调检索参数，改完立刻生效，还能追溯「当时引用了哪一页」。微调把错误知识焊进权重后，你连它为什么胡说都查不出来，回滚要重训。</p>
<h2 id="什么时候我才会上微调">什么时候我才会上微调</h2>
<p>预判一下自己：等业务问答稳定，出现这类需求再考虑——「回答必须严格按公司工单模板的语气和结构输出」这种<strong>格式/风格</strong>问题。届时也是 LoRA 这类轻量方案 + 现成 API 模型，依旧不碰预训练。知识类需求，永远 RAG。</p>
<h2 id="速查表">速查表</h2>
<table>
	<thead>
			<tr>
					<th>需求</th>
					<th>选择</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>全局规则/格式约束</td>
					<td>Prompt</td>
			</tr>
			<tr>
					<td>私有知识、时效知识、要溯源</td>
					<td>RAG</td>
			</tr>
			<tr>
					<td>固定输出风格/任务行为</td>
					<td>微调（最后才考虑）</td>
			</tr>
			<tr>
					<td>「把文档灌进模型」的想法</td>
					<td>❌ 方向错了，那是 RAG 的活</td>
			</tr>
	</tbody>
</table>
<p>一句话收束：<strong>知识在模型外面解决（RAG），行为在模型权重里解决（微调）——分不清这两件事，选型必错。</strong></p>
<p>下一篇讲 RAG 效果差怎么调试。</p>
<blockquote>
<p>本篇最早于 2026 年 10 月 9 日发布于小红书，此为博客完整版。</p>
</blockquote>
]]></content:encoded></item></channel></rss>