From 6150fc0dd27fda30e69cdb837b5bd9136be8eb21 Mon Sep 17 00:00:00 2001 From: MerCry Date: Thu, 26 Feb 2026 12:39:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DRAG=E6=A3=80=E7=B4=A2?= =?UTF-8?q?=E6=97=A0=E7=BB=93=E6=9E=9C=E9=97=AE=E9=A2=98-=E5=90=91?= =?UTF-8?q?=E9=87=8F=E5=AD=98=E5=82=A8=E6=A0=BC=E5=BC=8F=E4=B8=8E=E6=A3=80?= =?UTF-8?q?=E7=B4=A2=E6=A0=BC=E5=BC=8F=E4=B8=8D=E5=8C=B9=E9=85=8D=20[AC-AI?= =?UTF-8?q?SVC-50]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ai-service/app/api/admin/kb.py | 38 +++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/ai-service/app/api/admin/kb.py b/ai-service/app/api/admin/kb.py index e150d72..e185e0e 100644 --- a/ai-service/app/api/admin/kb.py +++ b/ai-service/app/api/admin/kb.py @@ -442,13 +442,15 @@ async def _index_document(tenant_id: str, job_id: str, doc_id: str, content: byt logger.info(f"[INDEX] Total chunks: {len(all_chunks)}") qdrant = await get_qdrant_client() - await qdrant.ensure_collection_exists(tenant_id) + await qdrant.ensure_collection_exists(tenant_id, use_multi_vector=True) + + from app.services.embedding.nomic_provider import NomicEmbeddingProvider + use_multi_vector = isinstance(embedding_provider, NomicEmbeddingProvider) + logger.info(f"[INDEX] Using multi-vector format: {use_multi_vector}") points = [] total_chunks = len(all_chunks) for i, chunk in enumerate(all_chunks): - embedding = await embedding_provider.embed(chunk.text) - payload = { "text": chunk.text, "source": doc_id, @@ -461,13 +463,26 @@ async def _index_document(tenant_id: str, job_id: str, doc_id: str, content: byt if chunk.source: payload["filename"] = chunk.source - points.append( - PointStruct( - id=str(uuid.uuid4()), - vector=embedding, - payload=payload, + if use_multi_vector: + embedding_result = await embedding_provider.embed_document(chunk.text) + points.append({ + "id": str(uuid.uuid4()), + "vector": { + "full": embedding_result.embedding_full, + "dim_256": embedding_result.embedding_256, + "dim_512": embedding_result.embedding_512, + }, + "payload": payload, + }) + else: + embedding = await embedding_provider.embed(chunk.text) + points.append( + PointStruct( + id=str(uuid.uuid4()), + vector=embedding, + payload=payload, + ) ) - ) progress = 20 + int((i + 1) / total_chunks * 70) if i % 10 == 0 or i == total_chunks - 1: @@ -478,7 +493,10 @@ async def _index_document(tenant_id: str, job_id: str, doc_id: str, content: byt if points: logger.info(f"[INDEX] Upserting {len(points)} vectors to Qdrant...") - await qdrant.upsert_vectors(tenant_id, points) + if use_multi_vector: + await qdrant.upsert_multi_vector(tenant_id, points) + else: + await qdrant.upsert_vectors(tenant_id, points) await kb_service.update_job_status( tenant_id, job_id, IndexJobStatus.COMPLETED.value, progress=100