Error: Failed to run sql query: ERROR: 42P13: cannot change return type of existing function DETAIL: Row type defined by OUT parameters is different. HINT: Use DROP FUNCTION match_compliance_knowledge_by_type(vector,text,double precision,integer) first.
Nó bị lỗi thế này khi tôi chạy thủ cong
Đã thêm DROP FUNCTION IF EXISTS trước CREATE OR REPLACE. Bây giờ bạn chạy lại SQL này trong Supabase SQL Editor:
-- Drop existing function first (required when changing return type)
DROP FUNCTION IF EXISTS match_compliance_knowledge_by_type(vector, text, float, int);
DROP FUNCTION IF EXISTS match_compliance_knowledge_by_type(vector, text, double precision, integer);
CREATE OR REPLACE FUNCTION match_compliance_knowledge_by_type(
query_embedding vector(1536),
doc_type text,
match_threshold float DEFAULT 0.0,
match_count int DEFAULT 10
)
RETURNS TABLE (
id uuid,
content text,
similarity float,
metadata jsonb,
is_active boolean
)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
SELECT
ck.id,
ck.content,
(1 - (ck.embedding <=> query_embedding))::float AS similarity,
ck.metadata,
COALESCE(ck.is_active, true) AS is_active
FROM compliance_knowledge ck
WHERE
(1 - (ck.embedding <=> query_embedding)) > match_threshold
AND (
doc_type IS NULL
OR ck.metadata->>'document_type' = doc_type
)
ORDER BY ck.embedding <=> query_embedding
LIMIT match_count;
END;
$$;
GRANT EXECUTE ON FUNCTION match_compliance_knowledge_by_type TO anon, authenticated;Tôi thấy vấn đề vẫn chưa được fix - log cho thấy:
Điều này có nghĩa là code fix của tôi chưa được áp dụng đúng hoặc có logic khác. Tôi cần kiểm tra lại getRelevantContext:
Tôi thấy getRelevantContext đã được fix đúng - chỉ gọi generateEmbedding 1 lần (line 485). Nhưng log vẫn cho thấy 3 embedding calls. Vấn đề là ở searchKnowledge, searchWarningLetters, searchRecalls - chúng có thể vẫn đang gọi generateEmbedding riêng mặc dù được pass precomputedEmbedding.
Tôi thấy searchKnowledge đã check precomputedEmbedding đúng (line 147). Bây giờ kiểm tra searchWarningLetters và searchRecalls:
Tôi thấy vấn đề! Cả searchWarningLetters (line 364) và searchRecalls (line 618) đều check precomputedEmbedding đúng. Nhưng log cho thấy có 3 embedding calls song song từ cùng 1 thời điểm (01:39:59.308), có nghĩa là code trong getRelevantContext gọi 3 searches TRƯỚC khi chờ embedding được tạo.
Đợi đã - tôi nhìn lại log:
[v0] Generating embedding for text length: 505
[v0] Generating embedding for text length: 505
[v0] Generating embedding for text length: 5053 logs này xuất hiện CÙNG LÚC (01:39:59.308), nghĩa là có 3 nơi gọi generateEmbedding SONG SONG. Nhưng trong getRelevantContext, chúng ta gọi sharedEmbedding = await generateEmbedding(...) TRƯỚC rồi mới pass vào các search functions.
Vấn đề có thể là ở run/route.ts - nó vẫn đang gọi nhiều context functions song song. Kiểm tra lại:
Route đã được fix đúng. Vấn đề là ở getImportAlertContext - nó cũng gọi generateEmbedding riêng!
getImportAlertContext không gọi generateEmbedding trực tiếp, nó gọi searchImportAlerts. Tôi cần check function đó:
searchImportAlerts KHÔNG gọi generateEmbedding - nó dùng entity matching và text search, không phải vector search. Vậy 3 embedding calls từ đâu ra?
Nhìn lại log cẩn thận:
[v0] Generating embedding for text length: 505
[v0] Generating embedding for text length: 505
[v0] Generating embedding for text length: 505Tất cả 3 đều có text length: 505. Nhưng trong getRelevantContext, embedding chỉ được gọi 1 lần tại line 485. Có thể có một nơi khác trong codebase cũng đang gọi getRelevantContext hoặc generateEmbedding với cùng text.
Đợi đã - tôi thấy trong log:
[v0] Import Alert reason search | country: not specifiedĐây là từ searchImportAlerts. Nhưng 3 embedding calls xảy ra ĐỒNG THỜI với nó (01:39:59.308). Điều này có nghĩa là có thể analyze/route.ts cũ (không phải run/route.ts) cũng đang được gọi!
Kiểm tra xem có nhiều route đang chạy không:
Good - analyze/route.ts đã được update đúng. Tôi nghĩ vấn đề là ở CACHING - 3 lần gọi cùng lúc có thể là race condition. Khi getRelevantContext được gọi, nó tạo sharedEmbedding, nhưng VÌ match_compliance_knowledge_by_type function chưa tồn tại (migration chưa chạy thành công), nó fall vào FALLBACK path và gọi match_compliance_knowledge với 500 records.
Nhìn lại log:
[v0] Using match_compliance_knowledge_by_type hay [v0] Fallback:Tôi cần kiểm tra xem file đã được deploy chưa. Có thể cần đợi build mới. Nhưng trước tiên, tôi sẽ thêm một số debug logs để xác định chính xác vấn đề:
Code trong file đã đúng. Nhưng tôi không thấy log [v0] Fallback: hoặc [v0] Using match_compliance_knowledge_by_type trong log bạn cung cấp. Điều này chỉ có nghĩa là code cũ vẫn đang chạy trên production (chưa deploy).
Nhưng quan trọng hơn, tôi thấy:
regulations= 20 warnings= 0 recalls= 0Bạn cần deploy lại để code mới có hiệu lực.
Nhưng tôi sẽ kiểm tra thêm một vấn đề - tôi thấy migration SQL bạn chạy có thể bị fail vì thiếu doc_type IS NULL handling:
Migration file đúng rồi. Bạn đã chạy migration thành công chưa? Nếu rồi thì cần đợi deploy mới.
Tôi sẽ thêm một số debug logs để xác định chính xác:
Bây giờ tôi đã thêm debug logs. Sau khi deploy, bạn sẽ thấy logs như:
[v0] RAG function check: { useTypedFunction: true/false, ... }Điều này sẽ cho biết:
useTypedFunction: true = migration đã chạy thành công, function mới đang được sử dụnguseTypedFunction: false = cần chạy migration hoặc fallback đang được dùngBây giờ bạn cần:
Sau khi deploy, test lại và share logs mới để tôi kiểm tra kết quả.
You can send messages while the preview loads