惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
Cyberwarzone
Cyberwarzone
博客园 - Franky
V
V2EX
人人都是产品经理
人人都是产品经理
爱范儿
爱范儿
Martin Fowler
Martin Fowler
The Cloudflare Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
Vercel News
Vercel News
Blog — PlanetScale
Blog — PlanetScale
Webroot Blog
Webroot Blog
Hacker News: Ask HN
Hacker News: Ask HN
Forbes - Security
Forbes - Security
D
Docker
C
CXSECURITY Database RSS Feed - CXSecurity.com
Project Zero
Project Zero
大猫的无限游戏
大猫的无限游戏
云风的 BLOG
云风的 BLOG
C
Cyber Attacks, Cyber Crime and Cyber Security
Recent Announcements
Recent Announcements
L
LINUX DO - 热门话题
小众软件
小众软件
Stack Overflow Blog
Stack Overflow Blog
G
Google Developers Blog
S
Security @ Cisco Blogs
T
Threat Research - Cisco Blogs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Register - Security
The Register - Security
O
OpenAI News
雷峰网
雷峰网
P
Proofpoint News Feed
宝玉的分享
宝玉的分享
Scott Helme
Scott Helme
Google DeepMind News
Google DeepMind News
博客园 - 司徒正美
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Help Net Security
Help Net Security
F
Full Disclosure
Engineering at Meta
Engineering at Meta
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Tailwind CSS Blog
Google DeepMind News
Google DeepMind News
博客园 - 三生石上(FineUI控件)
Apple Machine Learning Research
Apple Machine Learning Research
Attack and Defense Labs
Attack and Defense Labs
T
Tenable Blog
AI
AI
Spread Privacy
Spread Privacy

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解 【002】HTTPS 粗解:证书、TLS 握手与对后端配置的影响 Hermes Agent 一周暴涨五万 Star,但我劝你别急着追 明明连接的是Redis的DB0,为什么能查到DB3的数据? 【从0到1构建一个ClaudeAgent】协作-Agent团队 熟悉电子元器件之后,电子小白下一步该怎么走? MAF快速入门(23)通过C#类定义Skills .NET 高级开发 | 手写一个对象映射框架 FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了 mysqldump 参数拾遗:在遗忘与铭记之间 C# .NET 周刊|2026年3月5期 Claude code入门 - 陈彦斌 一文学习入门 ThingsBoard 开源物联网平台 GitHub 热门项目 | 2026年04月16日 如何为GIT设置全局勾子,为每次提交追加信息 Number.isFinite和isFinite与isNaN()和Number.isNaN的区别 PortSwigger SQL注入LAB2 推荐一个测试人必备的Skills,从功能到性能全搞定(附详细实操和安装下载方式) 筑基期:掌握Odoo基础核心知识点02(Odoo XML 开发方式详解) GLM模型这么火,咱们用vllm也咧一个呗! 深入理解 AbortController:从底层原理到跨语言设计哲学 字符串学习笔记 多租户系统框架的基础模块设计和分析设计 Apache SeaTunnel Zeta 为什么能做到“又快又稳”? AI开发-python-LangGraph框架(3-26-LangGraph基本概念及第一个简单样例) Vue 3 组件通信,别只会用 Props 和 Emits 了,这几个狠活儿你得看看 ElasticSearch7.X版本配置密码 用Manim实现动态交点计算--从一个动点问题说起 团结引擎+Addressable+Instant Game打包抖音小游戏 function call 实战:让 LLM 自动判断 pod 异常、调用日志工具并完成故障分析 bubseek —— 让 Agent 的足迹,变成团队的洞察 通过 C# 读取并导出 PDF 书签 如何用 GitHub Actions 实现 Steam 自动化发布 【从0到1构建一个ClaudeAgent】并发-后台任务 .NET 高级开发 | 定制 ASP.NET Core 框架 电子小白:什么是运算放大器(运放) zero2Agent:面向大厂面试的 Agent 工程教程,从概念到生产的完整学习路线 堆上的ORW HC32F460 USB CDC通信异常:非对齐访问异常排查 20260413-Hyperbridge 攻击事件:发生在默克尔山上的验证绕过 那些喊着AI 要淘汰你的人,正在靠你的焦虑赚大钱! 深度学习进阶(八)Swin Transformer 最小二乘问题详解19:带先验约束的增量式SFM优化与实现 SnapTranslate 3.0 正式发布:全局划词翻译 + 完整英语学习闭环,一站式搞定查词、记词、复习 工作的意义、工作的困难认知再思考 .NET + AI 进阶实战:基于类的技能开发 - 打造可治理的 Agent 能力模块 【从0到1构建一个ClaudeAgent】规划与协调-技能 上周热点回顾(4.6-4.12) 电子小白的工具三件套:面包板、杜邦线、万能板 单表五亿数据的查询优化 | Mysql、StarRocks 2. WorkBuddy:从“我是谁”到“帮我干活” C# 如何减少代码运行时间:7 个实战技巧 基于HelixToolkit.SharpDX 渲染3D模型 - 笺上知微 从零开始的双臂具身VLA起源及现阶段发展综述 - SkyXZ 记对 xonsh shell 的使用, 脚本编写, 迁移及调优 - pluvium27 受够了Vibe Coding的失控?换个起点,让AI事半功倍 从开始配置漏洞环境到漏洞复现流程 - 難しい 关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法 - 虚无境 Any metadata 的内存布局 C# .NET 周刊|2026年3月2期 - InCerry 我帮你测过了,测试圈排名第二的 Skill 依然很牛逼 Skill Discovery | 无监督技能发现的经典工作总结 - MoonOut 上下文工程是什么?过时了么?一文讲明白! - 一枫说码 开了 TUN 模式还是直连?90% 的人都踩过这个坑 AScript扩展多种脚本语言 - rockey627 AI 学习笔记:Agent 的记忆机制 你能被装进一个文件里吗?——7 万人把同事"蒸馏"成了 AI - 我没有三颗心脏 Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南 - 暮色之狐 在浏览器中快速编辑代码:VSCode Web 集成实践 - Newbe36524 蒸馏自己 skill?基于 Deepseek 的蒸馏器,丐版蒸馏方式,简单便捷 - To_Carpe_Diem Spring AI Aliababa和AgentScope,哪个更好? - 苏三说技术
RAG学习笔记:让大模型先查资料再回答问题
养肥胖虎 · 2026-05-16 · via 博客园_首页

