P1 LightAIP — 分析智能平台
对标 Palantir AIP:以自然语言与数据深度交互(NLQ 智能查数)。核心资产是 LLM 网关 + NLQ 链路(五路召回 + RLS/CLS 注入 + 会话记忆)+ 知识域(实体抽取/证据链/语义标注/多格式解析)+ 审计。服务端口 18080。
NLQ 五路召回 + 安全注入
决策证据链 / 实体抽取
语义标注 / 分层知识树
会话记忆 / 通知中心
TOTP 双因子
NLQ 最小链路(五步)
products/aip/nlq/ 实现从自然语言到图表的完整链路(nlq.Orchestrator 编排):
用户自然语言提问
│
▼ ① intent(意图识别) IntentRecognitionService —— 判定意图类型(如 data_query,附 confidence)
▼ ② rag(上下文检索) RAGService —— 关键词/向量检索相关表列语义上下文
│ V5 五通道加权:metadata 0.35 / knowledge 0.25 / history 0.15
│ / fewshot 0.15 / entity 0.10(实体抽取成果接入,旧库四通道自动补种)
▼ ②.5 security(v5 安全注入) security.ApplyRLS/ApplyCLS —— 执行前注入行级/列级安全,失败拒绝执行
▼ ②.6 memory(v5 会话记忆) ConversationMemory —— 组装 prompt 前注入记忆上下文(最近 6 轮原文+旧轮摘要),
│ 查询成功回写本轮对话(失败轮次不写)
▼ ③ text2sql(SQL 生成) Text2SQLService —— 经 LLM 网关(deepseek-v4-flash)生成 SQL
▼ ④ query_executor(执行) QueryExecutorService —— 经 ConnectorCache 在真实数据源执行
▼ ⑤ visualization(图表推荐) VisualizationService —— 按结果形状推荐 chart_type
▼
返回 { sql, rows, chart_type, intent, confidence } 并写审计 NLQ_QUERY
实测示例(冒烟 smoke_aip)
提问 "查询订单总金额" 返回:
- intent =
data_query(confidence 0.5),数据源aip_demo_warehouse - SQL =
SELECT SUM(sales_amount) AS total_sales FROM orders; - rows =
[["6470.5"]],chart_type =metric_card - 审计日志
NLQ_QUERY SUCCESS(含 sql 与 rows)
知识域:实体抽取 / 决策证据链 / 语义标注 / 多格式解析 / 会话记忆(V5)
实体/关系抽取 + RAG 第五通道(products/aip/entityextract,B2-1)
aie_entities/aie_relations/aie_extract_runs三表;分块 → LLM 抽取(JSON 限定 schema,坏 JSON 重试 1 次,任务化)→ 人工确认/拒绝审核闭环(confirmed 保留,重抽幂等);- API:
POST /knowledge/documents/:id/extract、GET /knowledge/documents/:id/graph、GET /entities|/relations、POST /entities/:id/confirm|reject; - 抽取成果接入检索增强:RAG 第五通道(metadata 0.35/knowledge 0.25/history 0.15/fewshot 0.15/entity 0.10),旧库四通道自动补种,提升自然语言查数召回。
决策证据链(products/aip/decision,B2-2)
ad_answers(id=trace_id、steps/citations JSON)+ad_citations表;5 步链:decompose 拆解 → retrieve 三路检索(RAG 四通道+实体+结构化 NLQ,融合去重截断 12 条)→ verify LLM 批量判 support/refute/irrelevant → synthesize 仅基于证据生成 markdown+[n] 引用 → cite 确定性映射;- 每步
LogEventRef(refType="ai_decision", stepType=...)审计留痕,GET /api/v1/ai-audit?trace_id=全流程回放; - API:
POST /decision/answer(同步多步 LLM)、GET /decision/answers、GET /decision/answers/:id。
元数据语义标注(products/aip/schemaai,B2-4)
asi_inferred_relationships(fk/semantic/join_path + confidence + 三态)+asi_column_annotations(semantic_type/description,source llm|rule_only);- FK 命名猜测 → 每表 LIMIT 20 采样 → LLM 批量判定(坏 JSON 重试、幻觉防御白名单、零重叠置信度×0.5)→ 任务化;LLM 缺失降级纯规则;
- API:
POST /datasources/:id/infer-relationships、GET /datasources/:id/relationships|annotations、POST /schemaai/relationships|annotations/:id/confirm|reject。
多格式解析 + 分层摘要树(products/aip/knowledge 扩展,B2-5)
- PDF(ledongthuc/pdf 纯 Go,字体大小+加粗推断标题)与 Word(archive/zip+XML 手写)双解析接口;
- 分层树
kdoc_nodes(document→section→chunk 三级、parent_id/ord/uri/vector_id),标题→section 层级栈嵌套、超长段落非重叠切分;检索双表合并去重 +source: tree|blocks+ node_path 回溯标题链; - API:
GET /knowledge/documents/:id/outline、POST /knowledge/documents(text/markdown/html 直传、pdf/docx base64)、POST /knowledge/search。
会话记忆(products/aip/nlq/models_memory.go + memory.go,B5-5.5)
anl_conversation_memory表(session_id+created_at 索引);Append(正则实体提及抽取)/Context(最近 6 轮原文 + 旧轮 summary,无 summary 滚动 LLM 压缩并回写,失败降级截断);- 编排器 AttachConversationMemory:记忆上下文并入 ragContext,查询成功回写记忆(失败轮次不写);
- API:
GET /chat/sessions、GET|DELETE /chat/sessions/:sid/memory;清理 jobaip:memory-cleanup(0 4 * * * 删 30 天前);前端/memory-manage页管理。
安全与协作加固(B3)
- TOTP 双因子认证:
platform/auth/mfa.go(RFC 6238),setup→verify-enable→登录要求totp_code(MFA_REQUIRED); - 通知中心:
platform/notifyHub/Channel,AIP 注册 feishu + email 渠道;GET /notify/channels、POST /notify/send; - 审计归档:
audit:archive调度(0 3 * * * 归档超 90 天)+GET|PUT /audit/archive-config; - NLQ RLS/CLS 注入:Text2SQL 执行前注入,失败拒绝执行不静默放行(B3-5.2)。
HTTP API(/api/v1)
| 方法 | 路径 | 用途 |
|---|---|---|
| POST | /auth/register / /auth/login | 注册 / 登录(login 返回 token) |
| GET|POST | /datasources | 数据源列表 / 创建 |
| GET|PUT|DELETE | /datasources/:id | 数据源详情 / 更新 / 删除 |
| POST | /datasources/:id/test | 连接测试 |
| POST | /datasources/:id/import-metadata | 导入表/列元数据(生成语义描述) |
| POST | /chat | NLQ 自然语言查询 |
| GET | /audit/logs | 审计日志查询 |
| POST | /decision/answer | 决策证据链(5 步,答案带引用) |
| GET | /decision/answers / /decision/answers/:id | 决策答案列表 / 详情 |
| POST | /knowledge/documents/:id/extract | 实体/关系抽取(任务化) |
| GET | /entities / /relations | 实体 / 关系列表(可确认/拒绝) |
| GET | /knowledge/documents/:id/outline | 文档分层大纲(document→section→chunk) |
| POST | /datasources/:id/infer-relationships | 元数据语义标注推断(任务化) |
| GET | /chat/sessions / /chat/sessions/:sid/memory | 会话记忆管理(DELETE 清空) |
| GET | /tasks / /tasks/:id | 异步任务列表 / 详情(任务化端点轮询) |
| GET | /scheduler/jobs / /scheduler/jobs/:name/runs | 调度任务与运行记录 |
| GET | /notify/channels / POST /notify/send | 通知中心渠道 / 发送 |
| GET|PUT | /audit/archive-config | 审计归档配置(默认 90 天) |
| GET | /feishu/status | 飞书机器人状态(enabled/running/configured/app_id,admin) |
| POST | /feishu/push | 飞书主动推送文本(receive_type=open_id|chat_id,admin) |
| GET | /email/status | 邮件服务状态(enabled/configured/server/from/port,admin) |
| POST | /email/test | 发送测试邮件验证 SMTP 连通性(body {to},admin) |
| GET | /license/info | 授权状态与关停调度(shutdown_scheduled/deadline/tier/reason) |
| GET | /health | 健康检查(zy-action-aip) |
除认证与 health 外均需 Authorization: Bearer <token>(JWT)。
演示数据(orders / customers / products)
server/bootstrap.go 启动时幂等重建 demo SQLite(temp/aip_demo_datasource.db),含三张表;导入元数据前先按 table_schema_id 清理旧 columns/tables,防止残留表名误导 RAG。
| 表 | 关键列 | 作用 |
|---|---|---|
| orders | order_id, customer_id, product_id, sales_amount, order_date, status | 订单事实(NLQ 主查询表) |
| customers | customer_id, name, level, region | 客户维度(join 用) |
| products | product_id, name, category, price | 产品维度(join 用) |
demo struct 固定
TableName(),避免 DropTable 与 GORM 表名不一致(此前导致 "no such table: demo_orders")。LLM 网关(底座复用)
AIP 通过 llm.NewGatewayFromConfig 装配网关(llm.LLMService),Text2SQL 与元数据生成共用同一网关。路由链:deepseek-v4-flash 主力 → qwen 备用 → local_rule 降级,含熔断与 tokens/成本 usage 统计。详见 底座五大机制。
通知与主动推送(飞书 / 邮件)
主动通知渠道演进:internal(审计日志)→ feishu(飞书私聊推送)→ email(SMTP 邮件)。工作流 send_notification 节点按 channel 分发到对应渠道。
飞书 IM 机器人(products/aip/feishu/)
- WebSocket 长连接 + 交互卡片,Automation Copilot 对话与 NLQ 查数可经飞书私聊/群聊;
default_channel可选 copilot / nlq。 - 主动推送:Engine
PushToChat / PushCardToChat / PushToUser / PushCardToUser;管理 APIGET /feishu/status、POST /feishu/push。 - 配置了
app_id + app_secret且未显式禁用时默认启用;feishu_contacts表登记 open_id↔chat_id 映射,供 PushToUser 定位。 - 工作流通知:
send_notification节点channel=feishu按 recipients(open_id)推送到飞书私聊。
SMTP 邮件服务(platform/mailer/)
- 纯标准库
net/smtp+crypto/tls:SSL 直连(465)/ STARTTLS(25/587)/ 明文三种模式,超时自动重试,HTML UTF-8,header 防注入。 - 配置
config.yaml email:节 +EMAIL_*env / DB 覆盖(DB 优先),凭证齐全默认启用。 - 管理 API
GET /email/status、POST /email/test;工作流send_notification节点channel=email按 recipients(邮箱)发送。
feishu / email 渠道需先配置好凭证,未配置而使用会让通知节点直接失败(执行结果可见,不静默丢通知)。
前端与网关接入
- 前端
action/web/保留 AIP 页面:LoginPage / DataSourcesPage / ChatWindow(Vue3 + Vite)。 - V5 新增 AIP 顶级路由:
/entity-extract(实体关系抽取)、/decision(决策证据链)、/schema-annotation(元数据语义标注)、/knowledge-tree(知识库分层树)、/memory-manage(会话记忆),App.vue 导航栏加入口。 - 管理后台页面:
/admin/feishu(飞书设置)、/admin/email(邮件设置)、/admin/workflows(工作流编排)、/admin/ai-audit(AI 决策审计,含归档开关)等。 - 网关代理:
/aip-api/*→ AIP 18080(前缀重写为/api)。 - 相关设计:
action/wiki/design/design_aip.md;评测集制品(契约⑤)随 Apollo bundle 分发供 NLQ 回归。