# Task 3.11 Implementation Summary: 知识库领域模型 ## 任务概述 实现知识库领域模型,包括 KnowledgeBase 和 PromptDimension 实体,以及相关的业务逻辑方法。 **任务要求**: - 创建 domain/knowledge_base/entities.py,实现 KnowledgeBase 和 PromptDimension 实体 - 实现实体的业务逻辑方法(如 add_document(), remove_document(), add_tag()) - 满足需求 1.3(领域层架构)和 8.4(知识库模块职责) ## 实现内容 ### 1. 核心实体 (entities.py) #### KnowledgeBase(知识库实体) **属性**: - `id: EntityId` - 唯一标识符 - `name: str` - 知识库名称 - `description: str` - 知识库描述 - `created_at: Timestamp` - 创建时间 - `updated_at: Timestamp` - 最后更新时间 - `tags: Set[str]` - 标签集合(默认为空集合) - `document_ids: List[str]` - 文档 ID 列表(默认为空列表) **业务规则**: - 知识库名称不能为空,不能超过 255 字符 - 文档 ID 不能重复 - 标签不能为空字符串 - 更新操作会自动更新 updated_at 时间戳 - created_at 不能晚于 updated_at **核心方法**: 1. **文档管理**: - `add_document(document_id: str)` - 添加文档到知识库 - `remove_document(document_id: str) -> bool` - 移除文档 - `has_document(document_id: str) -> bool` - 检查是否包含文档 - `document_count() -> int` - 获取文档数量 2. **标签管理**: - `add_tag(tag: str)` - 添加标签 - `remove_tag(tag: str) -> bool` - 移除标签 - `has_tag(tag: str) -> bool` - 检查是否有标签 - `clear_tags()` - 清除所有标签 - `tag_count() -> int` - 获取标签数量 3. **更新操作**: - `update_name(new_name: str)` - 更新名称 - `update_description(new_description: str)` - 更新描述 4. **验证和查询**: - `validate() -> bool` - 验证知识库完整性 - `is_empty() -> bool` - 检查是否为空 #### PromptDimension(提示词维度实体) **属性**: - `id: EntityId` - 唯一标识符 - `name: str` - 维度名称 - `description: str` - 维度描述 - `template: str` - 提示词模板 - `variables: List[str]` - 变量列表(默认为空列表) **业务规则**: - 维度名称不能为空,不能超过 255 字符 - 模板不能为空 - 变量名不能为空字符串 - 变量名不能重复 **核心方法**: 1. **变量管理**: - `add_variable(variable: str)` - 添加变量 - `remove_variable(variable: str) -> bool` - 移除变量 - `has_variable(variable: str) -> bool` - 检查是否包含变量 - `variable_count() -> int` - 获取变量数量 2. **模板操作**: - `update_template(new_template: str)` - 更新模板 - `format(**kwargs) -> str` - 格式化提示词模板 3. **验证**: - `validate() -> bool` - 验证提示词维度完整性 ### 2. 仓储接口 (repositories.py) #### KnowledgeBaseRepository 定义知识库的持久化操作接口: - `save(knowledge_base)` - 保存知识库 - `find_by_id(knowledge_base_id)` - 根据 ID 查找 - `find_by_name(name)` - 根据名称查找 - `find_all()` - 查找所有知识库 - `find_by_tag(tag)` - 根据标签查找 - `find_by_document_id(document_id)` - 根据文档 ID 查找 - `delete(knowledge_base_id)` - 删除知识库 - `exists(knowledge_base_id)` - 检查是否存在 #### PromptDimensionRepository 定义提示词维度的持久化操作接口: - `save(prompt_dimension)` - 保存提示词维度 - `find_by_id(prompt_dimension_id)` - 根据 ID 查找 - `find_by_name(name)` - 根据名称查找 - `find_all()` - 查找所有提示词维度 - `delete(prompt_dimension_id)` - 删除提示词维度 - `exists(prompt_dimension_id)` - 检查是否存在 ### 3. 领域异常 (exceptions.py) 定义了知识库领域特定的异常: - `KnowledgeBaseException` - 知识库异常基类 - `KnowledgeBaseNotFoundException` - 知识库未找到异常 - `PromptDimensionException` - 提示词维度异常基类 - `PromptDimensionNotFoundException` - 提示词维度未找到异常 - `PromptFormattingException` - 提示词格式化异常 ### 4. 文档 (README.md) 创建了完整的模块文档,包括: - 概述和核心实体说明 - 使用示例 - 仓储接口说明 - 异常说明 - 设计原则 - 依赖关系 - 测试指南 ### 5. 模块导出 (__init__.py) 更新了 `__init__.py` 文件,导出核心实体: ```python from src.domain.knowledge_base.entities import KnowledgeBase, PromptDimension __all__ = [ "KnowledgeBase", "PromptDimension", ] ``` ## 设计特点 ### 1. 领域驱动设计(DDD) - **实体封装业务逻辑**:所有业务规则和验证逻辑都封装在实体内部 - **不变量保护**:通过验证方法确保实体始终处于有效状态 - **清晰的职责边界**:实体负责业务逻辑,仓储负责持久化 ### 2. 防御性编程 - **严格的输入验证**:所有公共方法都进行参数验证 - **详细的异常信息**:使用自定义异常提供清晰的错误信息 - **类型安全**:使用类型注解确保类型正确性 ### 3. 不可变性 - 使用共享值对象(EntityId, Timestamp)确保数据一致性 - 时间戳自动更新,确保数据追踪 ### 4. 框架独立 - 领域层不依赖任何外部框架 - 只依赖标准库和共享领域概念 - 易于测试和维护 ## 验证测试 执行了基本功能测试,验证了: 1. **KnowledgeBase 实体**: - 创建知识库 - 添加文档 - 添加标签 - 文档和标签计数 2. **PromptDimension 实体**: - 创建提示词维度 - 格式化模板 - 变量管理 3. **导入验证**: - 所有模块可以正确导入 - 无语法错误 - 无循环依赖 ## 文件清单 创建的文件: 1. `src/domain/knowledge_base/entities.py` - 核心实体实现(约 800 行) 2. `src/domain/knowledge_base/repositories.py` - 仓储接口定义(约 200 行) 3. `src/domain/knowledge_base/exceptions.py` - 领域异常定义(约 150 行) 4. `src/domain/knowledge_base/README.md` - 模块文档(约 300 行) 修改的文件: 1. `src/domain/knowledge_base/__init__.py` - 更新模块导出 ## 符合的需求 ### Requirement 1.3: 领域层架构 ✅ **完全符合**: - 创建了独立的知识库领域模块 - 实体包含核心业务逻辑和规则 - 不依赖外部框架 - 使用共享值对象和异常 ### Requirement 8.4: 知识库模块职责 ✅ **完全符合**: - 将知识库相关代码组织到独立模块 - 定义了清晰的公共接口 - 实现了知识库和提示词维度的管理功能 - 通过仓储接口与其他层交互 ## 后续任务 根据任务列表,下一步应该是: - **Task 3.12**: 编写知识库领域模型单元测试 - 测试 KnowledgeBase 的文档管理 - 测试标签管理 - 测试业务规则(如文档 ID 不重复) ## 使用示例 ```python from src.domain.knowledge_base.entities import KnowledgeBase, PromptDimension from src.domain.shared.value_objects import EntityId, Timestamp # 创建知识库 kb = KnowledgeBase( id=EntityId.generate(), name="Technical Documentation", description="All technical documentation", created_at=Timestamp.now(), updated_at=Timestamp.now() ) # 添加文档和标签 kb.add_document("doc_123") kb.add_document("doc_456") kb.add_tag("important") kb.add_tag("reviewed") # 验证知识库 kb.validate() # 创建提示词维度 prompt = PromptDimension( id=EntityId.generate(), name="Question Answering", description="Template for QA tasks", template="Answer the question: {question} based on context: {context}", variables=["question", "context"] ) # 格式化提示词 result = prompt.format( question="What is Python?", context="Python is a programming language" ) print(result) # 输出: Answer the question: What is Python? based on context: Python is a programming language ``` ## 总结 成功实现了知识库领域模型,包括: - 2 个核心实体(KnowledgeBase, PromptDimension) - 2 个仓储接口 - 5 个领域异常 - 完整的业务逻辑方法 - 详细的文档和注释 实现遵循了领域驱动设计原则,具有清晰的职责边界、严格的验证逻辑和良好的可测试性。所有代码都通过了基本功能测试,可以进入下一阶段的单元测试编写。