chat_attachment.sql 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. -- ============================================================================
  2. -- 对话附件(module/agent/attachment)元数据表
  3. --
  4. -- 落在 **master PG**(与 chat/message 管理表同库)。附件问答三路的登记与归属锚点:
  5. -- A 内联 小文档/小表格 → 提取文本进消息
  6. -- B Python 大表格 → 流式扫描(行数/表头/样本),Agent 用 execute_python 直读文件
  7. -- C RAG 大文档 → sidecar 全文 + 分块向量化(chat_att_vec_{caseId}_d{dims})
  8. --
  9. -- 隔离:user_id/case_id/session_id 三重归属,loadForSession 校验不过即拒绝;
  10. -- 向量侧另按会话过滤(payload 里带 sessionId,检索 SQL 强制 WHERE)。
  11. -- 设计文档:输入框附件问答设计(2026-09)
  12. -- ============================================================================
  13. create table if not exists chat_attachment
  14. (
  15. id bigint primary key,
  16. user_id bigint not null, -- 归属用户(加载校验)
  17. case_id bigint not null, -- 归属案件(加载校验)
  18. session_id bigint not null, -- 归属会话(加载校验 + RAG 检索过滤)
  19. file_name varchar(500) not null, -- 原始文件名(展示用)
  20. file_path varchar(1000) not null, -- 原件落盘路径(路径 B 的 execute_python 读它)
  21. sidecar_path varchar(1000), -- 衍生文本:文档全文 .txt / xlsx 转 .csv
  22. mime varchar(100), -- Tika 探测的 MIME
  23. kind varchar(20) not null, -- DOCUMENT / TABLE / UNSUPPORTED
  24. size_bytes bigint default 0,
  25. char_count integer default 0, -- 提取文本字符数(文档)
  26. row_count integer default 0, -- 数据行数(表格,不含表头)
  27. truncated integer default 0, -- 1=内容已截断(文档内联截断或索引超块数)
  28. inline_text text, -- 路径 A 的内联全文(≤inline-max-chars)
  29. index_blocks integer default 0, -- 路径 C 已向量化块数
  30. index_status varchar(20), -- 路径 C:NONE / READY / FAILED
  31. status varchar(20) not null, -- READY / FAILED
  32. link_message_id bigint, -- 关联的消息 id(发出后回填,孤儿清理依据)
  33. fail_reason varchar(1000),
  34. create_time timestamp default current_timestamp,
  35. update_time timestamp
  36. );
  37. create index if not exists idx_chat_att_session on chat_attachment (session_id);
  38. create index if not exists idx_chat_att_status on chat_attachment (status, link_message_id);