大模型学习之路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 小时前
AI 驱动的自动化安全测试工具--Strix
运维·人工智能·功能测试·测试工具·自动化
佳xuan1 小时前
深度学习pytorch
人工智能·pytorch·深度学习
蓝桉~MLGT1 小时前
中级软考(软件工程师)——软件设计师高频核心考点大补充(架构设计、硬核计算与OS篇)
学习·中级软考
小何code1 小时前
【第19篇】卷积神经网络CNN入门:图像识别的利器
人工智能·深度学习·cnn
古希腊掌管代码的神THU1 小时前
【清华代码熊】多模态|智谱GLM-5V-Turbo技术报告解析
人工智能·深度学习·自然语言处理
特立独行的猫a1 小时前
HarmonyOS / OpenHarmony 鸿蒙PC平台三方库移植:AI自动化编译框架build_in_harmonyos介绍及使用
人工智能·自动化·harmonyos·三方库移植·鸿蒙pc·opendesk
sali-tec1 小时前
C# 基于OpenCv的视觉工作流-章69-圆弧测量
图像处理·人工智能·opencv·算法·计算机视觉
NOCSAH1 小时前
统好AI数智平台CRM:智能录入与跟进功能解析
人工智能·统好ai
HIT_Weston1 小时前
76、【Agent】【OpenCode】用户对话提示词(addtionalProperties 属性)
人工智能·agent·opencode