
注意点:
-
文本如何分割?
RAG 文档切分攻略:做好这步,检索精度提升 50%-阿里云开发者社区
zhuanlan.zhihu.com
- 分块策略三大家族
| 策略 | 核心思想 | 优点 | 缺点 | 适用场景 |
| ① 固定长度分块 | 按字符/token数一刀切 | 简单、快、通用 | 上下文容易断裂 | 快速原型、对语义要求不高 |
| ② 文档结构分块 | 按段落、标题、列表切 | 最大程度保留语义 | 依赖文档格式 | Markdown、HTML、结构化文档 |
| ③ 混合分块 | 先按段落粗分,再按长度截断超长段落 | 平衡结构与大小 | 实现稍复杂 | 通用推荐方案 |
- 三大优化技巧
| 优化 | 做法 | 效果 |
| ① 过滤过短块 | 丢弃或合并低于阈值(如<50字符)的块 | 减少噪音、提升质量 |
| ② 元数据富化 | 添加标题、章节、文档ID等信息 | 增强上下文、方便溯源 |
| ③ 重叠策略 | 一般 15%-20%,信息密集型可提高 | 避免关键信息被切断 |
这里采用分段的方式,更加适合通用文章而且实现起来也简单。
对于不同的解析器:
word:因为内部是xml文件,<w:p>代表一个段落,<w:t>代表段落的里面的一段内容。由于word解析出来的段落可能会很小,所以还需要设置一个下限,将word每一段拼接起来(最后段落要大于下限值)
-
多轮对话管理
GPT多轮对话上下文管理:3大策略与实战避坑指南 - ByteZoneX社区
从单轮问答到连贯对话:RAG多轮对话技术详解 - 技术栈
-
滑动窗口:只保留最近的N轮对话作为上下文缺点: 当对话深入时,早期的重要信息会被“滑出”窗口,导致模型丢失关键上下文。
-
对话摘要:当对话历史变得太长时,我们调用一次模型,让它把早期的对话内容总结成一段摘要,然后用这个摘要替换掉那部分冗长的原始消息。摘要本身也消耗token,并且可能丢失细节。摘要的触发时机和保留消息的比例需要反复调试。我的经验是,当历史长度超过模型上下文窗口的70%时触发摘要,并始终保留最近的25%的对话不被摘要,这是一个比较稳妥的平衡点。
-
向量化记忆与RAG:原理是把“记忆”外包给向量数据库:存储: 每完成一轮对话,就将其中的问、答内容(或者关键信息点)通过Embedding模型转换成向量,存入向量数据库(如ChromaDB、Pinecone)。检索: 当用户提出新问题时,先将这个问题也转换成向量。查询: 用这个新的向量去数据库里进行相似度搜索,找出历史上与当前问题最相关的几段对话片段。注入: 将检索到的历史片段和最近几轮的对话一起组合成新的prompt,发送给大模型。
这种方式让模型每次都能拿到与当前话题最相关的“精准记忆”,而不是模糊的摘要或无关的近期对话。一个实用的技巧是,将最近的3-4轮对话始终保留在主上下文中,然后用RAG补充相关的历史片段。这种混合模式在实践中效果非常好,兼顾了即时性和长期记忆。
这里采用问题+回答向量化后存入对话知识库,然后用户输入新问题时会先检索对应知识库,同时也检索对话知识库,然后组装成prompt给大模型处理。
- 意图识别
意图识别准确率97.6%!高阶多轮对话RAG架构实战分享-阿里云开发者社区
这里采用意图识别寻找对应的知识库,后端会配置好对应的意图文档,分类保存。
-
问题重写
深入理解RAG查询转换优化:多查询、问题分解与回答回退 - muzinan110 - 博客园
高级RAG优化手册:3招解决检索不准和查询模糊-阿里云开发者社区
场景:
- 用户查询表述不清晰或含糊
- 需要从多个角度理解用户意图
- 单一查询难以覆盖完整信息
方法:
- 查询重写:“一题多解,集思广益”。先用LLM将原问题改写成多个语义相似但表述不同的子问题,再分别检索,最后合并去重。
- HyDE(假设文档嵌入):让LLM生成假设答案(如“解决客户投诉的步骤:1.倾听;2.道歉”),再用于检索,提升相关性。
- 多轮查询:拆分复杂问题,例如“某公司2023年净利润及增长率”分解为子问题分别检索,最后汇总答案。
这里采用:
一开始使用最近几轮的对话(问题+答案)向量,和当前对话进行问题重写,但是会出现一个情况:
- “事假休几天?”
- “年假呢?”
- “事假怎么请?”
- “那年假呢?”
4的问题会全局检索最相似的几条,然后会检索到2最相似,然后最后的答案会受到2的影响,导致改写为年假休几天
-
Prompt工程
提示词工程 | 菜鸟教程
提示词要素 | Prompt Engineering Guide
-
检索优化
检索 = 召回+排序
https://aistudio.baidu.com/blog/detail/780105490893957
召回:一般会使用混合召回,因为单纯使用向量计算相似度,在以下场景容易失效:
- 专有名词匹配:产品型号、人名、ID等精确匹配需求
- 布尔逻辑:"包含A但不包含B"的复合查询
- 数字范围:价格区间、日期范围等过滤条件
混合检索融合向量和关键词,可以兼顾语义和精确匹配。
融合:
RRF融合,使用1/(n+60),n为检索系统中的排名,不用归一化和无需调权重,不受异常分数影响,只看排名。
排序:
RAG中的Rerank(重排序)简单易懂全面介绍及实战案例在RAG(检索增强生成)技术中,rerank(重排序)是对初步 - 掘金
初步检索通常返回数十甚至上百个候选文档,但它们的质量参差不齐:
- 向量相似度 ≠ 语义相关性
- 长文档可能占据多个检索槽位
- 初步检索缺少查询-文档的交叉特征
重排序(Reranking)的核心作用是用更精确的模型对候选进行"精排"。
| 模型类型 | 原理 | 计算成本 | 适用场景 |
| Cross-Encoder | 将查询和文档拼接输入,输出相关性分数 | 高(需逐对计算) | Top-100精排 |
| Bi-Encoder | 分别编码查询和文档,计算相似度 | 中(可预计算文档向量) | 大规模粗排 |
| LLM-based | 用大模型直接判断相关性或生成排序 | 极高 | Top-10超精排 |
| Learning-to-Rank | 基于特征工程的传统机器学习排序 | 低 |
