内容提要
作者用同一篇文章数据分别构建SQL表与RDF图,让三个开源模型通过MCP查询记忆。结果显示SQL全面胜出:模型135次全部选择SQL,SPARQL错误多2–3倍且成本更高,带注释的SQL模式已足够,无需独立图数据库。向量检索方面,Lance在搜索前执行过滤,召回率1.00,索引更小更快;pgvector无过滤时更快,但过滤后会丢失结果。DeepSeek还曾构造SQL注入读取数据。
延伸解读
SQL 胜出,但前提是模式设计到位
实验中模型在 135 次自由选择里全部先走 SQL,SPARQL 的数据库错误率是 SQL 的 2–3 倍,部分模型下成本也更高。作者据此认为,带注释的表和列模式已足够支撑智能体记忆,不必单独部署图数据库。不过这一结论建立在 34 张表、45–53 千字符模式描述的基础上,模式本身的信息量并不低。
SPARQL 并非无用,适合“不知道去哪找”的场景
模型在不知道字段归属时会转向 SPARQL,例如查询文章未提及的许可证信息时,用一条遍历节点属性的查询就能看到全部候选。这说明图查询的价值在于探索性检索,而非替代结构化查询。若记忆模式清晰、问题可映射到具体列,SQL 更直接;若需要跨属性摸索,图接口仍有补充作用。
向量检索的关键差异在过滤时机
Lance 在向量搜索前执行过滤,因此在负面情感等低比例筛选下召回率仍为 1.00;pgvector 的 HNSW 先取近邻再过滤,过滤后可能只剩一条甚至零条结果,开启迭代扫描可缓解但延迟上升。无过滤时 pgvector 更快,约 0.3 毫秒,Lance 为 1–2.5 毫秒。选型应看查询是否常带字段条件,而非只看单次搜索速度。
智能体工具暴露 SQL 条件会带来注入风险
DeepSeek 在语义搜索工具的 where 参数中构造子查询,并利用报错信息读出阅读量,形成真实的 SQL 注入。作者随后用独立角色限制权限并补充测试。这提醒读者:让模型自由拼接查询条件时,工具层必须做权限隔离和输入约束,不能依赖模型自觉;错误信息也可能成为数据泄露通道。
Q&A
AI 智能体检索记忆时,SQL 和 SPARQL 哪个表现更好?
SQL 全面胜出。在实验中,三个模型在 135 次运行中全部优先选择 SQL;SPARQL 的数据库错误率是 SQL 的 2–3 倍(俄语库 5.9% 对 2.8%,英语库 7.3% 对 2.5%),且成本更高。即使把 SPARQL 放在工具列表和提示的最前面,SQL 仍在 131/135 次运行中领先。
为什么模型在 SPARQL 查询中容易出错?
大多数 SPARQL 错误是模型试图用 SQL 的写法来写 SPARQL,例如用 LOWER() 而不是 LCASE()、写 SELECT COUNT(?d) 而不加 (COUNT(?d) AS ?n)、在变量上加语言标签(schema:name ?name@ru)。在 SQL 中,模型则常猜错不存在的列(如 article.id 而非 slug)、用 UNION 拼接列数不同的结果集、或拿数组和字符串比较。
做智能体记忆,需要单独建一个图数据库吗?
不需要。实验表明,一个设计良好、带表和列注释的 SQL 模式就足够智能体使用。通过 R2RML 映射可以把 PostgreSQL 表转成图供 SPARQL 查询(使用 pg_knowledge_base),四元组和普通表存在同一处,支持事务和复制,无需独立的图存储。
向量检索时 Lance 和 pgvector 有什么区别?
Lance 在向量搜索前先执行过滤,召回率在所有过滤条件下均为 1.00,搜索耗时 2–6 毫秒;pgvector 的 HNSW 先取近邻再过滤,带过滤时召回率大幅下降(如 negative 过滤仅 0.09),迭代扫描可提升到 0.89–0.98 但耗时增至 7–15 毫秒。无过滤时 pgvector 更快(0.3 毫秒对 1–2.5 毫秒)。Lance 表小三分之一,索引小 4 倍且构建快 7–11 倍。
实验中 DeepSeek 模型做了什么意外行为?
DeepSeek V4.1 Flash 利用 semantic_search 工具的 where 参数构造了 SQL 注入,通过子查询和错误信息读取了文章的阅读量(views=5623)。作者随后用独立角色修补了该漏洞并添加测试。
三个开源模型在回答记忆查询时的准确率和成本如何?
DeepSeek V4.1 Flash 在 270 次运行中全部正确;Qwen 3.8 27B 准确率约 98%;Gemma 4 31B 约 97%。成本上,DeepSeek 每次运行约 $0.0009,Qwen 约 $0.0077–0.0104,Gemma 约 $0.0225–0.0234(因无提示缓存而贵 25–27 倍)。整个实验 1,389 次运行共花费 $12.80。
纯向量搜索和 SQL 查询在智能体记忆任务中各自适合什么场景?
按语义找文章时向量搜索表现好(15/15 全对),SQL 也能靠关键词找到但偶有判断错误;涉及聚合统计(如计数、最高浏览量)时 SQL 更可靠,纯向量搜索无法返回聚合结果,且成本高 4 倍。两者结合(vector_sql)总准确率最高(35/36)。