ChatGPT Project 明明有那个文件却说'我没看到':向量检索漏召回

文件就在 Project 里,但短 query 让向量检索漏掉了它。最快的修法:在 prompt 里写出确切文件名,强制走关键字检索。

你的 ChatGPT Project 里有 12 个文件,需要的那个就摆在侧栏 Files 下面,你问”我们的定价政策是怎么写的”,模型回:“我没看到这个 Project 里有定价文档。“文件明明在。

最快的修法: 在 prompt 里写出确切文件名——Open "pricing-tiers-2026.pdf" and tell me what it says about discounts. ChatGPT 对 Project 文件跑的是混合检索(关键字 + 语义),确切文件名会触发关键字这条路径,绕开刚才把你的短 query 丢掉的相似度阈值。光这一步就能解决大多数 case。

底层原因是检索排序。ChatGPT 把每个文件抽出文本、切成 chunk、做 embedding,给 Project 建一个小向量索引。短的或泛的 query 生成的 embedding 跟所有内容都弱相关、跟任何具体内容都不强相关,所以过不了相似度阈值,没有 chunk 进得了 context。下面讲清楚文件在却被漏掉的五种原因、按顺序排好的修法,以及怎么确认检索是真的恢复了。

先排除头号假警报:文件在 Library 里,不在 Project 里

2026 年上线 Library 之后,你在任何对话里上传的文件都会自动存进账号 Library(侧栏 -> Library)。文件出现在 Library 里 不等于 已加进 Project。如果你是把文件拖进普通对话、然后才打开 Project,Project 是检索不到它的。

动手前先确认作用域:

  1. 打开这个 Project。
  2. 点开 Project 面板里的 Files(在右侧,或在项目名下方)。
  3. 确认文件名是列在 那里,而不只是在全局 Library 里。

如果它只在 Library,就加进 Project:打开 Project,点 Add files,选中它。下面所有步骤都默认文件已经真在 Project 的 Files 列表里。

常见原因

1. Query 太短,embedding 区分度不够

“定价?“或”政策?“生成的 embedding 很小,跟所有内容都弱匹配。检索按相似度给 chunk 排序,低于阈值(常被引用的值大概是 0.7-0.75 余弦相似度)就没有 chunk 进 context。

如何判断:长而具体的 query 能命中,短 query 不行。

2. Query 用的词不在文件里

文件叫 pricing-tiers-2026.pdf,里面写”Standard tier”、“Enterprise tier”、“list price”。你问”多少钱”可能命不中,因为在 query 其余部分很泛的情况下,“钱”离”list price”在 embedding 空间里太远。Custom GPT 那套词汇错位问题在这也一样。

如何判断:用文件里的原词问能命中,换个说法就失败。

3. Project 文件多,你的目标排在低位

ChatGPT 每个回合只拉 top 几个 chunk。文件越多,每个 chunk 面对的竞争越大。截至 2026 年 6 月,每个 Project 的文件上限如下:

套餐每个 Project 文件数
Free5
Plus约 20
Pro40

允许加到上限,但远没到上限检索质量就开始下降。如果你那个文件的最佳 chunk 排第 6、而只用 top 3-5,它就永远进不了 context。

如何判断:删掉不相关文件后,同样的 query 突然能行。

4. 文件入库了,但被切到你没想到的 chunk 里

大 PDF 按边界切 chunk 时,可能把一个逻辑段拆到两块里。你的 query 命中的是另一页,答案来源不完整。

如何判断:问第 1 页的答案对,问靠后的章节就错或者瞎编。

5. 对话历史把 ChatGPT 锚定在它先前的否认上

如果同一对话里前面 ChatGPT 说过”我没看到这个文件”,后面的回合可能因为指令一致性继续坚持这个结论——不是检索又失败,而是被前面的否认锚定了。Project Memory(按项目的记忆开关,在 Settings -> Personalization -> Memory 里开了 Personal Memory 时生效)还可能把这个锚定带进下一个对话。

你属于哪一类?

症状最可能原因去看
文件只在全局 Library,不在 Project Files作用域错了上面那节
长 query 行,短 query 失败原因 1Step 1 + 2
原词能命中,换说法就失败原因 2Step 2
删掉别的文件后就行了原因 3Step 6
第 1 页对,靠后页错原因 4Step 4,带页码
否认过一次,同对话一直否认原因 5Step 3

最短修复路径

Step 1:显式点名文件名

差:What does our pricing policy say about discounts?

好:Open "pricing-tiers-2026.pdf" in this Project and tell me what it says about discounts.

用确切文件名点名,会触发混合检索的关键字那一侧,绕开纯向量相似度。这一步能解决大部分”我没看到”的 case。

Step 2:用文档里的原词重写

