我有一個 RAG 工作流程,但它不能正常運作。在將文本上傳到 Supabase 資料庫後(工作流程成功結束),我向 LLM 詢問了上傳到 Supabase 中的內容。但 AI 給出了錯誤的答案(它給我的回答像是:I don’t know what you talking about.)
有人知道如何解決這個問題嗎?
我的工作流程在這裡
@Quent 經典 RAG 檢索失誤:上傳成功但搜尋沒有回傳任何結果,所以代理沒有內容可用,只能說「我不知道」。原因幾乎總是以下兩種之一:
-
嵌入模型不匹配(#1 常見原因)。插入時使用的嵌入模型必須與查詢時使用的模型完全相同。不同的模型或維度會將向量放在不同的空間中,導致相似度搜尋返回零結果。檢查兩個 Embeddings 節點是否使用相同的模型。
-
Vector Store 未連接到代理作為檢索器,或 Query Name 未設定為 match_documents。
如果兩者都已對齐,請貼上工作流程,我會幫你找出問題所在。但有 9/10 的機率是插入和查詢時使用的嵌入模型不同。
我覺得我正確設定了 LLM。而且我認為問題確實出在 Supabase,因為當我查看 Supabase 資料庫時,我沒有看到上傳的嵌入向量
@Quent 這樣就縮小範圍了:成功但沒有行記錄代表它們落在你沒有查看的地方。重點是:Supabase Vector Store 節點會忽略表名欄位,總是寫入字面上名為 documents 的表(已知的怪癖)。所以要特別檢查 documents 表,如果你建立或正在檢查一個不同名稱的表,你的行記錄就在 documents 裡。
還要確認 documents 表有快速入門結構(id、content、metadata、embedding vector(N)),維度要與你的嵌入模型相符,如果缺少那一欄,就沒有東西會被保存。
如果你看到 RLS/政策錯誤,改用你的 service_role 金鑰作為憑證(它會略過 RLS)。但還是先檢查 documents 表,通常行記錄都在那裡。
不對,沒有 documents 表。我檢查了儲存空間中的 bucket,但沒有找到它,我也檢查了資料庫中的表,但也沒有找到它
比上傳文本到 Supabase 時更好,我從不會看到 Supabase 節點與嵌入模型的互動
@Quent 那就是原因所在。Supabase Vector Store 節點需要連接一個 Embeddings 子節點到它,就是節點下方那個小小的「Embeddings」端口。如果那裡沒有連接任何東西,節點就沒有模型來將你的文字轉換成向量,所以 insert 存儲的就是沒有用處的內容,這正是為什麼你從來看不到它與 embedding 模型進行互動。
將一個 Embeddings 節點(Embeddings OpenAI,或任何其他提供商)連接到 Vector Store 節點上的那個端口,然後重新執行,你就會看到帶有 embeddings 的列出現在 documents 表格中。稍後有一個需要注意的地方:在查詢端也要使用完全相同的 embeddings 模型,否則檢索將無法匹配。
如果你在 Supabase 中根本看不到 documents 表,那表示該表從未被建立 - n8n 不會自動為你建立它。前往 Supabase > SQL Editor 並執行以下程式碼:
create extension if not exists vector;
create table documents (
id bigserial primary key,
content text,
metadata jsonb,
embedding vector(1536)
);
create index on documents using ivfflat (embedding vector_cosine_ops);
注意:將 1536 改為符合你的嵌入模型的維度(OpenAI text-embedding-3-small = 1536,text-embedding-3-large = 3072)。表格建立後,重新執行你的上傳工作流程,你應該會看到行列出現在 Table Editor 的 documents 表中。
現在我看到了 documents 表,但我看不到該表中的列。當我在工作流表中上傳文本時,它沒有填充我的表。
嘿 @Quent,既然表格存在但仍然沒有任何行,insert 本身可能是在無提示的情況下失敗了。
快速檢查:
在執行後點擊 Vector Store 節點並檢查其實際輸出,工作流程上的綠色勾選標記並不總是意味著該節點真正寫入了資料。
確認它設定為「Insert」模式,而不是「Retrieve」。
嘗試使用 service_role 金鑰而不是 anon,RLS 可能會在沒有可見錯誤的情況下無提示地阻止 insert。
如果這些都沒有顯示任何內容,節點實際執行輸出的螢幕截圖(而不僅僅是畫布)將有助於快速確定問題。
同意 @achamm 的看法,嵌入維度不匹配是目前為止最主要的原因。
如果他的修復方案沒有解決問題,還有兩個值得檢查的地方:
- Supabase 向量欄位維度:當你建立資料表時,
embedding欄位有固定的大小(例如vector(1536))。如果你的嵌入模型輸出不同的大小,插入可能會無聲地失敗,或搜尋會返回沒有結果。在 Supabase SQL 編輯器中執行\d documents來確認維度與你的模型相符。 - 分塊 + top_k:如果你的分塊太大(整個頁面)或
top_k太低(例如 1),檢索器可能會拉取一個實際上不包含答案的分塊。試著用約 500 個令牌的分塊和 top_k = 4-5 開始。
如果在那之後還是失敗的話,請分享你的工作流程!
我已经解决那个问题了。谢谢各位
