PMFlow/backend/app/models/qa_record.py

51 lines
2.8 KiB
Python

"""RAG 问答记录模型。"""
from __future__ import annotations
from typing import Any, Optional
from sqlalchemy import BigInteger, ForeignKey, Integer, Text, VARCHAR
from sqlalchemy.orm import Mapped, mapped_column
from .base import Base
from .types import JSONB
class QARecord(Base):
__tablename__ = "qa_records"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
question: Mapped[str] = mapped_column(Text, nullable=False)
answer: Mapped[str] = mapped_column(Text, nullable=False)
sources: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
intent: Mapped[str] = mapped_column(VARCHAR(20), nullable=False, default="question")
domains_used: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
response_time_ms: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
asked_by: Mapped[Optional[int]] = mapped_column(BigInteger, nullable=True, index=True)
asked_via: Mapped[str] = mapped_column(VARCHAR(20), nullable=False, default="pmflow", index=True)
project_id: Mapped[Optional[int]] = mapped_column(BigInteger, nullable=True, index=True)
session_id: Mapped[Optional[int]] = mapped_column(
Integer,
ForeignKey("qa_sessions.id", ondelete="SET NULL"),
nullable=True,
index=True,
)
turn_index: Mapped[int] = mapped_column(Integer, nullable=False, default=1)
source_message_id: Mapped[Optional[str]] = mapped_column(VARCHAR(128), nullable=True, index=True)
source_chat_id: Mapped[Optional[str]] = mapped_column(VARCHAR(128), nullable=True)
source_sender_open_id: Mapped[Optional[str]] = mapped_column(VARCHAR(128), nullable=True)
reply_to_message_id: Mapped[Optional[str]] = mapped_column(VARCHAR(128), nullable=True)
root_message_id: Mapped[Optional[str]] = mapped_column(VARCHAR(128), nullable=True)
conversation_scope_key: Mapped[Optional[str]] = mapped_column(VARCHAR(160), nullable=True, index=True)
anchor_kind: Mapped[Optional[str]] = mapped_column(VARCHAR(32), nullable=True)
anchor_ref: Mapped[Optional[str]] = mapped_column(VARCHAR(128), nullable=True)
routing_snapshot: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
answer_mode: Mapped[Optional[str]] = mapped_column(VARCHAR(32), nullable=True)
grounding_status: Mapped[Optional[str]] = mapped_column(VARCHAR(32), nullable=True)
policy_version: Mapped[Optional[str]] = mapped_column(VARCHAR(160), nullable=True)
citations: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
sources_used: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
evidence_pack: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
tool_trace: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
retrieval_metrics: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)