AI 快讯 编译自 simon_willison #工具评测#提示词优化#DSPy

DSPy 实战:用自动评估优化 Datasette Agent 的 SQL 系统提示词

Simon Willison 使用 DSPy 框架自动评估并改进了 Datasette Agent 的 SQL 查询提示词,发现关键问题:仅列出表名导致模型猜测列名并陷入错误循环。本文介绍 DSPy 在提示词优化中的实际应用,对中文开发者调试 LLM 应用有直接参考价值。

编译发布 2026/07/02 原文发布 2026/07/02

一句话看懂

Simon Willison 用 DSPy 框架自动评估 Datasette Agent 的 SQL 提示词,发现仅列出表名会让模型猜测列名并陷入错误循环。

详细发生了什么

Datasette Agent 是一个让用户通过自然语言查询 SQLite 数据库的工具,核心依赖 LLM 将问题转为 SQL。但它的系统提示词一直靠手动调优,效果不稳定。

Simon Willison 在 AIE 大会听到 DSPy 的 keynote 后,立刻在 Claude Code for Web 中发起了一个异步研究任务,使用 Claude Fable 5 模型执行:安装最新 Datasette alpha、datasette-agent 和 DSPy,然后用 DSPy 评估并改进 Datasette Agent 的 SQL 系统提示词。

Fable 选择用 GPT 4.1 mini 和 nano 进行测试,发现了几个有价值的改进方向。其中最突出的问题是:当前提示词只列出了数据库表名,却告诉模型“如果你已经有信息,不要调用 describe_table”。这导致模型在缺乏列名信息时只能猜测(如 page_count、o.order_id、first_name),猜测错误后触发重试,形成死循环。

改进建议很直接:要么在提示词的 schema 中直接包含列名,要么软化那条“不要重复调用”的指令。

中文圈视角

这件事对中文开发者有两点直接价值:

1. DSPy 的实用门槛比想象中低。 很多人以为 DSPy 需要复杂的编译流程,但 Simon 只用了一个异步任务就完成了从安装到出结果的全流程。中文社区里关于 DSPy 的教程偏理论,缺少这种“拿一个真实项目直接跑”的案例。如果你正在用 LangChain 或自己写 prompt 调优,DSPy 可以帮你自动化评估——尤其是 SQL 生成这种有明确对错标准的场景。

2. 提示词优化的常见陷阱。 中文开发者做 Text-to-SQL 时,经常只给表名不给列名,认为“模型可以自己查”。但 Simon 的实验证明,这会导致模型猜测列名并反复出错。更优的做法是:在 system prompt 里直接嵌入完整的 schema 信息(表名+列名+类型),减少模型不必要的 tool calling。国内类似项目如 DB-GPT、Chat2DB 也可以借鉴这个发现。

另外,DSPy 目前对中文支持一般,但评估逻辑(正确性、重试次数)是语言无关的,可以直接套用。

几条值得记住的细节

  • DSPy 由斯坦福 NLP 团队开发,专门用于自动优化 LLM 提示词和 pipeline。
  • Simon 使用的模型是 Claude Fable 5(执行研究任务)和 GPT 4.1 mini/nano(测试)。
  • 核心发现:仅列出表名会导致模型猜测列名(如 page_count)并触发错误重试循环。
  • 改进方案:在 prompt 的 schema 中直接包含列名,或软化“不要重复调用 describe_table”的指令。
  • 整个实验通过 Claude Code for Web 的异步任务完成,无需手动编写复杂脚本。

一句话总结

如果你在做 Text-to-SQL 或类似工具,记得在提示词里把列名写清楚——别让模型猜。