<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>知识库工程 - category - 沐木</title><link>https://oldletter.cn/categories/%E7%9F%A5%E8%AF%86%E5%BA%93%E5%B7%A5%E7%A8%8B/</link><description>知识库工程 - category - 沐木</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sat, 11 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://oldletter.cn/categories/%E7%9F%A5%E8%AF%86%E5%BA%93%E5%B7%A5%E7%A8%8B/" rel="self" type="application/rss+xml"/><item><title>知识库工程（二）：LLM 的记忆从哪里来</title><link>https://oldletter.cn/posts/rag-engineering-02-ingestion-pipeline/</link><pubDate>Sat, 11 Jul 2026 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/rag-engineering-02-ingestion-pipeline/</guid><description><![CDATA[<blockquote>
<p>系列导航：<a href="/posts/rag-engineering-01-adapter-boundary/" rel="">1</a> | <a href="/posts/rag-engineering-02-ingestion-pipeline/" rel="">2</a> | <a href="/posts/rag-engineering-03-retrieval-quality/" rel="">3</a> | <a href="/posts/rag-engineering-04-contract-sse/" rel="">4</a></p></blockquote>
<p>“模型记住了”可能指六件不同的事：训练数据进入参数，当前消息仍在上下文中，推理服务保留了 KV Cache，应用保存了聊天记录，检索器找回一条旧资料，或者 Agent 把经历写进长期存储。这些机制的寿命、容量、成本和风险完全不同。</p>
<p>把它们统称为记忆，会产生常见误判。清空聊天窗口不一定删除服务端保存的摘要，KV Cache 命中也不表示模型拥有长期记忆，向量库召回一段旧对话更不代表这段内容仍然有效。知识库工程先要确定信息存在哪一层，再决定如何写入和遗忘。</p>
<h2 id="参数记忆保存训练中压缩出的规律">参数记忆保存训练中压缩出的规律</h2>
<p>预训练通过梯度下降调整模型参数，使下一个 token 的概率分布更接近训练文本。事实、语言规律和推理模式被分散编码在大量权重中，无法按数据库记录逐条定位。模型能够回答某个事实，不等于内部存在一行可直接读取的键值记录。</p>
<p>参数记忆容量大，推理时无需外部查询，更新却很重。继续预训练、监督微调或参数高效微调都可能引入新知识，也可能损伤已有能力。训练语料中的时间边界、冲突信息和错误内容会一起影响参数。需要频繁更新、删除或审计的企业资料不适合只靠参数保存。</p>
<h2 id="上下文窗口是一次推理的工作区">上下文窗口是一次推理的工作区</h2>
<p>Transformer 使用注意力让当前位置读取上下文中的其他 token。缩放点积注意力写作：</p>
<p>$$
\operatorname{Attention}(Q,K,V)=\operatorname{softmax}\left(\frac{QK^\mathsf{T}}{\sqrt{d_k}}\right)V
$$</p>
<p>系统提示词、用户问题、历史消息、检索片段和工具结果都要占用上下文。它们在一次请求中可见，超出窗口后必须截断、摘要或移到外部存储。上下文属于显式输入，修改后无需训练；其缺点是每次读取都会消耗 token 和计算资源。</p>
<p>窗口长度也不能直接换算成有效记忆容量。重复资料会稀释注意力，冲突版本会让模型难以选择，关键证据所在位置会影响结果。<code>Lost in the Middle</code> 说明长上下文模型对中部信息的利用并不稳定。上下文管理需要排序、去重和预算，不能只执行拼接。</p>
<h2 id="kv-cache-是计算缓存">KV Cache 是计算缓存</h2>
<p>自回归生成每个新 token 时，历史 token 的 Key 和 Value 可以复用。推理服务把它们保存在 KV Cache 中，避免每一步重新计算完整前缀。以普通多头注意力作近似，单个请求的缓存规模与层数 $L$、序列长度 $T$、隐藏维度 $H$ 和数据字节数 $B$ 成正比：</p>
<p>$$
M_{KV}\approx 2LTHB
$$</p>
<p>系数 2 对应 Key 与 Value。分组查询注意力、量化和分页缓存会改变实际占用。KV Cache 保存的是模型计算产生的张量，通常随请求结束、实例回收或缓存淘汰而消失。它不负责判断某条信息是否值得长期保存，也不提供按事实更新、权限过滤和来源追踪。</p>
<p>提示词前缀缓存也属于成本优化。多个请求共享相同前缀时，服务端可以复用计算结果；前缀内容仍要通过应用规则进入请求。把缓存命中率称为“记忆能力”会混淆性能与知识管理。</p>
<h2 id="会话历史和摘要由应用保存">会话历史和摘要由应用保存</h2>
<p>多轮对话常把近期若干条消息原样放入上下文，较早内容压缩成摘要。原始记录有较好的可追溯性，但 token 占用持续增长。摘要控制了长度，也会丢失限定条件、否定词和时间信息。若摘要由模型生成，错误概括还会在后续轮次反复被引用。</p>]]></description></item><item><title>知识库工程（三）：提示词、RAG 与 Agent 如何协作</title><link>https://oldletter.cn/posts/rag-engineering-03-retrieval-quality/</link><pubDate>Sat, 11 Jul 2026 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/rag-engineering-03-retrieval-quality/</guid><description><![CDATA[<blockquote>
<p>系列导航：<a href="/posts/rag-engineering-01-adapter-boundary/" rel="">1</a> | <a href="/posts/rag-engineering-02-ingestion-pipeline/" rel="">2</a> | <a href="/posts/rag-engineering-03-retrieval-quality/" rel="">3</a> | <a href="/posts/rag-engineering-04-contract-sse/" rel="">4</a></p></blockquote>
<p>提示词、RAG 和 Agent 经常被写成三个可替换的方案。它们处在不同层次：提示词组织一次模型调用中的信息与约束，RAG 从外部知识中选择证据，Agent 根据任务状态决定下一步动作。一个完整应用可以同时使用三者，也可以只使用其中一部分。</p>
<p>分清职责后，很多故障会更容易定位。模型漏掉文档中的事实，应先检查检索与上下文；模型格式不稳定，再检查提示词和结构化输出；模型需要多次查询、计算或调用业务工具，才进入 Agent 编排。只改提示词无法补回没有进入上下文的证据。</p>
<h2 id="prompt-是一次调用的上下文编排">Prompt 是一次调用的上下文编排</h2>
<p>实际送给模型的输入通常由系统规则、用户任务、少量示例、检索证据、对话状态和工具定义组成。它们共享同一个 token 预算：</p>
<p>$$
T_{sys}+T_{user}+T_{demo}+T_{rag}+T_{history}+T_{tool}+T_{output}\leq T_{window}
$$</p>
<p>上下文窗口扩大后，预算约束依旧存在，因为输入长度还会影响延迟、费用与注意力分配。系统规则应该短而稳定，业务数据保持结构清晰，检索片段携带来源与版本。少量示例适合约束输出模式，不能用来长期保存不断变化的知识。</p>
<p>Prompt 中常见的几个区块有不同优先级。系统规则定义身份、权限和禁止事项；用户消息描述当前目标；证据区提供可引用事实；工具定义列出允许执行的动作。检索文档属于不可信数据，其中若出现“忽略系统要求”，应用不能把它提升为指令。</p>
<h2 id="rag-在生成前选择证据">RAG 在生成前选择证据</h2>
<p>一次基础 RAG 包含查询改写、候选召回、过滤、重排、上下文组装和生成。查询改写解决代词、省略和多轮上下文问题，召回负责扩大候选范围，重排比较问题与段落的匹配程度，组装阶段处理去重、版本与 token 预算。</p>
<p>检索结果必须连同来源进入 Prompt。只有正文，没有文档标识、页码或更新时间，模型生成后就难以给出可核对引用。旧版制度和新版制度同时被召回时，生成模型也不适合自行猜测哪一版有效，检索前应先按状态和时间过滤。</p>
<p>RAG 适合知识密集且资料可索引的任务，例如制度问答、项目文档检索、代码说明和客服知识。需要精确计算、实时余额或写入业务状态时，应调用确定性工具。模型可以解释工具结果，数据真值仍由业务系统提供。</p>
<h2 id="agent-把单次问答扩展成有状态循环">Agent 把单次问答扩展成有状态循环</h2>
<p>ReAct 将推理与动作交替组织。模型根据当前观察选择动作，环境执行工具并返回结果，模型再判断是否继续。工程实现无需暴露完整内部推理文本，可以保留结构化计划摘要、工具调用、观察结果和停止原因。</p>
<div class="mermaid" id="id-2" data-mermaid-definition="Zmxvd2NoYXJ0IFRECiAgICBBW&#43;eUqOaIt&#43;ebruagh10gLS0&#43;IEJb6K&#43;75Y&#43;W5Lya6K&#43;d5LiO6ZW/5pyf6K6w5b&#43;GXQogICAgQiAtLT4gQ1vpgInmi6nkuIvkuIDmraXliqjkvZxdCiAgICBDIC0tPiBEW&#43;ajgOe0ouefpeivhl0KICAgIEMgLS0&#43;IEVb6LCD55So5Y&#43;X5o6n5bel5YW3XQogICAgRCAtLT4gRlvmoKHpqozlubborrDlvZXop4Llr59dCiAgICBFIC0tPiBGCiAgICBGIC0tPiBHe&#43;S7u&#43;WKoeWujOaIkOaIlumihOeul&#43;iAl&#43;WwvT99CiAgICBHIC0tPnzlkKZ8IEMKICAgIEcgLS0&#43;fOaYr3wgSFvnlJ/miJDlj6/lvJXnlKjnu5Pmnpxd">flowchart TD
    A[用户目标] --&gt; B[读取会话与长期记忆]
    B --&gt; C[选择下一步动作]
    C --&gt; D[检索知识]
    C --&gt; E[调用受控工具]
    D --&gt; F[校验并记录观察]
    E --&gt; F
    F --&gt; G{任务完成或预算耗尽?}
    G --&gt;|否| C
    G --&gt;|是| H[生成可引用结果]</div><p>循环必须由运行时控制。调用次数、总 token、总耗时和工具权限都有硬上限；同一动作连续失败时应停止或切换策略。模型输出“完成”也要经过程序检查，例如所需字段是否齐全、写操作是否返回成功、引用是否存在。</p>]]></description></item><item><title>知识库工程（四）：今天的知识库怎么用</title><link>https://oldletter.cn/posts/rag-engineering-04-contract-sse/</link><pubDate>Sat, 11 Jul 2026 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/rag-engineering-04-contract-sse/</guid><description><![CDATA[<blockquote>