RAG学习笔记:让大模型先查资料再回答问题

好家伙,

这次我们来聊 RAG.

RAG 这个词最近出现得很多,但如果只是记住它的英文全称,其实没什么用.

我更关心的是:

它到底解决什么问题?
为什么一个普通大模型问答不够用?
文档是怎么变成知识库的?
用户提问时系统背后到底发生了什么?

所以这篇文章不准备一上来堆概念.

还是从一个很实际的问题开始:

我有一堆项目文档,配置表,接口说明,设计笔记.
我想直接问它们问题.

比如:

某个配置字段是什么意思?
有哪些文档提到了某个角色?
这个系统的部署流程是什么?
某个功能的设计依据在哪里?

如果直接问普通大模型,它很可能不知道.

因为这些资料在我的本地,不在它的训练数据里.

那么问题来了:

我不希望模型瞎猜.

我希望它先查我的资料,再回答.

这就是 RAG 最核心的价值.

0.背景:为什么需要RAG

先看普通大模型问答.

它的流程大概是:

用户问题 -> 大模型 -> 答案

这个流程很简单.

但它有几个问题.

0.1 大模型不知道我的私有资料

大模型知道很多通用知识.

但它不知道我电脑里的:

项目文档
策划案
配置表
部署笔记
内部接口说明
个人学习笔记

如果这些资料没有被放进上下文,模型就只能靠已有知识猜.

这个时候它回答得越流畅,反而越危险.

因为你很难分辨它是在基于资料回答,还是在编.

0.2 文档太多,人工翻效率低

项目一大,资料会越来越多.

比如一个游戏项目里可能有:

文案文档
战斗配置表
技能配置表
装备配置表
后端部署文档
接口说明
测试记录

人工一个个搜,效率很低.

而且有些问题不是关键词能直接搜出来的.

比如:

这个字段是不是和套装效果有关?
有没有哪个文档解释过战斗监控?
这个配置表里的 name 和 title 有什么区别?

这些问题更偏语义.

传统搜索不一定好用.

0.3 我们想要的是先找证据

所以真正想要的流程应该是:

用户提问
  -> 系统先找相关资料
  -> 把资料交给大模型
  -> 大模型基于资料回答
  -> 最后给出来源

这就是 RAG.

它不是让模型凭空变聪明.

而是给模型加了一个"查资料"的步骤.

1.RAG是什么

RAG 的全称是:

Retrieval-Augmented Generation

拆开看:

Retrieval  检索
Augmented  增强
Generation 生成

连起来就是:

检索增强生成

我自己的理解更简单:

RAG = 先从知识库找资料,再让大模型基于资料回答.

普通问答:

问题 -> 大模型 -> 答案

RAG 问答:

