简介
手写结构化查询语言是那种在不经意间将许多人排除在数据工作之外的技能之一:产品经理、支持代理甚至初级开发人员往往确切地知道他们想向数据库询问什么,但不知道如何将其表达为结构化查询语言。这正是文本转结构化查询语言系统试图解决的问题:用自然语言(英语或西班牙语)提出问题,并从真实的数据库中获取真实的数据。
在本文中,我使用哈金脸公司的smolagents 库构建了一个小型但完整的文本转结构化查询语言人工智能代理,解释了为什么代理比“大型语言模型编写结构化查询语言并直接执行”这种简单流水线更可靠,展示了实际代码,并涵盖了在将此类系统连接到生产环境数据库之前需要考虑的安全事项。
本项目的完整源代码可在本文末尾链接的公共代码仓库中获取。
为什么不直接让大型语言模型生成结构化查询语言?
最简单的文本转结构化查询语言流水线如下所示:
- 将数据库模式加上用户的问题发送给大型语言模型。
- 要求大型语言模型返回一条结构化查询语言查询语句。
- 执行该查询并显示结果。
这种方法有效……直到它失效为止。问题在于,单次调用大型语言模型是脆弱的:模型可能会生成语法上有效但语义上错误的查询(错误的连接、错误的过滤条件、错误的聚合),并且仍然会返回一个结果,只是这个结果并不正确。系统内部没有任何机制来验证答案或进行重试。
这正是 smolagents 文档开篇提出的“黄金问题”:为什么不通过单个提示词保持简单?答案是,一个代理——一种能够推理、调用工具、观察结果并决定是否需要重试的系统——对于此类任务来说,在根本上更加稳健。
什么是 smolagents,以及“以代码思考”意味着什么?
smolagents 是哈金脸公司推出的一个轻量级代理框架,其维护者将其描述为“一个用于以代码思考的代理的最小化库”。CodeAgent 不强制模型以僵化的 JavaScript 对象表示法格式生成工具调用,而是在其推理循环中编写并执行真正的派森代码:
- 思考 —— 模型推理下一步该做什么。
- 行动 —— 编写一段派森代码片段,调用你提供给它的工具之一(在我们的案例中,是一个结构化查询语言执行工具)。
- 观察 —— 该代码的执行结果(查询输出)被重新整合到模型的上下文中。
- 重复或回答 —— 代理判断是否拥有足够的信息来回答问题,或者是否需要调整查询并再次尝试。
正是这个循环使得代理具备自我修正能力:如果某次查询返回了可疑的结果(空结果或明显错误的数字),模型可以重写查询,而不是自信地返回一个错误的答案。
构建项目:一个小型的“收据” SQLite 数据库
为了使示例易于理解,我使用了一个包含两个小表的内存中的 SQLite 数据库,其结构与示例中使用的相同
免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。