<p>系列导航：<a href="/posts/rag-engineering-01-adapter-boundary/" rel="">1</a> | <a href="/posts/rag-engineering-02-ingestion-pipeline/" rel="">2</a> | <a href="/posts/rag-engineering-03-retrieval-quality/" rel="">3</a> | <a href="/posts/rag-engineering-04-contract-sse/" rel="">4</a></p></blockquote>
<p>当前知识库已经不止“上传文档后聊天”。文档理解、关键词与向量混合召回、重排、引用、多模态解析、知识图谱、Agent 工具和长期记忆逐步进入同一套产品。能力增加后，使用重点从“能否回答”转到“证据是否正确、版本是否有效、权限是否一致、过程能否评测”。</p>
<p>RAGFlow 和 WeKnora 展示了两种正在靠近的产品形态。RAGFlow 从文档解析与 RAG 工作流扩展到上下文层、Agent 编排和 Memory；WeKnora 把快速问答、ReAct Agent、Wiki 与知识图谱放在同一框架中。它们都说明知识库正从单次检索组件演进为 LLM 的上下文基础设施。</p>
<h2 id="一条可用的知识链路">一条可用的知识链路</h2>
<p>原始文件进入系统后，需要解析版面、表格、标题层级和图像，再形成适合检索的文本单元。切片同时写入关键词索引和向量索引，查询从两路取得候选，融合后交给重排器。选中的证据经过权限、版本、去重与 token 预算处理，再进入 LLM 或 Agent。</p>
<div class="mermaid" id="id-2" data-mermaid-definition="Zmxvd2NoYXJ0IFRECiAgICBBW&#43;aWh&#43;S7tiDnvZHpobUg6KGo5qC8IOWbvuWDj10gLS0&#43;IEJb6Kej5p6QIE9DUiDkuI7nu5PmnoTmgaLlpI1dCiAgICBCIC0tPiBDW&#43;WIh&#43;eJhyDlhYPmlbDmja7kuI7niYjmnKxdCiAgICBDIC0tPiBEW0JNMjUg5YWz6ZSu6K&#43;N57Si5byVXQogICAgQyAtLT4gRVtFbWJlZGRpbmcg5ZCR6YeP57Si5byVXQogICAgRCAtLT4gRlvono3lkIjkuI7ph43mjpJdCiAgICBFIC0tPiBGCiAgICBGIC0tPiBHW&#43;S4iuS4i&#43;aWh&#43;S4juW8leeUqF0KICAgIEcgLS0&#43;IEhbTExNIOmXruetlF0KICAgIEcgLS0&#43;IElbQWdlbnQg5qOA57Si5LiO5bel5YW3XQogICAgSCAtLT4gSlvlj43ppojkuI7or4TmtYtdCiAgICBJIC0tPiBK">flowchart TD
    A[文件 网页 表格 图像] --&gt; B[解析 OCR 与结构恢复]
    B --&gt; C[切片 元数据与版本]
    C --&gt; D[BM25 关键词索引]
    C --&gt; E[Embedding 向量索引]
    D --&gt; F[融合与重排]
    E --&gt; F
    F --&gt; G[上下文与引用]
    G --&gt; H[LLM 问答]
    G --&gt; I[Agent 检索与工具]
    H --&gt; J[反馈与评测]
    I --&gt; J</div><p>链路中的前半段决定“资料是否可找”，后半段决定“证据如何被使用”。很多效果问题来自解析：扫描 PDF 没有 OCR，表格行列被打散，标题与正文断开，页眉在每个切片中重复。直接更换 LLM 通常无法修复这些缺陷。</p>]]></description></item><item><title>知识库工程（一）：从信息检索到 RAG</title><link>https://oldletter.cn/posts/rag-engineering-01-adapter-boundary/</link><pubDate>Sat, 11 Jul 2026 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/rag-engineering-01-adapter-boundary/</guid><description><![CDATA[<blockquote>
