RAG流程优化(微调)的4个基本策略

一、RAG(检索增强生成)基础与优化方向

RAG是一种结合检索与语言模型生成的技术,核心流程包括:

  1. 数据收集:将数据分块、生成向量嵌入并存储到数据库;
  2. 推理过程:根据用户查询检索相关文档,结合提示生成回答。

文章提出RAG优化的4个关键方向:分块方法、嵌入模型、向量搜索策略、提示工程,并通过实验验证效果。

二、4种优化策略及实验验证

  1. 分块方法优化目标:平衡块大小,避免过小(丢失上下文)或过大(检索冗余)。实验:尝试“父文档检索器”,同时检索相关片段及其父文档以保留上下文,但结果显示性能下降(如上下文召回率降低),需进一步调整分块逻辑。
  2. 嵌入模型选择对比:DPR(密集 Passage 检索模型)和Sentence-BERT: DPR在检索精度上更优,适合需要高准确性的场景;Sentence-BERT在实验中性能下降,说明嵌入模型需与任务匹配(如领域数据微调)。
  3. 向量搜索方法调整实验将距离度量改为余弦相似度,结果显示“真实性”和“上下文召回率”提升,证明相似度算法对检索结果影响显著。
  4. 提示工程优化通过构造清晰指令(如要求答案基于上下文、简洁回答)提升生成质量,提示中加入示例可引导模型更准确输出,但需反复迭代测试。

三、评估指标与实验工具

  • 指标:使用RAGAS提出的4个指标: 真实性(答案是否基于上下文)、相关性(是否直接回答问题)、上下文精度(检索内容的相关性)、上下文召回(检索内容的完整性)。
  • 工具:通过LangChain框架实现RAG流程,结合Chroma向量数据库、Ollama模型等进行实验和评估。

推广到测试领域的用法

在测试领域(如软件测试、质量保障),RAG优化策略可用于以下场景:

一、测试用例生成与管理

  1. 分块方法应用将需求文档、历史测试用例按功能模块分块(如“用户登录”“支付流程”),检索时可快速定位相关测试场景,避免上下文碎片化。示例:当测试新功能时,通过分块检索相似功能的测试用例,复用或优化用例结构。
  2. 嵌入模型微调使用测试领域数据(如错误日志、测试规范)微调嵌入模型,提升对测试术语(如“边界条件”“异常处理”)的语义表示能力,减少检索偏差。
  3. 向量搜索优化测试用例检索用余弦相似度检索相似测试场景,例如:当发现一个软件bug时,快速找到历史上类似bug的测试用例,辅助定位问题。

二、自动化测试与错误分析

  1. 提示工程生成测试脚本构造提示让模型基于需求文档生成自动化测试脚本,例如:通过优化提示(如指定脚本框架、断言标准)提升生成代码的准确性。
  2. 错误日志分析与定位将错误日志分块存储,当新错误出现时,检索相似日志并生成分析报告,提升排错效率。例如:用向量搜索匹配“数据库连接失败”相关的历史错误及解决方案。

三、测试领域的指标扩展

除文章中的4个指标,可新增测试专属评估维度:

  • 测试覆盖率:检索到的测试用例对新功能的覆盖程度;
  • 错误检测率:生成的测试用例发现实际bug的比例;
  • 脚本可执行性:生成的自动化测试脚本是否能正常运行。

四、实际应用价值

  • 效率提升:减少测试人员手动编写用例的时间,快速复用历史资源;
  • 一致性保障:基于统一的需求文档和历史数据生成测试内容,避免人为疏漏;
  • 知识沉淀:将测试经验通过RAG系统结构化存储,便于新人快速获取信息。

总结

RAG的优化策略在测试领域的核心价值在于:通过数据分块与检索增强,将分散的测试资源(需求、用例、日志)转化为可高效利用的知识库,结合模型生成能力实现自动化测试流程,同时通过指标迭代持续提升测试质量。实际应用时需结合测试场景特性,针对性调整分块逻辑、嵌入模型和提示策略。

RAG 核心组件深度解析

1. 分块(Chunking)的技术细节

  • 分块的核心目标:将长文本分割为语义完整的“块”,确保每个块包含足够上下文(如完整段落、章节),同时避免块过大导致检索时冗余信息过多。
  • 分块方法对比: 按长度分块(如RecursiveCharacterTextSplitter):按字符数或token数分割,适合无结构文本,但可能切断语义(如一句话被分成两块)。按结构分块(如MarkdownHeaderTextSplitter):按文档结构(标题、段落)分割,保留语义完整性,适合有格式的文档(如API文档、测试规范)。
  • 父文档检索器失效原因:实验中性能下降可能是因为父文档块过大(1500 token),包含过多无关信息,导致检索时上下文噪声增加,模型生成答案时混淆关键信息。

