
使用 LangChain Go 的 JSON Mode从多 LLM 后端获取结构化 JSON 输出【免费下载链接】langchaingoLangChain for Go, the easiest way to write LLM-based programs in Go项目地址: https://gitcode.com/GitHub_Trending/la/langchaingo导读本文围绕 langchaingo 仓库中的 json-mode-example 示例 展开讲解如何用同一套 Go 代码通过llms.WithJSONMode()让 OpenAI、Ollama、Anthropic、Google AI 四个不同后端稳定输出 JSON 格式的结构化数据。读完本文你将掌握 langchaingo 中 JSON 结构化输出的核心 API、各后端底层实现差异以及如何修改和扩展该示例用于真实业务。示例要解决什么问题大语言模型默认返回自由文本这对程序化解析很不友好。JSON Mode 的核心价值在于让模型在推理时就被约束为输出合法 JSON配合明确要求字段名的提示词即可获得可直接json.Unmarshal的结构化结果。这个示例程序做的事情非常聚焦见 examples/json-mode-example/README.md通过命令行 flag 选择要使用的 AI 后端初始化所选后端OpenAI、Ollama、Anthropic 或 Google AI发送提示词 Who was the first man to walk on the moon? 并要求以 JSON 格式响应打印模型返回的 JSON 内容。它同时演示了两个关键实践JSON Mode 结构化输出和temperature 设为 0 获得更确定的结果。环境准备与运行方式示例是独立 Go module见 examples/json-mode-example/go.modmodule 名为github.com/tmc/langchaingo/examples/json-mode-exampleGo 版本要求go 1.24.3依赖github.com/tmc/langchaingo v0.1.14-pre.4因此直接在该目录下go run即可无需手动配置本地 replace。运行前先确保目标后端所需的 API Key 或本地服务就绪后端前置条件openai设置OPENAI_API_KEY环境变量ollama本地启动 Ollama 服务并已拉取mistral模型anthropic设置ANTHROPIC_API_KEY环境变量googleai设置GEMINI_API_KEY或等效的 Google AI 凭据启动命令来自 READMEgo run json_mode_example.go -backendopenai将openai替换为ollama、anthropic或googleai即可切换后端无需改动任何代码go run json_mode_example.go -backendollama go run json_mode_example.go -backendanthropic go run json_mode_example.go -backendgoogleai完整代码逐段解析源码位于 examples/json-mode-example/json_mode_example.go结构非常精简整体只有三个部分。1. flag 定义与主流程var flagBackend flag.String(backend, openai, backend to use) func main() { flag.Parse() ctx : context.Background() llm, err : initBackend(ctx) if err ! nil { log.Fatal(err) } completion, err : llms.GenerateFromSinglePrompt(ctx, llm, Who was first man to walk on the moon? Respond in json format, include first_man in response keys., llms.WithTemperature(0.0), llms.WithJSONMode(), ) if err ! nil { log.Fatal(err) } fmt.Println(completion) }核心只有一次调用llms.GenerateFromSinglePrompt(ctx, llm, prompt, opts...)。注意提示词本身也参与了结构化约束——除了要求 Respond in json format还明确指定了first_man必须出现在响应键中这是获得稳定字段名的关键技巧JSON Mode 保证格式合法提示词决定字段内容。2. 四个后端的统一初始化func initBackend(ctx context.Context) (llms.Model, error) { switch *flagBackend { case openai: return openai.New() case ollama: return ollama.New(ollama.WithModel(mistral)) case anthropic: return anthropic.New(anthropic.WithModel(claude-3-5-sonnet-20240620)) case googleai: return googleai.New(ctx, googleai.WithDefaultModel(gemini-1.5-flash)) default: return nil, fmt.Errorf(unknown backend: %s, *flagBackend) } }所有后端都返回统一的llms.Model接口这是 langchaingo 多后端抽象的核心业务代码只依赖llms包具体厂商差异被收敛在各自的初始化函数里。此处也展示了各家的模型选择方式Ollama 用WithModel(mistral)Anthropic 指定claude-3-5-sonnet-20240620Google AI 用WithDefaultModel(gemini-1.5-flash)OpenAI 则使用默认模型。3. 输出模型返回的 JSON 以纯文本打印到标准输出例如可能得到{first_man: Neil Armstrong}核心 APIWithJSONMode 与 GenerateFromSinglePromptWithJSONMode 选项llms.WithJSONMode()在 llms/options.go 中定义其作用是把CallOptions.JSONMode置为true对应结构体字段见 llms/options.go// WithJSONMode will add an option to set the response format to JSON. func WithJSONMode() CallOption { return func(o *CallOptions) { o.JSONMode true } }它属于CallOption体系可以和WithTemperature、WithSeed、WithMaxTokens等选项自由组合作用域仅限单次调用。GenerateFromSinglePrompt 便捷函数GenerateFromSinglePrompt定义在 llms/llms.go是为单个字符串提示词、期望单个字符串响应场景提供的便捷封装它把 prompt 包装成一条ChatMessageTypeHuman消息调用底层llm.GenerateContent然后取出第一个 choice 的文本返回。想要更细粒度控制多轮消息、多 choice、Token 用量统计时应直接使用llm.GenerateContent。各后端 JSON Mode 的底层实现差异JSON Mode 并不是 langchaingo 自己拼装提示词而是把意图透传给各厂商的专用参数。这一点在源码里可以清晰看到OpenAI在 llms/openai/openaillm.go 中JSONMode为 true 时设置req.ResponseFormat ResponseFormatJSON而ResponseFormatJSON在 llms/openai/openaillm_option.go 中被定义为ResponseFormat{Type: json_object}对应 OpenAI 的response_format: {type: json_object}参数。如果还需要严格 JSON Schema 校验langchaingo 也提供了ResponseFormatJSONSchema相关的结构化输出类型见 llms/openai/internal/openaiclient/chat.go。Ollama在 llms/ollama/ollamallm.go 中JSONMode会把请求的format字段设为json对应 Ollama 的原生 JSON 模式。Google AIGemini在 llms/googleai/googleai.go 中JSONMode会设置model.ResponseMIMEType ResponseMIMETypeJson通过 MIME 类型约束模型输出 JSON。值得注意的一个细节Google AI 后端中JSONMode与ResponseMIMEType是互斥的同时设置会直接返回错误conflicting options, cant use JSONMode and ResponseMIMEType together而ResponseMIMEType本身又支持text/plain等非 JSON 类型见 llms/options.go 附近的注释。另外 Maritaca 后端也采用了与 Ollama 相同的format json透传方式见 llms/maritaca/maritacallm.go。Anthropic示例中 Anthropic 后端同样接受这些 CallOptions从代码结构看该示例主要依赖 Anthropic 对提示词指令的遵循能力来完成 JSON 输出。这些实现差异都在 llms/googleai/googleai_test.goTestGoogleAIWithJSONMode和 llms/options_test.go 等测试中得到验证说明WithJSONMode的行为是被单元测试守护的公开契约。temperature 0 的作用llms.WithTemperature(0.0)将采样温度设为 0让模型在生成时尽可能选择高概率 token显著降低同一提示词多次调用结果漂移的概率。对 JSON 结构化输出来说这有两个直接收益字段名、嵌套结构更稳定便于程序化解析相同输入下结果可复现性更好方便调试和测试。需要说明的是temperature0 不能完全保证每次输出逐字一致模型自身仍有一定随机性若要进一步追求确定性还可以组合使用WithSeed见 llms/options.go 的Seed字段。如何基于该示例做扩展示例的提示词和字段名都是写死的实际项目中常见做法更换提示词与字段约定把 includefirst_manin response keys 替换成你需要的键名清单模型会按约束生成。解析 JSON对completion直接json.Unmarshal到自定义 struct例如var result struct { FirstMan string json:first_man } if err : json.Unmarshal([]byte(completion), result); err ! nil { log.Fatal(err) }切换更多模型在initBackend的 switch 中新增分支即可例如 OpenAI 侧换用openai.WithModel(gpt-4o)或叠加openai.WithBaseURL(...)指向兼容端点。注意事项JSON 合法 ≠ 结构符合预期JSON Mode 只保证输出是合法 JSON字段是否齐全仍取决于提示词约束生产代码应对解析结果做校验和兜底。后端能力差异不同厂商对 JSON 模式的支持机制不同json_object、format: json、ResponseMIMEType切换到新后端时建议先跑一遍示例验证行为。版本前提示例基于 langchaingov0.1.14-pre.4与 Go 1.24.3升级主库版本前建议核对WithJSONMode等 API 的兼容性。本文介绍的 json-mode-example 是探索 langchaingo 结构化输出的最小可运行入口一套代码、四个后端、一个选项即可让 LLM 返回可直接解析的 JSON——这是把大模型能力接入真实业务系统时最常用的一步。【免费下载链接】langchaingoLangChain for Go, the easiest way to write LLM-based programs in Go项目地址: https://gitcode.com/GitHub_Trending/la/langchaingo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考