描述問題/錯誤/疑問
我正在構建一個使用向量存儲接收器連接到 PGVector 的 AI 工作流程。大多數情況下它會檢索到正確的文件,但有時排名較低的不相關文件會排在我實際期望的文件之上。我已經確認文件的嵌入是正確的,並且索引和查詢使用相同的嵌入模型。有什麼可以查看以改進檢索質量嗎
錯誤訊息是什麼(如有的話)?
請分享您的工作流程
(在畫布上選擇節點,並使用鍵盤快捷鍵 CMD+C/CTRL+C 和 CMD+V/CTRL+V 複製和貼上工作流程。)
分享最後一個節點返回的輸出
有關您 n8n 設置的信息
n8n 版本:1.123.x
數據庫(默認:SQLite):
n8n EXECUTIONS_PROCESS 設置(默認:own、main):
通過以下方式運行 n8n(Docker、npm、n8n cloud、桌面應用):
操作系統:
嘿 @Oluwanifemi ,在等待回覆的時候,這些資源或許能幫助你:
建議的資源
自動符合你的提問。
文件:
論壇:
@merarisosa 、@jabbson - 你們之前幫助過類似的問題,能看一下嗎?
由 n8n 社群機器人自動建議。這是試用版 - 請在此分享意見回饋 。
嗨 @Oluwanifemi
Oluwanifemi:
有什麼方法可以改善檢索品質嗎
如果相關性較低的文件排名較高,通常是因為相關文件的核心訊息被其分塊中的周圍文本「稀釋」了,或者分塊太小而無法提供足夠的上下文。
調整分塊大小和重疊: 在你的文本分割器 節點中,嘗試調整分塊大小。如果分塊太大(例如 >1000 個 token),它們會包含多個主題,使向量成為無關概念的「平均值」。如果分塊太小(<200 個 token),它們就缺乏上下文。嘗試使用 400–800 個 token 的大小和 10–20% 的重疊 。
為分塊添加上下文: 如果你正在分割大型 PDF 或 markdown 檔案,請在嵌入前為每個分塊前置文件標題或段落標頭。你可以使用編輯欄位(設定)節點或在向量存儲接收器之前的 程式碼 節點來完成此操作。這會強制嵌入模型將向量錨定到特定文件/段落上下文。
向量資料庫使用數學公式計算點之間的距離。如果指標與你的特定嵌入模型的訓練方式不相符,排名就會被扭曲。
檢查 PGVector 節點: 在你的向量存儲工具 / PGVector 節點設定中,確保相似度指標設定為餘弦距離 (或餘弦相似度)。大多數現代嵌入模型(如 OpenAI 的 text-embedding-3-*、Cohere 和 Mistral)都針對餘弦相似度進行了優化。如果設定為 L2(歐幾里得)或內積,可能會導致無關文件得分較高。
這有幫助嗎?
值得檢查的是你的 PGVector 欄位上使用的索引類型。如果是 ivfflat 或 hnsw,那表示你確實在進行近似最近鄰搜尋。如果你使用預設設定,「近似」可能導致實際最近的匹配被遺漏,而不只是被降低優先度。
對於 ivfflat,檢查你的列表計數並在查詢時增加「probes」。更多的 probes 更接近精確搜尋,但即使較高的 probe 計數也不保證等效。對於 hnsw,檢查「ef_search」。在嘗試重新排序搜尋之前,這是個快速的排除方法,特別是因為它可能只需要簡單的單行 SQL 變更。
Hi @Oluwanifemi
向量存儲節點具有插入、取得和檢索模式,但沒有替換或刪除功能,因此每次運行您的攝取工作流程都會附加每個塊的新複本,而不是更新已存在的行。近似相同的舊複本隨後會與當前塊競爭,並可能佔據檢索器的最高位置,這正是偶爾出現錯誤文件的原因。計算行數並與單次攝取應產生的數量進行比較:
SELECT count(*) FROM your_table;
如果結果是您預期數量的倍數,請清空表格、索引一次,然後在重新索引前刪除該來源的行。
有關更廣泛的 RAG 設定的詳細資訊:
https://axshul.site/n8n/guide/vector-stores-and-rag/
如果您已經排除了嵌入模型不匹配的情況,我建議檢查文件如何分塊。許多檢索問題源於包含多個主題的塊,這會導致嵌入不夠聚焦
另一個要檢查的地方是您的文件是否包含大量重複的措辭或範本。如果每條記錄都以相同的段落開頭,嵌入最終會比預期更接近,這會讓 PGVector 更難排列最佳匹配
最後,不要過度依賴相似度分數本身。改為比較前 5 個結果。如果正確的文件一直出現在頂部附近但不是第一個,這通常是數據質量問題,而不是 PGVector 的問題
嗨 @Oluwanifemi
這不是一個bug。這是單階段向量搜尋的正常行為:餘弦相似度衡量的是主題相似性 ,而非相關性 。當兩個chunk在~0.03的餘弦距離內時,哪一個排在前面基本上就是噪音。你的嵌入式表示正確並不能阻止這種情況。
解決方案(5分鐘,n8n 1.98版本起內建支援):
在你的 PGVector Vector Store 節點上,設定 Limit 為 20(預設值為4)。
Options → Add option → Rerank Results → 啟用。
Reranker 連接器會出現在節點的下方 — 附加一個 Reranker Cohere 子節點,模型選擇 rerank-v3.5。
保持Vector Store Retriever和chain連接方式不變。
為什麼有效:你的嵌入式模型在編碼文件時從未見過查詢。Reranker是一個交叉編碼器 — 它同時讀取查詢和chunk,並評分實際相關性。對整個語料庫來說速度太慢,但用於20個候選項目是理想的。
將 Limit 設定為純數字,不要用表達式 — n8n#14151 在那裡無聲地忽略表達式,並退回到4。