From e274458dd3cc8ad20a1a63df558f43e319a4951f Mon Sep 17 00:00:00 2001 From: ShenHongxuan <3012693863@qq.com> Date: Sun, 16 Aug 2026 20:37:43 +0800 Subject: [PATCH] Polish showcase and documentation --- README.md | 33 ++++++- .../dataagent_pipeline/demo_data.py | 3 +- .../dataagent_agent/env_test.py | 4 +- .../schema_retrieval/embedding_client.py | 4 +- .../schema_retrieval/retriever.py | 9 +- .../dataagent_agent/sql_generation/objects.py | 4 +- .../sql_generation/schema_store.py | 13 +-- demo-site/src/App.jsx | 5 +- demo-site/src/styles.css | 94 ++++++++++--------- ...12\347\272\277\346\214\207\345\215\227.md" | 4 +- ...12\347\272\277\346\214\207\345\215\227.md" | 2 +- 11 files changed, 95 insertions(+), 80 deletions(-) diff --git a/README.md b/README.md index 0d4a07a..3aeb2a6 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,33 @@ # InsightFlow:企业知识与数据问答 Agent +[![CI](https://github.com/hachiwar/InsightFlow/actions/workflows/ci.yml/badge.svg)](https://github.com/hachiwar/InsightFlow/actions/workflows/ci.yml) +[![GitHub Pages](https://github.com/hachiwar/InsightFlow/actions/workflows/pages.yml/badge.svg)](https://github.com/hachiwar/InsightFlow/actions/workflows/pages.yml) + [在线演示](https://hachiwar.github.io/InsightFlow/) · [架构设计](docs/architecture.md) · [国内服务器上线指南](docs/InsightFlow国内服务器上线指南.md) -InsightFlow 是一套可运行的企业 Agent 工程:MindAgent 负责会话记忆、知识库 RAG、意图识别和多 Agent 编排;DataAgent 负责把自然语言数据问题转换为经过治理、执行、校验和解释的 SQL。项目提供 Java / Python 后端、浏览器内 SQLite 范例、Docker Compose 部署以及自动化测试。 +InsightFlow 是一套面向企业知识问答与结构化数据分析的 Agent 工程。MindAgent 负责会话记忆、知识库 RAG、意图识别和多 Agent 编排;DataAgent 负责把自然语言数据问题转换为经过治理、执行、校验和解释的 SQL。仓库包含 Java 与 Python 后端、浏览器内 SQLite 交互范例、Docker Compose 部署、接口文档和自动化测试。 + +## 核心能力 + +| 领域 | 能力 | +|---|---| +| 统一入口 | MindAgent 对外提供 `/chat`,在知识问答、技术支持、账单账户和数据查询之间完成意图路由 | +| 对话与知识 | Redis 工作记忆、历史摘要、用户画像、查询改写、BM25 与向量混合检索、Rerank | +| 数据推理 | 字段级 Schema 召回、SchemaGraph、CoT 四元组规划、局部 Schema SQL 生成和有限纠错 | +| 执行治理 | 单语句与只读校验、危险函数拦截、表白名单、查询超时、结果上限和 SQLite 只读连接 | +| 结果证据 | 问题导向解释、行列一致性校验、SQL 指纹、策略结果、执行耗时和错误审计 | +| 工程交付 | Caddy、Docker Compose、双 API Key、内部网络、健康检查、冒烟测试和 GitHub Actions | + +## 技术栈 + +| 层级 | 技术 | +|---|---| +| MindAgent | Java 21、Spring Boot、Spring AI、Redis、Micrometer、OpenAPI | +| DataAgent | Python、SQLite、HTTP API、Schema 检索、Text-to-SQL、SQL 治理 | +| 在线范例 | React、Vite、sql.js、WebAssembly | +| 部署与质量 | Caddy、Docker Compose、GitHub Actions、Java/Python/Node.js 自动化测试 | -## 为什么不是预存 SQL +## 动态数据问答场景 报表脚本适合固定口径;业务问答经常同时包含动态时间、模糊概念、多表关系和追问上下文。例如: @@ -57,7 +80,7 @@ DataAgent(Python) [GitHub Pages 范例站](https://hachiwar.github.io/InsightFlow/) 使用 React、sql.js 和 WebAssembly 在浏览器内真实执行 5 张样例表,展示完整数据链路。内置 3 个复杂多表场景,无需 API Key。 -页面也支持临时填写 OpenAI Chat Completions 兼容端点。启用后,模型负责动态 SQL、错误修复和结果解释;执行仍由浏览器只读沙盒完成。API Key 只保存在当前页面内存,刷新即清除。问题、相关 Schema、SQL 和结果会发送到用户填写的模型端点,因此只应使用临时限额 Key和公开样例数据。 +页面也支持临时填写 OpenAI Chat Completions 兼容端点。启用后,模型负责动态 SQL、错误修复和结果解释;执行仍由浏览器只读沙盒完成。API Key 只保存在当前页面内存,刷新即清除。问题、相关 Schema、SQL 和结果会发送到用户填写的模型端点,因此只应使用临时限额 Key 和公开样例数据。 本地运行: @@ -178,7 +201,7 @@ MindAgent 优先使用 `answer` 组织对话回复,同时保留 SQL 和校验 - 容器使用只读文件系统、非特权模式和内部网络; - 返回行数、请求体和执行时间均有限制; - 审计记录不保存明文 SQL,只保存指纹、策略、耗时和错误; -- `.env`、数据库、日志、PDF 和本地面试材料均被 Git 忽略。 +- `.env`、数据库、运行日志、PDF 和本地个人文档均被 Git 忽略。 项目的工程范围是只读企业问答与 SQLite 演示数据,不提供数据库写操作,也不连接真实银行账户。接入企业数据时,应为每个数据源配置专用只读账号与最小化表白名单。 @@ -218,7 +241,7 @@ InsightFlow/ └── .env.example # 无密钥配置模板 ``` -## 项目验证路径 +## 复现与检查 1. 查看 MindAgent / DataAgent 的职责边界; 2. 在在线站点运行“盈利下降”或“存款未消费”场景,逐步查看关键词、Schema、计划、SQL、结果和解释; diff --git a/dataagent/code/dataagent_agent/dataagent_agent/dataagent_pipeline/demo_data.py b/dataagent/code/dataagent_agent/dataagent_agent/dataagent_pipeline/demo_data.py index 43fdc94..9fbd4fd 100644 --- a/dataagent/code/dataagent_agent/dataagent_agent/dataagent_pipeline/demo_data.py +++ b/dataagent/code/dataagent_agent/dataagent_agent/dataagent_pipeline/demo_data.py @@ -136,8 +136,7 @@ def get_trade_relations_meta() -> list[dict]: """ Demo 表关系元数据。 - 当前 SQLite 可以通过外键提取出关系。 - 这里保留结构,后续可以写入 Milvus 的表关系 Collection。 + SQLite 通过外键提取关系;同一结构也可作为 Milvus 表关系 Collection 的写入对象。 """ return [ { diff --git a/dataagent/code/dataagent_agent/dataagent_agent/env_test.py b/dataagent/code/dataagent_agent/dataagent_agent/env_test.py index 37c194f..cfa5076 100644 --- a/dataagent/code/dataagent_agent/dataagent_agent/env_test.py +++ b/dataagent/code/dataagent_agent/dataagent_agent/env_test.py @@ -318,7 +318,7 @@ def test_schema_loading_and_retrieval() -> bool: print("\n✅ 最小字段检索流程正常") return True - print("\n⚠️ 检索流程跑通,但没有命中预期字段。可以后续优化分词和元数据。") + print("\n⚠️ 检索流程可用,但本次查询未命中预期字段;请检查分词与元数据配置。") return True except Exception as exc: @@ -339,7 +339,7 @@ def test_sentence_transformers_import(deps: dict) -> bool: print("✅ sentence-transformers 可以 import") print("说明:这里不强制下载模型,避免无网络环境卡住。") - print("后续你可以手动测试:") + print("如需验证模型下载,可运行:") print('python -c "from sentence_transformers import SentenceTransformer; SentenceTransformer(\'BAAI/bge-small-zh-v1.5\')"') return True diff --git a/dataagent/code/dataagent_agent/dataagent_agent/schema_retrieval/embedding_client.py b/dataagent/code/dataagent_agent/dataagent_agent/schema_retrieval/embedding_client.py index 8f305ba..1525de4 100644 --- a/dataagent/code/dataagent_agent/dataagent_agent/schema_retrieval/embedding_client.py +++ b/dataagent/code/dataagent_agent/dataagent_agent/schema_retrieval/embedding_client.py @@ -120,8 +120,8 @@ def embed_texts(self, texts: List[str]) -> np.ndarray: vectors = np.array(embeddings, dtype=np.float32) - # 归一化,后续可以直接用点积计算 cosine similarity。 + # 归一化后可直接用点积计算 cosine similarity。 norms = np.linalg.norm(vectors, axis=1, keepdims=True) vectors = vectors / np.maximum(norms, 1e-8) - return vectors \ No newline at end of file + return vectors diff --git a/dataagent/code/dataagent_agent/dataagent_agent/schema_retrieval/retriever.py b/dataagent/code/dataagent_agent/dataagent_agent/schema_retrieval/retriever.py index 0748f21..1e81157 100644 --- a/dataagent/code/dataagent_agent/dataagent_agent/schema_retrieval/retriever.py +++ b/dataagent/code/dataagent_agent/dataagent_agent/schema_retrieval/retriever.py @@ -12,15 +12,12 @@ class SchemaRetriever: """ 字段级 Schema 检索器。 - 当前 Demo 实现: + SchemaRetriever 提供: - 字段级文档构建 - BM25关键词召回 - 简单业务别名 boost - 后续扩展: - - 加 VectorIndex - - 加 Reranker - - 加 LLM Query 关键词提取 + HybridSchemaRetrievalService 在此基础上组合向量召回、Rerank 和关键词提取。 """ def __init__( @@ -74,7 +71,7 @@ def _business_boost(self, query: str, doc: FieldDocument) -> float: - Query 直接包含字段名、字段别名、表别名时加分。 - Query token 与字段描述 token 重合时加分。 - 这部分后续可以替换为 rerank 模型。 + 该规则分数与上层 Rerank 结果共同参与混合排序。 """ query_lower = query.lower() query_tokens = set(tokenize(query)) diff --git a/dataagent/code/dataagent_agent/dataagent_agent/sql_generation/objects.py b/dataagent/code/dataagent_agent/dataagent_agent/sql_generation/objects.py index d1de511..185d487 100644 --- a/dataagent/code/dataagent_agent/dataagent_agent/sql_generation/objects.py +++ b/dataagent/code/dataagent_agent/dataagent_agent/sql_generation/objects.py @@ -9,7 +9,7 @@ class CotStep: """ CoT 四元组中的单个步骤。 - 数据库只用于后续执行路由; + 数据库只用于执行路由; SQL 生成 Prompt 中只放处理对象、操作指令和输出目标。 """ @@ -124,7 +124,7 @@ def to_execution_request(self) -> Dict[str, str]: """ 转换为数据库执行请求。 - 后续可以通过 MCP 路由到对应 database 的执行 API。 + 返回对象由 MCPRouter 路由到对应 database 的执行器。 """ return { "database": self.database, diff --git a/dataagent/code/dataagent_agent/dataagent_agent/sql_generation/schema_store.py b/dataagent/code/dataagent_agent/dataagent_agent/sql_generation/schema_store.py index e766f50..e4d3665 100644 --- a/dataagent/code/dataagent_agent/dataagent_agent/sql_generation/schema_store.py +++ b/dataagent/code/dataagent_agent/dataagent_agent/sql_generation/schema_store.py @@ -11,12 +11,8 @@ class LocalSchemaStore: """ 本地 Schema 存储。 - 这里先用内存对象保存完整 Schema。 - 后续可以替换为: - - Milvus 字段索引 - - Milvus 表关系索引 - - SchemaGraph 对象 - - 元数据服务 API + 使用内存对象保存当前查询的完整 Schema,并支持从 SchemaGraph 构建。 + 上游元数据可以来自 Milvus 字段索引、表关系索引或元数据服务 API。 SQL 生成阶段不会直接使用完整 Schema,而是根据 CoT 四元组中的处理对象 裁剪出当前步骤需要的局部 Schema。 @@ -90,9 +86,8 @@ def from_schema_graph(cls, schema_graph: object) -> "LocalSchemaStore": 从 SchemaGraph 构建 SchemaStore。 SchemaGraph 来自 Schema 检索阶段。 - SQL 生成阶段会先把这个 SchemaGraph 存下来, - 后续根据 CoT 四元组中的处理对象、操作指令和输出目标, - 再从中裁剪当前步骤需要的局部 Schema。 + SQL 生成阶段保存 SchemaGraph,并根据 CoT 四元组中的处理对象、 + 操作指令和输出目标裁剪当前步骤需要的局部 Schema。 """ tables: Dict[str, TableSchema] = {} diff --git a/demo-site/src/App.jsx b/demo-site/src/App.jsx index 3b468f6..ab32de9 100644 --- a/demo-site/src/App.jsx +++ b/demo-site/src/App.jsx @@ -172,15 +172,14 @@ function DataLab() { return
{STAGES.map((stage, index) => { const number = index + 1; const state = number < activeStage ? "done" : number === activeStage ? "active" : ""; return
{number < activeStage ? "✓" : number}{stage}
; })}
- {error ?
本次分析未完成{error}
: null} + {error ?
分析失败{error}
: null}