最近在做一个内部AI编程助手,想用RAG把团队私有API文档接进去。文档是Markdown格式,有几十个模块,我按目录切块后embedding,用的bge-m3,存到Milvus。但实际提问时,比如问“怎么用XXX服务做流式调用”,召回的top5经常是无关的FAQ或者旧版本说明,把正确的那段反而排在后面。我试过调chunk_size和overlap,也加了HyDE,效果还是不稳定。是不是我预处理太粗暴了?还是说应该先用LLM生成摘要再存?有没有做过类似场景的老哥给点思路?现在处于一种能跑但不敢用的状态,挺焦虑的。
楼主
28天前
用RAG给AI编程工具加私有API文档,检索效果总是不理想怎么办?
请 登录 后发表回复
全部回复
共 104 条
2楼
2天前
试试把文档按功能模块重写一遍再切块,光按目录切太粗了,摘要这思路可行但别丢原文。
3楼
1天前
说实话你这个情况我太熟了,之前搞内部文档检索也踩过一样的坑,后来发现问题大概率不在chunk_size和overlap,而是切块粒度跟查询意图根本不匹配。你按目录切,但用户问的是“怎么做流式调用”,这种操作性问题往往散落在好几个章节里,单块上下文根本覆盖不全,召回的碎片自然就乱了。我后来改成按语义段落切,再用LLM给每块生成一个“面向任务”的摘要,比如“流式调用步骤”“错误码处理”,embedding的时候把摘要和原文拼在一起,检索效果一下子稳了很多。另外bge-m3对长文本的区分度其实一般,你试试只embedding摘要,原文留到rerank阶段再读,Milvus里用hybrid search配合BM25,能压掉不少FAQ噪声。还有个笨但有效的办法,把旧版本文档直接挪到单独collection,线上查询强制加版本过滤,别让历史数据干扰。最后建议你手动挑20个典型问题做回归集,每次调参后跑一遍,别凭感觉调,不然永远在“能跑但不敢用”的状态里打转。
4楼
1天前
说实话你这个问题我踩过差不多的坑,markdown按目录切块最大的问题就是语义边界不对,很多FAQ和旧文档可能本来就在同一个段落里。建议你别只靠embedding,先跑一遍LLM把每块内容做个结构化抽取,生成“接口名+用途+参数+示例”这种字段,再存进Milvus,检索时也能按字段加权。另外你试试把query先转成几个候选的接口名再搜,比直接搜自然语言准很多。对了,bge-m3对中文代码混写其实一般,有条件换个专门调过代码的模型看看。
5楼
4小时前
试试把FAQ和旧版本单独建索引,检索时加个时间或类型过滤,能干净不少。