Agent 查完数据,
直接给你卡片。
一个基于 AgentScope Java 2.0 与 Spring Boot WebFlux 的对话式数据分析 Agent。工具不再吐一坨 markdown,而是返回带 type 的结构化 JSON,浏览器直接挂载成图表卡片;向量、全文、标量三路检索用 RRF 融合排序,会话之外还有能被语义召回的长期记忆。
问一句数据问题,
它回你一堵文字墙。
工具输出是 markdown,模型再复述一遍,结构没了,数字也容易走样。
结果被复述一遍
LLM 把工具返回的表格重新写成人话,既多花一轮 token,数字还可能走样,用户也没法直接拿去用。
检索只有一条路
纯向量召回会漏掉精确条件——「2020 年后、评分 4.5 以上」这类标量过滤,没地方放。
聊完就忘
会话一关,上次说过的口径和事实全丢,下次又得从头交代一遍。
所以 agent-hub 把「工具返回什么」和「界面怎么显示」拆成了两件事。
从编排到记忆,都自己搭了
每一块都能在仓库里找到对应的包和设计文档。
ReAct 编排
AgentScope 2.0 的 ReActAgent 驱动,31 类事件被折叠成 5 种领域事件,通过 SSE 推到浏览器。
A2UI 结构化卡片
工具返回 type: chart | hybrid | table 的 JSON 信封,前端检测后挂载原生卡片,并明确禁止模型复述结果。
混合检索 + RRF
本地哈希向量、全文匹配、标量过滤三路召回,用 Reciprocal Rank Fusion 融合排序,不依赖外部向量服务。
双层记忆
会话内历史之外,异步 MemoryExtractor 蒸馏稳定事实,跨会话按语义召回。
DDD 分层
presentation → application → domain ← infrastructure,依赖只向内,外部系统只由基础设施适配器接触。
可换人格 / A2A
换一个 AgentPersona 就换行业;A2A 协议配合 Nacos 发现,出站委派与取消都带签名。
三步,本地就能对话
需要 JDK 21、Maven 3.9+ 和 Docker Compose。
起基础设施
SeekDB :2881、MongoDB :27017、Neo4j :7687 一次拉起,初始化 SQL 由容器挂载执行。
docker-compose up -d
配置密钥并构建
模型密钥只走环境变量,仓库里只有 .env.example 的字段名。
export AGENT_MODEL_API_KEY=sk-...
mvn clean package -DskipTests
启动并打开
先通过手机号验证码或微信扫码登录,再进入聊天页。
java -jar target/agent-hub-1.0.0.jar
# localhost:8080/chat.html
几个被问过的问题
为什么不用图表库?
柱状图就是 div 的高度,饼图是 CSS 的 conic-gradient。前端零依赖、完全自包含,也不用为了画一张图引入一整个库。
为什么要三个 profile?
seekdb / mongo / oceanbase 共用同一套应用,换仓储实现和 AgentPersona,就能从电商数据分析切到 OceanBase 知识图谱问答。
模型密钥会进仓库吗?
不会。AGENT_MODEL_API_KEY 只从环境变量读取,仓库里只放 .env.example 说明有哪些变量可配。