feat(backend): knowledge iteration + vision + neo4j + response contract source
dependencies.py 拆分为 dependencies/ 包; 新增 vision/ragflow_ingestion/neo4j 客户端与 h5_ai_task; alembic 045 图置信度迁移; 响应契约统一收尾。
This commit is contained in:
@@ -0,0 +1,140 @@
|
||||
"""add graph/confidence/audience fields to knowledge_suggestions and knowledge_base
|
||||
|
||||
扩充 KnowledgeSuggestion 12 个字段(confidence/audience/issue/action/relation_type/
|
||||
parent_issue/graph_meta/graph_sync_status/source_failed/queued_at/applied_at)和
|
||||
KnowledgeBase 2 个字段(graph_sync_status/graph_node_uuid)。
|
||||
|
||||
关联设计文档:增量设计-知识库迭代与痛点缓解 §2.1
|
||||
|
||||
Revision ID: 045_graph_confidence_audience
|
||||
Revises: 044_automation
|
||||
Create Date: 2026-07-11
|
||||
|
||||
"""
|
||||
from typing import Sequence, Union
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = '045_graph_confidence_audience'
|
||||
down_revision: Union[str, None] = '044_automation'
|
||||
branch_labels: Union[str, Sequence[str], None] = None
|
||||
depends_on: Union[str, Sequence[str], None] = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
# --------------------------------------------------------------------------
|
||||
# 1. knowledge_suggestions 表 — 新增 12 个字段
|
||||
# --------------------------------------------------------------------------
|
||||
op.add_column(
|
||||
'knowledge_suggestions',
|
||||
sa.Column('confidence', sa.Float(), nullable=True,
|
||||
comment='AI 生成置信度(0.0-1.0)'),
|
||||
)
|
||||
op.add_column(
|
||||
'knowledge_suggestions',
|
||||
sa.Column('audience', sa.String(30), nullable=True,
|
||||
comment='受众类型:employee_quick_reply / engineer_workguide'),
|
||||
)
|
||||
op.add_column(
|
||||
'knowledge_suggestions',
|
||||
sa.Column('issue', sa.String(256), nullable=True,
|
||||
comment='图节点:问题名称(对应 Neo4j Issue.name)'),
|
||||
)
|
||||
op.add_column(
|
||||
'knowledge_suggestions',
|
||||
sa.Column('action', sa.String(256), nullable=True,
|
||||
comment='图节点:动作名称(对应 Neo4j Action.name)'),
|
||||
)
|
||||
op.add_column(
|
||||
'knowledge_suggestions',
|
||||
sa.Column('relation_type', sa.String(30), nullable=True,
|
||||
comment='图关系类型:LEADS_TO / RELATES_TO / CAN_JUMP_TO'),
|
||||
)
|
||||
op.add_column(
|
||||
'knowledge_suggestions',
|
||||
sa.Column('parent_issue', sa.String(256), nullable=True,
|
||||
comment='父 Issue 名称(用于图关系构建)'),
|
||||
)
|
||||
op.add_column(
|
||||
'knowledge_suggestions',
|
||||
sa.Column('graph_meta', sa.JSON(), nullable=True,
|
||||
comment='图结构扩展元数据(JSON)'),
|
||||
)
|
||||
op.add_column(
|
||||
'knowledge_suggestions',
|
||||
sa.Column('graph_sync_status', sa.String(20), nullable=False,
|
||||
server_default='pending',
|
||||
comment='图同步状态:pending / synced / failed'),
|
||||
)
|
||||
op.add_column(
|
||||
'knowledge_suggestions',
|
||||
sa.Column('source_failed', sa.Boolean(), nullable=False,
|
||||
server_default=sa.text('false'),
|
||||
comment='AI 生成失败标记(Dify 不可用或置信度不足)'),
|
||||
)
|
||||
op.add_column(
|
||||
'knowledge_suggestions',
|
||||
sa.Column('queued_at', sa.DateTime(timezone=True), nullable=True,
|
||||
comment='入队列时间'),
|
||||
)
|
||||
op.add_column(
|
||||
'knowledge_suggestions',
|
||||
sa.Column('applied_at', sa.DateTime(timezone=True), nullable=True,
|
||||
comment='应用到 KB 的时间'),
|
||||
)
|
||||
|
||||
# 新增索引
|
||||
op.create_index(
|
||||
'idx_suggestion_audience', 'knowledge_suggestions', ['audience'],
|
||||
)
|
||||
op.create_index(
|
||||
'idx_suggestion_confidence', 'knowledge_suggestions', ['confidence'],
|
||||
)
|
||||
op.create_index(
|
||||
'idx_suggestion_graph_sync', 'knowledge_suggestions', ['graph_sync_status'],
|
||||
)
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# 2. knowledge_base 表 — 新增 2 个字段
|
||||
# --------------------------------------------------------------------------
|
||||
op.add_column(
|
||||
'knowledge_base',
|
||||
sa.Column('graph_sync_status', sa.String(20), nullable=False,
|
||||
server_default='pending',
|
||||
comment='图同步状态:pending / synced / failed'),
|
||||
)
|
||||
op.add_column(
|
||||
'knowledge_base',
|
||||
sa.Column('graph_node_uuid', sa.String(36), nullable=True,
|
||||
comment='关联 Neo4j Issue 节点的 uuid'),
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
# --------------------------------------------------------------------------
|
||||
# 回滚 knowledge_suggestions
|
||||
# --------------------------------------------------------------------------
|
||||
op.drop_index('idx_suggestion_graph_sync', table_name='knowledge_suggestions')
|
||||
op.drop_index('idx_suggestion_confidence', table_name='knowledge_suggestions')
|
||||
op.drop_index('idx_suggestion_audience', table_name='knowledge_suggestions')
|
||||
|
||||
op.drop_column('knowledge_suggestions', 'applied_at')
|
||||
op.drop_column('knowledge_suggestions', 'queued_at')
|
||||
op.drop_column('knowledge_suggestions', 'source_failed')
|
||||
op.drop_column('knowledge_suggestions', 'graph_sync_status')
|
||||
op.drop_column('knowledge_suggestions', 'graph_meta')
|
||||
op.drop_column('knowledge_suggestions', 'parent_issue')
|
||||
op.drop_column('knowledge_suggestions', 'relation_type')
|
||||
op.drop_column('knowledge_suggestions', 'action')
|
||||
op.drop_column('knowledge_suggestions', 'issue')
|
||||
op.drop_column('knowledge_suggestions', 'audience')
|
||||
op.drop_column('knowledge_suggestions', 'confidence')
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# 回滚 knowledge_base
|
||||
# --------------------------------------------------------------------------
|
||||
op.drop_column('knowledge_base', 'graph_node_uuid')
|
||||
op.drop_column('knowledge_base', 'graph_sync_status')
|
||||
Reference in New Issue
Block a user