记得文件里写过什么就直接复用:

差:定价政策怎么说?
好:根据 "pricing-tiers-2026.pdf",Enterprise tier 的 list price 是多少?

具体词(“list price”、“Enterprise tier”)能拉高与那个文件 chunk 的相似度。

Step 3:在同一 Project 里开新对话

对话内的锚定效应会持续。在 Project 视图里点 New chat,再问。对话 context 复位,检索对着同一批 Project 文件重新跑。

Step 4:靠后页漏召时,带上页码或章节

如果第 1 页能召回、靠后的章节不行,说明那一段的 chunk 排在阈值之下。直接钉住它:

In "pricing-tiers-2026.pdf", go to the section titled
"Enterprise tier" (around page 5) and quote the list price.

点出章节标题和大致页码,把检索引到正确的 chunk。

Step 5:删掉再重传以强制重新入库

文件确实入库失败的话,把它从 Project 移除,再加一次,等 30-60 秒索引完再问。验证入库是否成功:

List every file you can access in this Project.
For "pricing-tiers-2026.pdf", quote one sentence from page 1 verbatim.

能列出文件但引用不出来,说明检索找到了文件名元数据但没找到正文——重传几乎一定能修。

Step 6:检索老漏召的话,砍 Project 文件数

Project 越接近上限,检索质量越差。把陈旧 / 低优先级文件挪到单独的 Archive Project。活跃 Project 大致控制在 8-12 个文件(远低于 20-40 的上限),排序会明显改善,因为每个 chunk 面对的竞争者更少。

验证修复

不要相信单次成功召回。每个文件做这套三问审计:

1. Quote the first sentence of "<filename>" verbatim.
2. What is the section heading on page 2 of "<filename>"?
3. What is the last sentence in "<filename>"?

三问都正确 = 这个文件的检索确实可用。任一错误,就重传后再做正经依赖。

快速判断:命中文件名 vs 命中正文

两种失败模式修法不同:

  • 能列出文件名但引不出内容:正文入库失败。重传。
  • 列不出文件名:文件不在 Project 作用域内。确认它在 Project 的 Files 里,而不只是全局 Library。
  • 能列出文件、能引第 1 页但引不到第 5 页:chunk 排序问题。显式带上页码(Step 4)。

检索就是修不好怎么办

罕见情况下,文件无论你怎么搞都召不回——通常是 parser 对某个 PDF / DOCX 解析失败。绕开方案:

  • 本地把 PDF 转成 Markdown(比如用 marker-pdf),上传 .md。纯 Markdown 去掉了 PDF 的排版冗余,同样内容下比 PDF 召回更稳。
  • 长文档按章节拆成小文件。小文件 chunk 邻域更紧凑,召回排序更稳。
  • 表格抽出来存 CSV,跟原文件一起传。表格很少能从 PDF 文本抽取里完整保留,但对着 CSV 问一定命中。

预防

  • 文件名要有语义。pricing-tiers-2026.pdfdoc1.pdf 更利于文件名关键字检索。
  • 上传后立刻做”触发测试”:问 2-3 个只该文件里才有的事实。测试不过就先修好,别凑合用了再出错。
  • 活跃 Project 控制在 8-12 个文件,远低于套餐上限。排序上少即是多。
  • 多段文档加清晰的 # Section 标题。chunk 尊重标题边界,召回时上下文更干净。
  • 长期 Project 定期重跑上面那套检索审计。不过的就重传。

常见问题

为什么 ChatGPT 这个对话能找到文件、下个对话又找不到? 每个对话都重新建检索,而且会锚定到前面的回合。在同一 Project 里开新对话通常能修好(Step 3)。如果跨对话还在犯,可能是按项目的记忆把先前的否认带过来了;重传后再测一次。

是文件数上限导致的吗? 间接是。截至 2026 年 6 月,每个 Project 能放 5 个(Free)、约 20 个(Plus)、40 个(Pro)文件,但因为每回合只用 top 几个 chunk,远没到上限检索排序就开始变差。文件越少,排序越好。

Library 里的文件会自动进 Project 吗? 不会。2026 年的 Library 会把每次上传自动存进账号,但 Project 只检索加进该 Project Files 列表的文件。要显式加进 Project。

为什么点确切文件名管用、普通问法不管用? ChatGPT 用的是混合检索(关键字 + 语义)。确切文件名走关键字路径能命中,哪怕你的短 query 太泛、过不了语义相似度阈值。

重传后 PDF 还是召不回,怎么办? 多半是那个文件的 parser 问题。把它转成 Markdown(marker-pdf 之类)或按章节拆开,再传更小、更干净的文件。

标签: #ChatGPT #排查 #chatgpt-projects #vector-search