大模型学习之路009:问题解决-RAG 知识库系统能上传文档,但检索不到内容

第一步:先确认问题出在哪一层

问题大概率出在 **「文档分块」或「向量库入库」** 环节。

1. 先检查分块文件 processed_chunks.jsonl

打开这个文件,看看里面有没有数据:

  • 有没有 JSON 格式的分块
  • 每个分块的 text 字段里,有没有 "JVM"、"RAG" 相关的内容
  • 分块数量是不是和你上传的 PDF 页数对应

上传的新文档 → 只在内存里生效 → 没有写入到本地文件 processed_chunks.jsonl

找到 add_documents 方法:

python 复制代码
    def add_documents(self, new_chunks):
        """向混合检索器中添加新文档分块"""
        # 1. 添加到内存
        self.chunks.extend(new_chunks)

        with open("processed_chunks.jsonl", "a", encoding="utf-8") as f:
            for chunk in new_chunks:
                f.write(json.dumps(chunk, ensure_ascii=False) + "\n")
        # 2. 添加到向量库
        documents = [chunk["text"] for chunk in new_chunks]
        metadatas = [chunk["metadata"] for chunk in new_chunks]
        ids = [chunk["id"] for chunk in new_chunks]

        self.collection.add(
            documents=documents,
            metadatas=metadatas,
            ids=ids
        )

        # 3. 重建BM25(现在有这个方法了)
        self.build_bm25_index()
        print(f"✅ 成功添加 {len(new_chunks)} 个文档分块")

重启后端,重新上传文档,可以看到 processed_chunks.jsonl文档有更新

上传文档时后端打印日志,报错信息如下:

问题分析

  1. 写入问题已解决processed_chunks.jsonl里已经有了19.JVM 手册.pdf的分块数据,说明上传功能已经正常工作。
  2. 新问题:PDF 解析器报错MuPDF error 说明你当前使用的 PDF 解析库损坏或版本不兼容,导致部分 PDF 解析失败,文本乱码(看你截图里的text字段,有大量重复的JVMJVMJava,这就是解析失败的乱码)。
  3. 检索不到的原因:因为解析出来的文本是乱码,向量模型无法匹配你的查询,所以一直返回 "没有找到相关信息"。

首先,替换别的文档试试。

解决。

第二步:分块文档中存在,但是仍然查不到

问题出在混合检索的得分过滤hybrid_search函数中,对语义检索和 BM25 的得分进行了加权融合,但如果:

  • 语义相似度得分太低(比如低于 0.5)
  • BM25 的得分也不高
  • 融合后的结果被过滤掉了

就会出现 "明明有文本,但检索结果为空" 的情况

步骤 1:降低检索过滤门槛,强制返回所有 Top-K 结果

打开 rag_core.py,找到调用hybrid_search的地方,改成只用语义检索,并取消过滤

python 复制代码
def query(self, question, top_k=5, stream=False, max_context_tokens=12000):
    processed_question = self._preprocess_query(question)
    if not processed_question:
        return "请输入有效的问题。"
    
    # 关键:改成只用语义检索,并且强制返回所有结果,不做过滤
    retrieved_docs = self.retriever.semantic_search(
        query=processed_question,
        top_k=top_k
    )
    
    # 强制打印检索结果,方便调试
    print(f"🔍 检索到的文档数量:{len(retrieved_docs)}")
    for i, doc in enumerate(retrieved_docs):
        print(f"  [{i}] 得分:{doc['score']:.4f} | 文本:{doc['text'][:50]}...")
    
    # 即使得分低,也不直接返回"无相关信息",而是继续处理
    if not retrieved_docs:
        return "抱歉,知识库中没有找到相关信息,无法回答您的问题。"
    
    # 后续上下文处理代码不变...

步骤 2:修复 BGE 模型离线加载问题

之前的 BGE 模型是离线加载的,很可能因为路径或版本问题,导致向量生成失败,所有文本的向量都变成了随机值,相似度极低。

  1. 临时改成在线模式,把hybrid_retriever.py开头的环境变量注释掉:

    复制代码
    # os.environ["HF_HUB_OFFLINE"] = "1"
    # os.environ["TRANSFORMERS_OFFLINE"] = "1"
  2. 重启后端,让它自动下载 BGE 模型,生成正确的向量。

  3. 再问问题,看控制台打印的score是否都大于 0.5。

OK。

相关推荐
一尘之中1 小时前
从C语言底层设计到系统架构评估:软件架构知识体系全景
学习·系统架构·ai写作
久违 °2 小时前
【AI-Agent】TagMatrix 数据标注工具开发
人工智能·数据分析·go·agent·数据隐私
AI360labs_atyun2 小时前
腾讯推出电子牛马Marvis,好用吗?
人工智能·科技·ai
Dfreedom.2 小时前
Windows、虚拟机、开发板组网通信原理及调试通联步骤
人工智能·windows·部署·边缘计算·开发板·模型加速
3DVisionary2 小时前
蓝光三维扫描:医疗制造的精度焦虑怎么解
人工智能·算法·制造·蓝光三维扫描·医疗制造·三维检测·义齿检测
Are_You_Okkk_2 小时前
基于MonkeyCode解析AI研发新模式,根治开发低效痛点
大数据·人工智能·开源·ai编程
好评笔记2 小时前
机器学习面试八股——常用损失函数
人工智能·深度学习·算法·机器学习·校招
weixin_468466852 小时前
全局与局部注意力机制新手实战指南
人工智能·python·深度学习·算法·自然语言处理·transformer·注意力机制
weixin_468466852 小时前
工业相机成像原理新手入门指南
人工智能·自动化·机器视觉·工业相机·光学·光学系统·成像原理
回眸&啤酒鸭2 小时前
【回眸】CSDN新增功能测评——AI数字营销之内容创作
人工智能