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

Project 里文件就在那,但模型说找不到——短 query 让向量相似度过不了阈值。修法是显式点名文件、用文档原词重写。

你 ChatGPT Project 里有 12 个文件,需要的那个就摆在侧栏上,你问”我们的定价政策是怎么写的”,模型回:“我没看到这个 Project 里有定价文档。“文件明明在。原因是向量检索排序:短的、泛的 query 嵌入向量跟任何具体 chunk 的相似度都不高,分数低于阈值就被丢掉。修法是显式:点名文件、用文档里的原词重写、或者直接强行触发再检索。

常见原因

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

“定价?“或”政策?“生成的 embedding 很小,跟所有内容都弱匹配。检索按相似度排,低于阈值(通常 0.7-0.75)就没文件进 context。

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

2. Query 用的词不在文件里

文件叫 pricing-tiers-2026.pdf,里面写”Standard tier”、“Enterprise tier”、“list price”。你问”多少钱”——“钱”和”price”在 embedding 空间里离泛 query 太远,永远命不中。Custom GPT 那套词汇错位问题在这也一样。

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

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

Project 里 15-20 个文件时,检索只拉 top 3-5 个 chunk。你那个文件的 chunk 排第 6,永远进不来。

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

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

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

5. Project 记忆 / 对话历史压过了检索

如果同一对话前面 ChatGPT 说过”我没看到这个文件”,后面的 turn 可能因为指令一致性继续坚持这个结论——不是检索又失败,而是被前面的否认锚定了。

最短修复路径

Step 1:显式点名文件名

差:我们的定价政策对折扣怎么说?

好:打开这个 Project 里的 "pricing-tiers-2026.pdf",告诉我它对折扣怎么说。

点名走的是文件名关键字路径,绕开纯向量相似度。70% 的 case 这一步就解决。

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

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

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

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

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

对话内的锚定效应会持续。在 Project 侧栏顶部点 新对话,再问。Project context 复位,检索重新跑。

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

文件确实入库失败的话,把它从 Project 删掉,再传一次,等 30-60 秒索引。再问。如果回答正确了,说明原来的索引坏了。

验证入库是否成功:

列出你能在这个 Project 里访问的所有文件。
从 "pricing-tiers-2026.pdf" 的第 1 页逐字引用一句。

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

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

15+ 文件的 Project 检索质量明显下降。把陈旧 / 低优先级文件挪到单独的 Archive Project。活跃 Project 控制在 8-12 个文件,检索质量会明显回升。

验证修复

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

1. 逐字引用 "<filename>" 的第一句。
2. "<filename>" 第 2 页的章节标题是什么?
3. "<filename>" 的最后一句是什么?

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

预防

  • 文件名要有语义。pricing-tiers-2026.pdfdoc1.pdf 更利于文件名关键字检索。
  • 上传后立刻做”触发测试”:问 2-3 个只该文件里才有的事实。测试不过就立刻 troubleshoot,别凉拌等用了出错。
  • Project 文件控制在 8-12 个。检索排序上少即是多。
  • 多段文档加清晰的 # Section 标题。chunk 尊重标题边界,召回时上下文更干净。
  • 长期 Project 定期做检索审计:每个文件挑一个已知事实问一遍。不过的就重传。
  • 把”按文件原名引用”写进团队 prompt 风格指南——大家都能省同样的 debug 时间。

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

两种失败模式修法不同:

  • 能列出文件名但引不出内容:正文入库失败。重传。
  • 列不出文件名:文件不在当前 scope。确认是上传到正确 Project,而不是个人账号。
  • 能列出文件、能引第 1 页但引不到第 5 页:chunk 排序问题。下一条 query 显式带页码。

检索就是修不好怎么办

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

  • 本地用 marker-pdf 把 PDF 转 Markdown,上传 .md。同样内容下 Markdown 的向量召回明显比 PDF 强。
  • 长文档按章节拆成小文件。小文件 chunk 邻域更紧凑,召回排序更稳。
  • 表格抽出来存 CSV 单独上传。问表格内容时一定命中 CSV。

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