ForcePilot/backend/package/yuxi/storage/postgres/models_knowledge.py
Wenjie Zhang e3c5f41c7c refactor: 知识库重新设计
- 默认的知识库类型新增图谱抽取能力
- 移除 LightRAG 以及原有的知识图谱支持
- 移除所有兼容性的代码
2026-05-26 17:39:12 +08:00

169 lines
6.6 KiB
Python

"""PostgreSQL 知识库模型 - KnowledgeBase、KnowledgeFile、评估相关表"""
from sqlalchemy import (
JSON,
BigInteger,
Boolean,
Column,
DateTime,
Float,
ForeignKey,
Index,
Integer,
String,
Text,
UniqueConstraint,
)
from sqlalchemy.dialects.postgresql import JSONB
from yuxi.storage.postgres.models_business import Base
from yuxi.utils.datetime_utils import utc_now_naive
JSON_VALUE = JSON().with_variant(JSONB, "postgresql")
class KnowledgeBase(Base):
"""知识库模型"""
__tablename__ = "knowledge_bases"
__table_args__ = (UniqueConstraint("db_id", name="uq_knowledge_bases_db_id"),)
id = Column(Integer, primary_key=True, autoincrement=True)
db_id = Column(String(80), unique=True, nullable=False, index=True)
name = Column(String(255), nullable=False, index=True)
description = Column(Text)
kb_type = Column(String(32), nullable=False, index=True)
embedding_model_spec = Column(String(512))
llm_model_spec = Column(String(512))
query_params = Column(JSON_VALUE)
additional_params = Column(JSON_VALUE)
share_config = Column(JSON_VALUE)
mindmap = Column(JSON_VALUE)
sample_questions = Column(JSON_VALUE)
created_at = Column(DateTime(timezone=True), default=utc_now_naive)
updated_at = Column(DateTime(timezone=True), default=utc_now_naive, onupdate=utc_now_naive)
class KnowledgeFile(Base):
"""知识文件模型"""
__tablename__ = "knowledge_files"
__table_args__ = (UniqueConstraint("file_id", name="uq_knowledge_files_file_id"),)
id = Column(Integer, primary_key=True, autoincrement=True)
file_id = Column(String(64), unique=True, nullable=False, index=True)
db_id = Column(String(80), ForeignKey("knowledge_bases.db_id", ondelete="CASCADE"), nullable=False, index=True)
parent_id = Column(String(64), ForeignKey("knowledge_files.file_id", ondelete="SET NULL"), index=True)
filename = Column(String(512), nullable=False)
original_filename = Column(String(512))
file_type = Column(String(64))
path = Column(String(1024))
minio_url = Column(String(1024))
markdown_file = Column(String(1024))
status = Column(String(32), default="uploaded", index=True)
content_hash = Column(String(128), index=True)
file_size = Column(BigInteger)
content_type = Column(String(64))
processing_params = Column(JSON_VALUE)
is_folder = Column(Boolean, default=False)
error_message = Column(Text)
created_by = Column(String(64))
updated_by = Column(String(64))
created_at = Column(DateTime(timezone=True), default=utc_now_naive)
updated_at = Column(DateTime(timezone=True), default=utc_now_naive, onupdate=utc_now_naive)
class KnowledgeChunk(Base):
"""知识库 Chunk 模型"""
__tablename__ = "knowledge_chunks"
__table_args__ = (
UniqueConstraint("chunk_id", name="uq_knowledge_chunks_chunk_id"),
Index("ix_knowledge_chunks_file_id", "file_id"),
Index("ix_knowledge_chunks_db_id", "db_id"),
Index("ix_knowledge_chunks_graph_indexed", "graph_indexed"),
)
id = Column(Integer, primary_key=True, autoincrement=True)
chunk_id = Column(String(128), nullable=False)
file_id = Column(String(64), ForeignKey("knowledge_files.file_id", ondelete="CASCADE"), nullable=False)
db_id = Column(String(80), ForeignKey("knowledge_bases.db_id", ondelete="CASCADE"), nullable=False)
chunk_index = Column(Integer, nullable=False)
content = Column(Text, nullable=False)
start_char_pos = Column(Integer)
end_char_pos = Column(Integer)
start_token_pos = Column(Integer)
end_token_pos = Column(Integer)
graph_indexed = Column(Boolean, default=False)
ent_ids = Column(JSON_VALUE)
tags = Column(JSON_VALUE)
extraction_result = Column(JSON_VALUE)
created_at = Column(DateTime(timezone=True), default=utc_now_naive)
updated_at = Column(DateTime(timezone=True), default=utc_now_naive, onupdate=utc_now_naive)
class EvaluationBenchmark(Base):
"""评估基准模型"""
__tablename__ = "evaluation_benchmarks"
__table_args__ = (UniqueConstraint("benchmark_id", name="uq_evaluation_benchmarks_benchmark_id"),)
id = Column(Integer, primary_key=True, autoincrement=True)
benchmark_id = Column(String(64), unique=True, nullable=False, index=True)
db_id = Column(String(80), ForeignKey("knowledge_bases.db_id", ondelete="CASCADE"), nullable=False, index=True)
name = Column(String(255), nullable=False)
description = Column(Text)
question_count = Column(Integer, default=0)
has_gold_chunks = Column(Boolean, default=False)
has_gold_answers = Column(Boolean, default=False)
data_file_path = Column(String(1024))
created_by = Column(String(64))
created_at = Column(DateTime(timezone=True), default=utc_now_naive)
updated_at = Column(DateTime(timezone=True), default=utc_now_naive, onupdate=utc_now_naive)
class EvaluationResult(Base):
"""评估结果模型"""
__tablename__ = "evaluation_results"
__table_args__ = (UniqueConstraint("task_id", name="uq_evaluation_results_task_id"),)
id = Column(Integer, primary_key=True, autoincrement=True)
task_id = Column(String(64), unique=True, nullable=False, index=True)
db_id = Column(String(80), ForeignKey("knowledge_bases.db_id", ondelete="CASCADE"), nullable=False, index=True)
benchmark_id = Column(
String(64),
ForeignKey("evaluation_benchmarks.benchmark_id", ondelete="SET NULL"),
index=True,
)
status = Column(String(32), default="running", index=True)
retrieval_config = Column(JSON_VALUE)
metrics = Column(JSON_VALUE)
overall_score = Column(Float)
total_questions = Column(Integer, default=0)
completed_questions = Column(Integer, default=0)
started_at = Column(DateTime(timezone=True), default=utc_now_naive, index=True)
completed_at = Column(DateTime(timezone=True))
created_by = Column(String(64))
class EvaluationResultDetail(Base):
"""评估结果详情模型"""
__tablename__ = "evaluation_result_details"
__table_args__ = (UniqueConstraint("task_id", "query_index", name="uq_evaluation_result_details_task_query"),)
id = Column(Integer, primary_key=True, autoincrement=True)
task_id = Column(
String(64),
ForeignKey("evaluation_results.task_id", ondelete="CASCADE"),
nullable=False,
index=True,
)
query_index = Column(Integer, nullable=False)
query_text = Column(Text, nullable=False)
gold_chunk_ids = Column(JSON_VALUE)
gold_answer = Column(Text)
generated_answer = Column(Text)
retrieved_chunks = Column(JSON_VALUE)
metrics = Column(JSON_VALUE)