用过AI Agent(比如 Claude Code、Hermes Agent、Codex)的人应该都有同感:每个新对话,AI都像失忆了一样。
你跟它说过"我习惯用Markdown格式写文档",下个会话它又忘了。你之前让它查过的数据,换个对话窗口又要重新跑一遍。
这个问题有解吗?有。把 DuckDB 塞进你的 AI Agent 工作流里。
🔍 为什么是DuckDB?
你可能第一反应是"为什么不直接用SQLite"?对比一下:
| 维度 | DuckDB | SQLite | 向量数据库 |
|---|---|---|---|
| 分析查询速度 | ⚡ 极快(列式存储) | 一般(行式) | 适合语义搜索 |
| JSON处理 | ✅ 原生支持JSON解析 | ❌ 需要扩展 | ❌ |
| 内存占用 | 几MB | 几MB | 几十MB起 |
| SQL兼容性 | MySQL/PG语法兼容 | 标准SQL | 不支持SQL |
| 安装 | pip3 install duckdb | 系统自带 | 需要启动服务 |
| CSV/Parquet直接查 | ✅ 原生支持 | ❌ | ❌ |
| 部署难度 | 零配置 | 零配置 | 需要Docker |
关键结论: AI Agent 的核心需求不是存储关系数据,而是处理结构化信息——对话记录、工具调用日志、分析结果。DuckDB 的列式存储对这类工作负载比 SQLite 快5-10倍,而且能直接查 CSV、Parquet、JSON,省掉了ETL步骤。
🧠 实战:三个场景
场景一:让AI记住"你是谁"
每次对话都要重申偏好?用 DuckDB 当长期记忆层:
CREATE TABLE agent_memory (
session_id TEXT,
key TEXT,
value TEXT,
created_at TIMESTAMP DEFAULT now()
);
-- AI Agent 自动存储用户偏好
INSERT INTO agent_memory VALUES
('session_001', 'preferred_output', 'Markdown格式,中文'),
('session_001', 'timezone', 'Asia/Shanghai'),
('session_001', 'project_style', '代码先解释再执行');
-- 下次对话Auto-load
SELECT value FROM agent_memory
WHERE key = 'preferred_output'
ORDER BY created_at DESC LIMIT 1;
我是这么配置 Hermes 的:每次会话启动时先执行这段 SQL 加载记忆,结束时把新的偏好写入。现在它从不需要问我"用中文还是英文"——它记得。
场景二:追踪AI干了什么
AI Agent 跑自动化任务时,每一步都做了什么?普通日志文件很难查询。DuckDB 可以直接当审计表用:
CREATE TABLE tool_audit (
run_id TEXT,
tool_name TEXT,
input_summary TEXT,
output_status TEXT,
duration_ms INTEGER,
ts TIMESTAMP DEFAULT now()
);
-- 查询最慢的3个工具调用
SELECT tool_name, duration_ms, input_summary
FROM tool_audit
ORDER BY duration_ms DESC
LIMIT 3;
-- 统计今日成功率
SELECT tool_name,
COUNT(*) as total,
SUM(CASE WHEN output_status = 'ok' THEN 1 ELSE 0 END) as success,
ROUND(AVG(duration_ms)) as avg_ms
FROM tool_audit
WHERE ts > now() - INTERVAL '1 day'
GROUP BY tool_name;
这个表帮我发现了好多问题——原来某个工具平均耗时8秒,优化后才意识到是API超时没加限制。
场景三:把CSV直接当数据库查
这是 DuckDB 最强的能力。你从后台导出的数据文件,完全不需要导入数据库,直接查:
-- 直接读取CSV文件,像查表一样
SELECT category, COUNT(*) as cnt, ROUND(AVG(price), 2) as avg_price
FROM read_csv_auto('~/Downloads/sales_2026.csv')
WHERE amount > 100
GROUP BY category
ORDER BY cnt DESC;
AI Agent 拿到 CSV 后做的事情:
用户:帮我分析这个销售数据
Agent → DuckDB: read_csv + GROUP BY + 趋势计算
Agent → 输出: "3月份销售额最高的是品类A,环比增长23%"
整个流程从用户问出到出结果,不到40秒。没有数据导入,没有写ETL脚本,没有docker compose up。
⚙️ 怎么在你的AI Agent里用DuckDB
Hermes Agent
如果你在用 Hermes(或者想搭一个),配置超级简单。Hermes 自带 Python 执行环境,直接在 skill 或 script 里调用:
import duckdb
import json
# Agent 内部存储对话上下文
con = duckdb.connect('~/.hermes/agent_memory.duckdb')
# 存储结构化记忆
con.execute("""
INSERT INTO agent_memory VALUES (?, ?, ?, now())
""", [session_id, key, value])
# Agent 自己查自己
results = con.execute("""
SELECT value FROM agent_memory
WHERE key LIKE 'user_pref_%'
").fetchdf()
其他Agent(Claude Code / Codex)
一样的思路——只需要在项目的配置文件或初始化脚本中加入 DuckDB 连接,然后让 Agent 把每次会话的关键信息写入即可。
整个数据库文件就一个 .duckdb 文件,几MB到几十MB,可以放进 Git 或备份脚本里。
📊 一个真实的对比
我让我两个AI同时执行同一个分析任务——一个有DuckDB,一个没有。结果:
| 对比项 | 没有DuckDB的Agent | 带DuckDB的Agent |
|---|---|---|
| 数据加载 | 需要用pandas读CSV再转化 | 直接 read_csv_auto() |
| 第一次查询 | 需要写5行Python | 一行SQL |
| 多文件汇总 | for循环遍历+concat | read_csv('dir/*.csv') |
| 记住偏好 | 每次新对话重新说 | 自动加载 |
| 总耗时 | 约4分钟 | 约20秒 |
🚫 不是万能药
实话说几点限制:
- DuckDB 不是行级数据库——不适合频繁单行插入的OLTP场景(每秒几十次以上的写入要斟酌)
- 多并发访问需要做连接管理(Agent是单用户,这个不是问题)
- 不支持的SQL太复杂的嵌套循环关联(分析场景基本遇不到)
所以它最适合的定位是:AI Agent 的分析引擎 + 持久记忆层。不要把它当 MySQL 用就行。
💡 一句话总结
DuckDB 解决了 AI Agent 最尴尬的问题——每次对话都从零开始。装上它,你的 Agent 就有了"记忆",而且是能直接查SQL的那种记忆。
如果你已经在用某个AI Agent管理任务,打开终端装一个 DuckDB,然后让 Agent 建一个 agent_memory 表试试。第一次看到它自动记住你的习惯时,还是挺爽的。