2. 嵌入模型(Embedding)的本质

  • 嵌入的核心作用:将文本转换为高维向量(如768维),向量距离反映语义相似度。好的嵌入模型能让语义相近的文本在向量空间中距离更近。
  • DPR与Sentence-BERT的区别: DPR(Dense Passage Retrieval):专为检索设计,训练时优化“查询-文档”匹配度,更擅长捕捉查询与文档的语义关联(如问题“谁领导了实验1”与文档中“实验1由XXX负责”的匹配)。Sentence-BERT:通用语义表示模型,擅长文本相似度计算,但在检索场景中可能因未针对“查询-文档”对优化,导致检索精度下降(如实验中真实性指标降低)。
  • 领域适配重要性:若测试领域有特定术语(如“单元测试”“集成测试”),需用测试数据微调嵌入模型,否则通用模型可能将“测试用例”和“测试环境”的向量距离计算错误。

3. 向量搜索的数学原理

  • 余弦相似度 vs 欧几里得距离: 余弦相似度:计算两个向量的夹角余弦值,范围[-1,1],衡量方向相似性,不考虑向量长度。适合文本检索(文本向量长度常被归一化),如查询“登录功能测试”与文档中“用户登录模块测试”的向量方向应接近。欧几里得距离:计算向量空间中的直线距离,衡量数值差异,适合数值型数据(如图像特征)。文本场景中,若向量未归一化,长度差异可能干扰相似度判断。
  • 实验现象解释:使用余弦相似度后“真实性”提升,因为它更关注语义方向的匹配,而欧几里得距离可能受向量长度(如文档长短)影响,导致检索到无关但长度相似的块。

4. 提示工程(Prompt Engineering)的关键逻辑

  • 提示的三层结构: 上下文(CONTEXT):检索到的文档块,提供事实依据;问题(QUESTION):用户查询,明确任务目标;指令(INSTRUCTIONS):约束模型行为(如“仅基于上下文回答”“返回JSON格式”)。
  • 示例引导(Few-Shot Prompting): 在提示中加入样例,如: 引导模型学习回答格式和逻辑,提升生成一致性。

评估指标深度解读

  • 真实性(Faithfulness):答案是否全部来自上下文,杜绝“幻觉”(模型编造信息)。例如:若上下文未提“实验1的领导者”,模型回答“未知”则真实性高,若编造“张三领导”则真实性低。
  • 上下文召回(Context Recall):检索到的文档是否包含回答问题所需的全部信息。例如:问题需要3个关键点,若检索结果只包含2个,则召回率为66.67%。
  • 在测试领域的扩展指标: 测试覆盖召回率:检索到的测试用例覆盖新功能需求点的比例;错误模式匹配率:新错误日志与历史错误向量的匹配准确率。

测试领域应用的具体落地步骤

1. 测试用例自动化生成(以API测试为例)

  1. 分块阶段: 将API文档按“接口功能”分块(如“用户注册接口”“订单查询接口”),每个块包含参数说明、返回值示例。
  2. 嵌入与检索: 用DPR嵌入模型索引所有接口块,当需要测试新接口“支付退款”时,检索相似接口(如“支付下单”)的测试用例模板。
  3. 提示工程
  4. 指标评估: 用“测试覆盖召回率”检查生成用例是否覆盖需求文档中的所有退款规则。

2. 错误日志智能分析

  1. 数据处理: 将历史错误日志按“错误类型”分块(如“数据库连接错误”“权限不足”),每个块包含错误信息、解决方案。
  2. 向量搜索优化: 使用余弦相似度检索新错误日志的相似历史记录,例如新错误“Error: 1045 Access denied”与历史“MySQL权限错误”向量距离最近。
  3. 提示生成分析报告

常见误区与避坑指南

  1. 分块不是越小越好:块太小(如50 token)会丢失上下文,例如“测试用例需要验证用户名长度在6-16位”被分成两块,检索时可能无法关联“6-16位”的约束。
  2. 嵌入模型需定期更新:测试需求迭代后(如新增API),需重新微调嵌入模型,避免旧向量索引失效。
  3. 向量搜索参数需调优:如Chroma的k值(返回的最近邻块数),k过大导致上下文冗余(如k=10时包含5个无关块),k过小可能遗漏关键信息(如k=1时未检索到完整答案所需的块)。
全部评论
可以可以
1 回复 分享
发布于 昨天 18:17 辽宁
收藏
1 回复 分享
发布于 昨天 18:17 黑龙江
mark
1 回复 分享
发布于 昨天 18:17 山东
学习学习
1 回复 分享
发布于 06-16 15:17 山东
这个真得收藏了
点赞 回复 分享
发布于 06-18 16:50 北京
白薯哥学习学习
点赞 回复 分享
发布于 06-16 19:44 广东

