Google开源GenAI Toolbox:用YAML配置实现LLM安全查询数据库
为什么需要这个中间件
让大语言模型(LLM)直接去查数据库,听起来很美好,实际操作起来全是坑。最头疼的是安全问题:如果把数据库账号密码直接喂给模型,或者让模型自己拼凑SQL语句,稍微有点恶意的提示词注入,可能就把整个用户表删了。另外,模型生成的SQL往往效率低下,甚至语法错误,导致应用频繁崩溃。
Google开源的 genai-toolbox 就是为了解决这些麻烦事。它不是一个复杂的黑盒系统,而是一个轻量级的代理服务器。它的核心思路很简单:别让模型直接碰数据库,而是由开发者预先定义好“工具”(比如“查询用户信息”、“统计订单数量”),模型只需要调用这些工具,剩下的参数校验、SQL执行、结果返回都由 genai-toolbox 搞定。
这个项目基于 Model Context Protocol (MCP) 协议构建,用 Go 语言编写,性能不错,而且支持热加载配置。对于想要在生产环境中落地 RAG(检索增强生成)或智能 Agent 的团队来说,这是一个值得关注的基建组件。
它是怎么工作的
genai-toolbox 的架构并不复杂,主要分三部分:服务端、客户端 SDK 和 MCP 协议层。
服务端负责解析 YAML 配置文件,建立与数据库的连接池。它暴露出一组 RESTful API,比如 /loadToolset 用来获取可用工具列表,/invokeTool 用来执行具体操作。为了安全,它内置了身份验证中间件,支持 OAuth2 和 JWT,还能集成 OpenTelemetry 做链路追踪。这意味着你可以清楚地看到每个请求花了多少时间,有没有报错。
客户端 SDK 则负责把服务端的工具转换成 LLM 框架能理解的对象。无论你用的是 LangChain、LlamaIndex 还是 Google 自己的 Genkit,SDK 都能把工具的元数据(名称、描述、参数结构)打包成标准的 Function Calling 格式。模型在对话时,会根据上下文决定调用哪个工具,SDK 再把请求发给服务端。
MCP 协议在这里充当了翻译官的角色。它采用类似 JSON-RPC 的风格,确保不同语言、不同框架之间的通信标准统一。服务端收到请求后,会先校验参数是否符合 JSON Schema 定义,然后使用预编译的 SQL 语句执行查询,最后将结果序列化返回。这种机制从根本上杜绝了 SQL 注入的风险,因为 SQL 模板是写死在配置文件里的,用户输入只能作为参数传入。
核心功能亮点
1. 零代码 SQL 封装
这是最实用的功能。你不需要写任何后端逻辑代码,只需要在 tools.yaml 里声明 SQL 语句。例如,你想做一个根据姓名模糊搜索用户的功能,只需这样配置:
tools:
search_user:
kind: postgres-sql
source: my-pg
description: 根据姓名模糊查询用户
parameters:
- name: name
type: string
statement: SELECT id, name, email FROM users WHERE name ILIKE '%' || $1 || '%';系统会自动把这个配置变成一个可调用的工具。模型只要知道有个叫 search_user 的工具,接受一个 name 参数,就能完成查询。这大大降低了开发门槛,也让 SQL 逻辑更集中、更易维护。
2. 多数据源与事务支持
目前支持 PostgreSQL、AlloyDB 和 Cloud SQL,MySQL 还在实验阶段。对于企业级应用,它支持连接池复用,避免频繁创建连接带来的开销。更高级的是,它支持事务级工具。在一次对话中,如果涉及多个步骤(比如先查余额,再扣款),这些操作可以共享同一个数据库事务,保证数据的一致性。
3. 向量搜索能力
如果你在使用 PostgreSQL 的 pgvector 扩展,genai-toolbox 可以直接调用 text_embedding() 函数进行向量相似度检索。这对于构建 RAG 知识库非常有用,模型可以直接通过工具召回相关的文档片段,而不需要额外的向量数据库中间件。
4. 可观测性与热加载
运维人员喜欢这个功能。它开箱即用地提供 Prometheus Metrics,包括延迟、QPS 和错误率。同时,修改 YAML 配置后,无需重启服务,配置会在秒级内生效。这在调试 SQL 或调整参数时非常方便。
典型应用场景
RAG 知识库检索
在企业内部知识管理中,可以将文档索引表映射为 search_docs 工具。当用户提问时,模型先调用这个工具,从数据库中召回最相关的 K 个段落,再结合这些段落生成回答。相比传统的向量检索,这种方式可以更灵活地结合结构化数据(如文档权限、更新时间)进行过滤。
自然语言查数(NL2SQL)
运营人员经常需要查数据,但不会写 SQL。通过 genai-toolbox,你可以预设一些常用的查询模板,比如“查询上周销售额”、“查看库存低于10的商品”。模型将这些自然语言意图转化为对预设工具的调用,既满足了业务需求,又避免了模型随意生成复杂且低效的 SQL。
智能客服 Agent
在客服场景中,Agent 可能需要执行多步操作:查订单状态、修改收货地址、申请退款。这些操作涉及不同的数据表,且需要严格的事务控制。通过定义一系列工具,Agent 可以按顺序调用,每一步都经过参数校验和安全检查,确保操作合法合规。
AIOps 运维助手
SRE 团队可以通过 Slack 或钉钉机器人接入这个工具。输入“最近10分钟错误率最高的服务”,Agent 调用对应的监控数据查询工具,直接从 Prometheus 落地表中拉取数据并返回结论。这比手动写 PromQL 或 SQL 要快得多。
5分钟快速上手
假设你本地已经有一个运行中的 PostgreSQL 数据库。
第一步:下载二进制文件
export VERSION=0.2.0
curl -O https://storage.googleapis.com/genai-toolbox/v${VERSION}/linux/amd64/toolbox
chmod +x toolbox第二步:编写配置文件
创建 tools.yaml,配置数据源和工具:
sources:
my-pg:
kind: postgres
host: 127.0.0.1
port: 5432
database: toolbox_db
user: postgres
password: postgres
tools:
search_user:
kind: postgres-sql
source: my-pg
description: 根据姓名模糊查询用户
parameters:
- name: name
type: string
statement: SELECT id, name, email FROM users WHERE name ILIKE '%' || $1 || '%';第三步:启动服务
./toolbox --tools_file tools.yaml --port 5000第四步:Python 客户端调用
安装 SDK:
pip install toolbox-core编写测试代码:
from toolbox_core import ToolboxClient
import asyncio
async def main():
async with ToolboxClient("http://127.0.0.1:5000") as client:
# 加载工具集
tools = await client.load_toolset("default")
# 调用工具
result = await tools["search_user"].invoke({"name": "alice"})
print(result)
asyncio.run(main())如果你想集成到 LangChain,也只需要几行代码:
from toolbox_langchain import ToolboxClient
client = ToolboxClient("http://127.0.0.1:5000")
tools = client.load_toolset()
# 接下来就可以把 tools 传给 Agent 使用了Docker 部署
生产环境推荐用 Docker:
docker run -d --name toolbox \
-p 5000:5000 \
-v $(pwd)/tools.yaml:/tools.yaml \
ghcr.io/googleapis/genai-toolbox:v0.2.0 \
--tools_file /tools.yaml常见问题与排查
- 连接被拒绝:检查 PostgreSQL 是否监听
0.0.0.0,以及防火墙是否放行了 5432 端口。如果是本地测试,确保host配置正确。 - 工具找不到:确认
load_toolset时指定的工具集名称与配置文件中的一致。可以使用./toolbox validate --tools_file tools.yaml命令预检配置文件。 - 高并发超时:默认连接池可能较小。在 YAML 中调整
max_connections和pool_size,根据实际负载增加连接数。
总结
genai-toolbox 的价值在于它把“LLM 访问数据库”这个复杂问题标准化了。它不试图取代 ORM,也不试图让模型变成 SQL 专家,而是划定了一条清晰的安全边界:开发者定义工具,模型调用工具。
这种模式特别适合那些对数据安全敏感、但又希望利用 LLM 能力提升交互体验的企业。随着 Google 社区后续对 BigQuery、Spanner 等更多数据源的支持,它有望成为 GenAI 应用中连接数据层的重要基础设施。对于开发者而言,花半小时了解一下它的配置和集成方式,或许能为下一个 AI 项目省去不少造轮子的时间。