From da86e7d670635ad7c94f0f9decb793d1e3fefc40 Mon Sep 17 00:00:00 2001 From: Fam Zheng Date: Tue, 4 Nov 2025 21:55:53 +0000 Subject: [PATCH] add knowledge-base-search api --- api/products/views.py | 120 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/api/products/views.py b/api/products/views.py index 7e4bf54..cf687e3 100644 --- a/api/products/views.py +++ b/api/products/views.py @@ -2016,4 +2016,124 @@ class AIChatView(BaseView): message_type=message_type, text_content=content ) + + +class KnowledgeBaseSearchView(BaseView): + """知识库搜索API - 直接检索知识库内容""" + name = 'knowledge-base-search' + auth_check = None + + def post(self, request): + """搜索知识库""" + try: + # 获取请求参数 + query = request.data.get('query') + max_results = request.data.get('max_results', 5) + tenant_id = request.data.get('tenant_id') + + # 验证必需参数 + if not query: + return JsonResponse({ + 'error': 'query is required' + }, status=400) + + # 验证 max_results + if not isinstance(max_results, int) or max_results < 1 or max_results > 20: + return JsonResponse({ + 'error': 'max_results must be an integer between 1 and 20' + }, status=400) + + # 导入 RAG 服务 + try: + from .rag_service import CachedLangChainRAG + except ImportError as e: + return JsonResponse({ + 'error': f'RAG service not available: {str(e)}' + }, status=500) + + # 创建 RAG 服务实例 + try: + rag_service = CachedLangChainRAG() + except Exception as e: + return JsonResponse({ + 'error': f'Failed to initialize RAG service: {str(e)}' + }, status=500) + + # 执行搜索 + try: + results = rag_service.search( + query=query, + max_results=max_results, + tenant_id=tenant_id + ) + + return JsonResponse({ + 'query': query, + 'max_results': max_results, + 'tenant_id': tenant_id, + 'results': results, + 'count': len(results) + }) + + except Exception as e: + import traceback + traceback.print_exc() + return JsonResponse({ + 'error': f'Search failed: {str(e)}' + }, status=500) + + except Exception as e: + import traceback + traceback.print_exc() + return JsonResponse({ + 'error': f'Request processing failed: {str(e)}' + }, status=500) + + def get(self, request): + """获取知识库搜索使用说明""" + return JsonResponse({ + 'name': 'Knowledge Base Search API', + 'description': 'Search the knowledge base for relevant information', + 'method': 'POST', + 'parameters': { + 'query': { + 'type': 'string', + 'required': True, + 'description': 'The search query' + }, + 'max_results': { + 'type': 'integer', + 'required': False, + 'default': 5, + 'range': '1-20', + 'description': 'Maximum number of results to return' + }, + 'tenant_id': { + 'type': 'integer', + 'required': False, + 'description': 'Tenant ID for tenant-specific search' + } + }, + 'response': { + 'query': 'The search query', + 'max_results': 'Maximum results requested', + 'tenant_id': 'Tenant ID (if provided)', + 'results': [ + { + 'article_id': 'Article ID', + 'title': 'Article title', + 'content': 'Relevant content snippet', + 'score': 'Relevance score', + 'metadata': 'Additional metadata' + } + ], + 'count': 'Number of results returned' + }, + 'example': { + 'request': { + 'query': '支持多语言吗', + 'max_results': 3 + } + } + })