相关推荐

      二月末第一段实习离职,当时没想那么多,又找了一家小公司,也没有暑期实习的概念,但是在公司干的也不咋开心,看着周围个个上岸大厂,而且也不怎么喜欢当时的业务,压力是真的拉满了。     后面骑驴找马,5月多的时候拿到了腾讯云智的暑期,虽然是子公司,但是怎么着也是腾讯云。也感谢云智给了我跑路的勇气,本来是打算干到6月17号,然后考完试就飞西安,提了离职之后,因为手上的活排期肯定来不及,也没有太多其他的,leader就说可以早点走,然后想着还早,又多投了几个,大部分都没回应。在家看了几天八股,先是拿到了一家小公司的offer,在深圳,其实挺心动的,搞ai出海产品,一个月折合下来有7k,有转正机会。但是还是想上一个title秋招才有更大的底气,就拒了继续面。      面了字节和滴滴。字节一面觉得还行,二面没想到是问以前没答出来的(第三战字节了),明明面试前一天才看的,又忘了,虽然二面结果还没出,但是应该凉了😭滴滴一面因为操作系统不行,被拷打了很久,以为凉透了结果被捞了,二面就偏向聊天了,过了两天offer,     第一次面大厂就是滴滴,三战滴滴了,最后进滴滴也算是有头有尾了。这个组很核,要学好多东西,相信自己能抗住压力吧     牛油们虽然快六月了,但是也别放弃,最近大厂机会多了很多,大部分也都有转正机会,而且流程都很快,周五一面周一二面周三offer,有个同学更夸张,周一一面周二二面半小时后口头oc。而且大家别不好意思,有机会要争取,我最开始拒了面试,但是又一看这个组太想要了,重新打电话舔回面试。     广东人的第一次北漂,滴滴工资本科不高,不知道能不能独立存活     
点赞 评论 收藏
分享
    不知不觉,大学4年过去了,回顾大学4年更多的是内耗、焦虑,看着身边那么多技术大牛,虽说环境改变能影响人,感觉即使和大牛有过一面之缘,但是自我好像并没有更大的提升,也许计算机并不适合我。    大一初入校园,一点都不会用电脑,打字都还要看键盘一个字母一个字母敲。不断在金山软件练习打字,后来总算学会盲打了。随后,学校技术社团招新,那时候根本不知道这是些什么玩意,只知道精通了能进大厂。随着室友加入社团,看着他们熬夜敲代码,一股焦虑感瞬间产生。自从那以后,和java结缘了。每天都去图书馆看b站的java教学视频,java经典书籍,看着看着就很想睡觉,瞬间感觉这个好难啊,只看不敲代码是真的学不会。之后一旦有技术社团招新,就主动去听纳新会,通过努力顺利进入到一个技术团,但是后面偷懒跟不上大家学习进度,就主动退出了,回想如果不退,现在或许是另一种结果吧。大一的时候还兴起了NFT(类似炒股),那时候就莫名奇妙地搞这个,顺便还花了几k买了一个逆向安全班课程,但是到现在都没看完几集,自己根本沉不下心专心搞一件事。    大二,戒掉了NFT,学习学校的课程,继续学习java,微服务,分布式...跟着敲了一半的谷粒商城,后来编写接口更加熟练了,那时候瞬间感觉中大厂保底,然后想找一个实习,但是一直没找到,这个时候还没学算法+八股,只学会了简单做项目。现在想想真是愚蠢啊。如果当时更多的是去专研算法,也许又是另一种结局吧。    大三,这个时候开始背八股,敲力扣,但是这个时候就感觉算法根本学不会了,只会背的程度,极力后悔没有在大一的时候学习基础知识,下学期,找了一个小厂实习了3个月,但是收获并不大,只简单了解开发流程等。    大四,投了几百份,有面试的很少,感觉到了就业的严峻,秋招一直未果,因为一些原因转战投实习。随后找到了一家成都的小厂(规模只是10个人左右)实习,然后没有秋招了,一直实习了半年,转正。    走了很多弯路,没有意识到计算机基础的重要,要是有个指路人提前告诉自己什么时间该做什么事,也许是另一种结果吧。    人生如棋,落子无悔。想告诉学弟们,抓住当下,做好自己该做的,能做的,不要好高骛远,毕竟咱们都是普通人!
点赞 评论 收藏
分享
学历算污点吗?
小何和:快毕业了,BOSS上的od闻着味就来了
点赞 评论 收藏
分享
评论
2
11
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务