大模型学习之路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。

相关推荐
Ai-_Man2 小时前
希望大家能推荐一款软件,可以直接把文心生成的代码变流程图,提高办公效率
人工智能·ai·小程序·流程图
AI02264 小时前
探秘AI Agent软件公司:开启智能时代的创新引擎
人工智能
fīɡЙtīиɡ ℡6 小时前
AI 应用系统设计
java·开发语言·人工智能
小淮AI6 小时前
国际教育课程的本土化探索:以枫叶教育三十年为观察样本
大数据·人工智能
又折桃枝换酒钱6 小时前
VisCoder2:构建多语言可视化编码智能体(翻译与解读)
人工智能·信息可视化
AI绘画哇哒哒6 小时前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
Chengbei117 小时前
DSH渗透测试插件dsh-pentest全新升级!适配DeepSeek Harness,可视化探索链路,一键搭建轻量化AI渗透测试环境。
人工智能·web安全·网络安全·微信·小程序·系统安全·安全架构
QN1幻化引擎7 小时前
DalinX Phi 性能突破:跨层秩保持对齐与意识涌现度量的实证研究
人工智能·ai·架构·agi·asi
NeilCarmack7 小时前
Deepseek-harness增加桌面版端序列:第 1 讲 · 命令解析:`pnpm dsh desktop` 的第一步
人工智能·agent·ai agent