deepdata: core product code (backend, frontend, runtime, deepflow module)
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
"""
|
||||
策略模式 - 知识库策略基类
|
||||
|
||||
定义知识库检索和处理的抽象接口,支持不同类型的知识库(向量、知识图谱等)。
|
||||
"""
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
|
||||
class KnowledgeBaseStrategy(ABC):
|
||||
"""知识库策略抽象基类
|
||||
|
||||
所有知识库策略(向量、知识图谱等)必须实现此接口。
|
||||
|
||||
接口设计原则:
|
||||
- query(): 直接获取数据,不涉及相似度计算,返回值格式不统一
|
||||
- search(): 基于输入文本的相似度检索,返回值必须统一为 UnifiedSearchResult
|
||||
- process_file(): 处理单个文件,不同策略有不同的处理逻辑
|
||||
"""
|
||||
|
||||
def __init__(self, db: AsyncSession):
|
||||
"""初始化策略
|
||||
|
||||
Args:
|
||||
db: 数据库异步 session
|
||||
"""
|
||||
self.db = db
|
||||
|
||||
@abstractmethod
|
||||
async def query(
|
||||
self,
|
||||
knowledge_base_id: str,
|
||||
**kwargs
|
||||
) -> Any:
|
||||
"""直接查询知识库数据(不涉及相似度计算)
|
||||
|
||||
不同知识库类型的返回格式可以不同:
|
||||
- 向量知识库:返回 PagedResponse[RagChunkResp](分页分块列表)
|
||||
- 知识图谱:返回图谱数据(格式由 LightRAG 定义)
|
||||
|
||||
Args:
|
||||
knowledge_base_id: 知识库 ID
|
||||
**kwargs: 额外参数(如 rag_file_id, paging_query 等)
|
||||
|
||||
Returns:
|
||||
查询结果(格式由具体策略决定)
|
||||
"""
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
async def search(
|
||||
self,
|
||||
query_text: str,
|
||||
knowledge_base_ids: List[str],
|
||||
top_k: int = 10,
|
||||
threshold: Optional[float] = None,
|
||||
**kwargs
|
||||
) -> List[Dict[str, Any]]:
|
||||
"""基于输入文本的相似度检索
|
||||
|
||||
所有知识库类型必须返回统一格式:UnifiedSearchResult
|
||||
|
||||
Args:
|
||||
query_text: 查询文本
|
||||
knowledge_base_ids: 知识库 ID 列表
|
||||
top_k: 返回结果数量
|
||||
threshold: 相似度阈值(可选)
|
||||
**kwargs: 额外参数
|
||||
|
||||
Returns:
|
||||
统一格式的检索结果列表,每个元素包含:
|
||||
- id: 结果 ID
|
||||
- text: 文本内容
|
||||
- score: 相似度分数
|
||||
- metadata: 元数据字典
|
||||
- resultType: 结果类型("vector" 或 "graph")
|
||||
- knowledgeBaseId: 知识库 ID
|
||||
- knowledgeBaseName: 知识库名称
|
||||
"""
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
async def process_file(
|
||||
self,
|
||||
knowledge_base_id: str,
|
||||
rag_file_id: str,
|
||||
**kwargs
|
||||
) -> None:
|
||||
"""处理单个文件
|
||||
|
||||
不同知识库类型有不同的处理逻辑:
|
||||
- 向量知识库:文档分块 -> 向量化 -> 存储到 Milvus
|
||||
- 知识图谱:文档分块 -> 构建知识图谱 -> 存储到 LightRAG
|
||||
|
||||
Args:
|
||||
knowledge_base_id: 知识库 ID
|
||||
rag_file_id: RAG 文件 ID
|
||||
**kwargs: 额外参数(如 process_type, chunk_size 等)
|
||||
|
||||
Raises:
|
||||
BusinessError: 处理失败时抛出
|
||||
"""
|
||||
pass
|
||||
Reference in New Issue
Block a user