快速上手
先零配置跑通内置的 demo 数据源,看清它怎么回答一个问题; 再用 docker compose 起完整平台,最后接入你自己的库。 全程不需要准备任何数据——demo 连数据带知识库都随仓库提供。
| 你想要 | 走哪条 | 大概要多久 | 直接跳 |
|---|---|---|---|
| 先看看它答得怎么样 | 内置 demo:零配置,连数据带知识库都随仓库提供 | 五分钟 | 跑通 demo |
| 多人用、要管理台与界面 | docker compose 完整平台(四个容器) | 一次构建 | 平台方式 |
| 问自己的数据 | 连接 → /kb init 建模 → 提问 |
取决于库的规模 | 接入你的数据库 |
前置条件
| 项 | 要求 | 说明 |
|---|---|---|
| Python | ≥ 3.12 | 用 uv 管理依赖 |
| Node | ≥ 22 | 只有平台方式(前端)需要;纯 REPL / API 不需要 |
| LLM 凭证 | 一个 API key | 真实问答必需——SQL 生成与反思是模型做的 |
Trove 把能确定的都确定下来——join 路径、枚举值、时间分桶、口径、安全边界都由语义模型和确定性规则算,不花模型一分钱。 但问句到查询计划那一步是语言理解,必须有模型。
没有凭证时程序仍能启动(/kb init 退化为纯骨架),只是问不出可用的答案。这不是降级运行,是缺了必需件。
五分钟:跑通内置 demo
仓库自带一个 BIRD 金融数据集(Berka / PKDD'99 捷克银行数据,8 张表)作为 demo 数据源
demo.py:247 create_demo_database。
它的知识库也随仓库提供(.trove/kb/demo/ 下的几个 YAML),所以这一步不需要 /kb init。
1. 装依赖
git clone https://github.com/Nivane/trove.git
cd trove
uv sync
2. 给一个 LLM 凭证
在仓库根建一个 .env,或直接导出环境变量。默认目标是 DeepSeek:
echo 'DEEPSEEK_API_KEY=sk-...' >> .env
换别的厂商不用改代码:模型走 litellm 网关,改 conf/agent.yml 的 agent.target 即可
(openai/gpt-4o、anthropic/claude-...,或任何兼容端点)。
见 配置参考。
3. 提问
uv run trove --datasource demo
进 REPL 后直接问:
> Which region has the highest average loan amount?
想脚本化调用(stdin 进、JSON 出):
echo "Which region has the highest average loan amount?" \
| uv run trove-cli --datasource demo --print
两个入口共用同一套管线:trove 是交互 REPL
main.py:971 main_repl,
trove-cli 是管道模式
main.py:681 async_main_cli。
4. 看看它凭什么这么答
REPL 里这几条命令值得先跑一遍,它们解释了答案是怎么来的:
/kb list # 这个数据源的 KB 里有什么
/trace # 回放最近一次 run 的完整轨迹
/help # 全部斜杠命令
平台方式:docker compose
要多人用、要管理台、要不碰命令行,就用 compose。它起四个容器:PostgreSQL(业务库 + 向量 + 全文检索同实例)、 一次性灌数、后端 API、前端 SPA。
docker compose up --build
然后打开 http://localhost:8080/,用 admin / admin123 登录。
compose 栈默认已把 demo 数据灌进 PostgreSQL,可以直接在界面上提问。
admin 密码:admin123 只写在 compose 文件里供本地演练,生产用 TROVE_ADMIN_PASSWORD 环境变量覆盖。
LLM 凭证:容器里默认没有。取消 docker-compose.yml 中挂载 ~/.trove/conf 那行的注释,或直接给容器注入 API key。
前后端是两个独立镜像,可以分别重建——前端改动不必等后端:
docker compose build frontend # 只重建前端
docker compose restart backend # 只重启后端,前端容器不受影响
docker compose down
完整的部署拓扑、环境变量清单与两种存储后端的差别,见 安装部署。
接入你自己的数据库
三步,缺一不可。第二步是这个产品最容易被跳过、也最不能跳过的一步。
flowchart LR
C["① 连接
URL 或管理台注册"]:::entry --> M["② 建模
/kb init 连实时 schema 起草"]:::gen
M --> Q["③ 提问"]:::entry
Q -- "答得出" --> A["回答(可 /kb learn 沉淀)"]:::entry
Q -- "模型没覆盖" --> R["拒绝 + 起草扩展草稿"]:::gate
R -- "确认草稿" --> Q
classDef entry fill:#71717a14,stroke:#71717a59,stroke-width:1px;
classDef gen fill:#6366f114,stroke:#6366f199,stroke-width:1.5px;
classDef gate fill:#f59e0b14,stroke:#f59e0b99,stroke-width:1.5px;
linkStyle 4 stroke:#8b5cf6,stroke-width:1.5px
① 连接
给一个数据库 URL 即可(本地方式是 --datasource,平台方式在管理台注册):
uv run trove --datasource postgres://user:pass@host:5432/mydb
支持 SQLite / PostgreSQL / MySQL / Doris / ClickHouse / DuckDB / Snowflake / BigQuery,驱动按需懒加载,
装哪个用哪个(uv sync --extra postgres 等)。注册表见
registry.py:42 _ADAPTER_REGISTRY。
② 建模
/kb init
它会连上你的实时 schema,起草表/列注释,并确定性地生成语义模型骨架、术语与示例模板: 能算出来的部分不交给模型,模型只负责措辞。 init_pipeline.py:441 init_kb
这一步做完之前,Trove 会拒绝回答——不是报错,是明确告诉你缺什么。
这是设计而非缺陷:语义模型就是「可答边界」。一个不声明口径就敢算数的问数工具,你敢信它的数字吗? 被拒时它会顺手起草一份扩展草稿,你确认一下就能继续问。
③ 提问
然后正常提问即可。答对的可以沉淀(/kb learn → 管理端确认 → 下次直接命中),
答错的会被蒸馏成教训进 Hint Bank。准确率随使用增长,靠的是这个闭环,不是换个更大的模型。