55 lines
2.2 KiB
Python
55 lines
2.2 KiB
Python
"""
|
||
知识库模型 — SQLModel
|
||
对应 knowledge_items 和 knowledge_embeddings 两张表
|
||
embedding 字段使用 pgvector.Vector(对应 PG vector(1536))
|
||
"""
|
||
|
||
from datetime import datetime, date
|
||
from typing import Optional, Any
|
||
|
||
from sqlalchemy import Column, DateTime as SADateTime, Text, Integer
|
||
from sqlalchemy.dialects.postgresql import JSONB
|
||
from sqlalchemy.sql import func as sa_func
|
||
from sqlmodel import Field, SQLModel
|
||
|
||
from pgvector.sqlalchemy import Vector
|
||
|
||
|
||
class KnowledgeItem(SQLModel, table=True):
|
||
"""知识库条目(knowledge_items)"""
|
||
__tablename__ = "knowledge_items"
|
||
|
||
id: Optional[int] = Field(default=None, primary_key=True)
|
||
title: str = Field(max_length=300)
|
||
content_md: Optional[str] = Field(default=None)
|
||
source_type: str = Field(default="manual", max_length=30)
|
||
source_file_name: Optional[str] = Field(default=None, max_length=300)
|
||
source_url: Optional[str] = Field(default=None, max_length=1000)
|
||
author: Optional[str] = Field(default=None, max_length=100)
|
||
publish_date: Optional[date] = Field(default=None)
|
||
tags: Any = Field(default=None, sa_column=Column(JSONB, default=[]))
|
||
related_entities: Any = Field(default=None, sa_column=Column(JSONB, default=[]))
|
||
related_concepts: Any = Field(default=None, sa_column=Column(JSONB, default=[]))
|
||
created_at: datetime | None = Field(
|
||
default=None,
|
||
sa_column=Column(SADateTime(timezone=True), nullable=False, server_default=sa_func.now()),
|
||
)
|
||
updated_at: datetime | None = Field(
|
||
default=None,
|
||
sa_column=Column(SADateTime(timezone=True), nullable=False, server_default=sa_func.now()),
|
||
)
|
||
|
||
|
||
class KnowledgeEmbedding(SQLModel, table=True):
|
||
"""知识库向量(knowledge_embeddings)"""
|
||
__tablename__ = "knowledge_embeddings"
|
||
|
||
id: Optional[int] = Field(default=None, primary_key=True)
|
||
knowledge_id: int = Field(foreign_key="knowledge_items.id", index=True)
|
||
chunk_index: int = Field(default=0)
|
||
chunk_text: str = Field(sa_column=Column(Text, nullable=False))
|
||
embedding: Any = Field(sa_column=Column(Vector(1536), nullable=False))
|
||
created_at: datetime | None = Field(
|
||
default=None,
|
||
sa_column=Column(SADateTime(timezone=True), nullable=False, server_default=sa_func.now()),
|
||
) |