TASK_3.11_IMPLEMENTATION_SUMMARY.md 8.2 KB

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 文件,导出核心实体:

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 不重复)

使用示例

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 个领域异常
  • 完整的业务逻辑方法
  • 详细的文档和注释

实现遵循了领域驱动设计原则,具有清晰的职责边界、严格的验证逻辑和良好的可测试性。所有代码都通过了基本功能测试,可以进入下一阶段的单元测试编写。