问题
  -> 检索知识库
  -> 找到相关资料
  -> 资料 + 问题 一起给大模型
  -> 答案 + 来源

噢,这样一看就清楚了.

RAG 不是替代大模型.

它是给大模型补上一个外部知识来源.

2.RAG整体流程

一个基础 RAG 系统,大概分两部分:

1. 建库阶段
2. 查询阶段

2.1 建库阶段

建库阶段就是把资料整理成可以检索的形式.

流程大概是:

读取文档
  -> 清洗文本
  -> 切成片段
  -> 生成 embedding
  -> 写入向量数据库

比如:

Markdown 文档
Word 文档
txt 文本
Excel 配置表

都会被转成一条条知识记录.

每条记录一般包含:

文本内容
向量
来源文件
chunk 序号
额外元数据

2.2 查询阶段

用户提问时,流程大概是:

用户问题
  -> 生成问题 embedding
  -> 去向量数据库检索相似内容
  -> 取 Top K 相关片段
  -> 拼成 Prompt
  -> 让大模型回答
  -> 返回答案和来源

这里最关键的是:

大模型看到的不是空问题.
它看到的是问题 + 检索出来的资料.

所以它的回答就有了依据.

3.文档怎么进入知识库

RAG 的第一步不是问答.

而是文档处理.

如果文档处理得很粗糙,后面模型再强也救不回来.

3.1 文本类文档

像 Markdown,txt,Word 这种文档,一般先提取文本.

然后按段落切块.

比如:

原文档
  -> chunk 0
  -> chunk 1
  -> chunk 2

切块时要注意两个问题:

块太大,检索不精准
块太小,上下文容易断

所以常见做法是:

按段落切块 + 保留一点 overlap

也就是相邻片段之间保留一点重叠内容.

这样可以避免一句话刚好被切断.

3.2 Excel配置表

Excel 就不能完全按普通文本处理.

尤其是游戏项目里的配置表.

常见结构可能是:

第 1 行: 中文字段名
第 2 行: 字段 code
第 3 行以后: 数据记录

这种表格更适合按行处理.

也就是说:

一行配置 = 一条知识记录

并且要保存:

文件路径
Sheet 名
行号
中文字段名
字段 code

否则后面回答时,只能说"查到了相关配置".

但说不清到底在哪个表,哪个 sheet,哪一行.

这就不够可用.

4.Embedding和向量是什么

RAG 里面经常会提到 embedding.

这个词听起来有点抽象.

我现在这样理解:

embedding = 把文本变成一组数字

比如一句话:

RAG 适合做项目知识库问答

经过 embedding 模型以后,会变成:

[0.12, -0.08, 0.33, ...]

这一组数字就是向量.

它表示这段文本的语义位置.

如果两段文本意思接近,它们的向量距离也会比较接近.

比如:

RAG 适合做知识库问答
检索增强生成可以用于内部文档问答

这两句话虽然字面不完全一样,但语义接近.

所以向量检索能把它们关联起来.

这就是 RAG 比普通关键词搜索更灵活的地方.

5.向量数据库负责什么

向量生成出来以后,要存到一个地方.

这个地方就是向量数据库.

常见的有:

Qdrant
Milvus
Chroma
Weaviate

向量数据库主要做几件事:

1. 保存文档片段的向量
2. 保存文档片段的 payload
3. 根据问题向量检索相似片段
4. 返回相似度分数 score

这里 payload 很重要.

不要只存向量.

一条比较完整的 payload 可能长这样:

{
  "text": "File: skill.xlsx\nSheet: Skill\nRow: 12\n名称(name): 火球术",
  "source": "配置表/skill.xlsx",
  "fileType": ".xlsx",
  "sheet": "Skill",
  "rowNumber": 12,
  "chunkIndex": 0
}

向量负责:

找得准

payload 负责:

说得清

没有 payload,最后就很难展示来源.

6.用户提问时发生了什么

假设用户问:

套装描述的方法是什么?

系统第一步不是直接调用大模型.

而是先把这个问题也变成向量:

问题文本 -> 问题向量

然后拿问题向量去向量数据库里搜.

比如取前 6 条:

Top 1 score=0.72
Top 2 score=0.66
Top 3 score=0.51
Top 4 score=0.31
Top 5 score=0.28
Top 6 score=0.20

这里要注意:

不是所有结果都应该给大模型.

如果 score 太低,说明它可能只是"看起来有点像",但并不能真正回答问题.

所以需要设置一个最低相关度.

比如:

score >= 0.48 才进入上下文

如果没有任何片段达到阈值,系统应该回答:

根据当前资料无法确定。

这句话很重要.

因为 RAG 系统最怕的不是回答少.

