作者很早就开始关注 Cuelang(CUE),认为其在云原生生态中 YAML 泛滥的情况下有解决很多问题的潜力。CUE 在根据严格定义的模式验证数据以及从模式生成数据模型代码方面表现出色,最近在参与使用大型语言模型(LLM)的项目后,作者发现可以用 CUE 验证 LLM 输出。
CUE 和 Go 的结合:
- CUE 有语言教程和在线 playground,官方网站提供了关于如何将 CUE 与 Go 结合使用的指南,其中一个典型用例是数据验证。
- 可以用 CUE 定义模式来验证 Go 结构体,如定义
Person
结构体及其约束。Go 结构体的实例可以通过encoding/json
包与 CUE 进行交互,通过在json
标签中使用omitempty
选项可以使可选字段通过 CUE 验证。 - CUE 的 Go 包还可以从模型生成 OpenAPI 模式,通过在 CUE 模式文件中添加描述注释,可以生成包含对象字段描述的 OpenAPI JSON 模式。
- 虽然可以利用 Go 结构体标签定义和验证字段约束,但通过
cuego
包实现时存在一些问题,如无法从 Go 结构体标签生成 JSON 模式,并且cuego
包的某些功能在某些情况下会失败。
使用 CUE 和 Go 从 LLM 输出中提取和验证结构化数据:
- 编写一个 Go 程序,通过
ollama
运行llama3
模型,从输入的文本中提取特定信息(如球员的姓名和年龄)。将 CUE 模式嵌入到 Go 程序中,生成 OpenAPI 模式并传递给 LLM,然后验证 LLM 输出的 JSON 是否符合模式。 - 可以通过改变 CUE 模式中的约束来测试验证功能,如更改
age
的约束条件。 - 为了解决 OpenAPI 模式生成的问题,可以使用
jsonschema
Go 模块来指定 OpenAPI 定义,通过cue
标签指定验证约束,使用cuego
包验证从 LLM 接收的数据。
结论:
作者因与朋友的深夜交谈而创作了这篇博客,希望读者能从中学到新技巧,最后鼓励读者用 Go 和 CUE 提取和验证 LLM 生成的数据。同时还列出了其他相关文章。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。