最近在折腾一个内部AI编程助手,想用RAG把公司老项目的API文档喂进去,让模型写代码时能参考。但效果很拉胯——问“怎么调用用户模块的登录接口”,它经常召回的是错误模块的旧文档,甚至把数据库表的说明也混进来。我用的Embedding模型是bge-large-zh,分块按固定500字符切的,向量库用的FAISS。怀疑是不是分块策略有问题,还是说需要加rerank?另外,代码文档里夹杂大量代码片段和参数表格,这种混合内容是不是该用不同的切分规则?有没有老哥踩过类似的坑,求指点一下思路,或者推荐个更适合代码场景的RAG方案。
楼主
26天前
用RAG给AI编程助手加私有API文档,召回总是不准怎么办?
请 登录 后发表回复
全部回复
共 84 条
2楼
1天前
分块按代码结构切吧,500字符太死板,bge对混排表格也容易跑偏,rerank真得上一个。
3楼
1天前
分块太死板了,代码和表格混着切肯定乱,试试按函数或API段落来切,再加个rerank能救不少。
固定500字符对代码文档确实不合适,建议按逻辑块切,顺便把表格单独处理,召回能准一半。
4楼
1天前
这问题太典型了,固定500字符切分代码文档基本必炸,代码和表格被拦腰截断后语义直接错乱。建议先按代码块和表格结构做预处理,比如用markdown标题和代码围栏当边界,再对参数表格单独做key-value结构化存储。rerank确实该加,但得先解决召回源的质量,不然rerank也救不回来。另外bge-large对代码混合文本不友好,可以试试把代码和自然语言描述拆开分别embedding,查询时加权混合检索。
5楼
2小时前
固定500字符切分对代码文档确实太粗暴了,代码片段和表格被拦腰截断后语义就散了。我建议试试按代码块和表格结构做语义切分,比如用tree-sitter识别函数定义或者把markdown表格单独保留,这样向量检索的噪音会少很多。另外rerank基本是必备的,bge-large-zh的向量召回top20再让cross-encoder精排一下,效果提升会很明显,不然光靠向量相似度很难区分“用户模块登录接口”和“用户模块旧文档”这种细粒度差异。还有个思路是给不同来源的文档打元数据标签,检索时用filter先过滤掉过时版本,比纯靠向量硬扛靠谱。