From be2feda7e1de17f50a1fb7891799a1b176ab5d4f Mon Sep 17 00:00:00 2001 From: martsforever Date: Wed, 29 Oct 2025 15:58:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AF=B9knowledge=5Fdoc=E5=A2=9E?= =?UTF-8?q?=E5=88=A0=E6=94=B9=E6=97=B6=E6=9B=B4=E6=96=B0=E5=AF=B9=E5=BA=94?= =?UTF-8?q?=E7=9A=84=E6=96=87=E6=A1=A3=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../add_general_interceptor_knowledge_doc.py | 63 +++++++++++++++++++ app/main_app.py | 2 + 2 files changed, 65 insertions(+) create mode 100644 app/general_interceptors/add_general_interceptor_knowledge_doc.py diff --git a/app/general_interceptors/add_general_interceptor_knowledge_doc.py b/app/general_interceptors/add_general_interceptor_knowledge_doc.py new file mode 100644 index 0000000..4312038 --- /dev/null +++ b/app/general_interceptors/add_general_interceptor_knowledge_doc.py @@ -0,0 +1,63 @@ +import asyncio + +from llama_index.core import Document + +from app.general.general_interceptors import GeneralInterceptor, add_general_interceptor +from app.utils.milvus_utils import milvus_service + + +def add_general_interceptor_knowledge_doc(): + # 根据文档的id删除milvus中的文档块 + async def handle_delete_knowledge_doc(id: str): + print(f"handle_delete_knowledge_doc[{id}], 根据文档的id删除milvus中的文档块") + await milvus_service.async_delete(id) + + # 删除文档之后,要删除milvus中的文档块 + async def after_delete(query_config, session, user): + query_config_or_row = query_config + id_or_list = query_config_or_row['id'] + id_list = [id_or_list] if isinstance(id_or_list, str) else id_or_list + await asyncio.gather(*[handle_delete_knowledge_doc(id) for id in id_list]) + + # 创建文档 + def _create_document(row_dict: dict): + print(f"_create_document[{row_dict['id']}], 创建文档") + row_dict = {**row_dict} + text = row_dict['content'] + # 删除metadata中的content属性值,避免将原文内容保存到元信息中 + del row_dict['content'] + return Document( + doc_id=row_dict['id'], + text=text, + metadata=row_dict + ) + + # 新建文档之后,要给对应的文档创建文档块 + async def after_insert(row, session, user): + await milvus_service.async_create_index_from_documents([_create_document(row)]) + + # 批量新建文档之后,要给对应的文档创建文档块 + async def after_batch_insert(rows, session, user): + document_list = [_create_document(row) for row in rows] + await milvus_service.async_create_index_from_documents(document_list) + + # 更新文档之后,要删除对应的文档块,再重新创建 + async def after_update(row, session, user): + await milvus_service.async_delete(row['id']) + await after_insert(row, session, user) + + # 批量更新文档之后,要删除对应的文档块,再重新创建 + async def after_batch_update(rows, session, user): + row_id_list = [row['id'] for row in rows] + await after_delete({'id': row_id_list}, session, user) + await after_batch_insert(rows, session, user) + + # 添加拦截器 + add_general_interceptor(GeneralInterceptor( + module="knowledge_doc", + after_insert=after_insert, + after_batch_insert=after_batch_insert, + after_update=after_update, + after_batch_update=after_batch_update, + after_delete=after_delete, + )) diff --git a/app/main_app.py b/app/main_app.py index 36de3a3..5a444ec 100644 --- a/app/main_app.py +++ b/app/main_app.py @@ -26,6 +26,7 @@ from app.controller.test_sync import add_test_sync_route from app.controller.translate_controller import add_translate_route from app.create_app import create_app from app.general.add_general_route import add_general_route +from app.general_interceptors.add_general_interceptor_knowledge_doc import add_general_interceptor_knowledge_doc from app.general_interceptors.add_general_interceptor_llm_user import add_general_interceptor_llm_user from app.model.ApiSecretModel import ApiSecretService from app.model.ApproveModel import ApproveService @@ -137,3 +138,4 @@ ApiSecretService.add_route(app=app, path="/api_secret") ModuleService.add_route(app=app, path="/module") add_general_interceptor_llm_user() +add_general_interceptor_knowledge_doc()