<p>系列导航：<a href="/posts/rag-engineering-01-adapter-boundary/" rel="">1</a> | <a href="/posts/rag-engineering-02-ingestion-pipeline/" rel="">2</a> | <a href="/posts/rag-engineering-03-retrieval-quality/" rel="">3</a> | <a href="/posts/rag-engineering-04-contract-sse/" rel="">4</a></p></blockquote>
<p>今天谈知识库，常把向量数据库、Embedding 和大模型放在一起。知识库的历史远早于大模型，并且有两条长期并行的技术路线。一条来自专家系统，把事实、规则和推理程序分开；另一条来自信息检索，研究如何从大量文本中找出与查询相关的内容。RAG 延续了第二条路线，同时吸收了第一条路线对“外部知识”的处理方式。</p>
<p>厘清这段历史很重要。向量检索没有废除关键词检索，长上下文也没有消除索引。当前知识库产品中的切片、倒排索引、向量召回、重排和引用，分别来自不同阶段积累的方法。</p>
<h2 id="两条知识库路线在生成模型前已经形成">两条知识库路线在生成模型前已经形成</h2>
<p>早期专家系统把领域知识保存为事实和规则，再由推理引擎执行匹配与演绎。修改知识时可以调整规则库，无需重写推理器。它适合边界清楚、规则稳定的任务，却难以直接容纳大量自然语言文档。规则数量增长后，冲突处理和维护成本也会迅速上升。</p>
<p>信息检索处理的是另一类问题：文档已经存在，系统需要计算查询与文档的相关程度。图书目录依靠人工主题词，数字化文档推动了自动索引。倒排索引、词项权重和相关性排序由此成为搜索系统的基础。企业文档问答沿用的正是这套链路，只在候选文档后增加了生成模型。</p>
<div class="mermaid" id="id-2" data-mermaid-definition="Zmxvd2NoYXJ0IFRECiAgICBBW&#43;S6uuW3peebruW9leS4juinhOWImeW6k10gLS0&#43;IEJb5YCS5o6S57Si5byVXQogICAgQiAtLT4gQ1tURi1JREYg6K&#43;N6aG55p2D6YeNXQogICAgQyAtLT4gRFtCTTI1IOamgueOh&#43;aOkuW6j10KICAgIEQgLS0&#43;IEVb56We57uP6K&#43;t5LmJ5qOA57SiXQogICAgRSAtLT4gRltSQUcg5aKe5by655Sf5oiQXQogICAgRiAtLT4gR1vmt7flkIjmo4DntKLkuI4gQWdlbnRd">flowchart TD
    A[人工目录与规则库] --&gt; B[倒排索引]
    B --&gt; C[TF-IDF 词项权重]
    C --&gt; D[BM25 概率排序]
    D --&gt; E[神经语义检索]
    E --&gt; F[RAG 增强生成]
    F --&gt; G[混合检索与 Agent]</div><h2 id="倒排索引解决候选集规模">倒排索引解决候选集规模</h2>