最怕的是资料不够还硬编.

7.Prompt怎么约束模型

检索到资料以后,还要把资料放进 prompt.

这里 prompt 不能太随便.

一个比较稳的 prompt 思路是:

你是一个项目内部知识库助手.
请使用中文回答.
只能使用提供的资料.
如果资料足够,直接回答.
如果资料只提供部分线索,说明"资料只提供了部分线索".
如果资料不足,说明"根据当前资料无法确定".
最后附上来源.

这里的核心是:

限制模型不要脱离资料发挥.

也就是说,模型可以负责组织语言.

但证据必须来自检索结果.

这就是 RAG 和普通聊天最大的区别.

8.RAG为什么一定要显示来源

我觉得 RAG 里"来源"不是附加功能.

它是核心功能.

如果系统只回答:

套装描述通过 desc 字段配置。

这个答案看起来有用.

但用户还是会问:

你从哪看到的?
在哪个文件?
哪一行?

所以更好的回答应该带来源:

来源:
配置表/equip.xlsx / Sheet: Equip / Row: 12 / score=0.6231

这样用户可以回到原始资料验证.

对于项目知识库来说,能验证比会说更重要.

尤其是配置表,部署文档,接口说明这种内容.

答错了可能会直接影响开发和测试.

9.RAG适合什么场景

RAG 很适合这些场景:

1. 公司内部知识库
2. 项目文档问答
3. 游戏文案和配置表查询
4. 个人学习笔记检索
5. 客服知识库
6. 部署文档和故障排查

这些场景有一个共同点:

资料很多
资料会变
需要基于资料回答
最好能给来源

所以 RAG 很适合.

因为它不需要重新训练模型.

资料变了,重新导入知识库就行.

10.RAG不适合什么场景

RAG 也不是万能的.

有些场景不适合只靠 RAG.

10.1 精确数值筛选

比如:

找出攻击力大于 50 的装备

这个问题更适合数据库查询.

因为它是结构化筛选.

RAG 可以帮你解释字段含义.

但真正筛选数值,数据库更稳定.

10.2 复杂计算

比如:

按照这套公式计算最终伤害

这类问题应该走明确的计算逻辑.

不要让模型凭感觉算.

10.3 资料根本不存在

如果知识库里没有导入相关资料,RAG 也答不出来.

它不是凭空造知识.

它只是帮你更好地使用已有资料.

10.4 图片和扫描件

如果资料是图片或者扫描件,但没有 OCR,那系统读不到文字.

这种情况需要先做 OCR.

否则 RAG 根本不知道图片里写了什么.

11.本地RAG项目可以怎么搭

一个本地 RAG MVP 可以这样搭:

Ollama        跑本地模型
bge-m3        做 embedding
qwen 类模型   做回答
Qdrant        存向量
Node/Go/Python 提供 API
Web 页面       展示答案和来源

流程大概是:

文档目录
  -> 解析 Markdown / txt / docx / xlsx
  -> 切块或按行处理
  -> 生成 embedding
  -> 写入 Qdrant
  -> Web 页面提问
  -> 返回答案和来源

本地方案的好处:

1. 数据不出本机
2. 可以接内部资料
3. 成本低
4. 适合先做 MVP 验证

限制也很明显:

1. 速度取决于本地模型
2. 大批量导入会比较慢
3. 没有鉴权时只能本机或内网用
4. 高并发能力有限

所以一开始不要追求大而全.

先导入一小批真实资料.

然后准备 10 个真实问题去问.

如果答案能被来源验证,这个方向就有价值.

12.总结

这次整理 RAG,我最大的收获是:

RAG 的核心不是让模型记住资料.
而是让模型回答前先检索资料.

它的核心链路是:

文档
  -> 切块
  -> embedding
  -> 向量数据库
  -> 检索
  -> prompt
  -> 回答和来源

几个关键点:

1. 文档解析质量决定知识库质量
2. 切块策略会影响检索效果
3. payload 元数据决定答案能不能追溯
4. score 过滤可以减少低质量上下文
5. prompt 要限制模型只基于资料回答
6. 来源展示是 RAG 的核心能力

踩坑点也很清楚:

1. 不要把所有文档粗暴拼成一大段
2. 不要只存文本不存来源
3. 不要把低相关度结果硬塞给模型
4. 不要指望 RAG 替代结构化数据库
5. 不要让模型在资料不足时强行回答

最后一句话总结:

RAG 不是魔法.
它是一套让大模型先查资料,再回答问题的工程流程.

把这条流程跑通以后,大模型才真正能服务我们的项目文档,配置表和内部知识库.