每个上生产的LLM功能最后都会撞上同一堵墙。它一开始只是Python文件里的一行提示词字符串,然后长出系统消息、三个示例、一段处理JSON偶尔被markdown包裹的格式化补丁,最后留下一句注释:# DO NOT TOUCH — tuned 2026-08-14。没人能测它,没人能diff它,模型厂商一发更新,它就悄悄退化。
DSPy从根上解决这件事。它是斯坦福NLP的框架,MIT许可,当前版本3.4.0。用它,你不再写提示词,而是写程序:类型化的签名声明输入输出,模块组合推理策略,优化器按你定义的指标把整个东西编译一遍——就像编译器针对目标架构优化代码。提示词变成构建产物,不再是源代码。
一条能跑通的完整回路
下面这条回路是端到端的:一个客服工单分诊程序,预测紧急程度和负责团队。用签名定义它,用dspy.Evaluate测出真实基线,用BootstrapFewShot编译它,看准确率从55.6%走到88.9%,再把优化后的程序存成文件发出去。整条流水线免费、离线,跑在一个确定性的沙箱模型上,零API开销就能复现每一个数字。
需要准备的东西不多:Python 3.10+和pip,CPU就够,不需要GPU。装DSPy 3.4.0,用python -c "import dspy; print(dspy.__version__)"确认版本。主流水线不需要任何API key,它跑在SandboxLM上——一个确定性模拟器,从提示词里读取少样本示例,读不到就退回一个弱关键词启发式,故意做得平庸,就像真实的零样本基线。想接真模型也可以,OpenAI、Anthropic或本地Ollama,一行代码就能把沙箱换掉。
沙箱不是LLM,但它模拟了关键的那一个性质
配置从dspy.configure开始,告诉框架用哪个语言模型。真模型路线是dspy.LM("openai/gpt-4o-mini"),key从环境变量取;本地路线是dspy.LM("ollama/llama3.1", api_base="http://localhost:11434")。
教程用的是沙箱。它继承DSPy的DummyLM,重写_use_example钩子——这是DSPy 3.4的dummy引擎真正调用的扩展点。给定一个查询,它找出输入内容词重叠最多的少样本示例,复制那个示例的输出;没有重叠示例时退回弱启发式。
这里有一个诚实的提醒:这个模拟器不是LLM。它只模拟真实模型的一个性质——从上下文示例中做少样本学习——好让优化回路的行为和面对真模型时一致。
换句话说,你在这条流水线上看到的每一个测量结果,都是可复现的。提示词不该是手调的字符串,它该是一个能被编译、被测量、被版本化的构建产物。
热门跟贴