<?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>Prompt工程 on 老朱的赛博工位</title><link>https://blog.zjkun.top/tags/prompt%E5%B7%A5%E7%A8%8B/</link><description>Recent content in Prompt工程 on 老朱的赛博工位</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Thu, 15 Oct 2026 13:00:00 +0800</lastBuildDate><atom:link href="https://blog.zjkun.top/tags/prompt%E5%B7%A5%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>RAG 改写没头绪？6 规则配 6 类型直接抄</title><link>https://blog.zjkun.top/posts/rag-rewrite-6rules-6types/</link><pubDate>Thu, 15 Oct 2026 13:00:00 +0800</pubDate><guid>https://blog.zjkun.top/posts/rag-rewrite-6rules-6types/</guid><description>Query 改写的 6 条规则对应 6 种问法：上下文依赖→指代消解+省略补全，对比→保留双实体，独立型放行不改。一条横向护栏「不编造实体」，异常一律回原 query。附我项目 system prompt 原文和婚假实测数据。</description><content:encoded><![CDATA[<p><a href="/posts/rag-query-rewrite-4-steps/">上一篇</a>拆了 Query 改写的链路：四步+两道短路。这篇补核心对照——<strong>六条规则对应六种问法，一类问题开一剂药。</strong></p>
<h2 id="为什么先分类再改写">为什么先分类再改写</h2>
<p>病症不同，药不同。不分类一刀切地「请改写用户问题」，模型容易改错方向：把该放行的独立问题改花，把对比句「归纳」掉一个实体。我的做法是把六规则和六类型全部写进 system prompt，模型每步输出 JSON <code>{type, rewritten}</code>——<strong>先判型，再按规则改</strong>。</p>
<p>真实 prompt 关键段（<code>query-rewrite.service.ts</code>，节选）：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>先判断 query 类型（从以下选一个）：
</span></span><span style="display:flex;"><span>- context_dependent: 上下文依赖型（需看历史才能理解指代）
</span></span><span style="display:flex;"><span>- comparative:       对比型（A 和 B 哪个好）
</span></span><span style="display:flex;"><span>- vague_reference:   模糊指代型（那个东西怎么用）
</span></span><span style="display:flex;"><span>- multi_intent:      多意图型（同时问多个事）
</span></span><span style="display:flex;"><span>- rhetorical:        反问型（难道不是...吗）
</span></span><span style="display:flex;"><span>- standalone:        独立型（不依赖历史，表达清晰）
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>只输出 JSON，不要解释，不要 markdown：
</span></span><span style="display:flex;"><span>{&#34;type&#34;: &#34;类型&#34;, &#34;rewritten&#34;: &#34;改写后的完整query&#34;}
</span></span></code></pre></div><p>模型 deepseek-chat，<code>temperature: 0.1</code>（改写要确定性），<code>response_format: json_object</code>。</p>
<h2 id="六组配对症状--药">六组配对：症状 → 药</h2>
<table>
	<thead>
			<tr>
					<th>类型</th>
					<th>症状</th>
					<th>用药</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>context_dependent</td>
					<td>「那第二步呢」，缺指代缺主语</td>
					<td>指代消解 + 省略补全：从 history 把实体拉回来</td>
			</tr>
			<tr>
					<td>comparative</td>
					<td>一句问两个东西的区别</td>
					<td>模糊词具体化，<strong>双实体必须同时保留</strong>——两个实体就是检索词，去掉任一个都伤召回</td>
			</tr>
			<tr>
					<td>vague_reference</td>
					<td>「好用吗」「怎么弄」</td>
					<td>模糊词具体化：口语翻译成可打分的明确意图</td>
			</tr>
			<tr>
					<td>multi_intent</td>
					<td>一句话问三件事</td>
					<td>多意图聚焦：拆子问题分开检索，整句塞给向量语义直接漂</td>
			</tr>
			<tr>
					<td>rhetorical</td>
					<td>「这都查不出来？」</td>
					<td>反问转意图：情绪化反问转陈述式再去查，原话进检索几乎 0 命中</td>
			</tr>
			<tr>
					<td>standalone</td>
					<td>句子成分齐全</td>
					<td><strong>放行不改</strong>。改写成分齐全的独立问题，反而容易改坏</td>
			</tr>
	</tbody>
</table>
<p>婚假实测（同一组数据贯穿两篇）：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>输入：「申请要怎么做?有没有步骤」+ 2 条婚假相关历史
</span></span><span style="display:flex;"><span>输出：{&#34;type&#34;: &#34;context_dependent&#34;,
</span></span><span style="display:flex;"><span>       &#34;rewritten&#34;: &#34;婚假申请的具体步骤和流程是什么&#34;}
</span></span><span style="display:flex;"><span>耗时 709ms / 565 token
</span></span><span style="display:flex;"><span>BM25 命中：0 条 → 11 条（索引 docs=38, vocab=1936）
</span></span></code></pre></div><h2 id="一条横六型的护栏不编造实体">一条横六型的护栏：不编造实体</h2>
<p>prompt 第 6 条规则单独拎出来说，因为它是事故源头：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>6. 不要添加历史中不存在的信息，不要编造实体
</span></span></code></pre></div><p><code>rewritten</code> 里只能出现 history 和原问里出现过的实体——用户没提婚假，就不能「猜」他要问婚假。<strong>编造实体 = 检索奔向错误文档，比不改更糟。</strong></p>
<p>对比型还有一个专门的坑：模型爱把「A 和 B 的区别」「归纳」成只讲 A。所以规则里写死双实体必须保留，这条救过一次召回。</p>
<h2 id="宁可保守失败全回-null">宁可保守：失败全回 null</h2>
<p>改写失败、超时、JSON 不合法、改写结果和原话一样——一律 <code>return null</code>，上层降级用原 query，链路永不因改写挂掉。判型成 <code>standalone</code> 或直接跳过（无历史 / 启发式不含指代信号）都走同一个出口。</p>
<p>保守方向的选择题：改坏了捞错文档 vs 不改多捞几条垃圾——后者至少模型还能自己消化，前者直接把错误资料塞进上下文。所以宁可少改。</p>
<h2 id="速查表贴墙版">速查表（贴墙版）</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>上下文依赖 → 指代消解 + 省略补全
</span></span><span style="display:flex;"><span>对比       → 具体化 + 保留双实体
</span></span><span style="display:flex;"><span>模糊       → 模糊词具体化
</span></span><span style="display:flex;"><span>多意图     → 拆分逐条检
</span></span><span style="display:flex;"><span>反问       → 转陈述再查
</span></span><span style="display:flex;"><span>独立       → 放行不改
</span></span><span style="display:flex;"><span>公共护栏：不编造实体 + 异常回原话
</span></span></code></pre></div><p>改改写本质是「先承认用户的问法会带来什么麻烦，再决定怎么改」。无差别套一句「请优化这个问题」的 prompt，最容易跑偏。</p>
<blockquote>
<p>本篇最早于 2026 年 10 月 15 日发布于小红书，此为含完整代码与数据的博客版。</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>