🏠 首页 攻略 DuckDB + AI Agent:你的AI分身从此有了持久记忆

DuckDB + AI Agent:你的AI分身从此有了持久记忆

详解如何使用DuckDB作为AI Agent的持久化存储层——从对话记忆、工具调用追踪到知识库,让AI代理不再每次对话都从零开始

用过AI Agent(比如 Claude Code、Hermes Agent、Codex)的人应该都有同感:每个新对话,AI都像失忆了一样。

你跟它说过"我习惯用Markdown格式写文档",下个会话它又忘了。你之前让它查过的数据,换个对话窗口又要重新跑一遍。

这个问题有解吗?有。把 DuckDB 塞进你的 AI Agent 工作流里。

🔍 为什么是DuckDB?

你可能第一反应是"为什么不直接用SQLite"?对比一下:

维度DuckDBSQLite向量数据库
分析查询速度⚡ 极快(列式存储)一般(行式)适合语义搜索
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循环遍历+concatread_csv('dir/*.csv')
记住偏好每次新对话重新说自动加载
总耗时约4分钟约20秒

🚫 不是万能药

实话说几点限制:

  • DuckDB 不是行级数据库——不适合频繁单行插入的OLTP场景(每秒几十次以上的写入要斟酌)
  • 多并发访问需要做连接管理(Agent是单用户,这个不是问题)
  • 不支持的SQL太复杂的嵌套循环关联(分析场景基本遇不到)

所以它最适合的定位是:AI Agent 的分析引擎 + 持久记忆层。不要把它当 MySQL 用就行。

💡 一句话总结

DuckDB 解决了 AI Agent 最尴尬的问题——每次对话都从零开始。装上它,你的 Agent 就有了"记忆",而且是能直接查SQL的那种记忆。

如果你已经在用某个AI Agent管理任务,打开终端装一个 DuckDB,然后让 Agent 建一个 agent_memory 表试试。第一次看到它自动记住你的习惯时,还是挺爽的。