48 lines
2.1 KiB
Python
48 lines
2.1 KiB
Python
"""
|
||
知识库分段模型
|
||
"""
|
||
from sqlalchemy import Column, String, Text, Integer, Boolean, JSON, Index
|
||
|
||
from app.base_model import BaseModel
|
||
|
||
|
||
class KnowledgeSegment(BaseModel):
|
||
"""
|
||
知识库分段(Chunk)
|
||
|
||
文档经过分块后的最小检索单元
|
||
向量数据存储在 Qdrant 向量数据库中,此表只存业务数据
|
||
"""
|
||
__tablename__ = "ai_knowledge_segment"
|
||
|
||
knowledge_base_id = Column(String(21), nullable=False, index=True, comment="所属知识库ID(逻辑外键关联ai_knowledge_base)")
|
||
document_id = Column(String(21), nullable=False, index=True, comment="所属文档ID(逻辑外键关联ai_knowledge_document)")
|
||
|
||
# 内容
|
||
position = Column(Integer, default=0, comment="在文档中的位置序号")
|
||
content = Column(Text, nullable=False, comment="分段文本内容")
|
||
answer = Column(Text, nullable=True, comment="Q&A 模式的答案内容")
|
||
token_count = Column(Integer, default=0, comment="Token 数")
|
||
char_count = Column(Integer, default=0, comment="字符数")
|
||
word_count = Column(Integer, default=0, comment="词数")
|
||
|
||
# 元数据
|
||
page_number = Column(Integer, nullable=True, comment="来源页码(PDF/PPT)")
|
||
keywords = Column(JSON, nullable=True, comment="关键词列表(用于全文检索增强)")
|
||
extra_metadata = Column(JSON, nullable=True, comment="元数据(标题/来源等)")
|
||
|
||
# 向量化状态(向量数据存在 Qdrant 中,这里只记录状态)
|
||
embedding_status = Column(String(20), default="pending", comment="向量化状态: pending/completed/failed")
|
||
|
||
# 父子分段(Small-to-Big)
|
||
parent_segment_id = Column(String(21), nullable=True, index=True, comment="父分段ID(逻辑外键,用于 Small-to-Big 检索)")
|
||
|
||
# 状态
|
||
enabled = Column(Boolean, default=True, comment="是否启用(禁用后不参与检索)")
|
||
hit_count = Column(Integer, default=0, comment="命中次数")
|
||
|
||
__table_args__ = (
|
||
Index('idx_segment_kb_doc', 'knowledge_base_id', 'document_id'),
|
||
Index('idx_segment_kb_enabled', 'knowledge_base_id', 'enabled'),
|
||
)
|