<p>顺序扫描每篇文档的代价随文档总量增长。倒排索引反过来记录“词出现在哪些文档中”。查询包含“迁移 校验”时，检索器先取得两个词对应的文档列表，再求交集、并集或带权组合。文档频率、词频和位置信息都可以保存在 posting list 中。</p>
<p>倒排索引擅长精确标识符、人名、错误码和专有术语。它也有明显限制：用户搜索“服务无法启动”，文档只写“进程初始化失败”，词面重合可能很少。分词、同义词和查询扩展可以缓解问题，仍无法完整表达句子语义。</p>
<h2 id="tf-idf-给词项分配区分度">TF-IDF 给词项分配区分度</h2>
<p>词频 <code>TF</code> 描述词项 $t$ 在文档 $d$ 中出现的程度，逆文档频率 <code>IDF</code> 降低常见词的权重。一种常见写法是：</p>
<p>$$
\operatorname{tfidf}(t,d)=\operatorname{tf}(t,d)\cdot \log\frac{N}{\operatorname{df}(t)+1}
$$</p>
<p>$N$ 是文档总数，$\operatorname{df}(t)$ 是包含词项 $t$ 的文档数。工程实现会采用对数词频、平滑项和向量归一化等变体，因此不同搜索库给出的分数不能脱离实现直接比较。</p>
<p>将文档与查询表示成词项权重向量后，可以计算余弦相似度：</p>
<p>$$
\cos(q,d)=\frac{q\cdot d}{\lVert q\rVert\lVert d\rVert}
$$</p>
<p>TF-IDF 建立了可计算的相关性模型，但长文档容易因为词出现次数更多而占优。词频的收益也并非线性增长，一个词出现二十次通常不会比出现十次多一倍信息。</p>]]></description></item></channel></rss>